core

package
v0.2.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 12, 2025 License: AGPL-3.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// TokenPrefix is the prefix for all API tokens
	TokenPrefix = "logchef_"
	// TokenLength is the length of the random part of the token (32 characters)
	TokenLength = 32
	// TokenPrefixLength is the length of the prefix shown to users
	TokenPrefixLength = 8
)

Variables

View Source
var (
	// ErrAPITokenNotFound is returned when an API token is not found
	ErrAPITokenNotFound = errors.New("API token not found")
	// ErrInvalidToken is returned when a token format is invalid
	ErrInvalidToken = errors.New("invalid token format")
	// ErrTokenExpired is returned when a token has expired
	ErrTokenExpired = errors.New("token has expired")
)
View Source
var (
	ErrQueryNotFound       = fmt.Errorf("saved query not found")
	ErrQueryTypeRequired   = fmt.Errorf("query type is required")
	ErrInvalidQueryType    = fmt.Errorf("invalid query type: must be 'logchefql' or 'sql'")
	ErrInvalidQueryContent = fmt.Errorf("invalid query content format or values")
)
View Source
var (
	ErrSessionNotFound = errors.New("session not found")
	ErrSessionExpired  = errors.New("session expired")
)

Session-specific errors

View Source
var (
	// ErrUserNotFound is returned when a user is not found.
	ErrUserNotFound = errors.New("user not found")
	// ErrCannotDeleteLastAdmin is returned when attempting to delete or deactivate the last admin.
	ErrCannotDeleteLastAdmin = errors.New("cannot delete or deactivate the last admin user")
	// ErrUserAlreadyExists is returned when trying to create a user that already exists.
	ErrUserAlreadyExists = errors.New("user already exists")
	// ErrTeamAlreadyExists is returned when trying to create a team that already exists.
	ErrTeamAlreadyExists = errors.New("team already exists")
	// ErrInvalidRole is returned for invalid user or team roles.
	ErrInvalidRole = errors.New("invalid role specified")
	// ErrInvalidStatus is returned for invalid user status.
	ErrInvalidStatus = errors.New("invalid status specified")

	// Define team/source errors here temporarily for IsNotFoundError, or reference from other files.
	// Ideally, these would live in teams.go and source.go respectively.
	ErrTeamNotFound = errors.New("team not found")
)
View Source
var ErrSourceAlreadyExists = fmt.Errorf("source already exists")
View Source
var ErrSourceNotFound = fmt.Errorf("source not found")

ErrSourceNotFound is returned when a source is not found

Functions

func AddTeamMember

func AddTeamMember(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, userID models.UserID, role models.TeamRole) error

AddTeamMember adds a user to a team with a specified role. If the user is already a member, it updates their role.

func AddTeamSource

func AddTeamSource(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID) error

AddTeamSource associates a source with a team.

func AuthenticateAPIToken added in v0.2.2

func AuthenticateAPIToken(ctx context.Context, db *sqlite.DB, log *slog.Logger, config *config.AuthConfig, token string) (*models.User, *models.APIToken, error)

AuthenticateAPIToken authenticates a token and returns the associated user

func CheckSourceConnectionStatus

func CheckSourceConnectionStatus(ctx context.Context, chDB *clickhouse.Manager, log *slog.Logger, source *models.Source) bool

CheckSourceConnectionStatus checks the connection status for a given source. It returns true if the source is connected and the table is queryable, false otherwise.

func CleanupExpiredTokens added in v0.2.2

func CleanupExpiredTokens(ctx context.Context, db *sqlite.DB, log *slog.Logger) error

CleanupExpiredTokens removes all expired API tokens

func CreateAPIToken added in v0.2.2

func CreateAPIToken(ctx context.Context, db *sqlite.DB, log *slog.Logger, config *config.AuthConfig, userID models.UserID, name string, expiresAt *time.Time) (*models.CreateAPITokenResponse, error)

CreateAPIToken creates a new API token for a user

func CreateSession

func CreateSession(ctx context.Context, db *sqlite.DB, log *slog.Logger, userID models.UserID, duration time.Duration, maxConcurrent int) (*models.Session, error)

CreateSession creates a new session for a user, respecting concurrent session limits.

func CreateSource

func CreateSource(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, name string, autoCreateTable bool, conn models.ConnectionInfo, description string, ttlDays int, metaTSField string, metaSeverityField string, customSchema string) (*models.Source, error)

CreateSource creates a new source, validates connection, and optionally creates the table.

func CreateTeam

func CreateTeam(ctx context.Context, db *sqlite.DB, log *slog.Logger, name, description string) (*models.Team, error)

CreateTeam creates a new team in the database.

func CreateTeamSourceQuery

func CreateTeamSourceQuery(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID, name, description, queryContentJSON, queryType string) (*models.SavedTeamQuery, error)

CreateTeamSourceQuery creates a new saved query for a team and source.

func CreateUser

func CreateUser(ctx context.Context, db *sqlite.DB, log *slog.Logger, email, fullName string, role models.UserRole, status models.UserStatus) (*models.User, error)

CreateUser creates a new user in the database.

func DeleteAPIToken added in v0.2.2

func DeleteAPIToken(ctx context.Context, db *sqlite.DB, log *slog.Logger, userID models.UserID, tokenID int) error

DeleteAPIToken deletes an API token by ID, ensuring the user owns it

func DeleteSource

func DeleteSource(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, id models.SourceID) error

DeleteSource deletes a source from SQLite and removes its connection from the manager

func DeleteTeam

func DeleteTeam(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID) error

DeleteTeam deletes a team and its associations (members, sources, queries).

func DeleteTeamSourceQuery

func DeleteTeamSourceQuery(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID, queryID int) error

DeleteTeamSourceQuery deletes a specific saved query.

func DeleteUser

func DeleteUser(ctx context.Context, db *sqlite.DB, log *slog.Logger, id models.UserID) error

DeleteUser deletes a user from the database.

func GetAPIToken added in v0.2.2

func GetAPIToken(ctx context.Context, db *sqlite.DB, tokenID int) (*models.APIToken, error)

GetAPIToken retrieves an API token by ID

func GetSource

func GetSource(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, id models.SourceID) (*models.Source, error)

GetSource retrieves a source by ID including connection status and schema

func GetSourceHealth

func GetSourceHealth(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, id models.SourceID) (models.SourceHealth, error)

GetSourceHealth retrieves the health status of a source from the ClickHouse manager

func GetSourceSchema

func GetSourceSchema(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, sourceID models.SourceID) ([]models.ColumnInfo, error)

GetSourceSchema retrieves the schema (column information) for a specific source from ClickHouse.

func GetSourcesWithDetails

func GetSourcesWithDetails(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, sourceIDs []models.SourceID) ([]*models.Source, error)

GetSourcesWithDetails retrieves multiple sources with their full details including schema This is more efficient than calling GetSource multiple times for a list of sources

func GetTeam

func GetTeam(ctx context.Context, db *sqlite.DB, id models.TeamID) (*models.Team, error)

GetTeam retrieves a specific team by its ID.

func GetTeamByName

func GetTeamByName(ctx context.Context, db *sqlite.DB, name string) (*models.Team, error)

GetTeamByName retrieves a specific team by its name.

func GetTeamMember

func GetTeamMember(ctx context.Context, db *sqlite.DB, teamID models.TeamID, userID models.UserID) (*models.TeamMember, error)

GetTeamMember retrieves a specific member's details within a team.

func GetTeamSourceQuery

func GetTeamSourceQuery(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID, queryID int) (*models.SavedTeamQuery, error)

GetTeamSourceQuery retrieves a specific saved query by its ID, team ID, and source ID.

func GetUser

func GetUser(ctx context.Context, db *sqlite.DB, id models.UserID) (*models.User, error)

GetUser retrieves a specific user by their ID.

func GetUserByEmail

func GetUserByEmail(ctx context.Context, db *sqlite.DB, email string) (*models.User, error)

GetUserByEmail retrieves a specific user by their email address.

func InitAdminUsers

func InitAdminUsers(ctx context.Context, db *sqlite.DB, log *slog.Logger, adminEmails []string) error

InitAdminUsers ensures that specified admin users exist and are configured correctly.

func InitializeSource

func InitializeSource(ctx context.Context, chDB *clickhouse.Manager, source *models.Source) error

InitializeSource adds a source connection to the ClickHouse manager. It assumes the source object contains valid connection details.

func IsNotFoundError

func IsNotFoundError(err error) bool

IsNotFoundError checks if the error is a known not found error. TODO: Refactor to check errors defined in respective packages (users, teams, source) if errors are split.

func IsTeamAdmin

func IsTeamAdmin(ctx context.Context, db *sqlite.DB, teamID models.TeamID, userID models.UserID) (bool, error)

IsTeamAdmin checks if a user is an admin of a specific team.

func IsTeamMember

func IsTeamMember(ctx context.Context, db *sqlite.DB, teamID models.TeamID, userID models.UserID) (bool, error)

IsTeamMember checks if a user is a member of a specific team.

func ListAPITokensForUser added in v0.2.2

func ListAPITokensForUser(ctx context.Context, db *sqlite.DB, userID models.UserID) ([]*models.APIToken, error)

ListAPITokensForUser lists all API tokens for a specific user

func ListQueriesForTeamAndSource

func ListQueriesForTeamAndSource(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID) ([]*models.SavedTeamQuery, error)

ListQueriesForTeamAndSource retrieves all saved queries associated with a specific team and source.

func ListSourceTeams

func ListSourceTeams(ctx context.Context, db *sqlite.DB, sourceID models.SourceID) ([]*models.Team, error)

ListSourceTeams returns all teams that have access to a specific source.

func ListSources

func ListSources(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger) ([]*models.Source, error)

ListSources returns all sources with basic connection status but without schema details. This is optimized for performance in list views where the schema isn't needed.

func ListSourcesForUser

func ListSourcesForUser(ctx context.Context, db *sqlite.DB, userID models.UserID) ([]*models.Source, error)

ListSourcesForUser returns all unique sources a user has access to across all teams.

func ListTeamMembers

func ListTeamMembers(ctx context.Context, db *sqlite.DB, teamID models.TeamID) ([]*models.TeamMember, error)

ListTeamMembers returns all members of a specific team.

func ListTeamSources

func ListTeamSources(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, teamID models.TeamID) ([]*models.Source, error)

ListTeamSources returns basic information for all sources associated with a specific team, including their connection status fetched from the ClickHouse manager's cache.

func ListTeams

func ListTeams(ctx context.Context, db *sqlite.DB) ([]*models.Team, error)

ListTeams returns all teams from the database.

func ListTeamsForUser

func ListTeamsForUser(ctx context.Context, db *sqlite.DB, userID models.UserID) ([]*models.UserTeamDetails, error)

ListTeamsForUser returns all teams a user is a member of, including their role and team member count.

func ListTeamsWithAccessToSource

func ListTeamsWithAccessToSource(ctx context.Context, db *sqlite.DB, log *slog.Logger, sourceID models.SourceID, userID models.UserID) ([]*models.Team, error)

ListTeamsWithAccessToSource returns teams accessible by a user for a given source. This involves multiple DB calls and might be better placed closer to the handler.

func ListUsers

func ListUsers(ctx context.Context, db *sqlite.DB) ([]*models.User, error)

ListUsers returns all users from the database.

func ParseSourceID

func ParseSourceID(sourceIDStr string) (models.SourceID, error)

ParseSourceID converts a string source ID to models.SourceID. Utility function often needed in handlers.

func ParseTeamID

func ParseTeamID(teamIDStr string) (models.TeamID, error)

ParseTeamID converts a string team ID to models.TeamID. Utility function often needed in handlers.

func ParseUserID

func ParseUserID(userIDStr string) (models.UserID, error)

ParseUserID converts a string user ID to models.UserID. Utility function often needed in handlers.

func QueryLogs

func QueryLogs(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, sourceID models.SourceID, params clickhouse.LogQueryParams) (*models.QueryResult, error)

QueryLogs retrieves logs from a specific source based on the provided parameters. Timeout is always applied - either from params or default value.

func RemoveTeamMember

func RemoveTeamMember(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, userID models.UserID) error

RemoveTeamMember removes a user from a team.

func RemoveTeamSource

func RemoveTeamSource(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID) error

RemoveTeamSource removes the association between a source and a team.

func RevokeSession

func RevokeSession(ctx context.Context, db *sqlite.DB, log *slog.Logger, sessionID models.SessionID) error

RevokeSession deletes a specific session by its ID.

func RevokeUserSessions

func RevokeUserSessions(ctx context.Context, db *sqlite.DB, log *slog.Logger, userID models.UserID) error

RevokeUserSessions deletes all sessions for a specific user.

func TeamHasSourceAccess

func TeamHasSourceAccess(ctx context.Context, db *sqlite.DB, teamID models.TeamID, sourceID models.SourceID) (bool, error)

TeamHasSourceAccess checks if a specific team has access to a specific source.

func UpdateAPITokenLastUsed added in v0.2.2

func UpdateAPITokenLastUsed(ctx context.Context, db *sqlite.DB, tokenID int) error

UpdateAPITokenLastUsed updates the last used timestamp for an API token

func UpdateSource

func UpdateSource(ctx context.Context, db *sqlite.DB, log *slog.Logger, id models.SourceID, description string, ttlDays int) (*models.Source, error)

UpdateSource updates an existing source's mutable fields (description, ttlDays)

func UpdateTeam

func UpdateTeam(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, updateData models.Team) error

UpdateTeam updates an existing team's mutable fields (name, description).

func UpdateTeamMemberRole

func UpdateTeamMemberRole(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, userID models.UserID, newRole models.TeamRole) error

UpdateTeamMemberRole changes the role of an existing team member.

func UpdateTeamSourceQuery

func UpdateTeamSourceQuery(ctx context.Context, db *sqlite.DB, log *slog.Logger, teamID models.TeamID, sourceID models.SourceID, queryID int, name, description, queryContentJSON, queryType string) (*models.SavedTeamQuery, error)

UpdateTeamSourceQuery updates an existing saved query.

func UpdateUser

func UpdateUser(ctx context.Context, db *sqlite.DB, log *slog.Logger, userID models.UserID, updateData models.User) error

UpdateUser updates an existing user's information. Only non-empty fields in the `updateData` struct are applied.

func UserHasAccessToTeamSource

func UserHasAccessToTeamSource(ctx context.Context, db *sqlite.DB, log *slog.Logger, userID models.UserID, teamID models.TeamID, sourceID models.SourceID) (bool, error)

UserHasAccessToTeamSource checks if a user has access to a specific source through a specific team. This is the proper way to check access - requiring both team membership and team-source linkage.

func ValidateConnection

ValidateConnection validates a connection to a ClickHouse database using temporary client

func ValidateConnectionWithColumns

func ValidateConnectionWithColumns(ctx context.Context, chDB *clickhouse.Manager, log *slog.Logger, conn models.ConnectionInfo, tsField, severityField string) (*models.ConnectionValidationResult, error)

ValidateConnectionWithColumns validates a connection and checks specified column types.

func ValidateSavedQueryContent

func ValidateSavedQueryContent(contentJSON string) error

ValidateSavedQueryContent validates the JSON structure and basic rules of the query content.

func ValidateSession

func ValidateSession(ctx context.Context, db *sqlite.DB, log *slog.Logger, sessionID models.SessionID) (*models.Session, error)

ValidateSession checks if a session ID is valid and not expired. It returns the session details if valid, or an appropriate error.

Types

type HistogramParams

type HistogramParams struct {
	Window   string // e.g., "1m", "5m", "1h"
	Query    string // Optional filter query (WHERE clause part)
	GroupBy  string // Optional field to group by
	Timezone string // Optional timezone identifier (e.g., 'America/New_York', 'UTC')
	// Query execution timeout in seconds. If not specified, uses default timeout.
	QueryTimeout *int
}

HistogramParams defines parameters specifically for histogram queries. Keeping it separate allows for specific validation or processing.

type HistogramResponse

type HistogramResponse struct {
	Granularity string                     `json:"granularity"`
	Data        []clickhouse.HistogramData `json:"data"`
}

HistogramResponse structures the response for histogram data.

func GetHistogramData

func GetHistogramData(ctx context.Context, db *sqlite.DB, chDB *clickhouse.Manager, log *slog.Logger, sourceID models.SourceID, params HistogramParams) (*HistogramResponse, error)

GetHistogramData fetches histogram data for a specific source and time range. It uses the source's configured timestamp field. Timeout is always applied.

type SourceStats

type SourceStats struct {
	TableStats  *clickhouse.TableStat        `json:"table_stats"`  // Use pointer to allow nil if stats fail completely
	ColumnStats []clickhouse.TableColumnStat `json:"column_stats"` // Slice is sufficient, empty if stats fail
}

SourceStats represents the combined statistics for a ClickHouse table Use types directly from the clickhouse package

func GetSourceStats

func GetSourceStats(ctx context.Context, chDB *clickhouse.Manager, log *slog.Logger, source *models.Source) (*SourceStats, error)

GetSourceStats retrieves statistics for a specific source (ClickHouse table)

type ValidationError

type ValidationError struct {
	Field   string
	Message string
	Err     error // Original error (optional)
}

ValidationError represents a validation error, potentially wrapping an original error.

func (*ValidationError) Error

func (e *ValidationError) Error() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL