generated from VLADIMIR/template
save refresh token in login route
This commit is contained in:
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"cSpell.words": [
|
||||||
|
"pgxpool"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
Reference in New Issue
Block a user