feat(auth): implement yggdrasil authenticate endpoint
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user