feat(auth): implement yggdrasil authenticate endpoint

This commit is contained in:
2025-06-14 21:51:36 +03:00
parent 54ce479a6e
commit 4d42cfff2d
5 changed files with 209 additions and 8 deletions

View File

@@ -7,6 +7,7 @@ import (
"errors"
"gitea.mrixs.me/minecraft-platform/backend/internal/models"
"github.com/google/uuid"
)
var (
@@ -57,3 +58,39 @@ func (r *UserRepository) CreateUserTx(ctx context.Context, user *models.User) er
// Шаг 10 из ТЗ: Коммитим транзакцию
return tx.Commit()
}
var (
ErrUserExists = errors.New("user with this username or email already exists")
ErrUserNotFound = errors.New("user not found") // Новая ошибка
)
// ...
// GetUserByUsername находит пользователя по его имени.
// Возвращает полную структуру User, включая хеш пароля для проверки.
func (r *UserRepository) GetUserByUsername(ctx context.Context, username string) (*models.User, error) {
user := &models.User{}
var userUUID string
query := "SELECT id, uuid, username, email, password_hash, role FROM users WHERE username = $1"
err := r.DB.QueryRowContext(ctx, query, username).Scan(
&user.ID, &userUUID, &user.Username, &user.Email, &user.PasswordHash, &user.Role,
)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, ErrUserNotFound
}
return nil, err
}
user.UUID, _ = uuid.Parse(userUUID)
return user, nil
}
// CreateAccessToken сохраняет новый токен доступа в базу данных.
func (r *UserRepository) CreateAccessToken(ctx context.Context, userID int, accessToken, clientToken string) error {
query := "INSERT INTO access_tokens (user_id, access_token, client_token) VALUES ($1, $2, $3)"
_, err := r.DB.ExecContext(ctx, query, userID, accessToken, clientToken)
return err
}