Skip to main content

Listening History

История прослушиваний пользователя. Все эндпоинты требуют авторизации пользователя.

Эндпоинты

МетодМаршрутОписание
POST/api/v1/history/tracks/:trackIdЗаписать прослушивание
GET/api/v1/historyПолучить историю
DELETE/api/v1/historyОчистить всю историю
DELETE/api/v1/history/tracks/:trackIdУдалить трек из истории

Запись прослушивания

POST /api/v1/history/tracks/:trackId

Вызывается клиентом при начале или завершении воспроизведения трека. Создаёт новую запись с текущим временем.

{
"id": "uuid",
"listenedAt": "2026-06-21T14:30:00.000Z"
}

Получение истории

GET /api/v1/history?page=1&limit=20
ПараметрПо умолчаниюОписание
page1Номер страницы
limit20Записей на страницу

Ответ содержит записи с вложенными данными трека и артиста, отсортированные от новых к старым. Дедупликация: если трек прослушан несколько раз, он появится один раз (самое свежее вхождение).

[
{
"id": "uuid",
"listenedAt": "2026-06-21T14:30:00.000Z",
"track": {
"id": "uuid",
"title": "Creep",
"cover": "/static/covers/uuid.jpg",
"duration": 238,
"artistId": "uuid",
"artist": {
"id": "uuid",
"username": "Radiohead",
"avatar": "/static/avatars/uuid.jpg"
}
}
}
]

Очистка истории

DELETE /api/v1/history

Удаляет все записи истории текущего пользователя. Возвращает 204 No Content.

Удаление трека из истории

DELETE /api/v1/history/tracks/:trackId

Удаляет все записи конкретного трека из истории (все прослушивания). Возвращает 200 OK.

Схема БД

model ListeningHistory {
id String @id @default(uuid(7))
userId String
trackId String
listenedAt DateTime @default(now())

user User @relation(...)
track Track @relation(...)

@@index([userId, listenedAt(sort: Desc)])
@@index([trackId])
}

Составной индекс (userId, listenedAt DESC) оптимизирует основной запрос — выборку истории по пользователю с сортировкой по времени.