add service
Some checks failed
Deploy Smart Search Backend / deploy (push) Failing after 1m54s

This commit is contained in:
vallyenfail
2026-01-17 20:41:37 +03:00
parent 635acd13ac
commit e2968722ed
70 changed files with 7542 additions and 463 deletions

View File

@@ -4,9 +4,9 @@ import (
"context"
"errors"
"smart-search-back/internal/model"
"smart-search-back/pkg/crypto"
errs "smart-search-back/pkg/errors"
"git.techease.ru/Smart-search/smart-search-back/internal/model"
"git.techease.ru/Smart-search/smart-search-back/pkg/crypto"
errs "git.techease.ru/Smart-search/smart-search-back/pkg/errors"
sq "github.com/Masterminds/squirrel"
"github.com/jackc/pgx/v5"
@@ -123,20 +123,35 @@ func (r *userRepository) Create(ctx context.Context, user *model.User) error {
}
func (r *userRepository) UpdateBalance(ctx context.Context, userID int, delta float64) error {
return r.updateBalanceWithExecutor(ctx, r.pool, userID, delta)
}
func (r *userRepository) UpdateBalanceTx(ctx context.Context, tx pgx.Tx, userID int, delta float64) error {
return r.updateBalanceWithExecutor(ctx, tx, userID, delta)
}
func (r *userRepository) updateBalanceWithExecutor(ctx context.Context, exec DBTX, userID int, delta float64) error {
query := r.qb.Update("users").
Set("balance", sq.Expr("balance + ?", delta)).
Where(sq.Eq{"id": userID})
Where(sq.And{
sq.Eq{"id": userID},
sq.Expr("balance + ? >= 0", delta),
})
sqlQuery, args, err := query.ToSql()
if err != nil {
return errs.NewInternalError(errs.DatabaseError, "failed to build query", err)
}
_, err = r.pool.Exec(ctx, sqlQuery, args...)
result, err := exec.Exec(ctx, sqlQuery, args...)
if err != nil {
return errs.NewInternalError(errs.DatabaseError, "failed to update balance", err)
}
if result.RowsAffected() == 0 {
return errs.NewBusinessError(errs.InsufficientBalance, "insufficient balance")
}
return nil
}
@@ -161,24 +176,47 @@ func (r *userRepository) GetBalance(ctx context.Context, userID int) (float64, e
}
func (r *userRepository) IncrementInvitesIssued(ctx context.Context, userID int) error {
return r.incrementInvitesIssuedWithExecutor(ctx, r.pool, userID)
}
func (r *userRepository) IncrementInvitesIssuedTx(ctx context.Context, tx pgx.Tx, userID int) error {
return r.incrementInvitesIssuedWithExecutor(ctx, tx, userID)
}
func (r *userRepository) incrementInvitesIssuedWithExecutor(ctx context.Context, exec DBTX, userID int) error {
query := r.qb.Update("users").
Set("invites_issued", sq.Expr("invites_issued + 1")).
Where(sq.Eq{"id": userID})
Where(sq.And{
sq.Eq{"id": userID},
sq.Expr("invites_issued < invites_limit"),
})
sqlQuery, args, err := query.ToSql()
if err != nil {
return errs.NewInternalError(errs.DatabaseError, "failed to build query", err)
}
_, err = r.pool.Exec(ctx, sqlQuery, args...)
result, err := exec.Exec(ctx, sqlQuery, args...)
if err != nil {
return errs.NewInternalError(errs.DatabaseError, "failed to increment invites issued", err)
}
if result.RowsAffected() == 0 {
return errs.NewBusinessError(errs.InviteLimitReached, "invite limit reached")
}
return nil
}
func (r *userRepository) CheckInviteLimit(ctx context.Context, userID int) (bool, error) {
return r.checkInviteLimitWithExecutor(ctx, r.pool, userID)
}
func (r *userRepository) CheckInviteLimitTx(ctx context.Context, tx pgx.Tx, userID int) (bool, error) {
return r.checkInviteLimitWithExecutor(ctx, tx, userID)
}
func (r *userRepository) checkInviteLimitWithExecutor(ctx context.Context, exec DBTX, userID int) (bool, error) {
query := r.qb.Select("invites_issued", "invites_limit").
From("users").
Where(sq.Eq{"id": userID}).
@@ -190,7 +228,7 @@ func (r *userRepository) CheckInviteLimit(ctx context.Context, userID int) (bool
}
var issued, limit int
err = r.pool.QueryRow(ctx, sqlQuery, args...).Scan(&issued, &limit)
err = exec.QueryRow(ctx, sqlQuery, args...).Scan(&issued, &limit)
if err != nil {
return false, errs.NewInternalError(errs.DatabaseError, "failed to check invite limit", err)
}