save refresh token in login route

This commit is contained in:
2026-07-05 02:57:56 +07:00
parent 19dfc4e911
commit e4007eb15a
5 changed files with 73 additions and 3 deletions
+5
View File
@@ -0,0 +1,5 @@
{
"cSpell.words": [
"pgxpool"
]
}
+3 -1
View File
@@ -7,6 +7,7 @@ import (
"evening_detective_server/internal/modules/email_sender" "evening_detective_server/internal/modules/email_sender"
"evening_detective_server/internal/modules/password_generator" "evening_detective_server/internal/modules/password_generator"
"evening_detective_server/internal/modules/processor_jwt" "evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/repos/refresh_tokens_repo"
"evening_detective_server/internal/repos/users_repo" "evening_detective_server/internal/repos/users_repo"
"evening_detective_server/internal/services/users_service" "evening_detective_server/internal/services/users_service"
proto "evening_detective_server/proto" proto "evening_detective_server/proto"
@@ -51,7 +52,8 @@ func main() {
smtpPassword := os.Getenv("SMTP_PASSWORD") smtpPassword := os.Getenv("SMTP_PASSWORD")
emailSender := email_sender.NewSender(smtpHost, smtpPort, smtpUser, smtpPassword) emailSender := email_sender.NewSender(smtpHost, smtpPort, smtpUser, smtpPassword)
processorJWT := processor_jwt.NewProcessor(os.Getenv("SECRET")) processorJWT := processor_jwt.NewProcessor(os.Getenv("SECRET"))
usersService := users_service.NewUsersService(usersRepo, passwordGenerator, emailSender, processorJWT) refreshTokensRepo := refresh_tokens_repo.NewRefreshTokensRepo(dbpool)
usersService := users_service.NewUsersService(usersRepo, passwordGenerator, emailSender, processorJWT, refreshTokensRepo)
// Create a listener on TCP port // Create a listener on TCP port
lis, err := net.Listen("tcp", ":8080") lis, err := net.Listen("tcp", ":8080")
@@ -0,0 +1,43 @@
package refresh_tokens_repo
import (
"context"
"github.com/jackc/pgx/v5/pgxpool"
)
type RefreshTokensRepo struct {
pool *pgxpool.Pool
}
func NewRefreshTokensRepo(pool *pgxpool.Pool) *RefreshTokensRepo {
return &RefreshTokensRepo{
pool: pool,
}
}
func (s *RefreshTokensRepo) AddRefreshToken(
ctx context.Context,
userId int,
refreshToken string,
) error {
_, err := s.pool.Exec(
ctx,
`INSERT INTO refresh_tokens (user_id, refresh_token) VALUES ($1, $2)`,
userId,
refreshToken,
)
return err
}
func (s *RefreshTokensRepo) DeleteRefreshTokensByUserId(
ctx context.Context,
userId int,
) error {
_, err := s.pool.Exec(
ctx,
`DELETE FROM refresh_tokens WHERE user_id = $1`,
userId,
)
return err
}
+11 -2
View File
@@ -6,6 +6,7 @@ import (
"evening_detective_server/internal/modules/email_sender" "evening_detective_server/internal/modules/email_sender"
"evening_detective_server/internal/modules/password_generator" "evening_detective_server/internal/modules/password_generator"
"evening_detective_server/internal/modules/processor_jwt" "evening_detective_server/internal/modules/processor_jwt"
"evening_detective_server/internal/repos/refresh_tokens_repo"
"evening_detective_server/internal/repos/users_repo" "evening_detective_server/internal/repos/users_repo"
"fmt" "fmt"
"strings" "strings"
@@ -18,6 +19,7 @@ type UsersService struct {
passwordGenerator password_generator.IPasswordGenerator passwordGenerator password_generator.IPasswordGenerator
emailSender email_sender.IEmailSender emailSender email_sender.IEmailSender
processorJWT processor_jwt.IProcessorJWT processorJWT processor_jwt.IProcessorJWT
refreshTokensRepo *refresh_tokens_repo.RefreshTokensRepo
} }
func NewUsersService( func NewUsersService(
@@ -25,12 +27,14 @@ func NewUsersService(
passwordGenerator password_generator.IPasswordGenerator, passwordGenerator password_generator.IPasswordGenerator,
emailSender email_sender.IEmailSender, emailSender email_sender.IEmailSender,
processorJWT processor_jwt.IProcessorJWT, processorJWT processor_jwt.IProcessorJWT,
refreshTokensRepo *refresh_tokens_repo.RefreshTokensRepo,
) *UsersService { ) *UsersService {
return &UsersService{ return &UsersService{
usersRepo: usersRepo, usersRepo: usersRepo,
passwordGenerator: passwordGenerator, passwordGenerator: passwordGenerator,
emailSender: emailSender, emailSender: emailSender,
processorJWT: processorJWT, processorJWT: processorJWT,
refreshTokensRepo: refreshTokensRepo,
} }
} }
@@ -130,8 +134,13 @@ func (s *UsersService) Login(
fmt.Println(accessToken, refreshToken) fmt.Println(accessToken, refreshToken)
// delete refresh tokens if err := s.refreshTokensRepo.DeleteRefreshTokensByUserId(ctx, user.ID); err != nil {
// save new refresh token return "", "", err
}
if err := s.refreshTokensRepo.AddRefreshToken(ctx, user.ID, refreshToken); err != nil {
return "", "", err
}
return accessToken, refreshToken, nil return accessToken, refreshToken, nil
} }
@@ -0,0 +1,11 @@
-- +goose Up
CREATE TABLE IF NOT EXISTS refresh_tokens (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id INT NOT NULL,
refresh_token TEXT NOT NULL,
CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- +goose Down
DROP TABLE IF EXISTS refresh_tokens;