store

package
v1.7.0 Latest Latest
Warning

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

Go to latest
Published: Mar 15, 2026 License: GPL-3.0 Imports: 12 Imported by: 0

Documentation

Overview

Package store provides database access for minimaldoc-server. Supports PostgreSQL and SQLite backends.

Package store — repository interface definitions. Pattern: repository interface per domain aggregate.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type AnalyticsStore

type AnalyticsStore interface {
	RecordPageView(ctx context.Context, siteID, path, referrer, country, deviceType, browser, os, sessionHash string) error
	GetPageViewStats(ctx context.Context, siteID string, since time.Time) (totalViews int64, uniqueSessions int64, err error)
	GetPageViewStatsExtended(ctx context.Context, siteID string, since time.Time) (totalViews, uniqueSessions int64, avgDuration float64, err error)
	UpdatePageViewDuration(ctx context.Context, siteID, path, sessionHash string, duration int) error
	UpdatePageViewDurationAndBounce(ctx context.Context, siteID, path, sessionHash string, duration int, isBounce *bool) error
	GetBounceRate(ctx context.Context, siteID string, since time.Time) (float64, error)
	GetTopPages(ctx context.Context, siteID string, since time.Time, limit int) ([]struct {
		Path  string
		Views int64
	}, error)
	GetTrafficSources(ctx context.Context, siteID string, since time.Time, limit int) ([]TrafficSource, error)
	GetDailyViews(ctx context.Context, siteID string, days int) ([]DailyViewCount, error)
}

AnalyticsStore handles page view tracking and statistics.

type AuditLog

type AuditLog struct {
	ID         string
	SiteID     string
	UserID     sql.NullString
	UserEmail  string
	Action     string
	EntityType string
	EntityID   sql.NullString
	EntityName sql.NullString
	Details    sql.NullString
	IPAddress  sql.NullString
	UserAgent  sql.NullString
	CreatedAt  string
}

AuditLog represents an audit log entry for admin actions.

type AuditLogStats

type AuditLogStats struct {
	Total    int
	Today    int
	ThisWeek int
}

AuditLogStats holds aggregate counts for audit logs.

type AuditStore

type AuditStore interface {
	CreateAuditLog(ctx context.Context, id, siteID, userID, userEmail, action, entityType, entityID, entityName, details, ipAddress, userAgent string) error
	ListAuditLogs(ctx context.Context, siteID, action, entityType string, limit, offset int) ([]AuditLog, int, error)
	GetAuditLogStats(ctx context.Context, siteID string) (*AuditLogStats, error)
	GetAuditLogEntityTypes(ctx context.Context, siteID string) ([]string, error)
}

AuditStore handles audit log operations.

type BlogComment

type BlogComment struct {
	ID          string
	SiteID      string
	PostID      string
	ParentID    sql.NullString
	AuthorName  string
	AuthorEmail string
	Content     string
	Status      string
	IPAddress   sql.NullString
	UserAgent   sql.NullString
	CreatedAt   string
	ModeratedAt sql.NullString
	ModeratedBy sql.NullString
	// Joined fields
	ModeratorName sql.NullString
	Replies       []BlogComment
}

BlogComment represents a blog comment.

type BlogPost

type BlogPost struct {
	ID            string         `json:"id"`
	SiteID        string         `json:"site_id"`
	AuthorID      sql.NullString `json:"author_id"`
	Slug          string         `json:"slug"`
	Title         string         `json:"title"`
	Description   sql.NullString `json:"description"`
	Content       string         `json:"content"`
	FeaturedImage sql.NullString `json:"featured_image"`
	Tags          string         `json:"tags"`
	Category      sql.NullString `json:"category"`
	Status        string         `json:"status"`
	Visibility    string         `json:"visibility"`
	PublishedAt   sql.NullString `json:"published_at"`
	ScheduledAt   sql.NullString `json:"scheduled_at"`
	CreatedAt     string         `json:"created_at"`
	UpdatedAt     string         `json:"updated_at"`
	AuthorName    sql.NullString `json:"author_name"`
	AuthorEmail   sql.NullString `json:"author_email"`
}

BlogPost represents a blog post.

type BlogStore

type BlogStore interface {
	CreateBlogPost(ctx context.Context, id, siteID, authorID, slug, title, description, content, featuredImage, tags, category, visibility string) (*BlogPost, error)
	GetBlogPostByID(ctx context.Context, id string) (*BlogPost, error)
	GetBlogPostBySlug(ctx context.Context, siteID, slug string) (*BlogPost, error)
	UpdateBlogPost(ctx context.Context, id, slug, title, description, content, featuredImage, tags, category, visibility string) error
	DeleteBlogPost(ctx context.Context, id string) error
	ListBlogPosts(ctx context.Context, siteID string, status string, limit, offset int) ([]BlogPost, error)
	ListPublishedBlogPosts(ctx context.Context, siteID string, limit, offset int) ([]BlogPost, error)
	ListPublishedBlogPostsFiltered(ctx context.Context, siteID, category, tag, search string, limit, offset int) ([]BlogPost, int64, error)
	GetRelatedPosts(ctx context.Context, siteID, excludeID, category, tags string, limit int) ([]BlogPost, error)
	GetBlogPostStats(ctx context.Context, siteID string) (total, published, draft int64, err error)
	PublishBlogPost(ctx context.Context, id string) error
	UnpublishBlogPost(ctx context.Context, id string) error
	ScheduleBlogPost(ctx context.Context, id, scheduledAt string) error
	ClearSchedule(ctx context.Context, id string) error
	GetScheduledPosts(ctx context.Context) ([]BlogPost, error)
	PublishScheduledPosts(ctx context.Context) (int64, error)

	// Comments
	CreateBlogComment(ctx context.Context, id, siteID, postID, parentID, authorName, authorEmail, content, ipAddress, userAgent string) (*BlogComment, error)
	GetBlogCommentByID(ctx context.Context, id string) (*BlogComment, error)
	ListBlogComments(ctx context.Context, siteID string, status string, limit, offset int) ([]BlogComment, error)
	ListApprovedComments(ctx context.Context, postID string, limit, offset int) ([]BlogComment, error)
	ListPendingComments(ctx context.Context, siteID string, limit, offset int) ([]BlogComment, error)
	ModerateComment(ctx context.Context, id, status, moderatorID string) error
	DeleteBlogComment(ctx context.Context, id string) error
	GetCommentStats(ctx context.Context, siteID string) (total, pending, approved int64, err error)
}

BlogStore handles blog posts and comments.

type DB

type DB struct {
	*sql.DB
	// contains filtered or unexported fields
}

DB wraps the database connection and provides query methods.

func New

func New(cfg config.DatabaseConfig) (*DB, error)

New creates a new database connection.

func (*DB) AddTagToTopic

func (db *DB) AddTagToTopic(ctx context.Context, topicID, tagID string) error

func (*DB) AwardBadge

func (db *DB) AwardBadge(ctx context.Context, id, siteID, userID, badgeID, awardedBy string) error

func (*DB) CheckDocAccess

func (db *DB) CheckDocAccess(ctx context.Context, siteID, path string) (*DocAccess, error)

CheckDocAccess checks if a path matches any access rule and returns the required role. Returns nil if the path is not protected.

func (*DB) CleanExpiredSessions

func (db *DB) CleanExpiredSessions(ctx context.Context) (int64, error)

func (*DB) ClearSchedule

func (db *DB) ClearSchedule(ctx context.Context, id string) error

ClearSchedule removes the scheduled time from a post.

func (*DB) CountSubscribers

func (db *DB) CountSubscribers(ctx context.Context, siteID string, verifiedOnly bool) (int64, error)

func (*DB) CountUserApprovedTopics

func (db *DB) CountUserApprovedTopics(ctx context.Context, siteID, userID string) (int64, error)

CountUserApprovedTopics returns the number of published topics by a user.

func (*DB) CountUserPostsToday

func (db *DB) CountUserPostsToday(ctx context.Context, siteID, userID string) (int64, error)

CountUserPostsToday returns the number of posts created by a user today.

func (*DB) CountUserTopicsToday

func (db *DB) CountUserTopicsToday(ctx context.Context, siteID, userID string) (int64, error)

CountUserTopicsToday returns the number of topics created by a user today.

func (*DB) CountUsers

func (db *DB) CountUsers(ctx context.Context, siteID string) (int, error)

func (*DB) CountUsersByRole

func (db *DB) CountUsersByRole(ctx context.Context, siteID, role string) (int, error)

func (*DB) CreateAuditLog

func (db *DB) CreateAuditLog(ctx context.Context, id, siteID, userID, userEmail, action, entityType, entityID, entityName, details, ipAddress, userAgent string) error

CreateAuditLog creates a new audit log entry.

func (*DB) CreateBlogComment

func (db *DB) CreateBlogComment(ctx context.Context, id, siteID, postID, parentID, authorName, authorEmail, content, ipAddress, userAgent string) (*BlogComment, error)

func (*DB) CreateBlogPost

func (db *DB) CreateBlogPost(ctx context.Context, id, siteID, authorID, slug, title, description, content, featuredImage, tags, category, visibility string) (*BlogPost, error)

func (*DB) CreateDocAccess

func (db *DB) CreateDocAccess(ctx context.Context, id, siteID, pathPattern, requiredRole, description string) (*DocAccess, error)

func (*DB) CreateForumBadge

func (db *DB) CreateForumBadge(ctx context.Context, id, siteID, slug, name, description, icon, color, criteria, tier string, isManual bool) (*ForumBadge, error)

func (*DB) CreateForumBan

func (db *DB) CreateForumBan(ctx context.Context, id, siteID, userID, bannedBy, reason, expiresAt string, isPermanent bool) error

func (*DB) CreateForumBookmark

func (db *DB) CreateForumBookmark(ctx context.Context, id, siteID, userID, topicID string) error

func (*DB) CreateForumCategory

func (db *DB) CreateForumCategory(ctx context.Context, id, siteID, parentID, slug, name, description, color, icon string, position int) (*ForumCategory, error)

func (*DB) CreateForumFlag

func (db *DB) CreateForumFlag(ctx context.Context, id, siteID, reporterID, topicID, postID, reason, description string) error

func (*DB) CreateForumNotification

func (db *DB) CreateForumNotification(ctx context.Context, id, siteID, userID, notifType, title, message, topicID, postID, actorID string) error

func (*DB) CreateForumPost

func (db *DB) CreateForumPost(ctx context.Context, id, siteID, topicID, parentID, authorID, content string) (*ForumPost, error)

func (*DB) CreateForumSubscription

func (db *DB) CreateForumSubscription(ctx context.Context, id, siteID, userID, topicID, categoryID, level string) error

func (*DB) CreateForumTag

func (db *DB) CreateForumTag(ctx context.Context, id, siteID, slug, name, description, color string) (*ForumTag, error)

func (*DB) CreateForumTopic

func (db *DB) CreateForumTopic(ctx context.Context, id, siteID, categoryID, authorID, slug, title, content, status string) (*ForumTopic, error)

func (*DB) CreateSession

func (db *DB) CreateSession(ctx context.Context, id, userID, tokenHash, ipAddress, userAgent string, expiresAt time.Time) error

func (*DB) CreateSite

func (db *DB) CreateSite(ctx context.Context, id, name, domain, apiKeyHash string) (*Site, error)

func (*DB) CreateSubscriber

func (db *DB) CreateSubscriber(ctx context.Context, id, siteID, email, verifyToken string) error

func (*DB) CreateUpload

func (db *DB) CreateUpload(ctx context.Context, id, siteID, userID, filename, mimeType string, sizeBytes int64, storagePath, url string) (*Upload, error)

CreateUpload stores upload metadata.

func (*DB) CreateUser

func (db *DB) CreateUser(ctx context.Context, id, siteID, email, passwordHash, role, name string) (*User, error)

func (*DB) CreateUserWithOAuth

func (db *DB) CreateUserWithOAuth(ctx context.Context, id, siteID, email, oauthProvider, oauthID, name, avatarURL, role string) (*User, error)

CreateUserWithOAuth creates a new user with OAuth credentials.

func (*DB) CreateUserWithVerification

func (db *DB) CreateUserWithVerification(ctx context.Context, id, siteID, email, passwordHash, role, name, verifyToken string) (*User, error)

CreateUserWithVerification creates a new user with a verification token.

func (*DB) CreateVerifiedSubscriber

func (db *DB) CreateVerifiedSubscriber(ctx context.Context, id, siteID, email, provider, displayName string) error

CreateVerifiedSubscriber inserts or upgrades a subscriber as OAuth-verified. ON CONFLICT upgrades an existing email-only subscriber to OAuth-verified.

func (*DB) DeleteBlogComment

func (db *DB) DeleteBlogComment(ctx context.Context, id string) error

func (*DB) DeleteBlogPost

func (db *DB) DeleteBlogPost(ctx context.Context, id string) error

func (*DB) DeleteDocAccess

func (db *DB) DeleteDocAccess(ctx context.Context, id string) error

func (*DB) DeleteForumBadge

func (db *DB) DeleteForumBadge(ctx context.Context, id string) error

func (*DB) DeleteForumBan

func (db *DB) DeleteForumBan(ctx context.Context, siteID, userID string) error

func (*DB) DeleteForumBookmark

func (db *DB) DeleteForumBookmark(ctx context.Context, userID, topicID string) error

func (*DB) DeleteForumCategory

func (db *DB) DeleteForumCategory(ctx context.Context, id string) error

func (*DB) DeleteForumPost

func (db *DB) DeleteForumPost(ctx context.Context, id string) error

func (*DB) DeleteForumSubscription

func (db *DB) DeleteForumSubscription(ctx context.Context, userID, topicID, categoryID string) error

func (*DB) DeleteForumTag

func (db *DB) DeleteForumTag(ctx context.Context, id string) error

func (*DB) DeleteForumTopic

func (db *DB) DeleteForumTopic(ctx context.Context, id string) error

func (*DB) DeleteSession

func (db *DB) DeleteSession(ctx context.Context, tokenHash string) error

func (*DB) DeleteSite

func (db *DB) DeleteSite(ctx context.Context, id string) error

func (*DB) DeleteUpload

func (db *DB) DeleteUpload(ctx context.Context, id string) error

DeleteUpload removes an upload record.

func (*DB) DeleteUser

func (db *DB) DeleteUser(ctx context.Context, id string) error

func (*DB) DeleteUserSessions

func (db *DB) DeleteUserSessions(ctx context.Context, userID string) error

func (*DB) Driver

func (db *DB) Driver() string

Driver returns the database driver name.

func (*DB) GetAuditLogEntityTypes

func (db *DB) GetAuditLogEntityTypes(ctx context.Context, siteID string) ([]string, error)

GetAuditLogEntityTypes returns distinct entity types in the audit log for filtering.

func (*DB) GetAuditLogStats

func (db *DB) GetAuditLogStats(ctx context.Context, siteID string) (*AuditLogStats, error)

GetAuditLogStats returns aggregate counts for audit logs.

func (*DB) GetBlogCommentByID

func (db *DB) GetBlogCommentByID(ctx context.Context, id string) (*BlogComment, error)

func (*DB) GetBlogPostByID

func (db *DB) GetBlogPostByID(ctx context.Context, id string) (*BlogPost, error)

func (*DB) GetBlogPostBySlug

func (db *DB) GetBlogPostBySlug(ctx context.Context, siteID, slug string) (*BlogPost, error)

func (*DB) GetBlogPostStats

func (db *DB) GetBlogPostStats(ctx context.Context, siteID string) (total, published, draft int64, err error)

func (*DB) GetBounceRate

func (db *DB) GetBounceRate(ctx context.Context, siteID string, since time.Time) (float64, error)

func (*DB) GetCommentStats

func (db *DB) GetCommentStats(ctx context.Context, siteID string) (total, pending, approved int64, err error)

func (*DB) GetDailyViews

func (db *DB) GetDailyViews(ctx context.Context, siteID string, days int) ([]DailyViewCount, error)

func (*DB) GetDocAccessByID

func (db *DB) GetDocAccessByID(ctx context.Context, id string) (*DocAccess, error)

func (*DB) GetEventStats

func (db *DB) GetEventStats(ctx context.Context, siteID string, since time.Time) ([]EventStat, error)

GetEventStats returns event counts grouped by name for a site since a given time.

func (*DB) GetEventsByName

func (db *DB) GetEventsByName(ctx context.Context, siteID, name string, limit, offset int) ([]Event, error)

GetEventsByName returns events with a specific name for a site.

func (*DB) GetForumBadgeByID

func (db *DB) GetForumBadgeByID(ctx context.Context, id string) (*ForumBadge, error)

func (*DB) GetForumBan

func (db *DB) GetForumBan(ctx context.Context, siteID, userID string) (*ForumBan, error)

func (*DB) GetForumCategoryByID

func (db *DB) GetForumCategoryByID(ctx context.Context, id string) (*ForumCategory, error)

func (*DB) GetForumCategoryBySlug

func (db *DB) GetForumCategoryBySlug(ctx context.Context, siteID, slug string) (*ForumCategory, error)

func (*DB) GetForumFlagByID

func (db *DB) GetForumFlagByID(ctx context.Context, id string) (*ForumFlag, error)

func (*DB) GetForumLeaderboard

func (db *DB) GetForumLeaderboard(ctx context.Context, siteID string, limit int) ([]ForumUserStats, error)

func (*DB) GetForumPostByID

func (db *DB) GetForumPostByID(ctx context.Context, id string) (*ForumPost, error)

func (*DB) GetForumStats

func (db *DB) GetForumStats(ctx context.Context, siteID string) (categories, topics, posts, users int64, err error)

func (*DB) GetForumTagByID

func (db *DB) GetForumTagByID(ctx context.Context, id string) (*ForumTag, error)

func (*DB) GetForumTagBySlug

func (db *DB) GetForumTagBySlug(ctx context.Context, siteID, slug string) (*ForumTag, error)

func (*DB) GetForumTopicByID

func (db *DB) GetForumTopicByID(ctx context.Context, id string) (*ForumTopic, error)

func (*DB) GetForumTopicBySlug

func (db *DB) GetForumTopicBySlug(ctx context.Context, siteID, slug string) (*ForumTopic, error)

func (*DB) GetOrCreateForumUserStats

func (db *DB) GetOrCreateForumUserStats(ctx context.Context, id, siteID, userID string) (*ForumUserStats, error)

func (*DB) GetPageViewStats

func (db *DB) GetPageViewStats(ctx context.Context, siteID string, since time.Time) (totalViews int64, uniqueSessions int64, err error)

func (*DB) GetPageViewStatsExtended

func (db *DB) GetPageViewStatsExtended(ctx context.Context, siteID string, since time.Time) (totalViews, uniqueSessions int64, avgDuration float64, err error)

func (*DB) GetRatingStats

func (db *DB) GetRatingStats(ctx context.Context, siteID string) (avgRating float64, totalRatings int64, err error)

func (*DB) GetRatingStatsExtended

func (db *DB) GetRatingStatsExtended(ctx context.Context, siteID string) (avgRating float64, totalRatings, withComments, thisWeek int64, err error)

func (*DB) GetRatingsByPath

func (db *DB) GetRatingsByPath(ctx context.Context, siteID, path string) (avgRating float64, count int64, err error)

func (*DB) GetRelatedPosts

func (db *DB) GetRelatedPosts(ctx context.Context, siteID, excludeID, category, tags string, limit int) ([]BlogPost, error)

GetRelatedPosts returns posts related by category or tags (public only).

func (*DB) GetReputationHistory

func (db *DB) GetReputationHistory(ctx context.Context, userID string, limit, offset int) ([]ForumReputationLog, error)

func (*DB) GetScheduledPosts

func (db *DB) GetScheduledPosts(ctx context.Context) ([]BlogPost, error)

GetScheduledPosts returns posts that are due to be published.

func (*DB) GetSessionByToken

func (db *DB) GetSessionByToken(ctx context.Context, tokenHash string) (*Session, error)

func (*DB) GetSiteByAPIKey

func (db *DB) GetSiteByAPIKey(ctx context.Context, apiKeyHash string) (*Site, error)

func (*DB) GetSiteByID

func (db *DB) GetSiteByID(ctx context.Context, id string) (*Site, error)

func (*DB) GetSubscriberByEmail

func (db *DB) GetSubscriberByEmail(ctx context.Context, siteID, email string) (*Subscriber, error)

func (*DB) GetSubscriberByToken

func (db *DB) GetSubscriberByToken(ctx context.Context, siteID, token string) (*Subscriber, error)

func (*DB) GetSubscriberStatsExtended

func (db *DB) GetSubscriberStatsExtended(ctx context.Context, siteID string) (total, verified, pending, thisMonth int64, err error)

func (*DB) GetTopPages

func (db *DB) GetTopPages(ctx context.Context, siteID string, since time.Time, limit int) ([]struct {
	Path  string
	Views int64
}, error)

func (*DB) GetTopicSubscribers

func (db *DB) GetTopicSubscribers(ctx context.Context, topicID string) ([]string, error)

func (*DB) GetTopicTags

func (db *DB) GetTopicTags(ctx context.Context, topicID string) ([]ForumTag, error)

func (*DB) GetTotalEventCount

func (db *DB) GetTotalEventCount(ctx context.Context, siteID string, since time.Time) (int64, error)

GetTotalEventCount returns the total number of events for a site since a given time.

func (*DB) GetTrafficSources

func (db *DB) GetTrafficSources(ctx context.Context, siteID string, since time.Time, limit int) ([]TrafficSource, error)

func (*DB) GetUniqueEventNames

func (db *DB) GetUniqueEventNames(ctx context.Context, siteID string, since time.Time) (int64, error)

GetUniqueEventNames returns the count of unique event names for a site since a given time.

func (*DB) GetUnreadNotificationCount

func (db *DB) GetUnreadNotificationCount(ctx context.Context, userID string) (int64, error)

func (*DB) GetUpload

func (db *DB) GetUpload(ctx context.Context, id string) (*Upload, error)

GetUpload retrieves an upload by ID.

func (*DB) GetUserBadges

func (db *DB) GetUserBadges(ctx context.Context, userID string) ([]ForumUserBadge, error)

func (*DB) GetUserByEmail

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

func (*DB) GetUserByID

func (db *DB) GetUserByID(ctx context.Context, id string) (*User, error)

func (*DB) GetUserByOAuth

func (db *DB) GetUserByOAuth(ctx context.Context, provider, providerID string) (*User, error)

func (*DB) GetUserByVerifyToken

func (db *DB) GetUserByVerifyToken(ctx context.Context, token string) (*User, error)

GetUserByVerifyToken finds a user by their verification token.

func (*DB) HasUserBadge

func (db *DB) HasUserBadge(ctx context.Context, userID, badgeID string) (bool, error)

func (*DB) HasUserBookmarkedTopic

func (db *DB) HasUserBookmarkedTopic(ctx context.Context, userID, topicID string) (bool, error)

func (*DB) HasUserLikedPost

func (db *DB) HasUserLikedPost(ctx context.Context, userID, postID string) (bool, error)

func (*DB) HasUserLikedTopic

func (db *DB) HasUserLikedTopic(ctx context.Context, userID, topicID string) (bool, error)

func (*DB) IncrementForumTopicViews

func (db *DB) IncrementForumTopicViews(ctx context.Context, id string) error

func (*DB) IncrementForumUserStats

func (db *DB) IncrementForumUserStats(ctx context.Context, siteID, userID, field string, delta int) error

func (*DB) IsPostgres

func (db *DB) IsPostgres() bool

IsPostgres returns true if using PostgreSQL.

func (*DB) IsSQLite

func (db *DB) IsSQLite() bool

IsSQLite returns true if using SQLite.

func (*DB) IsUserBanned

func (db *DB) IsUserBanned(ctx context.Context, siteID, userID string) (bool, error)

func (*DB) LikeForumPost

func (db *DB) LikeForumPost(ctx context.Context, id, siteID, userID, postID string) error

func (*DB) LikeForumTopic

func (db *DB) LikeForumTopic(ctx context.Context, id, siteID, userID, topicID string) error

func (*DB) LinkOAuthToUser

func (db *DB) LinkOAuthToUser(ctx context.Context, userID, oauthProvider, oauthID string) error

LinkOAuthToUser links OAuth credentials to an existing user.

func (*DB) ListApprovedComments

func (db *DB) ListApprovedComments(ctx context.Context, postID string, limit, offset int) ([]BlogComment, error)

func (*DB) ListAuditLogs

func (db *DB) ListAuditLogs(ctx context.Context, siteID, action, entityType string, limit, offset int) ([]AuditLog, int, error)

ListAuditLogs returns audit logs with optional filtering and pagination.

func (*DB) ListBlogComments

func (db *DB) ListBlogComments(ctx context.Context, siteID string, status string, limit, offset int) ([]BlogComment, error)

func (*DB) ListBlogPosts

func (db *DB) ListBlogPosts(ctx context.Context, siteID string, status string, limit, offset int) ([]BlogPost, error)

func (*DB) ListDocAccess

func (db *DB) ListDocAccess(ctx context.Context, siteID string) ([]DocAccess, error)

func (*DB) ListForumBadges

func (db *DB) ListForumBadges(ctx context.Context, siteID string) ([]ForumBadge, error)

func (*DB) ListForumBans

func (db *DB) ListForumBans(ctx context.Context, siteID string, limit, offset int) ([]ForumBan, int64, error)

func (*DB) ListForumCategories

func (db *DB) ListForumCategories(ctx context.Context, siteID string) ([]ForumCategory, error)

func (*DB) ListForumFlags

func (db *DB) ListForumFlags(ctx context.Context, siteID, status string, limit, offset int) ([]ForumFlag, int64, error)

func (*DB) ListForumNotifications

func (db *DB) ListForumNotifications(ctx context.Context, userID string, unreadOnly bool, limit, offset int) ([]ForumNotification, error)

func (*DB) ListForumPosts

func (db *DB) ListForumPosts(ctx context.Context, topicID string, limit, offset int) ([]ForumPost, int64, error)

func (*DB) ListForumTags

func (db *DB) ListForumTags(ctx context.Context, siteID string) ([]ForumTag, error)

func (*DB) ListForumTopics

func (db *DB) ListForumTopics(ctx context.Context, siteID, categoryID, status, search string, limit, offset int) ([]ForumTopic, int64, error)

func (*DB) ListForumTopicsByTag

func (db *DB) ListForumTopicsByTag(ctx context.Context, siteID, tagID string, limit, offset int) ([]ForumTopic, int64, error)

func (*DB) ListPendingComments

func (db *DB) ListPendingComments(ctx context.Context, siteID string, limit, offset int) ([]BlogComment, error)

func (*DB) ListPublishedBlogPosts

func (db *DB) ListPublishedBlogPosts(ctx context.Context, siteID string, limit, offset int) ([]BlogPost, error)

func (*DB) ListPublishedBlogPostsFiltered

func (db *DB) ListPublishedBlogPostsFiltered(ctx context.Context, siteID, category, tag, search string, limit, offset int) ([]BlogPost, int64, error)

ListPublishedBlogPostsFiltered returns published public posts with filtering and pagination.

func (*DB) ListRatings

func (db *DB) ListRatings(ctx context.Context, siteID string, limit, offset int) ([]Rating, error)

func (*DB) ListRecentEvents

func (db *DB) ListRecentEvents(ctx context.Context, siteID string, limit int) ([]Event, error)

ListRecentEvents returns the most recent events for a site.

func (*DB) ListSites

func (db *DB) ListSites(ctx context.Context) ([]Site, error)

func (*DB) ListSubscribers

func (db *DB) ListSubscribers(ctx context.Context, siteID string, verifiedOnly bool) ([]Subscriber, error)

func (*DB) ListUploads

func (db *DB) ListUploads(ctx context.Context, siteID, userID string, limit, offset int) ([]Upload, error)

ListUploads returns uploads for a site, optionally filtered by user.

func (*DB) ListUserBookmarks

func (db *DB) ListUserBookmarks(ctx context.Context, userID string, limit, offset int) ([]ForumBookmark, error)

func (*DB) ListUsers

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

func (*DB) LogReputationChange

func (db *DB) LogReputationChange(ctx context.Context, id, siteID, userID, action string, points int, topicID, postID, badgeID, note string) error

func (*DB) MarkAllNotificationsRead

func (db *DB) MarkAllNotificationsRead(ctx context.Context, userID string) error

func (*DB) MarkNotificationRead

func (db *DB) MarkNotificationRead(ctx context.Context, id string) error

func (*DB) MarkPostAsSolution

func (db *DB) MarkPostAsSolution(ctx context.Context, postID, topicID string) error

func (*DB) Migrate

func (db *DB) Migrate() error

Migrate runs database migrations using embedded SQL files.

func (*DB) ModerateComment

func (db *DB) ModerateComment(ctx context.Context, id, status, moderatorID string) error

func (*DB) PinForumTopic

func (db *DB) PinForumTopic(ctx context.Context, id string, pinned bool) error

func (*DB) Ping

func (db *DB) Ping(ctx context.Context) error

Ping verifies the database connection is alive.

func (*DB) PublishBlogPost

func (db *DB) PublishBlogPost(ctx context.Context, id string) error

func (*DB) PublishScheduledPosts

func (db *DB) PublishScheduledPosts(ctx context.Context) (int64, error)

PublishScheduledPosts publishes all posts that are due.

func (*DB) RecordEvent

func (db *DB) RecordEvent(ctx context.Context, siteID, name, category, path, value, sessionHash string) error

RecordEvent stores a custom analytics event.

func (*DB) RecordPageView

func (db *DB) RecordPageView(ctx context.Context, siteID, path, referrer, country, deviceType, browser, os, sessionHash string) error

func (*DB) RecordRating

func (db *DB) RecordRating(ctx context.Context, siteID, path string, rating int, feedback, sessionHash string) error

func (*DB) RemoveTagFromTopic

func (db *DB) RemoveTagFromTopic(ctx context.Context, topicID, tagID string) error

func (*DB) ResolveForumFlag

func (db *DB) ResolveForumFlag(ctx context.Context, id, status, resolverID, resolutionNote string) error

func (*DB) RevokeBadge

func (db *DB) RevokeBadge(ctx context.Context, userID, badgeID string) error

func (*DB) ScheduleBlogPost

func (db *DB) ScheduleBlogPost(ctx context.Context, id, scheduledAt string) error

ScheduleBlogPost sets a future publish time for a post.

func (*DB) SearchForum

func (db *DB) SearchForum(ctx context.Context, siteID, query string, limit, offset int) ([]ForumTopic, int64, error)

func (*DB) UnlikeForumPost

func (db *DB) UnlikeForumPost(ctx context.Context, userID, postID string) error

func (*DB) UnlikeForumTopic

func (db *DB) UnlikeForumTopic(ctx context.Context, userID, topicID string) error

func (*DB) UnpublishBlogPost

func (db *DB) UnpublishBlogPost(ctx context.Context, id string) error

func (*DB) UnsubscribeByEmail

func (db *DB) UnsubscribeByEmail(ctx context.Context, siteID, email string) error

func (*DB) UpdateBlogPost

func (db *DB) UpdateBlogPost(ctx context.Context, id, slug, title, description, content, featuredImage, tags, category, visibility string) error

func (*DB) UpdateDocAccess

func (db *DB) UpdateDocAccess(ctx context.Context, id, pathPattern, requiredRole, description string) error

func (*DB) UpdateForumBadge

func (db *DB) UpdateForumBadge(ctx context.Context, id, slug, name, description, icon, color, criteria, tier string, isManual bool) error

func (*DB) UpdateForumCategory

func (db *DB) UpdateForumCategory(ctx context.Context, id, slug, name, description, color, icon string, position int, isLocked bool) error

func (*DB) UpdateForumPost

func (db *DB) UpdateForumPost(ctx context.Context, id, content, editorID string) error

func (*DB) UpdateForumSubscription

func (db *DB) UpdateForumSubscription(ctx context.Context, userID, topicID, categoryID, level string) error

func (*DB) UpdateForumTag

func (db *DB) UpdateForumTag(ctx context.Context, id, slug, name, description, color string) error

func (*DB) UpdateForumTopic

func (db *DB) UpdateForumTopic(ctx context.Context, id, title, content string) error

func (*DB) UpdateForumTopicStatus

func (db *DB) UpdateForumTopicStatus(ctx context.Context, id, status string) error

func (*DB) UpdateForumUserLastSeen

func (db *DB) UpdateForumUserLastSeen(ctx context.Context, siteID, userID string) error

func (*DB) UpdatePageViewDuration

func (db *DB) UpdatePageViewDuration(ctx context.Context, siteID, path, sessionHash string, duration int) error

func (*DB) UpdatePageViewDurationAndBounce

func (db *DB) UpdatePageViewDurationAndBounce(ctx context.Context, siteID, path, sessionHash string, duration int, isBounce *bool) error

func (*DB) UpdateSite

func (db *DB) UpdateSite(ctx context.Context, id, name, domain string) error

func (*DB) UpdateSiteAPIKey

func (db *DB) UpdateSiteAPIKey(ctx context.Context, siteID, newAPIKeyHash string) error

func (*DB) UpdateUser

func (db *DB) UpdateUser(ctx context.Context, id, email, role, name string) error

func (*DB) UpdateUserLastLogin

func (db *DB) UpdateUserLastLogin(ctx context.Context, userID string) error

func (*DB) UpdateUserPassword

func (db *DB) UpdateUserPassword(ctx context.Context, id, passwordHash string) error

func (*DB) VerifySubscriber

func (db *DB) VerifySubscriber(ctx context.Context, siteID, token string) error

func (*DB) VerifyUserEmail

func (db *DB) VerifyUserEmail(ctx context.Context, userID string) error

VerifyUserEmail marks a user's email as verified and clears the token.

type DailyViewCount

type DailyViewCount struct {
	Date  string
	Views int64
}

DailyViewCount represents page views for a single day

type DocAccess

type DocAccess struct {
	ID           string
	SiteID       string
	PathPattern  string
	RequiredRole string
	Description  sql.NullString
	CreatedAt    string
	UpdatedAt    string
}

DocAccess represents an access rule for protected documentation paths.

type DocsStore

type DocsStore interface {
	CreateDocAccess(ctx context.Context, id, siteID, pathPattern, requiredRole, description string) (*DocAccess, error)
	GetDocAccessByID(ctx context.Context, id string) (*DocAccess, error)
	ListDocAccess(ctx context.Context, siteID string) ([]DocAccess, error)
	UpdateDocAccess(ctx context.Context, id, pathPattern, requiredRole, description string) error
	DeleteDocAccess(ctx context.Context, id string) error
	CheckDocAccess(ctx context.Context, siteID, path string) (*DocAccess, error)
}

DocsStore handles private documentation access rules.

type Event

type Event struct {
	ID          int64
	SiteID      string
	Name        string
	Category    sql.NullString
	Path        sql.NullString
	Value       sql.NullString
	SessionHash sql.NullString
	CreatedAt   string
}

Event represents a custom analytics event.

type EventStat

type EventStat struct {
	Name  string
	Count int64
}

EventStat represents aggregated event counts.

type EventStore

type EventStore interface {
	RecordEvent(ctx context.Context, siteID, name, category, path, value, sessionHash string) error
	GetEventStats(ctx context.Context, siteID string, since time.Time) ([]EventStat, error)
	GetEventsByName(ctx context.Context, siteID, name string, limit, offset int) ([]Event, error)
	ListRecentEvents(ctx context.Context, siteID string, limit int) ([]Event, error)
	GetTotalEventCount(ctx context.Context, siteID string, since time.Time) (int64, error)
	GetUniqueEventNames(ctx context.Context, siteID string, since time.Time) (int64, error)
}

EventStore handles custom analytics events.

type FeedbackStore

type FeedbackStore interface {
	RecordRating(ctx context.Context, siteID, path string, rating int, feedback, sessionHash string) error
	GetRatingStats(ctx context.Context, siteID string) (avgRating float64, totalRatings int64, err error)
	GetRatingStatsExtended(ctx context.Context, siteID string) (avgRating float64, totalRatings, withComments, thisWeek int64, err error)
	GetRatingsByPath(ctx context.Context, siteID, path string) (avgRating float64, count int64, err error)
	ListRatings(ctx context.Context, siteID string, limit, offset int) ([]Rating, error)
}

FeedbackStore handles user feedback and ratings.

type ForumBadge

type ForumBadge struct {
	ID          string
	SiteID      string
	Slug        string
	Name        string
	Description sql.NullString
	Icon        sql.NullString
	Color       sql.NullString
	Criteria    sql.NullString
	Tier        string
	IsManual    bool
	CreatedAt   string
}

ForumBadge represents a badge definition.

type ForumBan

type ForumBan struct {
	ID          string
	SiteID      string
	UserID      string
	BannedBy    sql.NullString
	Reason      string
	ExpiresAt   sql.NullString
	IsPermanent bool
	CreatedAt   string
	// Joined fields
	UserName   sql.NullString
	UserEmail  sql.NullString
	BannerName sql.NullString
}

ForumBan represents a user ban.

type ForumBookmark

type ForumBookmark struct {
	ID        string
	SiteID    string
	UserID    string
	TopicID   string
	CreatedAt string
	// Joined fields
	TopicTitle sql.NullString
	TopicSlug  sql.NullString
}

ForumBookmark represents a saved topic.

type ForumCategory

type ForumCategory struct {
	ID          string
	SiteID      string
	ParentID    sql.NullString
	Slug        string
	Name        string
	Description sql.NullString
	Color       sql.NullString
	Icon        sql.NullString
	Position    int
	IsLocked    bool
	CreatedAt   string
	UpdatedAt   string
	// Joined/computed fields
	TopicCount int64
	PostCount  int64
	Children   []ForumCategory
}

ForumCategory represents a forum category.

type ForumFlag

type ForumFlag struct {
	ID             string
	SiteID         string
	ReporterID     sql.NullString
	TopicID        sql.NullString
	PostID         sql.NullString
	Reason         string
	Description    sql.NullString
	Status         string
	ResolvedBy     sql.NullString
	ResolvedAt     sql.NullString
	ResolutionNote sql.NullString
	CreatedAt      string
	// Joined fields
	ReporterName sql.NullString
	ResolverName sql.NullString
	TopicTitle   sql.NullString
	PostContent  sql.NullString
}

ForumFlag represents a content report.

type ForumLike

type ForumLike struct {
	ID        string
	SiteID    string
	UserID    string
	TopicID   sql.NullString
	PostID    sql.NullString
	CreatedAt string
}

ForumLike represents a like on a topic or post.

type ForumMention

type ForumMention struct {
	ID          string
	SiteID      string
	UserID      string
	MentionedBy string
	TopicID     sql.NullString
	PostID      sql.NullString
	IsRead      bool
	CreatedAt   string
	// Joined fields
	MentionerName sql.NullString
	TopicTitle    sql.NullString
}

ForumMention represents an @mention.

type ForumNotification

type ForumNotification struct {
	ID        string
	SiteID    string
	UserID    string
	Type      string
	Title     string
	Message   sql.NullString
	TopicID   sql.NullString
	PostID    sql.NullString
	ActorID   sql.NullString
	IsRead    bool
	CreatedAt string
	// Joined fields
	ActorName   sql.NullString
	ActorAvatar sql.NullString
	TopicSlug   sql.NullString
}

ForumNotification represents an in-app notification.

type ForumPost

type ForumPost struct {
	ID         string
	SiteID     string
	TopicID    string
	ParentID   sql.NullString
	AuthorID   sql.NullString
	Content    string
	LikeCount  int64
	IsSolution bool
	EditedAt   sql.NullString
	EditedBy   sql.NullString
	CreatedAt  string
	UpdatedAt  string
	// Joined fields
	AuthorName   sql.NullString
	AuthorEmail  sql.NullString
	AuthorAvatar sql.NullString
	EditorName   sql.NullString
	IsLiked      bool
	Replies      []ForumPost
}

ForumPost represents a forum reply.

type ForumReputationLog

type ForumReputationLog struct {
	ID        string
	SiteID    string
	UserID    string
	Action    string
	Points    int
	TopicID   sql.NullString
	PostID    sql.NullString
	BadgeID   sql.NullString
	Note      sql.NullString
	CreatedAt string
}

ForumReputationLog represents a reputation point entry.

type ForumStore

type ForumStore interface {
	// Categories
	CreateForumCategory(ctx context.Context, id, siteID, parentID, slug, name, description, color, icon string, position int) (*ForumCategory, error)
	GetForumCategoryByID(ctx context.Context, id string) (*ForumCategory, error)
	GetForumCategoryBySlug(ctx context.Context, siteID, slug string) (*ForumCategory, error)
	ListForumCategories(ctx context.Context, siteID string) ([]ForumCategory, error)
	UpdateForumCategory(ctx context.Context, id, slug, name, description, color, icon string, position int, isLocked bool) error
	DeleteForumCategory(ctx context.Context, id string) error

	// Topics
	CreateForumTopic(ctx context.Context, id, siteID, categoryID, authorID, slug, title, content, status string) (*ForumTopic, error)
	GetForumTopicByID(ctx context.Context, id string) (*ForumTopic, error)
	GetForumTopicBySlug(ctx context.Context, siteID, slug string) (*ForumTopic, error)
	ListForumTopics(ctx context.Context, siteID, categoryID, status, search string, limit, offset int) ([]ForumTopic, int64, error)
	ListForumTopicsByTag(ctx context.Context, siteID, tagID string, limit, offset int) ([]ForumTopic, int64, error)
	UpdateForumTopic(ctx context.Context, id, title, content string) error
	UpdateForumTopicStatus(ctx context.Context, id, status string) error
	PinForumTopic(ctx context.Context, id string, pinned bool) error
	IncrementForumTopicViews(ctx context.Context, id string) error
	DeleteForumTopic(ctx context.Context, id string) error

	// Posts
	CreateForumPost(ctx context.Context, id, siteID, topicID, parentID, authorID, content string) (*ForumPost, error)
	GetForumPostByID(ctx context.Context, id string) (*ForumPost, error)
	ListForumPosts(ctx context.Context, topicID string, limit, offset int) ([]ForumPost, int64, error)
	UpdateForumPost(ctx context.Context, id, content, editorID string) error
	MarkPostAsSolution(ctx context.Context, postID, topicID string) error
	DeleteForumPost(ctx context.Context, id string) error

	// Tags
	CreateForumTag(ctx context.Context, id, siteID, slug, name, description, color string) (*ForumTag, error)
	GetForumTagByID(ctx context.Context, id string) (*ForumTag, error)
	GetForumTagBySlug(ctx context.Context, siteID, slug string) (*ForumTag, error)
	ListForumTags(ctx context.Context, siteID string) ([]ForumTag, error)
	UpdateForumTag(ctx context.Context, id, slug, name, description, color string) error
	DeleteForumTag(ctx context.Context, id string) error
	AddTagToTopic(ctx context.Context, topicID, tagID string) error
	RemoveTagFromTopic(ctx context.Context, topicID, tagID string) error
	GetTopicTags(ctx context.Context, topicID string) ([]ForumTag, error)

	// Likes
	LikeForumTopic(ctx context.Context, id, siteID, userID, topicID string) error
	UnlikeForumTopic(ctx context.Context, userID, topicID string) error
	LikeForumPost(ctx context.Context, id, siteID, userID, postID string) error
	UnlikeForumPost(ctx context.Context, userID, postID string) error
	HasUserLikedTopic(ctx context.Context, userID, topicID string) (bool, error)
	HasUserLikedPost(ctx context.Context, userID, postID string) (bool, error)

	// Bookmarks
	CreateForumBookmark(ctx context.Context, id, siteID, userID, topicID string) error
	DeleteForumBookmark(ctx context.Context, userID, topicID string) error
	HasUserBookmarkedTopic(ctx context.Context, userID, topicID string) (bool, error)
	ListUserBookmarks(ctx context.Context, userID string, limit, offset int) ([]ForumBookmark, error)

	// Subscriptions
	CreateForumSubscription(ctx context.Context, id, siteID, userID, topicID, categoryID, level string) error
	UpdateForumSubscription(ctx context.Context, userID, topicID, categoryID, level string) error
	DeleteForumSubscription(ctx context.Context, userID, topicID, categoryID string) error
	GetTopicSubscribers(ctx context.Context, topicID string) ([]string, error)

	// Notifications
	CreateForumNotification(ctx context.Context, id, siteID, userID, notifType, title, message, topicID, postID, actorID string) error
	ListForumNotifications(ctx context.Context, userID string, unreadOnly bool, limit, offset int) ([]ForumNotification, error)
	MarkNotificationRead(ctx context.Context, id string) error
	MarkAllNotificationsRead(ctx context.Context, userID string) error
	GetUnreadNotificationCount(ctx context.Context, userID string) (int64, error)

	// Flags
	CreateForumFlag(ctx context.Context, id, siteID, reporterID, topicID, postID, reason, description string) error
	GetForumFlagByID(ctx context.Context, id string) (*ForumFlag, error)
	ListForumFlags(ctx context.Context, siteID, status string, limit, offset int) ([]ForumFlag, int64, error)
	ResolveForumFlag(ctx context.Context, id, status, resolverID, resolutionNote string) error

	// Bans
	CreateForumBan(ctx context.Context, id, siteID, userID, bannedBy, reason, expiresAt string, isPermanent bool) error
	GetForumBan(ctx context.Context, siteID, userID string) (*ForumBan, error)
	IsUserBanned(ctx context.Context, siteID, userID string) (bool, error)
	ListForumBans(ctx context.Context, siteID string, limit, offset int) ([]ForumBan, int64, error)
	DeleteForumBan(ctx context.Context, siteID, userID string) error

	// User stats
	GetOrCreateForumUserStats(ctx context.Context, id, siteID, userID string) (*ForumUserStats, error)
	UpdateForumUserLastSeen(ctx context.Context, siteID, userID string) error
	IncrementForumUserStats(ctx context.Context, siteID, userID, field string, delta int) error
	GetForumLeaderboard(ctx context.Context, siteID string, limit int) ([]ForumUserStats, error)

	// Badges
	CreateForumBadge(ctx context.Context, id, siteID, slug, name, description, icon, color, criteria, tier string, isManual bool) (*ForumBadge, error)
	GetForumBadgeByID(ctx context.Context, id string) (*ForumBadge, error)
	ListForumBadges(ctx context.Context, siteID string) ([]ForumBadge, error)
	UpdateForumBadge(ctx context.Context, id, slug, name, description, icon, color, criteria, tier string, isManual bool) error
	DeleteForumBadge(ctx context.Context, id string) error
	AwardBadge(ctx context.Context, id, siteID, userID, badgeID, awardedBy string) error
	RevokeBadge(ctx context.Context, userID, badgeID string) error
	HasUserBadge(ctx context.Context, userID, badgeID string) (bool, error)
	GetUserBadges(ctx context.Context, userID string) ([]ForumUserBadge, error)

	// Reputation
	LogReputationChange(ctx context.Context, id, siteID, userID, action string, points int, topicID, postID, badgeID, note string) error
	GetReputationHistory(ctx context.Context, userID string, limit, offset int) ([]ForumReputationLog, error)

	// Stats and search
	GetForumStats(ctx context.Context, siteID string) (categories, topics, posts, users int64, err error)
	SearchForum(ctx context.Context, siteID, query string, limit, offset int) ([]ForumTopic, int64, error)
	CountUserTopicsToday(ctx context.Context, siteID, userID string) (int64, error)
	CountUserApprovedTopics(ctx context.Context, siteID, userID string) (int64, error)
	CountUserPostsToday(ctx context.Context, siteID, userID string) (int64, error)
}

ForumStore handles all forum operations.

type ForumSubscription

type ForumSubscription struct {
	ID         string
	SiteID     string
	UserID     string
	TopicID    sql.NullString
	CategoryID sql.NullString
	Level      string
	CreatedAt  string
}

ForumSubscription represents a topic/category subscription.

type ForumTag

type ForumTag struct {
	ID          string
	SiteID      string
	Slug        string
	Name        string
	Description sql.NullString
	Color       sql.NullString
	UsageCount  int64
	CreatedAt   string
}

ForumTag represents a forum tag.

type ForumTopic

type ForumTopic struct {
	ID             string
	SiteID         string
	CategoryID     sql.NullString
	AuthorID       sql.NullString
	Slug           string
	Title          string
	Content        string
	Status         string
	IsPinned       bool
	IsSolved       bool
	SolutionPostID sql.NullString
	ViewCount      int64
	LikeCount      int64
	PostCount      int64
	LastPostAt     sql.NullString
	LastPostBy     sql.NullString
	CreatedAt      string
	UpdatedAt      string
	// Joined fields
	AuthorName     sql.NullString
	AuthorEmail    sql.NullString
	AuthorAvatar   sql.NullString
	CategoryName   sql.NullString
	CategorySlug   sql.NullString
	LastPostAuthor sql.NullString
	Tags           []ForumTag
	IsLiked        bool
	IsBookmarked   bool
}

ForumTopic represents a forum discussion thread.

type ForumUserBadge

type ForumUserBadge struct {
	ID        string
	SiteID    string
	UserID    string
	BadgeID   string
	AwardedBy sql.NullString
	AwardedAt string
	// Joined fields
	BadgeName  sql.NullString
	BadgeIcon  sql.NullString
	BadgeColor sql.NullString
	BadgeTier  sql.NullString
}

ForumUserBadge represents a badge awarded to a user.

type ForumUserStats

type ForumUserStats struct {
	ID                string
	SiteID            string
	UserID            string
	Reputation        int64
	TopicCount        int64
	PostCount         int64
	LikeReceivedCount int64
	LikeGivenCount    int64
	SolutionCount     int64
	LastSeenAt        sql.NullString
	CreatedAt         string
	UpdatedAt         string
	// Joined fields
	UserName   sql.NullString
	UserEmail  sql.NullString
	UserAvatar sql.NullString
	Badges     []ForumUserBadge
}

ForumUserStats represents user reputation and stats.

type NewsletterStore

type NewsletterStore interface {
	CreateSubscriber(ctx context.Context, id, siteID, email, verifyToken string) error
	CreateVerifiedSubscriber(ctx context.Context, id, siteID, email, provider, displayName string) error
	GetSubscriberByEmail(ctx context.Context, siteID, email string) (*Subscriber, error)
	GetSubscriberByToken(ctx context.Context, siteID, token string) (*Subscriber, error)
	VerifySubscriber(ctx context.Context, siteID, token string) error
	UnsubscribeByEmail(ctx context.Context, siteID, email string) error
	ListSubscribers(ctx context.Context, siteID string, verifiedOnly bool) ([]Subscriber, error)
	CountSubscribers(ctx context.Context, siteID string, verifiedOnly bool) (int64, error)
	GetSubscriberStatsExtended(ctx context.Context, siteID string) (total, verified, pending, thisMonth int64, err error)
}

NewsletterStore handles newsletter subscriptions.

type PageView

type PageView struct {
	ID          int64
	SiteID      string
	Path        string
	Referrer    sql.NullString
	Country     sql.NullString
	DeviceType  sql.NullString
	Browser     sql.NullString
	OS          sql.NullString
	SessionHash sql.NullString
	CreatedAt   string
}

PageView represents an analytics page view.

type Rating

type Rating struct {
	ID          int64
	SiteID      string
	Path        string
	Rating      int
	Feedback    sql.NullString
	SessionHash sql.NullString
	CreatedAt   string
}

Rating represents page feedback.

type Session

type Session struct {
	ID        string
	UserID    string
	TokenHash string
	IPAddress sql.NullString
	UserAgent sql.NullString
	ExpiresAt string
	CreatedAt string
}

Session represents a user session.

type SessionStore

type SessionStore interface {
	CreateSession(ctx context.Context, id, userID, tokenHash, ipAddress, userAgent string, expiresAt time.Time) error
	GetSessionByToken(ctx context.Context, tokenHash string) (*Session, error)
	DeleteSession(ctx context.Context, tokenHash string) error
	DeleteUserSessions(ctx context.Context, userID string) error
	CleanExpiredSessions(ctx context.Context) (int64, error)
}

SessionStore handles user session management.

type Site

type Site struct {
	ID        string
	Name      string
	Domain    sql.NullString
	APIKey    string
	Config    string
	CreatedAt string // SQLite returns string
	UpdatedAt string
}

Site represents a registered site.

type SiteStore

type SiteStore interface {
	CreateSite(ctx context.Context, id, name, domain, apiKeyHash string) (*Site, error)
	GetSiteByID(ctx context.Context, id string) (*Site, error)
	GetSiteByAPIKey(ctx context.Context, apiKeyHash string) (*Site, error)
	ListSites(ctx context.Context) ([]Site, error)
	UpdateSite(ctx context.Context, id, name, domain string) error
	UpdateSiteAPIKey(ctx context.Context, siteID, newAPIKeyHash string) error
	DeleteSite(ctx context.Context, id string) error
}

SiteStore handles multi-tenant site management.

type Store

Store composes all domain repositories with core database operations.

type Subscriber

type Subscriber struct {
	ID               string
	SiteID           string
	Email            string
	Verified         bool
	VerifyToken      sql.NullString
	VerifySentAt     sql.NullString
	SubscribedAt     string
	UnsubscribedAt   sql.NullString
	OAuthProvider    string
	OAuthDisplayName string
	VerifiedVia      string
}

Subscriber represents a newsletter subscriber.

type TrafficSource

type TrafficSource struct {
	Source string
	Visits int64
}

TrafficSource represents aggregated referrer data

type Upload

type Upload struct {
	ID          string
	SiteID      string
	UserID      string
	Filename    string
	MimeType    string
	SizeBytes   int64
	StoragePath string
	URL         string
	CreatedAt   string
}

Upload represents an uploaded file.

type UploadStore

type UploadStore interface {
	CreateUpload(ctx context.Context, id, siteID, userID, filename, mimeType string, sizeBytes int64, storagePath, url string) (*Upload, error)
	GetUpload(ctx context.Context, id string) (*Upload, error)
	DeleteUpload(ctx context.Context, id string) error
	ListUploads(ctx context.Context, siteID, userID string, limit, offset int) ([]Upload, error)
}

UploadStore handles file upload metadata.

type User

type User struct {
	ID            string
	SiteID        string
	Email         string
	PasswordHash  sql.NullString
	Role          string
	OAuthProvider sql.NullString
	OAuthID       sql.NullString
	Name          sql.NullString
	AvatarURL     sql.NullString
	EmailVerified bool
	VerifyToken   sql.NullString
	CreatedAt     string
	UpdatedAt     string
	LastLoginAt   sql.NullString
}

User represents a user account.

func (*User) ToAuthInfo

func (u *User) ToAuthInfo() *auth.UserInfo

Helper to create user info from DB user

type UserStore

type UserStore interface {
	CreateUser(ctx context.Context, id, siteID, email, passwordHash, role, name string) (*User, error)
	GetUserByID(ctx context.Context, id string) (*User, error)
	GetUserByEmail(ctx context.Context, siteID, email string) (*User, error)
	GetUserByOAuth(ctx context.Context, provider, providerID string) (*User, error)
	ListUsers(ctx context.Context, siteID string) ([]User, error)
	UpdateUserLastLogin(ctx context.Context, userID string) error
	DeleteUser(ctx context.Context, id string) error
	UpdateUser(ctx context.Context, id, email, role, name string) error
	UpdateUserPassword(ctx context.Context, id, passwordHash string) error
	CountUsers(ctx context.Context, siteID string) (int, error)
	CountUsersByRole(ctx context.Context, siteID, role string) (int, error)
	CreateUserWithVerification(ctx context.Context, id, siteID, email, passwordHash, role, name, verifyToken string) (*User, error)
	GetUserByVerifyToken(ctx context.Context, token string) (*User, error)
	VerifyUserEmail(ctx context.Context, userID string) error
	CreateUserWithOAuth(ctx context.Context, id, siteID, email, oauthProvider, oauthID, name, avatarURL, role string) (*User, error)
	LinkOAuthToUser(ctx context.Context, userID, oauthProvider, oauthID string) error
}

UserStore handles user account management.

Jump to

Keyboard shortcuts

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