From 7e3d9ec1559753ddcd914ca73e4f8c7f4345ef06 Mon Sep 17 00:00:00 2001 From: Sergey Chubaryan Date: Wed, 31 Jul 2024 08:45:52 +0300 Subject: [PATCH] implented action token db operations --- src/repo/action_token.go | 63 +++++++++++++++++++++++++++++++++--- src/services/user_service.go | 19 ++++++----- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/repo/action_token.go b/src/repo/action_token.go index 8e4d659..453a4ab 100644 --- a/src/repo/action_token.go +++ b/src/repo/action_token.go @@ -1,9 +1,64 @@ package repo -import "backend/src/models" +import ( + "backend/src/models" + "context" + "database/sql" +) type ActionTokenRepo interface { - CreateActionToken(actionToken models.ActionTokenDTO) (*models.ActionTokenDTO, error) - FindActionToken(userId, val string, target models.ActionTokenTarget) (*models.ActionTokenDTO, error) - DeleteActionToken(id string) error + CreateActionToken(ctx context.Context, dto models.ActionTokenDTO) (*models.ActionTokenDTO, error) + PopActionToken(ctx context.Context, userId, value string, target models.ActionTokenTarget) (*models.ActionTokenDTO, error) +} + +func NewActionTokenRepo(db *sql.DB) ActionTokenRepo { + return &actionTokenRepo{ + db: db, + } +} + +type actionTokenRepo struct { + db *sql.DB +} + +func (a *actionTokenRepo) CreateActionToken(ctx context.Context, dto models.ActionTokenDTO) (*models.ActionTokenDTO, error) { + query := ` + insert into + action_tokens (user_id, value, target) + values ($1, $2, $3) + returning id;` + row := a.db.QueryRowContext(ctx, query, dto.UserId, dto.Value, dto.Target) + + id := "" + if err := row.Scan(&id); err != nil { + return nil, err + } + + return &models.ActionTokenDTO{ + Id: id, + UserId: dto.UserId, + Value: dto.Value, + Target: dto.Target, + }, nil +} + +func (a *actionTokenRepo) PopActionToken(ctx context.Context, userId, value string, target models.ActionTokenTarget) (*models.ActionTokenDTO, error) { + query := ` + delete + from action_tokens + where user_id=$1 and value=$2 and target=$3 + returning id;` + row := a.db.QueryRowContext(ctx, query, userId, value, target) + + id := "" + if err := row.Scan(&id); err != nil { + return nil, err + } + + return &models.ActionTokenDTO{ + Id: id, + UserId: userId, + Value: value, + Target: target, + }, nil } diff --git a/src/services/user_service.go b/src/services/user_service.go index 6e11d62..d733844 100644 --- a/src/services/user_service.go +++ b/src/services/user_service.go @@ -112,11 +112,14 @@ func (u *userService) HelpPasswordForgot(ctx context.Context, userId string) err return err } - actionToken, err := u.deps.ActionTokenRepo.CreateActionToken(models.ActionTokenDTO{ - UserId: user.Id, - Value: uuid.New().String(), - Target: models.ActionTokenTargetForgotPassword, - }) + actionToken, err := u.deps.ActionTokenRepo.CreateActionToken( + ctx, + models.ActionTokenDTO{ + UserId: user.Id, + Value: uuid.New().String(), + Target: models.ActionTokenTargetForgotPassword, + }, + ) if err != nil { return err } @@ -131,7 +134,7 @@ func (u *userService) ChangePasswordForgot(ctx context.Context, userId, newPassw return err } - code, err := u.deps.ActionTokenRepo.FindActionToken(userId, accessCode, models.ActionTokenTargetForgotPassword) + code, err := u.deps.ActionTokenRepo.PopActionToken(ctx, userId, accessCode, models.ActionTokenTargetForgotPassword) if err != nil { return err } @@ -139,10 +142,6 @@ func (u *userService) ChangePasswordForgot(ctx context.Context, userId, newPassw return fmt.Errorf("wrong user access code") } - if err := u.deps.ActionTokenRepo.DeleteActionToken(code.Id); err != nil { - return fmt.Errorf("internal error occured: %w", err) - } - return u.updatePassword(ctx, *user, newPassword) }