Normalize audio waveform peaks for Flutter
فشلت بعض الفحوصات
Deploy To Ghaymah / deploy (push) Has been cancelled
فشلت بعض الفحوصات
Deploy To Ghaymah / deploy (push) Has been cancelled
هذا الالتزام موجود في:
121
docs/artist-dashboard-api.md
Normal file
121
docs/artist-dashboard-api.md
Normal file
@@ -0,0 +1,121 @@
|
||||
# Artist Dashboard API
|
||||
|
||||
This endpoint powers the Flutter artist profile dashboard for the currently authenticated user.
|
||||
|
||||
## Endpoint
|
||||
|
||||
`GET /api/v1/users/me/dashboard`
|
||||
|
||||
## Headers
|
||||
|
||||
```http
|
||||
Authorization: Bearer <accessToken>
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- This endpoint is private to the authenticated user.
|
||||
- It does not accept a `userId` parameter.
|
||||
- It does not expose another user's private analytics.
|
||||
- It keeps the existing `GET /api/v1/users/:id/profile-overview` endpoint unchanged.
|
||||
- Earnings, audience non-followers, and chart data are not faked. They return safe empty/default values until dedicated analytics storage exists.
|
||||
|
||||
## Success Response Example
|
||||
|
||||
```json
|
||||
{
|
||||
"profile": {
|
||||
"_id": "665f00000000000000000001",
|
||||
"coverImage": "",
|
||||
"avatar": "",
|
||||
"name": "Artist Name",
|
||||
"stageName": "Stage Name",
|
||||
"bio": "Short artist bio",
|
||||
"isVerified": false
|
||||
},
|
||||
"stats": {
|
||||
"followersCount": 120,
|
||||
"followingCount": 45,
|
||||
"postsCount": 12,
|
||||
"collaborationsCount": 2,
|
||||
"viewCount": 3000,
|
||||
"playCount": 980,
|
||||
"listenCount": 980,
|
||||
"likesCount": 220,
|
||||
"commentsCount": 40,
|
||||
"savesCount": 18,
|
||||
"sharesCount": 11,
|
||||
"engagementRate": 7.26,
|
||||
"scorePercentage": 0,
|
||||
"earnings": 0
|
||||
},
|
||||
"audience": {
|
||||
"followers": 120,
|
||||
"nonFollowers": 0,
|
||||
"newFollowersThisWeek": 4,
|
||||
"newFollowersThisMonth": 19
|
||||
},
|
||||
"engagementChart": [],
|
||||
"topContent": [
|
||||
{
|
||||
"_id": "665f00000000000000000002",
|
||||
"postType": "audio",
|
||||
"thumbnailUrl": "",
|
||||
"displayUrl": "",
|
||||
"content": "New track",
|
||||
"viewCount": 1000,
|
||||
"playCount": 600,
|
||||
"likesCount": 90,
|
||||
"commentsCount": 10,
|
||||
"savesCount": 8,
|
||||
"engagementScore": 113,
|
||||
"createdAt": "2026-06-08T00:00:00.000Z"
|
||||
}
|
||||
],
|
||||
"recentActivity": [],
|
||||
"meta": {
|
||||
"generatedAt": "2026-06-08T00:00:00.000Z",
|
||||
"chartAvailable": false,
|
||||
"earningsAvailable": false,
|
||||
"audienceAnalyticsAvailable": false
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Flutter Model Suggestion
|
||||
|
||||
- `ArtistDashboard`
|
||||
- `ArtistDashboardProfile`
|
||||
- `ArtistDashboardStats`
|
||||
- `ArtistDashboardAudience`
|
||||
- `ArtistDashboardTopContent`
|
||||
- `ArtistDashboardRecentActivity`
|
||||
- `ArtistDashboardMeta`
|
||||
|
||||
## UI Sections
|
||||
|
||||
1. Profile header: use `profile.coverImage`, `profile.avatar`, `profile.name`, `profile.stageName`, `profile.bio`, `profile.isVerified`.
|
||||
2. Stats cards: use `stats.followersCount`, `stats.followingCount`, `stats.viewCount`, `stats.listenCount`, `stats.engagementRate`.
|
||||
3. Engagement chart: render only when `meta.chartAvailable === true`; otherwise show the empty state.
|
||||
4. Top content list: use `topContent`.
|
||||
5. Audience summary: use `audience.followers`, `audience.nonFollowers`, `audience.newFollowersThisWeek`, `audience.newFollowersThisMonth`.
|
||||
6. Recent activity: use `recentActivity`.
|
||||
7. Empty states: show clear UI for no posts, no analytics, chart unavailable, and earnings unavailable.
|
||||
|
||||
## Empty States
|
||||
|
||||
- No posts yet: `stats.postsCount === 0`.
|
||||
- No analytics yet: `stats.viewCount === 0 && stats.playCount === 0`.
|
||||
- Chart not available: `meta.chartAvailable === false`.
|
||||
- Earnings not available: `meta.earningsAvailable === false`.
|
||||
|
||||
## Future Analytics Upgrade
|
||||
|
||||
Daily chart data requires event-level or snapshot storage. Recommended future collections:
|
||||
|
||||
- `post_view_events`
|
||||
- `post_play_events`
|
||||
- `post_engagement_events`
|
||||
- `daily_artist_analytics`
|
||||
|
||||
Audience split requires viewer identity tracking per view/play event. Earnings requires a monetization/revenue module. Until those exist, the backend intentionally returns safe defaults instead of fake values.
|
||||
المرجع في مشكلة جديدة
حظر مستخدم