Add multi-device identity foundation

This commit is contained in:
diyaa
2026-06-10 10:50:46 +02:00
parent 45c270c187
commit 8902efb92e
12 changed files with 689 additions and 49 deletions
+208 -7
View File
@@ -15,8 +15,9 @@
},
{
"name": "deviceId",
"required": true,
"required": false,
"in": "query",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided.",
"schema": {
"format": "uuid",
"type": "string"
@@ -36,11 +37,62 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"assets"
]
}
},
"/api/v1/artwork/{artworkId}/download": {
"get": {
"operationId": "ArtworkController_download_v1",
"parameters": [
{
"name": "artworkId",
"required": true,
"in": "path",
"schema": {
"type": "string"
}
},
{
"name": "deviceId",
"required": false,
"in": "query",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided.",
"schema": {
"format": "uuid",
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
"content": {
"image/*": {
"schema": {
"type": "string",
"format": "binary"
}
}
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"artwork"
]
}
},
"/api/v1/health": {
"get": {
"operationId": "HealthController_getHealth_v1",
@@ -88,6 +140,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"devices"
]
@@ -119,6 +176,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"devices"
]
@@ -150,6 +212,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"uploads"
]
@@ -180,6 +247,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"uploads"
]
@@ -233,6 +305,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"uploads"
]
@@ -273,6 +350,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"uploads"
]
@@ -284,8 +366,9 @@
"parameters": [
{
"name": "deviceId",
"required": true,
"required": false,
"in": "query",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided.",
"schema": {
"format": "uuid",
"type": "string"
@@ -304,6 +387,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"library"
]
@@ -312,7 +400,18 @@
"/api/v1/sync/bootstrap": {
"get": {
"operationId": "SyncController_bootstrap_v1",
"parameters": [],
"parameters": [
{
"name": "deviceId",
"required": false,
"in": "query",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided.",
"schema": {
"format": "uuid",
"type": "string"
}
}
],
"responses": {
"200": {
"description": "",
@@ -325,6 +424,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"sync"
]
@@ -334,6 +438,16 @@
"get": {
"operationId": "SyncController_changes_v1",
"parameters": [
{
"name": "deviceId",
"required": false,
"in": "query",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided.",
"schema": {
"format": "uuid",
"type": "string"
}
},
{
"name": "after",
"required": false,
@@ -356,6 +470,11 @@
}
}
},
"security": [
{
"bearer": []
}
],
"tags": [
"sync"
]
@@ -464,6 +583,10 @@
"type": "string",
"format": "uuid"
},
"deviceAccessToken": {
"type": "string",
"description": "Raw device access token returned only during registration. Store it securely."
},
"bootstrapToken": {
"type": "string"
},
@@ -474,6 +597,7 @@
},
"required": [
"deviceId",
"deviceAccessToken",
"bootstrapToken",
"serverTime"
]
@@ -483,7 +607,8 @@
"properties": {
"deviceId": {
"type": "string",
"format": "uuid"
"format": "uuid",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided."
},
"appVersion": {
"type": "string",
@@ -491,7 +616,6 @@
}
},
"required": [
"deviceId",
"appVersion"
]
},
@@ -517,7 +641,8 @@
"properties": {
"deviceId": {
"type": "string",
"format": "uuid"
"format": "uuid",
"description": "Legacy migration fallback. Omit when Authorization: Bearer <deviceAccessToken> is provided."
},
"sha256": {
"type": "string",
@@ -533,7 +658,6 @@
}
},
"required": [
"deviceId",
"sha256",
"originalFilename",
"sizeBytes"
@@ -611,6 +735,39 @@
"nextOffset"
]
},
"UploadFinalizeArtworkDto": {
"type": "object",
"properties": {
"dataBase64": {
"type": "string",
"example": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ..."
},
"sha256": {
"type": "string",
"example": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
},
"mimeType": {
"type": "string",
"enum": [
"image/jpeg",
"image/png"
]
},
"width": {
"type": "number",
"example": 512
},
"height": {
"type": "number",
"example": 512
}
},
"required": [
"dataBase64",
"sha256",
"mimeType"
]
},
"UploadFinalizeRequestDto": {
"type": "object",
"properties": {
@@ -629,6 +786,9 @@
"durationMs": {
"type": "number",
"example": 245000
},
"artwork": {
"$ref": "#/components/schemas/UploadFinalizeArtworkDto"
}
},
"required": [
@@ -653,6 +813,38 @@
"assetId"
]
},
"RemoteArtworkDto": {
"type": "object",
"properties": {
"artworkId": {
"type": "string",
"format": "uuid"
},
"sha256": {
"type": "string",
"example": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
},
"mimeType": {
"type": "string",
"example": "image/jpeg"
},
"width": {
"type": "object",
"example": 512,
"nullable": true
},
"height": {
"type": "object",
"example": 512,
"nullable": true
}
},
"required": [
"artworkId",
"sha256",
"mimeType"
]
},
"RemoteLibraryTrackDto": {
"type": "object",
"properties": {
@@ -687,6 +879,15 @@
"updatedAt": {
"type": "string",
"example": "2026-05-29T08:05:00.000Z"
},
"artwork": {
"nullable": true,
"type": "object",
"allOf": [
{
"$ref": "#/components/schemas/RemoteArtworkDto"
}
]
}
},
"required": [