14 KiB
14 KiB
Albums
This document describes album creation, management, sharing, and related functionality.
Album Overview
Albums are collections of assets that can be:
- Personal: Created by you, only visible to you
- Shared: Shared with other users who can view/contribute
- Local: Device albums (not synced to server)
Album Model
Album {
id: String // Unique identifier
name: String // Album name
description: String // Album description
ownerId: String // Owner user ID
ownerName: String // Owner display name
createdAt: DateTime // Creation time
updatedAt: DateTime // Last modified
thumbnailAssetId: String? // Cover image asset ID
assetCount: Integer // Number of assets
isShared: Boolean // Has shared users
isActivityEnabled: Boolean // Comments/likes enabled
order: AlbumAssetOrder // asc or desc
sharedUsers: List<User> // Users album is shared with
}
Album List Screen
Layout
┌─────────────────────────────────────────────────────────────┐
│ Albums [List/Grid] ⚙️ │
├─────────────────────────────────────────────────────────────┤
│ [ 🔍 Search albums... ] │
├─────────────────────────────────────────────────────────────┤
│ Sort by: Recent Activity ▼ [+ Create Album] │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ │ │ │ │ │ │
│ │ [Cover] │ │ [Cover] │ │ [Cover] │ │
│ │ │ │ │ │ │ │
│ │ Summer 2024 │ │ Family │ │ Wedding │ │
│ │ 24 items │ │ 156 items │ │ 89 items │ │
│ │ [👤 Shared] │ │ │ │ [👤👤 Shared]│ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
Sort Options
| Option | Description |
|---|---|
| Recent Activity | Most recently modified first |
| Album Name | Alphabetical order |
| Most Items | Largest albums first |
| Oldest First | By creation date ascending |
Filter Modes
| Mode | Shows |
|---|---|
| All | All albums |
| My Albums | Albums you own |
| Shared | Albums shared with you |
| Local | On-device albums |
Album API Endpoints
List Albums
GET /albums?shared=true|false|null
Response:
[
{
"id": "album-uuid",
"albumName": "Summer 2024",
"description": "Beach vacation photos",
"ownerId": "user-uuid",
"owner": { user object },
"albumThumbnailAssetId": "asset-uuid",
"assetCount": 24,
"shared": true,
"albumUsers": [...],
"hasSharedLink": false,
"isActivityEnabled": true,
"order": "desc",
"createdAt": "2024-06-15T10:00:00Z",
"updatedAt": "2024-06-20T15:30:00Z"
}
]
Get Album Detail
GET /albums/{id}
Response: Full album object with assets
Create Album
POST /albums
Body:
{
"albumName": "New Album",
"description": "Album description",
"assetIds": ["asset-1", "asset-2"],
"albumUsers": [
{ "userId": "user-uuid", "role": "editor" }
]
}
Response: Created album object
Update Album
PATCH /albums/{id}
Body:
{
"albumName": "Updated Name",
"description": "New description",
"isActivityEnabled": true,
"order": "asc"
}
Delete Album
DELETE /albums/{id}
Album Detail Screen
Layout
┌─────────────────────────────────────────────────────────────┐
│ ← Summer 2024 [Select] [⋮] │
├─────────────────────────────────────────────────────────────┤
│ Beach vacation with family │
│ 24 items • Shared with 3 people │
├─────────────────────────────────────────────────────────────┤
│ June 2024 │
│ ┌─────┬─────┬─────┬─────┐ │
│ │ │ │ │ │ │
│ │ 📷 │ 📷 │ 🎥 │ 📷 │ │
│ │ │ │ │ │ │
│ └─────┴─────┴─────┴─────┘ │
│ ... │
├─────────────────────────────────────────────────────────────┤
│ [+ Add Photos] [💬 Activity] │
└─────────────────────────────────────────────────────────────┘
Album Actions Menu
| Action | Description |
|---|---|
| Edit Album | Change name/description |
| Add Photos | Select assets to add |
| Share | Share with users or create link |
| Album Options | Advanced settings |
| Delete Album | Remove album (owner only) |
| Leave Album | Leave shared album |
Album Creation Flow
Step 1: Select Assets
┌─────────────────────────────────────────────────────────────┐
│ ← Add to Album [Create] │
├─────────────────────────────────────────────────────────────┤
│ Selected: 5 │
├─────────────────────────────────────────────────────────────┤
│ [Asset selection grid - same as timeline] │
│ │
└─────────────────────────────────────────────────────────────┘
Step 2: Enter Details
┌─────────────────────────────────────────────────────────────┐
│ ← Create Album │
├─────────────────────────────────────────────────────────────┤
│ │
│ Album Name │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Summer 2024 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Description (optional) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Beach vacation photos │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ [Share with users] (optional) │
│ │
│ [Create Album] │
└─────────────────────────────────────────────────────────────┘
Adding Assets to Album
API Endpoint
PUT /albums/{id}/assets
Body:
{
"ids": ["asset-1", "asset-2", "asset-3"]
}
Response:
{
"successfullyAdded": 3,
"alreadyInAlbum": ["asset-4"]
}
Removing Assets from Album
API Endpoint
DELETE /albums/{id}/assets
Body:
{
"ids": ["asset-1", "asset-2"]
}
Sharing Albums
Share with Users
PUT /albums/{id}/users
Body:
{
"albumUsers": [
{ "userId": "user-1", "role": "editor" },
{ "userId": "user-2", "role": "viewer" }
]
}
User Roles
| Role | Can View | Can Add | Can Remove | Can Edit |
|---|---|---|---|---|
| viewer | ✓ | |||
| editor | ✓ | ✓ | Own assets |
Remove User from Album
DELETE /albums/{id}/user/{userId}
Leave Album (for shared users)
DELETE /albums/{id}/user/me
Album Options Screen
┌─────────────────────────────────────────────────────────────┐
│ ← Album Options │
├─────────────────────────────────────────────────────────────┤
│ │
│ Sort Order │
│ [Newest first ▼] │
│ │
│ ───────────────────────────────────────────────────── │
│ │
│ Allow Activity [Toggle: ON] │
│ Enable comments and likes │
│ │
│ ───────────────────────────────────────────────────── │
│ │
│ Shared Users │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 👤 John Doe (Editor) [X] │ │
│ │ 👤 Jane Smith (Viewer) [X] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ [+ Add Users] │
│ │
│ ───────────────────────────────────────────────────── │
│ │
│ [Delete Album] (red, destructive) │
│ │
└─────────────────────────────────────────────────────────────┘
Local Albums
Device Albums
- Albums from device photo gallery
- Read-only in the app
- Can be selected for backup
- Synced to server when enabled
Local Album Model
LocalAlbum {
id: String // Device album ID
name: String // Album name
assetCount: Integer // Number of assets
modifiedAt: DateTime // Last modified
isAll: Boolean // Is "All Photos" album
thumbnailId: String? // Cover asset ID
}
Album Sync
Sync Album Feature
When enabled, uploaded assets are automatically added to matching remote albums:
- Asset uploaded with album names in metadata
- Server checks for existing albums with those names
- Creates albums if they don't exist
- Adds asset to matching albums
API for Album Sync
POST /albums/{albumName}/assets
Body:
{
"assetIds": ["asset-1"]
}
Album Search
Local Search
- Filter album list by name
- Instant results as you type
Quick Filter Chips
| Filter | Shows |
|---|---|
| All | All albums |
| Mine | Albums you created |
| Shared | Albums shared with you |