sqlite

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Jun 16, 2026 License: MIT Imports: 11 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type APIKeyRepository

type APIKeyRepository struct {
	// contains filtered or unexported fields
}

APIKeyRepository persists API keys using SQLite syntax. Implements apikey.Repository.

func NewAPIKeyRepository

func NewAPIKeyRepository(db *sql.DB) *APIKeyRepository

NewAPIKeyRepository creates a new SQLite API key repository.

func (*APIKeyRepository) CountByUserAndName

func (r *APIKeyRepository) CountByUserAndName(ctx context.Context, userID int, name string) (int, error)

CountByUserAndName returns the number of non-revoked keys for a user with the given name. Used by the domain service to prevent duplicate key names.

func (*APIKeyRepository) Create

func (r *APIKeyRepository) Create(ctx context.Context, key *apikey.APIKey) error

Create inserts a new API key record and populates key.ID with the assigned row ID.

func (*APIKeyRepository) FindByIDAndUserID

func (r *APIKeyRepository) FindByIDAndUserID(ctx context.Context, id, userID int) (*apikey.APIKey, error)

FindByIDAndUserID returns the single key matching (id, userID), or apikey.ErrKeyNotFound when no such row exists (covers nonexistent AND not-owned — identity scoping is enforced by the WHERE user_id predicate).

func (*APIKeyRepository) FindByKeyID

func (r *APIKeyRepository) FindByKeyID(ctx context.Context, keyID string) (*apikey.APIKey, error)

FindByKeyID returns the key matching the public lookup prefix keyID, INCLUDING revoked and expired rows, or apikey.ErrKeyNotFound if none. The deliberate absence of a revoked_at IS NULL filter lets the Service distinguish a verified-but-revoked key from an unknown keyID.

func (*APIKeyRepository) ListByUserID

func (r *APIKeyRepository) ListByUserID(ctx context.Context, userID int) ([]*apikey.APIKey, error)

ListByUserID returns all API keys owned by userID, newest-first. Returns an empty (non-nil) slice when the user has no keys.

func (*APIKeyRepository) RevokeByIDAndUserID

func (r *APIKeyRepository) RevokeByIDAndUserID(ctx context.Context, id, userID int, now time.Time) error

RevokeByIDAndUserID sets revoked_at = now for the matching (id, userID) row. No rows-affected check is performed — the Service guards via FindByIDAndUserID first, so a 0-row UPDATE only happens under a benign race and is harmless.

func (*APIKeyRepository) UpdateLastUsed

func (r *APIKeyRepository) UpdateLastUsed(ctx context.Context, id int, now time.Time, ip string) error

UpdateLastUsed sets last_used_at = now and last_used_ip = ip for the key id. Best-effort: no rows-affected check (the key was just verified to exist).

type CommentItem

type CommentItem struct {
	ID        int            `json:"id"`
	ContentID int            `json:"contentId"`
	UserID    int            `json:"userId"`
	Comment   string         `json:"comment"`
	Status    string         `json:"status"`
	Author    sql.NullString `json:"author"`
	Username  sql.NullString `json:"username"`
	Role      sql.NullString `json:"role"`
	CreatedAt time.Time      `json:"createdAt"`
	UpdatedAt time.Time      `json:"updatedAt"`
}

CommentItem represents a comment in the database

type CommentRepository

type CommentRepository struct {
	// contains filtered or unexported fields
}

CommentRepository handles comment data operations

func NewCommentRepository

func NewCommentRepository(db *sql.DB) *CommentRepository

NewCommentRepository creates a new comment repository

func (*CommentRepository) Create

func (r *CommentRepository) Create(ctx context.Context, comment *contentdomain.Comment) error

func (*CommentRepository) Delete

func (r *CommentRepository) Delete(ctx context.Context, id int) error

func (*CommentRepository) DeleteByUserID

func (r *CommentRepository) DeleteByUserID(ctx context.Context, userID int) error

func (*CommentRepository) GetByContentID

func (r *CommentRepository) GetByContentID(ctx context.Context, contentID int) ([]*contentdomain.Comment, error)

func (*CommentRepository) GetByContentIDForModeration

func (r *CommentRepository) GetByContentIDForModeration(ctx context.Context, contentID int) ([]*contentdomain.Comment, error)

func (*CommentRepository) GetByID

func (*CommentRepository) GetByUserID

func (r *CommentRepository) GetByUserID(ctx context.Context, userID int) ([]*contentdomain.Comment, error)

func (*CommentRepository) UpdateStatus

func (r *CommentRepository) UpdateStatus(ctx context.Context, id int, status contentdomain.CommentStatus) error

type ContentItem

type ContentItem struct {
	ID                 int           `json:"id"`
	UserID             int           `json:"userId"`
	Title              string        `json:"title"`
	Slug               string        `json:"slug"`
	Content            string        `json:"content"`
	Tags               string        `json:"tags"`
	Status             string        `json:"status"`
	PostType           string        `json:"postType"`
	MetaDescription    *string       `json:"metaDescription"`
	OGTitle            *string       `json:"ogTitle"`
	OGDescription      *string       `json:"ogDescription"`
	AllowComments      bool          `json:"allowComments"`
	CustomFields       *string       `json:"customFields"`
	Language           string        `json:"language"`
	TranslationGroupID sql.NullInt64 `json:"translationGroupId"`
	CreatedAt          time.Time     `json:"createdAt"`
	UpdatedAt          time.Time     `json:"updatedAt"`
}

ContentItem represents a content item in the database

type ContentRepository

type ContentRepository struct {
	// contains filtered or unexported fields
}

ContentRepository handles content data operations

func NewContentRepository

func NewContentRepository(db *sql.DB) *ContentRepository

NewContentRepository creates a new content repository

func (*ContentRepository) AuthorExists

func (r *ContentRepository) AuthorExists(ctx context.Context, username string) (bool, error)

func (*ContentRepository) CheckSlugUnique

func (r *ContentRepository) CheckSlugUnique(ctx context.Context, slug string, language string) (bool, error)

func (*ContentRepository) Create

func (r *ContentRepository) Create(ctx context.Context, content *contentdomain.Content) error

func (*ContentRepository) Delete

func (r *ContentRepository) Delete(ctx context.Context, id int, userID int) error

func (*ContentRepository) DeleteByID

func (r *ContentRepository) DeleteByID(ctx context.Context, id int) error

func (*ContentRepository) GetAll

func (r *ContentRepository) GetAll(ctx context.Context, limit int, offset int) ([]*contentdomain.Content, error)

func (*ContentRepository) GetByID

func (*ContentRepository) GetBySlug

func (r *ContentRepository) GetBySlug(ctx context.Context, slug string, language string) (*contentdomain.Content, error)

func (*ContentRepository) GetByUser

func (r *ContentRepository) GetByUser(ctx context.Context, userID int, limit int, offset int) ([]*contentdomain.Content, error)

func (*ContentRepository) GetPublished

func (r *ContentRepository) GetPublished(ctx context.Context, limit int, offset int) ([]*contentdomain.Content, error)

func (*ContentRepository) GetPublishedByAuthorUsername

func (r *ContentRepository) GetPublishedByAuthorUsername(ctx context.Context, username string, limit int, offset int) ([]*contentdomain.Content, error)

func (*ContentRepository) GetPublishedByPostType

func (r *ContentRepository) GetPublishedByPostType(ctx context.Context, postType string, limit int, offset int) ([]*contentdomain.Content, error)

func (*ContentRepository) GetPublishedBySlug

func (r *ContentRepository) GetPublishedBySlug(ctx context.Context, slug string, language string) (*contentdomain.Content, error)

func (*ContentRepository) GetPublishedBySlugAny

func (r *ContentRepository) GetPublishedBySlugAny(ctx context.Context, slug string) (*contentdomain.Content, error)

func (*ContentRepository) GetPublishedByTag

func (r *ContentRepository) GetPublishedByTag(ctx context.Context, tag string, limit int, offset int) ([]*contentdomain.Content, error)

func (*ContentRepository) GetPublishedCustomPostTypes

func (r *ContentRepository) GetPublishedCustomPostTypes(ctx context.Context) ([]string, error)

func (*ContentRepository) GetPublishedPages

func (r *ContentRepository) GetPublishedPages(ctx context.Context) ([]*contentdomain.Content, error)

func (*ContentRepository) GetTranslations

func (r *ContentRepository) GetTranslations(ctx context.Context, translationGroupID int, excludeID int) ([]*contentdomain.Content, error)

func (*ContentRepository) ListByCursor

func (r *ContentRepository) ListByCursor(ctx context.Context, userID int, limit int, beforeID int, filters contentdomain.ContentFilters) ([]*contentdomain.Content, error)

func (*ContentRepository) ListByFilters

func (r *ContentRepository) ListByFilters(ctx context.Context, userID int, filters contentdomain.ContentFilters) ([]*contentdomain.Content, error)

func (*ContentRepository) SearchPublished

func (r *ContentRepository) SearchPublished(ctx context.Context, query string, limit int) ([]*contentdomain.Content, error)

func (*ContentRepository) TranslationGroupExists

func (r *ContentRepository) TranslationGroupExists(ctx context.Context, id int) (bool, error)

func (*ContentRepository) Update

func (r *ContentRepository) Update(ctx context.Context, content *contentdomain.Content) error

type DashboardRepository

type DashboardRepository struct {
	// contains filtered or unexported fields
}

DashboardRepository handles dashboard data operations

func NewDashboardRepository

func NewDashboardRepository(db *sql.DB) *DashboardRepository

NewDashboardRepository creates a new dashboard repository

func (*DashboardRepository) GetStats

func (r *DashboardRepository) GetStats(ctx context.Context, userID int) (*dashboard.Stats, error)

GetStats retrieves aggregated statistics for the dashboard

type MediaFile

type MediaFile struct {
	ID               int            `json:"id"`
	UserID           int            `json:"userId"`
	Filename         string         `json:"filename"`
	OriginalFilename string         `json:"originalFilename"`
	MimeType         string         `json:"mimeType"`
	FileSize         int64          `json:"fileSize"`
	Width            int            `json:"width"`
	Height           int            `json:"height"`
	AltText          string         `json:"altText"`
	IsWebP           bool           `json:"isWebp"`
	FilePath         string         `json:"filePath"`
	URL              string         `json:"url"`
	Hash             string         `json:"hash"`
	Variants         sql.NullString `json:"variants"`
	CreatedAt        time.Time      `json:"createdAt"`
	UpdatedAt        time.Time      `json:"updatedAt"`
}

MediaFile represents a media file in the database

type MediaRepository

type MediaRepository struct {
	// contains filtered or unexported fields
}

MediaRepository handles media data operations

func NewMediaRepository

func NewMediaRepository(db *sql.DB) *MediaRepository

NewMediaRepository creates a new media repository

func (*MediaRepository) Create

func (r *MediaRepository) Create(ctx context.Context, media *mediadomain.Media) error

Create stores a new media file in the database

func (*MediaRepository) DeleteByID

func (r *MediaRepository) DeleteByID(ctx context.Context, id int) error

DeleteByID removes a media file by ID (admin path)

func (*MediaRepository) DeleteByOwner

func (r *MediaRepository) DeleteByOwner(ctx context.Context, id int, userID int) error

DeleteByOwner removes a media file owned by a specific user

func (*MediaRepository) FindAll

func (r *MediaRepository) FindAll(ctx context.Context, limit int, offset int) ([]*mediadomain.Media, error)

FindAll retrieves all media files

func (*MediaRepository) FindAllByDateRange

func (r *MediaRepository) FindAllByDateRange(
	ctx context.Context,
	since time.Time,
	limit int,
	offset int,
) ([]*mediadomain.Media, error)

FindAllByDateRange retrieves media files uploaded since a given date

func (*MediaRepository) FindAllByFilename

func (r *MediaRepository) FindAllByFilename(
	ctx context.Context,
	filename string,
	limit int,
	offset int,
) ([]*mediadomain.Media, error)

FindAllByFilename retrieves media files matching a filename query

func (*MediaRepository) FindAllByFilenameAndDateRange

func (r *MediaRepository) FindAllByFilenameAndDateRange(
	ctx context.Context,
	filename string,
	since time.Time,
	limit int,
	offset int,
) ([]*mediadomain.Media, error)

FindAllByFilenameAndDateRange retrieves media files matching filename and date range

func (*MediaRepository) FindByHash

func (r *MediaRepository) FindByHash(ctx context.Context, hash string) (*mediadomain.Media, error)

FindByHash retrieves a media file by its hash

func (*MediaRepository) FindByHashPrefix

func (r *MediaRepository) FindByHashPrefix(ctx context.Context, prefix string) (*mediadomain.Media, error)

FindByHashPrefix retrieves a media file whose hash starts with the given prefix

func (*MediaRepository) FindByID

func (r *MediaRepository) FindByID(ctx context.Context, id int) (*mediadomain.Media, error)

FindByID retrieves a media file by ID with uploader name

func (*MediaRepository) ListByCursor

func (r *MediaRepository) ListByCursor(ctx context.Context, userID int, limit int, beforeID int) ([]*mediadomain.Media, error)

ListByCursor returns the caller's media in newest-first (id DESC) order using keyset pagination (beforeID <= 0 means first page; otherwise only rows with id < beforeID). It is additive to the offset-based FindAll (the agent v1 list contract is cursor-only). The SELECT column list + row scan are reused from FindAll via mediaColumns/mediaFrom/scanMediaRows.

Jump to

Keyboard shortcuts

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