feat: taste onboarding for new listeners (M6)
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m2s
ci / db / db (push) Failing after 1m29s
ci / ts / ts (packages + web) (push) Successful in 49s
ci / api / api (push) Successful in 1m25s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 48s
ci / recommender / recommender (push) Successful in 21s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 1m2s
ci / db / db (push) Failing after 1m29s
ci / ts / ts (packages + web) (push) Successful in 49s
ci / api / api (push) Successful in 1m25s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 48s
ci / recommender / recommender (push) Successful in 21s
- GET /onboarding offers the library's top artists (with album covers) and genres and says whether to show it (not done and < 10 plays); PUT /me/onboarding stores the choice or a skip (migration 00009). - The recommender seeds the taste from it while the user has fewer than 30 scored tracks: chosen artists' tracks +1, chosen genres +0.5. - Web: onboarding replaces the wave on the home page until done or skipped; artist grid with covers, genre chips, at least 3 artists. - e2e journey and the recommender DB test cover it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ff0aafdb1e
commit
fb07f962eb
14 files changed
+1137
-238
No files matched your search
@@ -1256,6 +1256,38 @@ paths:
|
||||
description: Снято
|
||||
default:
|
||||
$ref: "#/components/responses/Problem"
|
||||
/api/v1/onboarding:
|
||||
get:
|
||||
operationId: getOnboarding
|
||||
tags: [wave]
|
||||
summary: Онбординг вкуса — исполнители и жанры библиотеки для выбора
|
||||
description: |
|
||||
`required` — показать онбординг: пользователь его не проходил и не пропускал, а своей истории почти нет.
|
||||
responses:
|
||||
"200":
|
||||
description: Варианты и состояние
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Onboarding"
|
||||
default:
|
||||
$ref: "#/components/responses/Problem"
|
||||
/api/v1/me/onboarding:
|
||||
put:
|
||||
operationId: saveOnboarding
|
||||
tags: [wave]
|
||||
summary: Сохранить выбор онбординга (или пропуск — пустые списки)
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/OnboardingChoice"
|
||||
responses:
|
||||
"204":
|
||||
description: Сохранено
|
||||
default:
|
||||
$ref: "#/components/responses/Problem"
|
||||
/api/v1/wave/options:
|
||||
get:
|
||||
operationId: getWaveOptions
|
||||
@@ -1442,6 +1474,59 @@ components:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Problem"
|
||||
schemas:
|
||||
Onboarding:
|
||||
type: object
|
||||
required: [required, artists, genres]
|
||||
properties:
|
||||
required:
|
||||
type: boolean
|
||||
artists:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
required: [id, name, track_count, cover_url, cover_colors]
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
format: uuid
|
||||
name:
|
||||
type: string
|
||||
track_count:
|
||||
type: integer
|
||||
cover_url:
|
||||
type: string
|
||||
nullable: true
|
||||
description: Обложка самого большого альбома исполнителя
|
||||
cover_colors:
|
||||
type: array
|
||||
items:
|
||||
type: string
|
||||
genres:
|
||||
type: array
|
||||
items:
|
||||
type: object
|
||||
required: [name, track_count]
|
||||
properties:
|
||||
name:
|
||||
type: string
|
||||
track_count:
|
||||
type: integer
|
||||
OnboardingChoice:
|
||||
type: object
|
||||
required: [artist_ids, genres]
|
||||
properties:
|
||||
artist_ids:
|
||||
type: array
|
||||
maxItems: 50
|
||||
items:
|
||||
type: string
|
||||
format: uuid
|
||||
genres:
|
||||
type: array
|
||||
maxItems: 30
|
||||
items:
|
||||
type: string
|
||||
maxLength: 100
|
||||
UserRef:
|
||||
type: object
|
||||
required: [id, username]
|
||||
|
||||
Reference in new issue
Block a user