Documentation
¶
Index ¶
- Variables
- func GenerateToken() (string, error)
- func HashToken(token string) string
- type BlockedEmail
- type BlockedEmailRepo
- type BlockedEmailRepository
- type EmailUpdateToken
- type EmailUpdateTokenRepo
- type EmailUpdateTokenRepository
- func (r *EmailUpdateTokenRepository) CleanUpExpiredTokens(ctx context.Context) error
- func (r *EmailUpdateTokenRepository) CreateToken(ctx context.Context, token string, userID int, newEmail string) error
- func (r *EmailUpdateTokenRepository) DeleteToken(ctx context.Context, tokenID int) error
- func (r *EmailUpdateTokenRepository) GetToken(ctx context.Context, token string) (*EmailUpdateToken, error)
- type FailedLoginAttempt
- type FailedLoginAttemptRepo
- type FailedLoginAttemptRepository
- func (r *FailedLoginAttemptRepository) Create(ctx context.Context, attempt *FailedLoginAttempt) error
- func (r *FailedLoginAttemptRepository) Delete(ctx context.Context, userID int) error
- func (r *FailedLoginAttemptRepository) GetByUserID(ctx context.Context, userID int) (*FailedLoginAttempt, error)
- func (r *FailedLoginAttemptRepository) IncrementAttempts(ctx context.Context, userID int) error
- func (r *FailedLoginAttemptRepository) IsLocked(ctx context.Context, userID int) (bool, *time.Time, error)
- func (r *FailedLoginAttemptRepository) LockAccount(ctx context.Context, userID int, lockoutDuration time.Duration) error
- func (r *FailedLoginAttemptRepository) ResetAttempts(ctx context.Context, userID int) error
- func (r *FailedLoginAttemptRepository) ShouldSendLockoutEmail(ctx context.Context, userID int, minInterval time.Duration) (bool, error)
- func (r *FailedLoginAttemptRepository) UpdateLastEmailSent(ctx context.Context, userID int) error
- type InMemoryNotificationRepository
- type Notification
- type NotificationRepo
- type NotificationType
- type PasswordResetToken
- type PasswordResetTokenRepo
- type PasswordResetTokenRepository
- func (r *PasswordResetTokenRepository) CreateToken(ctx context.Context, token *PasswordResetToken) error
- func (r *PasswordResetTokenRepository) DeleteUserTokens(ctx context.Context, userID int) error
- func (r *PasswordResetTokenRepository) FindValidToken(ctx context.Context, tokenHash string) (*PasswordResetToken, error)
- type SoftDeleteRepo
- type SoftDeleteRepository
- func (r *SoftDeleteRepository) GetSoftDeletedContentByID(ctx context.Context, id int) (*SoftDeletedContent, error)
- func (r *SoftDeleteRepository) GetSoftDeletedContentByUser(ctx context.Context, userID int) ([]*SoftDeletedContent, error)
- func (r *SoftDeleteRepository) PermanentDeleteContent(ctx context.Context, contentType string, contentID int) error
- func (r *SoftDeleteRepository) RestoreContent(ctx context.Context, contentType string, contentID int) error
- func (r *SoftDeleteRepository) SoftDeleteContent(ctx context.Context, contentType string, contentID int, userID int, ...) error
- type SoftDeletedContent
- type User
- type UserCommentItem
- type UserContentItem
- type UserDataExport
- type UserDataExportRepo
- type UserDataExportRepository
- func (r *UserDataExportRepository) GetUserComments(ctx context.Context, userID int) ([]*UserCommentItem, error)
- func (r *UserDataExportRepository) GetUserContent(ctx context.Context, userID int) ([]*UserContentItem, error)
- func (r *UserDataExportRepository) GetUserDataForExport(ctx context.Context, userID int) (*UserDataExport, error)
- func (r *UserDataExportRepository) GetUserMedia(ctx context.Context, userID int) ([]*UserMediaItem, error)
- type UserDeletionRepo
- type UserDeletionRepository
- func (r *UserDeletionRepository) CountUsersByRoleAndStatus(ctx context.Context, role, status string) (int, error)
- func (r *UserDeletionRepository) DeleteAllUserData(ctx context.Context, userID int) error
- func (r *UserDeletionRepository) DeleteUserAccount(ctx context.Context, userID int) error
- func (r *UserDeletionRepository) DeleteUserComments(ctx context.Context, userID int) error
- func (r *UserDeletionRepository) DeleteUserContent(ctx context.Context, userID int) error
- func (r *UserDeletionRepository) DeleteUserMedia(ctx context.Context, userID int) error
- func (r *UserDeletionRepository) DeleteUserTokens(ctx context.Context, userID int) error
- type UserMediaItem
- type UserRepo
- type UserRepository
- func (r *UserRepository) CheckEmailExists(ctx context.Context, email string) (bool, error)
- func (r *UserRepository) CheckEmailExistsForOtherUser(ctx context.Context, userID int, email string) (bool, error)
- func (r *UserRepository) CheckUsernameExists(ctx context.Context, username string) (bool, error)
- func (r *UserRepository) CreateUser(ctx context.Context, user *User) error
- func (r *UserRepository) DeleteProfilePicture(ctx context.Context, userID int) error
- func (r *UserRepository) DeleteUser(ctx context.Context, userID int) error
- func (r *UserRepository) GetAdminUser(ctx context.Context) (*User, error)
- func (r *UserRepository) GetAllUsers(ctx context.Context, status string, limit int, offset int) ([]*User, error)
- func (r *UserRepository) GetPendingUsers(ctx context.Context, limit int, offset int) ([]*User, error)
- func (r *UserRepository) GetUserByEmail(ctx context.Context, email string) (*User, error)
- func (r *UserRepository) GetUserByID(ctx context.Context, userID int) (*User, error)
- func (r *UserRepository) GetUserByUsername(ctx context.Context, username string) (*User, error)
- func (r *UserRepository) GetUserStatus(ctx context.Context, userID int) (string, error)
- func (r *UserRepository) SoftDeleteUser(ctx context.Context, userID int) error
- func (r *UserRepository) SuspendUser(ctx context.Context, userID int) error
- func (r *UserRepository) UnsuspendUser(ctx context.Context, userID int) error
- func (r *UserRepository) UpdateAdminPasswordAndEmail(ctx context.Context, passwordHash, email, currentPasswordHash string) error
- func (r *UserRepository) UpdateCustomFields(ctx context.Context, userID int, customFields map[string]any) error
- func (r *UserRepository) UpdateEmail(ctx context.Context, userID int, email string) error
- func (r *UserRepository) UpdateLastLoginAt(ctx context.Context, userID int) error
- func (r *UserRepository) UpdatePassword(ctx context.Context, userID int, currentPasswordHash, newPasswordHash string) error
- func (r *UserRepository) UpdatePasswordByUserID(ctx context.Context, userID int, newPasswordHash string) error
- func (r *UserRepository) UpdateProfile(ctx context.Context, userID int, name string, email string, role string, ...) error
- func (r *UserRepository) UpdateProfilePicture(ctx context.Context, userID int, profilePicture string) error
- func (r *UserRepository) UpdateUserStatus(ctx context.Context, userID int, status string) error
- func (r *UserRepository) UpdateUserStatusIfCurrentStatus(ctx context.Context, userID int, currentStatus string, newStatus string) error
- type VerificationToken
- type VerificationTokenRepo
- type VerificationTokenRepository
- func (r *VerificationTokenRepository) CreateToken(ctx context.Context, token *VerificationToken) error
- func (r *VerificationTokenRepository) DeleteExpiredTokens(ctx context.Context) error
- func (r *VerificationTokenRepository) DeleteUserTokens(ctx context.Context, userID int) error
- func (r *VerificationTokenRepository) FindValidToken(ctx context.Context, tokenHash string) (*VerificationToken, error)
Constants ¶
This section is empty.
Variables ¶
var ( ErrAdminNotFound = errors.New("admin user not found") ErrSetupAlreadyCompleted = errors.New("first-login setup has already been completed") )
var (
ErrFailedLoginAttemptNotFound = errors.New("failed login attempt record not found")
)
Functions ¶
func GenerateToken ¶
GenerateToken generates a secure random token (32 bytes, hex encoded)
Types ¶
type BlockedEmail ¶
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 ¶
BlockEmail adds an email to the blocked list
func (*BlockedEmailRepository) IsEmailBlocked ¶
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 ¶
func (r *EmailUpdateTokenRepository) GetToken(ctx context.Context, token string) (*EmailUpdateToken, error)
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 ¶
func (r *FailedLoginAttemptRepository) Create(ctx context.Context, attempt *FailedLoginAttempt) error
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 ¶
func (r *PasswordResetTokenRepository) CreateToken(ctx context.Context, token *PasswordResetToken) error
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
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 ¶
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 ¶
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 ¶
GetUserByEmail retrieves a user by email
func (*UserRepository) GetUserByID ¶
GetUserByID retrieves a user by ID
func (*UserRepository) GetUserByUsername ¶
GetUserByUsername retrieves a user by username (case-insensitive)
func (*UserRepository) GetUserStatus ¶
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 ¶
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 ¶
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 ¶
func (r *VerificationTokenRepository) CreateToken(ctx context.Context, token *VerificationToken) error
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