package repository import ( "context" "git.techease.ru/Smart-search/smart-search-back/internal/model" "github.com/google/uuid" "github.com/jackc/pgx/v5" ) type UserRepository interface { FindByEmailHash(ctx context.Context, emailHash string) (*model.User, error) FindByID(ctx context.Context, userID int) (*model.User, error) Create(ctx context.Context, user *model.User) error CreateTx(ctx context.Context, tx pgx.Tx, user *model.User) error UpdateBalance(ctx context.Context, userID int, delta float64) error UpdateBalanceTx(ctx context.Context, tx pgx.Tx, userID int, delta float64) error GetBalance(ctx context.Context, userID int) (float64, error) IncrementInvitesIssued(ctx context.Context, userID int) error IncrementInvitesIssuedTx(ctx context.Context, tx pgx.Tx, userID int) error CheckInviteLimit(ctx context.Context, userID int) (bool, error) CheckInviteLimitTx(ctx context.Context, tx pgx.Tx, userID int) (bool, error) } type SessionRepository interface { Create(ctx context.Context, session *model.Session) error FindByRefreshToken(ctx context.Context, token string) (*model.Session, error) UpdateAccessToken(ctx context.Context, refreshToken, newAccessToken string) error Revoke(ctx context.Context, refreshToken string) error RevokeByAccessToken(ctx context.Context, accessToken string) error IsAccessTokenValid(ctx context.Context, accessToken string) (bool, error) DeleteExpired(ctx context.Context) (int, error) } type InviteRepository interface { Create(ctx context.Context, invite *model.InviteCode) error CreateTx(ctx context.Context, tx pgx.Tx, invite *model.InviteCode) error FindByCode(ctx context.Context, code int64) (*model.InviteCode, error) FindActiveByCode(ctx context.Context, code int64) (*model.InviteCode, error) FindActiveByUserID(ctx context.Context, userID int) (*model.InviteCode, error) DecrementCanBeUsedCountTx(ctx context.Context, tx pgx.Tx, code int64) error DeactivateExpired(ctx context.Context) (int, error) GetUserInvites(ctx context.Context, userID int) ([]*model.InviteCode, error) } type RequestRepository interface { Create(ctx context.Context, req *model.Request) error UpdateWithTZ(ctx context.Context, id uuid.UUID, tz string, generated bool) error UpdateWithTZTx(ctx context.Context, tx pgx.Tx, id uuid.UUID, tz string, generated bool) error UpdateFinalTZ(ctx context.Context, id uuid.UUID, finalTZ string) error GetByUserID(ctx context.Context, userID int) ([]*model.Request, error) GetByID(ctx context.Context, id uuid.UUID) (*model.Request, error) GetDetailByID(ctx context.Context, id uuid.UUID) (*model.RequestDetail, error) GetUserStatistics(ctx context.Context, userID int) (requestsCount, suppliersCount, createdTZ int, err error) CheckOwnership(ctx context.Context, requestID uuid.UUID, userID int) (bool, error) } type SupplierRepository interface { BulkInsert(ctx context.Context, requestID uuid.UUID, suppliers []*model.Supplier) error BulkInsertTx(ctx context.Context, tx pgx.Tx, requestID uuid.UUID, suppliers []*model.Supplier) error GetByRequestID(ctx context.Context, requestID uuid.UUID) ([]*model.Supplier, error) DeleteByRequestID(ctx context.Context, requestID uuid.UUID) error } type TokenUsageRepository interface { Create(ctx context.Context, usage *model.TokenUsage) error CreateTx(ctx context.Context, tx pgx.Tx, usage *model.TokenUsage) error GetBalanceStatistics(ctx context.Context, userID int) (averageCost float64, history []*model.WriteOffHistory, err error) }