@@ -4,6 +4,7 @@ import (
"context"
"database/sql"
"errors"
"log"
"gitea.mrixs.me/minecraft-platform/backend/internal/models"
"github.com/google/uuid"
@@ -21,33 +22,47 @@ type UserRepository struct {
// CreateUserTx создает нового пользователя и е г о профиль в рамках одной транзакции
func ( r * UserRepository ) CreateUserTx ( ctx context . Context , user * models . User ) error {
log . Println ( "[DB] Beginning CreateUserTx transaction" )
tx , err := r . DB . Begin ( ctx )
if err != nil {
log . Printf ( "[DB] ERROR: Failed to begin transaction: %v" , err )
return err
}
defer tx . Rollback ( ctx )
log . Println ( "[DB] Checking if user exists..." )
var exists bool
err = tx . QueryRow ( ctx ,
"SELECT EXISTS(SELECT 1 FROM users WHERE username = $1 OR email = $2)" ) . Scan ( & exists )
"SELECT EXISTS(SELECT 1 FROM users WHERE username = $1 OR email = $2)" , user . Username , user . Email ). Scan ( & exists )
if err != nil {
log . Printf ( "[DB] ERROR: User existence check failed: %v" , err )
return err
}
if exists {
log . Printf ( "[DB] User with username '%s' or email '%s' already exists." , user . Username , user . Email )
return ErrUserExists
}
log . Println ( "[DB] User does not exist, proceeding." )
log . Println ( "[DB] Inserting into 'users' table..." )
var newUserID int
err = tx . QueryRow ( ctx , "INSERT INTO users (uuid, username, email, password_hash, role) VALUES ($1, $2, $3, $4, $5) RETURNING id" ) . Scan ( & newUserID )
err = tx . QueryRow ( ctx , "INSERT INTO users (uuid, username, email, password_hash, role) VALUES ($1, $2, $3, $4, $5) RETURNING id" ,
user . UUID , user . Username , user . Email , user . PasswordHash , user . Role ) . Scan ( & newUserID )
if err != nil {
log . Printf ( "[DB] ERROR: Insert into 'users' failed: %v" , err )
return err
}
log . Printf ( "[DB] Inserted into 'users' table successfully. New user ID: %d" , newUserID )
_ , err = tx . Exec ( ctx , "INSERT INTO profiles (user_id) VALUES ($1) ")
log . Println ( "[DB] Inserting into 'profiles' table... ")
_ , err = tx . Exec ( ctx , "INSERT INTO profiles (user_id) VALUES ($1)" , newUserID )
if err != nil {
log . Printf ( "[DB] ERROR: Insert into 'profiles' failed: %v" , err )
return err
}
log . Println ( "[DB] Inserted into 'profiles' table successfully." )
log . Println ( "[DB] Committing transaction..." )
return tx . Commit ( ctx )
}
@@ -122,8 +137,6 @@ var (
)
// ValidateAccessToken проверяет, действителен ли токен для данного пользователя.
// В нашей реализации мы просто проверяем е г о существование.
// В более сложных системах здесь можно было бы проверять срок действия токена.
func ( r * UserRepository ) ValidateAccessToken ( ctx context . Context , token string , userUUID uuid . UUID ) error {
var exists bool
query := `