From 7d759edfcc9842b4ddfa411d5f0bad8ea185c8b2 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Mon, 28 Jul 2025 18:40:34 -0400 Subject: [PATCH] chore: add permission metadata to open-api document (#20373) --- open-api/immich-openapi-specs.json | 501 ++++++++++++++++++---------- server/src/middleware/auth.guard.ts | 6 +- 2 files changed, 339 insertions(+), 168 deletions(-) diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 5000eaa5c7..8b305aa8b5 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -77,7 +77,8 @@ ], "tags": [ "Activities" - ] + ], + "x-immich-permission": "activity.read" }, "post": { "operationId": "createActivity", @@ -117,7 +118,8 @@ ], "tags": [ "Activities" - ] + ], + "x-immich-permission": "activity.create" } }, "/activities/statistics": { @@ -168,7 +170,8 @@ ], "tags": [ "Activities" - ] + ], + "x-immich-permission": "activity.statistics" } }, "/activities/{id}": { @@ -203,7 +206,8 @@ ], "tags": [ "Activities" - ] + ], + "x-immich-permission": "activity.delete" } }, "/admin/notifications": { @@ -391,7 +395,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.read" }, "post": { "operationId": "createUserAdmin", @@ -431,7 +436,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.create" } }, "/admin/users/{id}": { @@ -483,7 +489,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.delete" }, "get": { "operationId": "getUserAdmin", @@ -523,7 +530,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.read" }, "put": { "operationId": "updateUserAdmin", @@ -573,7 +581,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.update" } }, "/admin/users/{id}/preferences": { @@ -615,7 +624,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.read" }, "put": { "operationId": "updateUserPreferencesAdmin", @@ -665,7 +675,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.update" } }, "/admin/users/{id}/restore": { @@ -707,7 +718,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.delete" } }, "/admin/users/{id}/statistics": { @@ -773,7 +785,8 @@ ], "tags": [ "Users (admin)" - ] + ], + "x-immich-permission": "adminUser.read" } }, "/albums": { @@ -827,7 +840,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "album.read" }, "post": { "operationId": "createAlbum", @@ -867,7 +881,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "album.create" } }, "/albums/statistics": { @@ -899,7 +914,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "album.statistics" } }, "/albums/{id}": { @@ -934,7 +950,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "album.delete" }, "get": { "operationId": "getAlbumInfo", @@ -998,7 +1015,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "album.read" }, "patch": { "operationId": "updateAlbumInfo", @@ -1048,7 +1066,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "album.update" } }, "/albums/{id}/assets": { @@ -1103,7 +1122,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "albumAsset.delete" }, "put": { "operationId": "addAssetsToAlbum", @@ -1172,7 +1192,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "albumAsset.create" } }, "/albums/{id}/user/{userId}": { @@ -1215,7 +1236,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "albumUser.delete" }, "put": { "operationId": "updateAlbumUser", @@ -1266,7 +1288,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "albumUser.update" } }, "/albums/{id}/users": { @@ -1318,7 +1341,8 @@ ], "tags": [ "Albums" - ] + ], + "x-immich-permission": "albumUser.create" } }, "/api-keys": { @@ -1353,7 +1377,8 @@ ], "tags": [ "API Keys" - ] + ], + "x-immich-permission": "apiKey.read" }, "post": { "operationId": "createApiKey", @@ -1393,7 +1418,8 @@ ], "tags": [ "API Keys" - ] + ], + "x-immich-permission": "apiKey.create" } }, "/api-keys/{id}": { @@ -1428,7 +1454,8 @@ ], "tags": [ "API Keys" - ] + ], + "x-immich-permission": "apiKey.delete" }, "get": { "operationId": "getApiKey", @@ -1468,7 +1495,8 @@ ], "tags": [ "API Keys" - ] + ], + "x-immich-permission": "apiKey.read" }, "put": { "operationId": "updateApiKey", @@ -1518,7 +1546,8 @@ ], "tags": [ "API Keys" - ] + ], + "x-immich-permission": "apiKey.update" } }, "/assets": { @@ -1553,7 +1582,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.delete" }, "post": { "operationId": "uploadAsset", @@ -1620,7 +1650,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.upload" }, "put": { "operationId": "updateAssets", @@ -1653,7 +1684,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.update" } }, "/assets/bulk-upload-check": { @@ -1873,7 +1905,8 @@ ], "x-immich-lifecycle": { "deprecatedAt": "v1.116.0" - } + }, + "x-immich-permission": "asset.read" } }, "/assets/statistics": { @@ -1930,7 +1963,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.statistics" } }, "/assets/{id}": { @@ -1988,7 +2022,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.read" }, "put": { "operationId": "updateAsset", @@ -2038,7 +2073,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.update" } }, "/assets/{id}/original": { @@ -2097,7 +2133,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.download" }, "put": { "description": "Replace the asset with new file, without changing its id", @@ -2168,7 +2205,8 @@ ], "x-immich-lifecycle": { "addedAt": "v1.106.0" - } + }, + "x-immich-permission": "asset.replace" } }, "/assets/{id}/thumbnail": { @@ -2235,7 +2273,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.view" } }, "/assets/{id}/video/playback": { @@ -2294,7 +2333,8 @@ ], "tags": [ "Assets" - ] + ], + "x-immich-permission": "asset.view" } }, "/auth/admin-sign-up": { @@ -2367,7 +2407,8 @@ ], "tags": [ "Authentication" - ] + ], + "x-immich-permission": "auth.changePassword" } }, "/auth/login": { @@ -2465,7 +2506,8 @@ ], "tags": [ "Authentication" - ] + ], + "x-immich-permission": "pinCode.delete" }, "post": { "operationId": "setupPinCode", @@ -2498,7 +2540,8 @@ ], "tags": [ "Authentication" - ] + ], + "x-immich-permission": "pinCode.create" }, "put": { "operationId": "changePinCode", @@ -2531,7 +2574,8 @@ ], "tags": [ "Authentication" - ] + ], + "x-immich-permission": "pinCode.update" } }, "/auth/session/lock": { @@ -2715,7 +2759,8 @@ ], "tags": [ "Download" - ] + ], + "x-immich-permission": "asset.download" } }, "/download/info": { @@ -2774,7 +2819,8 @@ ], "tags": [ "Download" - ] + ], + "x-immich-permission": "asset.download" } }, "/duplicates": { @@ -2809,7 +2855,8 @@ ], "tags": [ "Duplicates" - ] + ], + "x-immich-permission": "duplicate.delete" }, "get": { "operationId": "getAssetDuplicates", @@ -2842,7 +2889,8 @@ ], "tags": [ "Duplicates" - ] + ], + "x-immich-permission": "duplicate.read" } }, "/duplicates/{id}": { @@ -2877,7 +2925,8 @@ ], "tags": [ "Duplicates" - ] + ], + "x-immich-permission": "duplicate.delete" } }, "/faces": { @@ -2922,7 +2971,8 @@ ], "tags": [ "Faces" - ] + ], + "x-immich-permission": "face.read" }, "post": { "operationId": "createFace", @@ -2955,7 +3005,8 @@ ], "tags": [ "Faces" - ] + ], + "x-immich-permission": "face.create" } }, "/faces/{id}": { @@ -3000,7 +3051,8 @@ ], "tags": [ "Faces" - ] + ], + "x-immich-permission": "face.delete" }, "put": { "operationId": "reassignFacesById", @@ -3050,7 +3102,8 @@ ], "tags": [ "Faces" - ] + ], + "x-immich-permission": "face.update" } }, "/jobs": { @@ -3082,7 +3135,8 @@ ], "tags": [ "Jobs" - ] + ], + "x-immich-permission": "job.read" }, "post": { "operationId": "createJob", @@ -3115,7 +3169,8 @@ ], "tags": [ "Jobs" - ] + ], + "x-immich-permission": "job.create" } }, "/jobs/{id}": { @@ -3166,7 +3221,8 @@ ], "tags": [ "Jobs" - ] + ], + "x-immich-permission": "job.create" } }, "/libraries": { @@ -3201,7 +3257,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.read" }, "post": { "operationId": "createLibrary", @@ -3241,7 +3298,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.create" } }, "/libraries/{id}": { @@ -3276,7 +3334,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.delete" }, "get": { "operationId": "getLibrary", @@ -3316,7 +3375,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.read" }, "put": { "operationId": "updateLibrary", @@ -3366,7 +3426,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.update" } }, "/libraries/{id}/scan": { @@ -3401,7 +3462,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.update" } }, "/libraries/{id}/statistics": { @@ -3443,7 +3505,8 @@ ], "tags": [ "Libraries" - ] + ], + "x-immich-permission": "library.statistics" } }, "/libraries/{id}/validate": { @@ -3704,7 +3767,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memory.read" }, "post": { "operationId": "createMemory", @@ -3744,7 +3808,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memory.create" } }, "/memories/statistics": { @@ -3810,7 +3875,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memory.statistics" } }, "/memories/{id}": { @@ -3845,7 +3911,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memory.delete" }, "get": { "operationId": "getMemory", @@ -3885,7 +3952,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memory.read" }, "put": { "operationId": "updateMemory", @@ -3935,7 +4003,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memory.update" } }, "/memories/{id}/assets": { @@ -3990,7 +4059,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memoryAsset.delete" }, "put": { "operationId": "addMemoryAssets", @@ -4043,7 +4113,8 @@ ], "tags": [ "Memories" - ] + ], + "x-immich-permission": "memoryAsset.create" } }, "/notifications": { @@ -4078,7 +4149,8 @@ ], "tags": [ "Notifications" - ] + ], + "x-immich-permission": "notification.delete" }, "get": { "operationId": "getNotifications", @@ -4145,7 +4217,8 @@ ], "tags": [ "Notifications" - ] + ], + "x-immich-permission": "notification.read" }, "put": { "operationId": "updateNotifications", @@ -4178,7 +4251,8 @@ ], "tags": [ "Notifications" - ] + ], + "x-immich-permission": "notification.update" } }, "/notifications/{id}": { @@ -4213,7 +4287,8 @@ ], "tags": [ "Notifications" - ] + ], + "x-immich-permission": "notification.delete" }, "get": { "operationId": "getNotification", @@ -4253,7 +4328,8 @@ ], "tags": [ "Notifications" - ] + ], + "x-immich-permission": "notification.read" }, "put": { "operationId": "updateNotification", @@ -4303,7 +4379,8 @@ ], "tags": [ "Notifications" - ] + ], + "x-immich-permission": "notification.update" } }, "/oauth/authorize": { @@ -4497,7 +4574,8 @@ ], "tags": [ "Partners" - ] + ], + "x-immich-permission": "partner.read" } }, "/partners/{id}": { @@ -4532,7 +4610,8 @@ ], "tags": [ "Partners" - ] + ], + "x-immich-permission": "partner.delete" }, "post": { "operationId": "createPartner", @@ -4572,7 +4651,8 @@ ], "tags": [ "Partners" - ] + ], + "x-immich-permission": "partner.create" }, "put": { "operationId": "updatePartner", @@ -4622,7 +4702,8 @@ ], "tags": [ "Partners" - ] + ], + "x-immich-permission": "partner.update" } }, "/people": { @@ -4657,7 +4738,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.delete" }, "get": { "operationId": "getAllPeople", @@ -4737,7 +4819,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.read" }, "post": { "operationId": "createPerson", @@ -4777,7 +4860,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.create" }, "put": { "operationId": "updatePeople", @@ -4820,7 +4904,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.update" } }, "/people/{id}": { @@ -4855,7 +4940,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.delete" }, "get": { "operationId": "getPerson", @@ -4895,7 +4981,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.read" }, "put": { "operationId": "updatePerson", @@ -4945,7 +5032,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.update" } }, "/people/{id}/merge": { @@ -5000,7 +5088,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.merge" } }, "/people/{id}/reassign": { @@ -5055,7 +5144,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.reassign" } }, "/people/{id}/statistics": { @@ -5097,7 +5187,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.statistics" } }, "/people/{id}/thumbnail": { @@ -5140,7 +5231,8 @@ ], "tags": [ "People" - ] + ], + "x-immich-permission": "person.read" } }, "/search/cities": { @@ -5175,7 +5267,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/search/explore": { @@ -5210,7 +5303,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/search/metadata": { @@ -5252,7 +5346,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/search/person": { @@ -5304,7 +5399,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "person.read" } }, "/search/places": { @@ -5348,7 +5444,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/search/random": { @@ -5393,7 +5490,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/search/smart": { @@ -5435,7 +5533,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/search/statistics": { @@ -5477,7 +5576,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.statistics" } }, "/search/suggestions": { @@ -5562,7 +5662,8 @@ ], "tags": [ "Search" - ] + ], + "x-immich-permission": "asset.read" } }, "/server/about": { @@ -5594,7 +5695,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "server.about" } }, "/server/apk-links": { @@ -5626,7 +5728,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "server.apkLinks" } }, "/server/config": { @@ -5693,7 +5796,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "serverLicense.delete" }, "get": { "operationId": "getServerLicense", @@ -5726,7 +5830,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "serverLicense.read" }, "put": { "operationId": "setServerLicense", @@ -5766,7 +5871,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "serverLicense.update" } }, "/server/media-types": { @@ -5840,7 +5946,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "server.statistics" } }, "/server/storage": { @@ -5872,7 +5979,8 @@ ], "tags": [ "Server" - ] + ], + "x-immich-permission": "server.storage" } }, "/server/theme": { @@ -5995,7 +6103,8 @@ ], "tags": [ "Sessions" - ] + ], + "x-immich-permission": "session.delete" }, "get": { "operationId": "getSessions", @@ -6028,7 +6137,8 @@ ], "tags": [ "Sessions" - ] + ], + "x-immich-permission": "session.read" }, "post": { "operationId": "createSession", @@ -6068,7 +6178,8 @@ ], "tags": [ "Sessions" - ] + ], + "x-immich-permission": "session.create" } }, "/sessions/{id}": { @@ -6103,7 +6214,8 @@ ], "tags": [ "Sessions" - ] + ], + "x-immich-permission": "session.delete" }, "put": { "operationId": "updateSession", @@ -6153,7 +6265,8 @@ ], "tags": [ "Sessions" - ] + ], + "x-immich-permission": "session.update" } }, "/sessions/{id}/lock": { @@ -6188,7 +6301,8 @@ ], "tags": [ "Sessions" - ] + ], + "x-immich-permission": "session.lock" } }, "/shared-links": { @@ -6233,7 +6347,8 @@ ], "tags": [ "Shared Links" - ] + ], + "x-immich-permission": "sharedLink.read" }, "post": { "operationId": "createSharedLink", @@ -6273,7 +6388,8 @@ ], "tags": [ "Shared Links" - ] + ], + "x-immich-permission": "sharedLink.create" } }, "/shared-links/me": { @@ -6374,7 +6490,8 @@ ], "tags": [ "Shared Links" - ] + ], + "x-immich-permission": "sharedLink.delete" }, "get": { "operationId": "getSharedLinkById", @@ -6414,7 +6531,8 @@ ], "tags": [ "Shared Links" - ] + ], + "x-immich-permission": "sharedLink.read" }, "patch": { "operationId": "updateSharedLink", @@ -6464,7 +6582,8 @@ ], "tags": [ "Shared Links" - ] + ], + "x-immich-permission": "sharedLink.update" } }, "/shared-links/{id}/assets": { @@ -6639,7 +6758,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.delete" }, "get": { "operationId": "searchStacks", @@ -6682,7 +6802,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.read" }, "post": { "operationId": "createStack", @@ -6722,7 +6843,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.create" } }, "/stacks/{id}": { @@ -6757,7 +6879,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.delete" }, "get": { "operationId": "getStack", @@ -6797,7 +6920,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.read" }, "put": { "operationId": "updateStack", @@ -6847,7 +6971,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.update" } }, "/stacks/{id}/assets/{assetId}": { @@ -6891,7 +7016,8 @@ ], "tags": [ "Stacks" - ] + ], + "x-immich-permission": "stack.update" } }, "/sync/ack": { @@ -6926,7 +7052,8 @@ ], "tags": [ "Sync" - ] + ], + "x-immich-permission": "syncCheckpoint.delete" }, "get": { "operationId": "getSyncAck", @@ -6959,7 +7086,8 @@ ], "tags": [ "Sync" - ] + ], + "x-immich-permission": "syncCheckpoint.read" }, "post": { "operationId": "sendSyncAck", @@ -6992,7 +7120,8 @@ ], "tags": [ "Sync" - ] + ], + "x-immich-permission": "syncCheckpoint.update" } }, "/sync/delta-sync": { @@ -7114,7 +7243,8 @@ ], "tags": [ "Sync" - ] + ], + "x-immich-permission": "sync.stream" } }, "/system-config": { @@ -7146,7 +7276,8 @@ ], "tags": [ "System Config" - ] + ], + "x-immich-permission": "systemConfig.read" }, "put": { "operationId": "updateConfig", @@ -7186,7 +7317,8 @@ ], "tags": [ "System Config" - ] + ], + "x-immich-permission": "systemConfig.update" } }, "/system-config/defaults": { @@ -7218,7 +7350,8 @@ ], "tags": [ "System Config" - ] + ], + "x-immich-permission": "systemConfig.read" } }, "/system-config/storage-template-options": { @@ -7250,7 +7383,8 @@ ], "tags": [ "System Config" - ] + ], + "x-immich-permission": "systemConfig.read" } }, "/system-metadata/admin-onboarding": { @@ -7282,7 +7416,8 @@ ], "tags": [ "System Metadata" - ] + ], + "x-immich-permission": "systemMetadata.read" }, "post": { "operationId": "updateAdminOnboarding", @@ -7315,7 +7450,8 @@ ], "tags": [ "System Metadata" - ] + ], + "x-immich-permission": "systemMetadata.update" } }, "/system-metadata/reverse-geocoding-state": { @@ -7347,7 +7483,8 @@ ], "tags": [ "System Metadata" - ] + ], + "x-immich-permission": "systemMetadata.read" } }, "/system-metadata/version-check-state": { @@ -7379,7 +7516,8 @@ ], "tags": [ "System Metadata" - ] + ], + "x-immich-permission": "systemMetadata.read" } }, "/tags": { @@ -7414,7 +7552,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.read" }, "post": { "operationId": "createTag", @@ -7454,7 +7593,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.create" }, "put": { "operationId": "upsertTags", @@ -7497,7 +7637,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.create" } }, "/tags/assets": { @@ -7539,7 +7680,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.asset" } }, "/tags/{id}": { @@ -7574,7 +7716,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.delete" }, "get": { "operationId": "getTagById", @@ -7614,7 +7757,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.read" }, "put": { "operationId": "updateTag", @@ -7664,7 +7808,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.update" } }, "/tags/{id}/assets": { @@ -7719,7 +7864,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.asset" }, "put": { "operationId": "tagAssets", @@ -7772,7 +7918,8 @@ ], "tags": [ "Tags" - ] + ], + "x-immich-permission": "tag.asset" } }, "/timeline/bucket": { @@ -7925,7 +8072,8 @@ ], "tags": [ "Timeline" - ] + ], + "x-immich-permission": "asset.read" } }, "/timeline/buckets": { @@ -8071,7 +8219,8 @@ ], "tags": [ "Timeline" - ] + ], + "x-immich-permission": "asset.read" } }, "/trash/empty": { @@ -8103,7 +8252,8 @@ ], "tags": [ "Trash" - ] + ], + "x-immich-permission": "asset.delete" } }, "/trash/restore": { @@ -8135,7 +8285,8 @@ ], "tags": [ "Trash" - ] + ], + "x-immich-permission": "asset.delete" } }, "/trash/restore/assets": { @@ -8177,7 +8328,8 @@ ], "tags": [ "Trash" - ] + ], + "x-immich-permission": "asset.delete" } }, "/users": { @@ -8212,7 +8364,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "user.read" } }, "/users/me": { @@ -8244,7 +8397,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "user.read" }, "put": { "operationId": "updateMyUser", @@ -8284,7 +8438,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "user.update" } }, "/users/me/license": { @@ -8309,7 +8464,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userLicense.delete" }, "get": { "operationId": "getUserLicense", @@ -8339,7 +8495,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userLicense.read" }, "put": { "operationId": "setUserLicense", @@ -8379,7 +8536,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userLicense.update" } }, "/users/me/onboarding": { @@ -8404,7 +8562,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userOnboarding.delete" }, "get": { "operationId": "getUserOnboarding", @@ -8434,7 +8593,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userOnboarding.read" }, "put": { "operationId": "setUserOnboarding", @@ -8474,7 +8634,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userOnboarding.update" } }, "/users/me/preferences": { @@ -8506,7 +8667,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userPreference.read" }, "put": { "operationId": "updateMyPreferences", @@ -8546,7 +8708,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userPreference.update" } }, "/users/profile-image": { @@ -8571,7 +8734,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userProfileImage.delete" }, "post": { "operationId": "createProfileImage", @@ -8612,7 +8776,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userProfileImage.update" } }, "/users/{id}": { @@ -8654,7 +8819,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "user.read" } }, "/users/{id}/profile-image": { @@ -8697,7 +8863,8 @@ ], "tags": [ "Users" - ] + ], + "x-immich-permission": "userProfileImage.read" } }, "/view/folder": { diff --git a/server/src/middleware/auth.guard.ts b/server/src/middleware/auth.guard.ts index 69b3cb5ecc..38ff1c373f 100644 --- a/server/src/middleware/auth.guard.ts +++ b/server/src/middleware/auth.guard.ts @@ -7,7 +7,7 @@ import { createParamDecorator, } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; -import { ApiBearerAuth, ApiCookieAuth, ApiOkResponse, ApiQuery, ApiSecurity } from '@nestjs/swagger'; +import { ApiBearerAuth, ApiCookieAuth, ApiExtension, ApiOkResponse, ApiQuery, ApiSecurity } from '@nestjs/swagger'; import { Request } from 'express'; import { AuthDto } from 'src/dtos/auth.dto'; import { ImmichQuery, MetadataKey, Permission } from 'src/enum'; @@ -27,6 +27,10 @@ export const Authenticated = (options?: AuthenticatedOptions): MethodDecorator = SetMetadata(MetadataKey.AuthRoute, options || {}), ]; + if (options?.permission) { + decorators.push(ApiExtension('x-immich-permission', options.permission)); + } + if ((options as SharedLinkRoute)?.sharedLink) { decorators.push( ApiQuery({ name: ImmichQuery.SharedLinkKey, type: String, required: false }),