repository

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: 13 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrAdminNotFound         = errors.New("admin user not found")
	ErrSetupAlreadyCompleted = errors.New("first-login setup has already been completed")
)
View Source
var (
	ErrFailedLoginAttemptNotFound = errors.New("failed login attempt record not found")
)

Functions

func GenerateToken

func GenerateToken() (string, error)

GenerateToken generates a secure random token (32 bytes, hex encoded)

func HashToken

func HashToken(token string) string

HashToken hashes a token using SHA-256

Types

type BlockedEmail

type BlockedEmail struct {
	ID        int
	Email     string
	CreatedAt string
	Reason    string
}

BlockedEmail represents a blocked email entry

type BlockedEmailRepo

type BlockedEmailRepo interface {
	BlockEmail(ctx context.Context, email string, reason string) error
	IsEmailBlocked(ctx context.Context, email string) (bool, error)
	UnblockEmail(ctx context.Context, email string) error
}

BlockedEmailRepo defines the interface for blocked email repository operations

type BlockedEmailRepository

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

BlockedEmailRepository handles blocked email data operations

func NewBlockedEmailRepository

func NewBlockedEmailRepository(db *sql.DB) *BlockedEmailRepository

NewBlockedEmailRepository creates a new blocked email repository

func (*BlockedEmailRepository) BlockEmail

func (r *BlockedEmailRepository) BlockEmail(ctx context.Context, email string, reason string) error

BlockEmail adds an email to the blocked list

func (*BlockedEmailRepository) IsEmailBlocked

func (r *BlockedEmailRepository) IsEmailBlocked(ctx context.Context, email string) (bool, error)

IsEmailBlocked checks if an email is in the blocked list

func (*BlockedEmailRepository) UnblockEmail

func (r *BlockedEmailRepository) UnblockEmail(ctx context.Context, email string) error

UnblockEmail removes an email from the blocked list

type EmailUpdateToken

type EmailUpdateToken struct {
	ID        int
	Token     string
	UserID    int
	NewEmail  string
	ExpiresAt string
	CreatedAt string
}

EmailUpdateToken represents an email update token in the system

type EmailUpdateTokenRepo

type EmailUpdateTokenRepo interface {
	CreateToken(ctx context.Context, token string, userID int, newEmail string) error
	GetToken(ctx context.Context, token string) (*EmailUpdateToken, error)
	DeleteToken(ctx context.Context, tokenID int) error
	CleanUpExpiredTokens(ctx context.Context) error
}

EmailUpdateTokenRepo defines the interface for email update token repository operations

type EmailUpdateTokenRepository

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

EmailUpdateTokenRepository handles email update token data operations

func NewEmailUpdateTokenRepository

func NewEmailUpdateTokenRepository(db *sql.DB) *EmailUpdateTokenRepository

NewEmailUpdateTokenRepository creates a new email update token repository

func (*EmailUpdateTokenRepository) CleanUpExpiredTokens

func (r *EmailUpdateTokenRepository) CleanUpExpiredTokens(ctx context.Context) error

CleanUpExpiredTokens deletes all expired email update tokens

func (*EmailUpdateTokenRepository) CreateToken

func (r *EmailUpdateTokenRepository) CreateToken(ctx context.Context, token string, userID int, newEmail string) error

CreateToken creates a new email update token

func (*EmailUpdateTokenRepository) DeleteToken

func (r *EmailUpdateTokenRepository) DeleteToken(ctx context.Context, tokenID int) error

DeleteToken deletes an email update token by ID

func (*EmailUpdateTokenRepository) GetToken

GetToken retrieves an email update token by token value

type FailedLoginAttempt

type FailedLoginAttempt struct {
	ID              int
	UserID          int
	Attempts        int
	LastAttemptAt   time.Time
	LockedUntil     *time.Time
	LastEmailSentAt *time.Time
	CreatedAt       time.Time
	UpdatedAt       time.Time
}

FailedLoginAttempt represents a failed login attempt record

type FailedLoginAttemptRepo

type FailedLoginAttemptRepo interface {
	GetByUserID(ctx context.Context, userID int) (*FailedLoginAttempt, error)
	Create(ctx context.Context, attempt *FailedLoginAttempt) error
	IncrementAttempts(ctx context.Context, userID int) error
	LockAccount(ctx context.Context, userID int, lockoutDuration time.Duration) error
	ResetAttempts(ctx context.Context, userID int) error
	Delete(ctx context.Context, userID int) error
	IsLocked(ctx context.Context, userID int) (bool, *time.Time, error)
	UpdateLastEmailSent(ctx context.Context, userID int) error
	ShouldSendLockoutEmail(ctx context.Context, userID int, minInterval time.Duration) (bool, error)
}

FailedLoginAttemptRepo defines the interface for failed login attempt repository operations

type FailedLoginAttemptRepository

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

FailedLoginAttemptRepository handles failed login attempt data operations

func NewFailedLoginAttemptRepository

func NewFailedLoginAttemptRepository(db *sql.DB) *FailedLoginAttemptRepository

NewFailedLoginAttemptRepository creates a new failed login attempt repository

func (*FailedLoginAttemptRepository) Create

Create creates a new failed login attempt record

func (*FailedLoginAttemptRepository) Delete

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

Delete removes the failed login attempt record for a user

func (*FailedLoginAttemptRepository) GetByUserID

func (r *FailedLoginAttemptRepository) GetByUserID(ctx context.Context, userID int) (*FailedLoginAttempt, error)

GetByUserID retrieves failed login attempt record by user ID

func (*FailedLoginAttemptRepository) IncrementAttempts

func (r *FailedLoginAttemptRepository) IncrementAttempts(ctx context.Context, userID int) error

IncrementAttempts increments the failed attempt counter for a user

func (*FailedLoginAttemptRepository) IsLocked

func (r *FailedLoginAttemptRepository) IsLocked(ctx context.Context, userID int) (bool, *time.Time, error)

IsLocked checks if a user account is currently locked

func (*FailedLoginAttemptRepository) LockAccount

func (r *FailedLoginAttemptRepository) LockAccount(ctx context.Context, userID int, lockoutDuration time.Duration) error

LockAccount locks an account for a specified duration

func (*FailedLoginAttemptRepository) ResetAttempts

func (r *FailedLoginAttemptRepository) ResetAttempts(ctx context.Context, userID int) error

ResetAttempts resets the failed attempt counter for a user

func (*FailedLoginAttemptRepository) ShouldSendLockoutEmail

func (r *FailedLoginAttemptRepository) ShouldSendLockoutEmail(ctx context.Context, userID int, minInterval time.Duration) (bool, error)

ShouldSendLockoutEmail checks if enough time has passed since the last email was sent

func (*FailedLoginAttemptRepository) UpdateLastEmailSent

func (r *FailedLoginAttemptRepository) UpdateLastEmailSent(ctx context.Context, userID int) error

UpdateLastEmailSent updates the timestamp when the last lockout email was sent

type InMemoryNotificationRepository

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

InMemoryNotificationRepository stores notifications in memory for MVP

func NewInMemoryNotificationRepository

func NewInMemoryNotificationRepository() *InMemoryNotificationRepository

NewInMemoryNotificationRepository creates a new in-memory notification repository

func (*InMemoryNotificationRepository) CreateNotification

func (r *InMemoryNotificationRepository) CreateNotification(ctx context.Context, notificationType NotificationType, message string) error

CreateNotification creates a new notification

func (*InMemoryNotificationRepository) GetNotifications

func (r *InMemoryNotificationRepository) GetNotifications(ctx context.Context, limit int) ([]Notification, error)

GetNotifications retrieves notifications in reverse chronological order

type Notification

type Notification struct {
	ID        int
	Type      NotificationType
	Message   string
	CreatedAt time.Time
}

Notification represents an admin notification

type NotificationRepo

type NotificationRepo interface {
	CreateNotification(ctx context.Context, notificationType NotificationType, message string) error
	GetNotifications(ctx context.Context, limit int) ([]Notification, error)
}

NotificationRepo defines the interface for notification operations

type NotificationType

type NotificationType string

NotificationType represents the type of notification

const (
	NotificationTypeUserRegistered NotificationType = "user_registered"
	NotificationTypeUserVerified   NotificationType = "user_verified"
)

type PasswordResetToken

type PasswordResetToken struct {
	ID        int
	UserID    int
	TokenHash string
	ExpiresAt time.Time
	CreatedAt time.Time
}

PasswordResetToken represents a password reset token in the system

type PasswordResetTokenRepo

type PasswordResetTokenRepo interface {
	CreateToken(ctx context.Context, token *PasswordResetToken) error
	FindValidToken(ctx context.Context, tokenHash string) (*PasswordResetToken, error)
	DeleteUserTokens(ctx context.Context, userID int) error
}

PasswordResetTokenRepo defines the interface for password reset token repository operations

type PasswordResetTokenRepository

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

PasswordResetTokenRepository handles password reset token data operations

func NewPasswordResetTokenRepository

func NewPasswordResetTokenRepository(db *sql.DB) *PasswordResetTokenRepository

NewPasswordResetTokenRepository creates a new password reset token repository

func (*PasswordResetTokenRepository) CreateToken

CreateToken creates a new password reset token

func (*PasswordResetTokenRepository) DeleteUserTokens

func (r *PasswordResetTokenRepository) DeleteUserTokens(ctx context.Context, userID int) error

DeleteUserTokens deletes all password reset tokens for a user

func (*PasswordResetTokenRepository) FindValidToken

func (r *PasswordResetTokenRepository) FindValidToken(ctx context.Context, tokenHash string) (*PasswordResetToken, error)

FindValidToken finds a valid (non-expired) password reset token by hash

type SoftDeleteRepo

type SoftDeleteRepo interface {
	SoftDeleteContent(ctx context.Context, contentType string, contentID int, userID int, deletedBy int, reason string) error
	GetSoftDeletedContentByUser(ctx context.Context, userID int) ([]*SoftDeletedContent, error)
	GetSoftDeletedContentByID(ctx context.Context, id int) (*SoftDeletedContent, error)
	RestoreContent(ctx context.Context, contentType string, contentID int) error
	PermanentDeleteContent(ctx context.Context, contentType string, contentID int) error
}

SoftDeleteRepo defines the interface for soft delete repository operations

type SoftDeleteRepository

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

SoftDeleteRepository handles soft delete data operations

func NewSoftDeleteRepository

func NewSoftDeleteRepository(db *sql.DB) *SoftDeleteRepository

NewSoftDeleteRepository creates a new soft delete repository

func (*SoftDeleteRepository) GetSoftDeletedContentByID

func (r *SoftDeleteRepository) GetSoftDeletedContentByID(ctx context.Context, id int) (*SoftDeletedContent, error)

GetSoftDeletedContentByID retrieves a soft deleted content item by its ID

func (*SoftDeleteRepository) GetSoftDeletedContentByUser

func (r *SoftDeleteRepository) GetSoftDeletedContentByUser(ctx context.Context, userID int) ([]*SoftDeletedContent, error)

GetSoftDeletedContentByUser retrieves all soft deleted content for a user

func (*SoftDeleteRepository) PermanentDeleteContent

func (r *SoftDeleteRepository) PermanentDeleteContent(ctx context.Context, contentType string, contentID int) error

PermanentDeleteContent permanently deletes content (for Story 1.8) This method is a placeholder for future implementation

func (*SoftDeleteRepository) RestoreContent

func (r *SoftDeleteRepository) RestoreContent(ctx context.Context, contentType string, contentID int) error

RestoreContent restores soft deleted content by removing it from the soft delete table

func (*SoftDeleteRepository) SoftDeleteContent

func (r *SoftDeleteRepository) SoftDeleteContent(ctx context.Context, contentType string, contentID int, userID int, deletedBy int, reason string) error

SoftDeleteContent marks content as deleted

type SoftDeletedContent

type SoftDeletedContent struct {
	ID          int
	ContentType string
	ContentID   int
	UserID      int
	DeletedAt   string
	DeletedBy   int
	Reason      sql.NullString
	IsPermanent bool
}

SoftDeletedContent represents a soft deleted content item

type User

type User struct {
	ID             int            `json:"id"`
	Username       string         `json:"username"`
	PasswordHash   string         `json:"-"`
	Email          string         `json:"email"`
	Name           string         `json:"name,omitempty"`
	Role           string         `json:"role"`
	Status         string         `json:"-"`
	ProfilePicture string         `json:"profilePicture,omitempty"`
	LastLoginAt    *string        `json:"lastLoginAt,omitempty"`
	CustomFields   map[string]any `json:"customFields,omitempty"`
	CreatedAt      string         `json:"createdAt"`
	UpdatedAt      string         `json:"updatedAt,omitempty"`
}

User represents a user in the system

type UserCommentItem

type UserCommentItem struct {
	ID            int    `json:"id"`
	ContentItemID int    `json:"contentItemId"`
	Content       string `json:"content"`
	CreatedAt     string `json:"createdAt"`
	UpdatedAt     string `json:"updatedAt"`
}

UserCommentItem represents a comment posted by a user

type UserContentItem

type UserContentItem struct {
	ID        int    `json:"id"`
	Type      string `json:"type"`
	Title     string `json:"title"`
	Slug      string `json:"slug"`
	Content   string `json:"content"`
	Status    string `json:"status"`
	CreatedAt string `json:"createdAt"`
	UpdatedAt string `json:"updatedAt"`
}

UserContentItem represents a content item (post/page) created by a user

type UserDataExport

type UserDataExport struct {
	ExportDate string             `json:"exportDate"`
	User       *User              `json:"user"`
	Content    []*UserContentItem `json:"content"`
	Comments   []*UserCommentItem `json:"comments"`
	Media      []*UserMediaItem   `json:"media"`
}

UserDataExport represents all user data for export

type UserDataExportRepo

type UserDataExportRepo interface {
	GetUserContent(ctx context.Context, userID int) ([]*UserContentItem, error)
	GetUserComments(ctx context.Context, userID int) ([]*UserCommentItem, error)
	GetUserMedia(ctx context.Context, userID int) ([]*UserMediaItem, error)
	GetUserDataForExport(ctx context.Context, userID int) (*UserDataExport, error)
}

UserDataExportRepo defines the interface for user data export repository operations

type UserDataExportRepository

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

UserDataExportRepository handles user data export operations

func NewUserDataExportRepository

func NewUserDataExportRepository(db *sql.DB) *UserDataExportRepository

NewUserDataExportRepository creates a new user data export repository

func (*UserDataExportRepository) GetUserComments

func (r *UserDataExportRepository) GetUserComments(ctx context.Context, userID int) ([]*UserCommentItem, error)

GetUserComments retrieves all comments posted by a user

func (*UserDataExportRepository) GetUserContent

func (r *UserDataExportRepository) GetUserContent(ctx context.Context, userID int) ([]*UserContentItem, error)

GetUserContent retrieves all content items (posts/pages) created by a user

func (*UserDataExportRepository) GetUserDataForExport

func (r *UserDataExportRepository) GetUserDataForExport(ctx context.Context, userID int) (*UserDataExport, error)

GetUserDataForExport aggregates all user data for export

func (*UserDataExportRepository) GetUserMedia

func (r *UserDataExportRepository) GetUserMedia(ctx context.Context, userID int) ([]*UserMediaItem, error)

GetUserMedia retrieves all media files uploaded by a user

type UserDeletionRepo

type UserDeletionRepo interface {
	DeleteUserAccount(ctx context.Context, userID int) error
	DeleteUserTokens(ctx context.Context, userID int) error
	DeleteUserContent(ctx context.Context, userID int) error
	DeleteUserComments(ctx context.Context, userID int) error
	DeleteUserMedia(ctx context.Context, userID int) error
	CountUsersByRoleAndStatus(ctx context.Context, role, status string) (int, error)
	DeleteAllUserData(ctx context.Context, userID int) error
}

UserDeletionRepo defines the interface for user deletion operations

type UserDeletionRepository

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

UserDeletionRepository handles user deletion data operations

func NewUserDeletionRepository

func NewUserDeletionRepository(db *sql.DB) *UserDeletionRepository

NewUserDeletionRepository creates a new user deletion repository

func (*UserDeletionRepository) CountUsersByRoleAndStatus

func (r *UserDeletionRepository) CountUsersByRoleAndStatus(ctx context.Context, role, status string) (int, error)

CountUsersByRoleAndStatus counts users by role and status

func (*UserDeletionRepository) DeleteAllUserData

func (r *UserDeletionRepository) DeleteAllUserData(ctx context.Context, userID int) error

DeleteAllUserData performs a hard delete of all user data within a single transaction

func (*UserDeletionRepository) DeleteUserAccount

func (r *UserDeletionRepository) DeleteUserAccount(ctx context.Context, userID int) error

DeleteUserAccount performs a hard delete of a user account

func (*UserDeletionRepository) DeleteUserComments

func (r *UserDeletionRepository) DeleteUserComments(ctx context.Context, userID int) error

DeleteUserComments deletes all comments posted by a user Note: This is a placeholder for future functionality

func (*UserDeletionRepository) DeleteUserContent

func (r *UserDeletionRepository) DeleteUserContent(ctx context.Context, userID int) error

DeleteUserContent deletes all content (posts, pages) created by a user Note: This is a placeholder for future functionality

func (*UserDeletionRepository) DeleteUserMedia

func (r *UserDeletionRepository) DeleteUserMedia(ctx context.Context, userID int) error

DeleteUserMedia deletes all media files uploaded by a user Note: This is a placeholder for future functionality

func (*UserDeletionRepository) DeleteUserTokens

func (r *UserDeletionRepository) DeleteUserTokens(ctx context.Context, userID int) error

DeleteUserTokens deletes all tokens associated with a user

type UserMediaItem

type UserMediaItem struct {
	ID               int    `json:"id"`
	Filename         string `json:"filename"`
	OriginalFilename string `json:"originalFilename"`
	FilePath         string `json:"filePath"`
	FileSize         int    `json:"fileSize"`
	MimeType         string `json:"mimeType"`
	CreatedAt        string `json:"createdAt"`
}

UserMediaItem represents a media file uploaded by a user

type UserRepo

type UserRepo interface {
	UpdateAdminPasswordAndEmail(ctx context.Context, passwordHash, email, currentPasswordHash string) error
	GetAdminUser(ctx context.Context) (*User, error)
	CreateUser(ctx context.Context, user *User) error
	CheckUsernameExists(ctx context.Context, username string) (bool, error)
	CheckEmailExists(ctx context.Context, email string) (bool, error)
	UpdateUserStatus(ctx context.Context, userID int, status string) error
	UpdateUserStatusIfCurrentStatus(ctx context.Context, userID int, currentStatus string, newStatus string) error
	GetUserByID(ctx context.Context, userID int) (*User, error)
	GetUserByEmail(ctx context.Context, email string) (*User, error)
	GetUserByUsername(ctx context.Context, username string) (*User, error)
	GetPendingUsers(ctx context.Context, limit int, offset int) ([]*User, error)
	DeleteUser(ctx context.Context, userID int) error
	SuspendUser(ctx context.Context, userID int) error
	UnsuspendUser(ctx context.Context, userID int) error
	SoftDeleteUser(ctx context.Context, userID int) error
	GetAllUsers(ctx context.Context, status string, limit int, offset int) ([]*User, error)
	GetUserStatus(ctx context.Context, userID int) (string, error)
	UpdateEmail(ctx context.Context, userID int, email string) error
	UpdatePassword(ctx context.Context, userID int, currentPasswordHash, newPasswordHash string) error
	UpdateLastLoginAt(ctx context.Context, userID int) error
	UpdatePasswordByUserID(ctx context.Context, userID int, newPasswordHash string) error
	UpdateProfile(ctx context.Context, userID int, name string, email string, role string, customFields map[string]any) error
	UpdateCustomFields(ctx context.Context, userID int, customFields map[string]any) error
	CheckEmailExistsForOtherUser(ctx context.Context, userID int, email string) (bool, error)
	UpdateProfilePicture(ctx context.Context, userID int, profilePicture string) error
	DeleteProfilePicture(ctx context.Context, userID int) error
}

UserRepo defines the interface for user repository operations

type UserRepository

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

UserRepository handles user data operations

func NewUserRepository

func NewUserRepository(db *sql.DB) *UserRepository

NewUserRepository creates a new user repository

func (*UserRepository) CheckEmailExists

func (r *UserRepository) CheckEmailExists(ctx context.Context, email string) (bool, error)

CheckEmailExists checks if an email already exists (case-insensitive)

func (*UserRepository) CheckEmailExistsForOtherUser

func (r *UserRepository) CheckEmailExistsForOtherUser(ctx context.Context, userID int, email string) (bool, error)

CheckEmailExistsForOtherUser checks if an email is already in use by a different user

func (*UserRepository) CheckUsernameExists

func (r *UserRepository) CheckUsernameExists(ctx context.Context, username string) (bool, error)

CheckUsernameExists checks if a username already exists (case-insensitive)

func (*UserRepository) CreateUser

func (r *UserRepository) CreateUser(ctx context.Context, user *User) error

CreateUser creates a new user in the database

func (*UserRepository) DeleteProfilePicture

func (r *UserRepository) DeleteProfilePicture(ctx context.Context, userID int) error

DeleteProfilePicture clears a user's profile picture column

func (*UserRepository) DeleteUser

func (r *UserRepository) DeleteUser(ctx context.Context, userID int) error

DeleteUser deletes a user by ID

func (*UserRepository) GetAdminUser

func (r *UserRepository) GetAdminUser(ctx context.Context) (*User, error)

GetAdminUser retrieves the admin user from the database

func (*UserRepository) GetAllUsers

func (r *UserRepository) GetAllUsers(ctx context.Context, status string, limit int, offset int) ([]*User, error)

GetAllUsers retrieves all users with optional status filtering and pagination

func (*UserRepository) GetPendingUsers

func (r *UserRepository) GetPendingUsers(ctx context.Context, limit int, offset int) ([]*User, error)

GetPendingUsers retrieves all users with pending status

func (*UserRepository) GetUserByEmail

func (r *UserRepository) GetUserByEmail(ctx context.Context, email string) (*User, error)

GetUserByEmail retrieves a user by email

func (*UserRepository) GetUserByID

func (r *UserRepository) GetUserByID(ctx context.Context, userID int) (*User, error)

GetUserByID retrieves a user by ID

func (*UserRepository) GetUserByUsername

func (r *UserRepository) GetUserByUsername(ctx context.Context, username string) (*User, error)

GetUserByUsername retrieves a user by username (case-insensitive)

func (*UserRepository) GetUserStatus

func (r *UserRepository) GetUserStatus(ctx context.Context, userID int) (string, error)

GetUserStatus retrieves the current status of a user

func (*UserRepository) SoftDeleteUser

func (r *UserRepository) SoftDeleteUser(ctx context.Context, userID int) error

SoftDeleteUser soft deletes a user by updating their status to 'soft_deleted'

func (*UserRepository) SuspendUser

func (r *UserRepository) SuspendUser(ctx context.Context, userID int) error

SuspendUser suspends a user by updating their status to 'suspended'

func (*UserRepository) UnsuspendUser

func (r *UserRepository) UnsuspendUser(ctx context.Context, userID int) error

UnsuspendUser unsuspends a user by updating their status to 'active'

func (*UserRepository) UpdateAdminPasswordAndEmail

func (r *UserRepository) UpdateAdminPasswordAndEmail(ctx context.Context, passwordHash, email, currentPasswordHash string) error

UpdateAdminPasswordAndEmail updates the admin user's password and email. Uses optimistic locking via currentPasswordHash to prevent concurrent setup completion.

func (*UserRepository) UpdateCustomFields

func (r *UserRepository) UpdateCustomFields(
	ctx context.Context,
	userID int,
	customFields map[string]any,
) error

UpdateCustomFields updates only the custom_fields JSON column for a user

func (*UserRepository) UpdateEmail

func (r *UserRepository) UpdateEmail(ctx context.Context, userID int, email string) error

UpdateEmail updates a user's email address

func (*UserRepository) UpdateLastLoginAt

func (r *UserRepository) UpdateLastLoginAt(ctx context.Context, userID int) error

UpdateLastLoginAt updates the last login timestamp for a user

func (*UserRepository) UpdatePassword

func (r *UserRepository) UpdatePassword(ctx context.Context, userID int, currentPasswordHash, newPasswordHash string) error

UpdatePassword updates a user's password, validating the current password first

func (*UserRepository) UpdatePasswordByUserID

func (r *UserRepository) UpdatePasswordByUserID(ctx context.Context, userID int, newPasswordHash string) error

UpdatePasswordByUserID updates a user's password by user ID (no current password check)

func (*UserRepository) UpdateProfile

func (r *UserRepository) UpdateProfile(
	ctx context.Context,
	userID int,
	name string,
	email string,
	role string,
	customFields map[string]any,
) error

UpdateProfile updates a user's profile fields (name, email, role, custom_fields)

func (*UserRepository) UpdateProfilePicture

func (r *UserRepository) UpdateProfilePicture(ctx context.Context, userID int, profilePicture string) error

UpdateProfilePicture updates a user's profile picture filename

func (*UserRepository) UpdateUserStatus

func (r *UserRepository) UpdateUserStatus(ctx context.Context, userID int, status string) error

UpdateUserStatus updates a user's status

func (*UserRepository) UpdateUserStatusIfCurrentStatus

func (r *UserRepository) UpdateUserStatusIfCurrentStatus(ctx context.Context, userID int, currentStatus string, newStatus string) error

UpdateUserStatusIfCurrentStatus atomically updates a user's status only if they currently have the specified status This prevents TOCTOU race conditions by performing the check and update in a single atomic operation

type VerificationToken

type VerificationToken struct {
	ID        int
	UserID    int
	TokenHash string
	ExpiresAt time.Time
	CreatedAt time.Time
}

VerificationToken represents a verification token in the system

type VerificationTokenRepo

type VerificationTokenRepo interface {
	CreateToken(ctx context.Context, token *VerificationToken) error
	FindValidToken(ctx context.Context, tokenHash string) (*VerificationToken, error)
	DeleteUserTokens(ctx context.Context, userID int) error
	DeleteExpiredTokens(ctx context.Context) error
}

VerificationTokenRepo defines the interface for verification token repository operations

type VerificationTokenRepository

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

VerificationTokenRepository handles verification token data operations

func NewVerificationTokenRepository

func NewVerificationTokenRepository(db *sql.DB) *VerificationTokenRepository

NewVerificationTokenRepository creates a new verification token repository

func (*VerificationTokenRepository) CreateToken

CreateToken creates a new verification token

func (*VerificationTokenRepository) DeleteExpiredTokens

func (r *VerificationTokenRepository) DeleteExpiredTokens(ctx context.Context) error

DeleteExpiredTokens deletes all expired tokens

func (*VerificationTokenRepository) DeleteUserTokens

func (r *VerificationTokenRepository) DeleteUserTokens(ctx context.Context, userID int) error

DeleteUserTokens deletes all tokens for a user

func (*VerificationTokenRepository) FindValidToken

func (r *VerificationTokenRepository) FindValidToken(ctx context.Context, tokenHash string) (*VerificationToken, error)

FindValidToken finds a valid (non-expired) verification token by hash

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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