Профили пользователей
Relevant source files
The following files were used as context for generating this wiki page:
- internal/features/users/model/user.go
- internal/features/users/service/service.go
- internal/features/users/service/update_profile.go
- internal/features/users/transport/http/get_me.go
- internal/features/users/transport/http/update_profile.go
- internal/features/users/repository/postgres/user_repository.go
- migrations/001_init.up.sql
Модуль управления профилями пользователей отвечает за хранение и обработку личной информации участников музыкального сервиса. Он включает в себя механизмы получения данных о текущем авторизованном пользователе, обновление контактных данных (Email) и идентификаторов (Username), а также управление ролями и типами подписок.
Система построена на многослойной архитектуре, разделяющей транспортный уровень (HTTP), бизнес-логику (Service) и уровень доступа к данным (Repository). Это обеспечивает безопасность данных и гибкость при управлении учетными записями.
Sources: internal/features/users/model/user.go, internal/features/users/service/service.go
Архитектура и модель данных
Данные пользователей хранятся в реляционной базе данных PostgreSQL. Модель пользователя включает в себя основные атрибуты, системные поля для аудита (время создания/обновления), а также поля, определяющие уровень доступа (роль) и возможности прослушивания (тип подписки).
Структура сущности User
| Поле | Тип (Go / SQL) | Описание |
|---|---|---|
ID | int64 / BIGSERIAL | Уникальный идентификатор (Primary Key) |
Email | string / VARCHAR(255) | Электронная почта (Unique) |
PasswordHash | string / VARCHAR(255) | Хэш пароля (скрыт в JSON) |
Username | string / VARCHAR(100) | Публичное имя пользователя (Unique) |
Role | string / VARCHAR(50) | Роль в системе (USER, ADMIN) |
SubscriptionType | string / VARCHAR(50) | Тип подписки (FREE, PREMIUM) |
CreatedAt | time.Time | Дата регистрации |
Sources: internal/features/users/model/user.go:12-23, migrations/001_init.up.sql:1-10
Схема взаимодействия компонентов
Следующая диаграмма иллюстрирует процесс обработки запроса на получение профиля:
Функциональные возможности
Получение текущего профиля
Система предоставляет эндпоинт для получения информации о текущем пользователе на основе данных из JWT-токена. Транспортный слой извлекает claims (заявления) из контекста запроса, которые устанавливаются middleware авторизации.
- Endpoint:
GET /users/me - Логика: Поиск пользователя в БД по ID, извлеченному из токена.
- Безопасность: Требуется заголовок
Authorization: Bearer <token>.
Sources: internal/features/users/transport/http/get_me.go:31-35, internal/core/middleware/middleware.go:116-120
Обновление профиля
Пользователи могут изменять свою электронную почту и имя пользователя. При обновлении проверяется уникальность новых данных (отсутствие дубликатов в БД).
Уровень доступа к данным (Repository)
Репозиторий реализует SQL-запросы к PostgreSQL с использованием библиотеки sqlx. Основные операции включают:
- GetByID: Получение полной информации о пользователе для отображения в профиле.
- UpdateProfile: Выполняет частичное обновление данных с использованием
COALESCE, что позволяет обновлять только переданные поля (email или username) в рамках одного запроса. - UpdateSubscription: Изменение типа подписки (используется административными функциями).
Пример логики обновления (SQL)
UPDATE users
SET
email = COALESCE($1, email),
username = COALESCE($2, username),
updated_at = NOW()
WHERE id = $3
RETURNING id, email, username, role, subscription_type, created_at, updated_at
Sources: internal/features/users/repository/postgres/user_repository.go:88-100
Обработка ошибок
Система профилей обрабатывает специфические бизнес-ошибки для обеспечения корректной обратной связи с клиентом:
| Ошибка | Статус HTTP | Причина |
|---|---|---|
ErrUserNotFound | 404 Not Found | Пользователь с указанным ID не существует в базе. |
ErrEmailAlreadyTaken | 409 Conflict | Попытка установить Email, который уже используется другим аккаунтом. |
ErrUsernameTaken | 409 Conflict | Попытка установить Username, который уже занят. |
ErrUnauthorized | 401 Unauthorized | Токен отсутствует или невалиден. |
Sources: internal/features/users/repository/postgres/user_repository.go:14-18, internal/features/users/transport/http/update_profile.go:63-67
Резюме
Модуль профилей пользователей является центральным компонентом для персонализации сервиса. Благодаря четкому разделению ответственности между слоями и строгой валидации на уровне базы данных (Unique Constraints), система гарантирует целостность учетных данных и предоставляет API для управления основными атрибутами пользователя, включая роли и уровни подписки.