From a5ac890ba78efa3fda243523ea91b92e0a97aabd Mon Sep 17 00:00:00 2001 From: rikifrank Date: Sun, 29 Oct 2023 16:32:21 +0200 Subject: [PATCH] getPersonAlbums --- cli/src/api/open-api/api.ts | 105 ++++ mobile/openapi/.openapi-generator/FILES | 3 + mobile/openapi/README.md | 534 +++++++++--------- .../openapi/doc/AlbumsForPersonResponseDto.md | 16 + mobile/openapi/doc/PersonApi.md | 56 ++ mobile/openapi/lib/api.dart | 1 + mobile/openapi/lib/api/person_api.dart | 51 ++ mobile/openapi/lib/api_client.dart | 2 + .../model/albums_for_person_response_dto.dart | 106 ++++ .../albums_for_person_response_dto_test.dart | 32 ++ mobile/openapi/test/person_api_test.dart | 5 + server/immich-openapi-specs.json | 61 ++ server/src/domain/album/album-response.dto.ts | 17 + server/src/domain/person/person.service.ts | 7 + .../domain/repositories/person.repository.ts | 2 + .../immich/controllers/person.controller.ts | 6 + .../infra/repositories/person.repository.ts | 23 +- web/src/api/open-api/api.ts | 105 ++++ 18 files changed, 865 insertions(+), 267 deletions(-) create mode 100644 mobile/openapi/doc/AlbumsForPersonResponseDto.md create mode 100644 mobile/openapi/lib/model/albums_for_person_response_dto.dart create mode 100644 mobile/openapi/test/albums_for_person_response_dto_test.dart diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index b1714e2764327..48977baf7c6e1 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -277,6 +277,25 @@ export interface AlbumResponseDto { */ 'updatedAt': string; } +/** + * + * @export + * @interface AlbumsForPersonResponseDto + */ +export interface AlbumsForPersonResponseDto { + /** + * + * @type {string} + * @memberof AlbumsForPersonResponseDto + */ + 'albumId': string; + /** + * + * @type {number} + * @memberof AlbumsForPersonResponseDto + */ + 'assetCount': number; +} /** * * @export @@ -11905,6 +11924,48 @@ export const PersonApiAxiosParamCreator = function (configuration?: Configuratio + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getPersonAlbums: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getPersonAlbums', 'id', id) + const localVarPath = `/person/{id}/albums` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication cookie required + + // authentication api_key required + await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration) + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; @@ -12210,6 +12271,16 @@ export const PersonApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.getPerson(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getPersonAlbums(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getPersonAlbums(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {string} id @@ -12300,6 +12371,15 @@ export const PersonApiFactory = function (configuration?: Configuration, basePat getPerson(requestParameters: PersonApiGetPersonRequest, options?: AxiosRequestConfig): AxiosPromise { return localVarFp.getPerson(requestParameters.id, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {PersonApiGetPersonAlbumsRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getPersonAlbums(requestParameters: PersonApiGetPersonAlbumsRequest, options?: AxiosRequestConfig): AxiosPromise> { + return localVarFp.getPersonAlbums(requestParameters.id, options).then((request) => request(axios, basePath)); + }, /** * * @param {PersonApiGetPersonAssetsRequest} requestParameters Request parameters. @@ -12385,6 +12465,20 @@ export interface PersonApiGetPersonRequest { readonly id: string } +/** + * Request parameters for getPersonAlbums operation in PersonApi. + * @export + * @interface PersonApiGetPersonAlbumsRequest + */ +export interface PersonApiGetPersonAlbumsRequest { + /** + * + * @type {string} + * @memberof PersonApiGetPersonAlbums + */ + readonly id: string +} + /** * Request parameters for getPersonAssets operation in PersonApi. * @export @@ -12512,6 +12606,17 @@ export class PersonApi extends BaseAPI { return PersonApiFp(this.configuration).getPerson(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {PersonApiGetPersonAlbumsRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PersonApi + */ + public getPersonAlbums(requestParameters: PersonApiGetPersonAlbumsRequest, options?: AxiosRequestConfig) { + return PersonApiFp(this.configuration).getPersonAlbums(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {PersonApiGetPersonAssetsRequest} requestParameters Request parameters. diff --git a/mobile/openapi/.openapi-generator/FILES b/mobile/openapi/.openapi-generator/FILES index cbad0876c706c..83b0dee9180b9 100644 --- a/mobile/openapi/.openapi-generator/FILES +++ b/mobile/openapi/.openapi-generator/FILES @@ -13,6 +13,7 @@ doc/AdminSignupResponseDto.md doc/AlbumApi.md doc/AlbumCountResponseDto.md doc/AlbumResponseDto.md +doc/AlbumsForPersonResponseDto.md doc/AllJobStatusResponseDto.md doc/AssetApi.md doc/AssetBulkDeleteDto.md @@ -190,6 +191,7 @@ lib/model/add_users_dto.dart lib/model/admin_signup_response_dto.dart lib/model/album_count_response_dto.dart lib/model/album_response_dto.dart +lib/model/albums_for_person_response_dto.dart lib/model/all_job_status_response_dto.dart lib/model/api_key_create_dto.dart lib/model/api_key_create_response_dto.dart @@ -333,6 +335,7 @@ test/admin_signup_response_dto_test.dart test/album_api_test.dart test/album_count_response_dto_test.dart test/album_response_dto_test.dart +test/albums_for_person_response_dto_test.dart test/all_job_status_response_dto_test.dart test/api_key_api_test.dart test/api_key_create_dto_test.dart diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 29572ead2598d..7ba08e893f62b 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -72,276 +72,278 @@ All URIs are relative to */api* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -*APIKeyApi* | [**createKey**](doc//APIKeyApi.md#createkey) | **POST** /api-key | -*APIKeyApi* | [**deleteKey**](doc//APIKeyApi.md#deletekey) | **DELETE** /api-key/{id} | -*APIKeyApi* | [**getKey**](doc//APIKeyApi.md#getkey) | **GET** /api-key/{id} | -*APIKeyApi* | [**getKeys**](doc//APIKeyApi.md#getkeys) | **GET** /api-key | -*APIKeyApi* | [**updateKey**](doc//APIKeyApi.md#updatekey) | **PUT** /api-key/{id} | -*AlbumApi* | [**addAssetsToAlbum**](doc//AlbumApi.md#addassetstoalbum) | **PUT** /album/{id}/assets | -*AlbumApi* | [**addUsersToAlbum**](doc//AlbumApi.md#adduserstoalbum) | **PUT** /album/{id}/users | -*AlbumApi* | [**createAlbum**](doc//AlbumApi.md#createalbum) | **POST** /album | -*AlbumApi* | [**deleteAlbum**](doc//AlbumApi.md#deletealbum) | **DELETE** /album/{id} | -*AlbumApi* | [**getAlbumCount**](doc//AlbumApi.md#getalbumcount) | **GET** /album/count | -*AlbumApi* | [**getAlbumInfo**](doc//AlbumApi.md#getalbuminfo) | **GET** /album/{id} | -*AlbumApi* | [**getAllAlbums**](doc//AlbumApi.md#getallalbums) | **GET** /album | -*AlbumApi* | [**removeAssetFromAlbum**](doc//AlbumApi.md#removeassetfromalbum) | **DELETE** /album/{id}/assets | -*AlbumApi* | [**removeUserFromAlbum**](doc//AlbumApi.md#removeuserfromalbum) | **DELETE** /album/{id}/user/{userId} | -*AlbumApi* | [**updateAlbumInfo**](doc//AlbumApi.md#updatealbuminfo) | **PATCH** /album/{id} | -*AssetApi* | [**bulkUploadCheck**](doc//AssetApi.md#bulkuploadcheck) | **POST** /asset/bulk-upload-check | -*AssetApi* | [**checkExistingAssets**](doc//AssetApi.md#checkexistingassets) | **POST** /asset/exist | -*AssetApi* | [**deleteAssets**](doc//AssetApi.md#deleteassets) | **DELETE** /asset | -*AssetApi* | [**downloadArchive**](doc//AssetApi.md#downloadarchive) | **POST** /asset/download/archive | -*AssetApi* | [**downloadFile**](doc//AssetApi.md#downloadfile) | **POST** /asset/download/{id} | -*AssetApi* | [**emptyTrash**](doc//AssetApi.md#emptytrash) | **POST** /asset/trash/empty | -*AssetApi* | [**getAllAssets**](doc//AssetApi.md#getallassets) | **GET** /asset | -*AssetApi* | [**getAssetById**](doc//AssetApi.md#getassetbyid) | **GET** /asset/assetById/{id} | -*AssetApi* | [**getAssetSearchTerms**](doc//AssetApi.md#getassetsearchterms) | **GET** /asset/search-terms | -*AssetApi* | [**getAssetStats**](doc//AssetApi.md#getassetstats) | **GET** /asset/statistics | -*AssetApi* | [**getAssetThumbnail**](doc//AssetApi.md#getassetthumbnail) | **GET** /asset/thumbnail/{id} | -*AssetApi* | [**getByTimeBucket**](doc//AssetApi.md#getbytimebucket) | **GET** /asset/time-bucket | -*AssetApi* | [**getCuratedLocations**](doc//AssetApi.md#getcuratedlocations) | **GET** /asset/curated-locations | -*AssetApi* | [**getCuratedObjects**](doc//AssetApi.md#getcuratedobjects) | **GET** /asset/curated-objects | -*AssetApi* | [**getDownloadInfo**](doc//AssetApi.md#getdownloadinfo) | **POST** /asset/download/info | -*AssetApi* | [**getMapMarkers**](doc//AssetApi.md#getmapmarkers) | **GET** /asset/map-marker | -*AssetApi* | [**getMemoryLane**](doc//AssetApi.md#getmemorylane) | **GET** /asset/memory-lane | -*AssetApi* | [**getRandom**](doc//AssetApi.md#getrandom) | **GET** /asset/random | -*AssetApi* | [**getTimeBuckets**](doc//AssetApi.md#gettimebuckets) | **GET** /asset/time-buckets | -*AssetApi* | [**getUserAssetsByDeviceId**](doc//AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} | -*AssetApi* | [**importFile**](doc//AssetApi.md#importfile) | **POST** /asset/import | -*AssetApi* | [**restoreAssets**](doc//AssetApi.md#restoreassets) | **POST** /asset/restore | -*AssetApi* | [**restoreTrash**](doc//AssetApi.md#restoretrash) | **POST** /asset/trash/restore | -*AssetApi* | [**runAssetJobs**](doc//AssetApi.md#runassetjobs) | **POST** /asset/jobs | -*AssetApi* | [**searchAsset**](doc//AssetApi.md#searchasset) | **POST** /asset/search | -*AssetApi* | [**serveFile**](doc//AssetApi.md#servefile) | **GET** /asset/file/{id} | -*AssetApi* | [**updateAsset**](doc//AssetApi.md#updateasset) | **PUT** /asset/{id} | -*AssetApi* | [**updateAssets**](doc//AssetApi.md#updateassets) | **PUT** /asset | -*AssetApi* | [**updateStackParent**](doc//AssetApi.md#updatestackparent) | **PUT** /asset/stack/parent | -*AssetApi* | [**uploadFile**](doc//AssetApi.md#uploadfile) | **POST** /asset/upload | -*AuditApi* | [**fixAuditFiles**](doc//AuditApi.md#fixauditfiles) | **POST** /audit/file-report/fix | -*AuditApi* | [**getAuditDeletes**](doc//AuditApi.md#getauditdeletes) | **GET** /audit/deletes | -*AuditApi* | [**getAuditFiles**](doc//AuditApi.md#getauditfiles) | **GET** /audit/file-report | -*AuditApi* | [**getFileChecksums**](doc//AuditApi.md#getfilechecksums) | **POST** /audit/file-report/checksum | -*AuthenticationApi* | [**adminSignUp**](doc//AuthenticationApi.md#adminsignup) | **POST** /auth/admin-sign-up | -*AuthenticationApi* | [**changePassword**](doc//AuthenticationApi.md#changepassword) | **POST** /auth/change-password | -*AuthenticationApi* | [**getAuthDevices**](doc//AuthenticationApi.md#getauthdevices) | **GET** /auth/devices | -*AuthenticationApi* | [**login**](doc//AuthenticationApi.md#login) | **POST** /auth/login | -*AuthenticationApi* | [**logout**](doc//AuthenticationApi.md#logout) | **POST** /auth/logout | -*AuthenticationApi* | [**logoutAuthDevice**](doc//AuthenticationApi.md#logoutauthdevice) | **DELETE** /auth/devices/{id} | -*AuthenticationApi* | [**logoutAuthDevices**](doc//AuthenticationApi.md#logoutauthdevices) | **DELETE** /auth/devices | -*AuthenticationApi* | [**validateAccessToken**](doc//AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | -*JobApi* | [**getAllJobsStatus**](doc//JobApi.md#getalljobsstatus) | **GET** /jobs | -*JobApi* | [**sendJobCommand**](doc//JobApi.md#sendjobcommand) | **PUT** /jobs/{id} | -*LibraryApi* | [**createLibrary**](doc//LibraryApi.md#createlibrary) | **POST** /library | -*LibraryApi* | [**deleteLibrary**](doc//LibraryApi.md#deletelibrary) | **DELETE** /library/{id} | -*LibraryApi* | [**getAllForUser**](doc//LibraryApi.md#getallforuser) | **GET** /library | -*LibraryApi* | [**getLibraryInfo**](doc//LibraryApi.md#getlibraryinfo) | **GET** /library/{id} | -*LibraryApi* | [**getLibraryStatistics**](doc//LibraryApi.md#getlibrarystatistics) | **GET** /library/{id}/statistics | -*LibraryApi* | [**removeOfflineFiles**](doc//LibraryApi.md#removeofflinefiles) | **POST** /library/{id}/removeOffline | -*LibraryApi* | [**scanLibrary**](doc//LibraryApi.md#scanlibrary) | **POST** /library/{id}/scan | -*LibraryApi* | [**updateLibrary**](doc//LibraryApi.md#updatelibrary) | **PUT** /library/{id} | -*OAuthApi* | [**authorizeOAuth**](doc//OAuthApi.md#authorizeoauth) | **POST** /oauth/authorize | -*OAuthApi* | [**callback**](doc//OAuthApi.md#callback) | **POST** /oauth/callback | -*OAuthApi* | [**generateConfig**](doc//OAuthApi.md#generateconfig) | **POST** /oauth/config | -*OAuthApi* | [**link**](doc//OAuthApi.md#link) | **POST** /oauth/link | -*OAuthApi* | [**mobileRedirect**](doc//OAuthApi.md#mobileredirect) | **GET** /oauth/mobile-redirect | -*OAuthApi* | [**unlink**](doc//OAuthApi.md#unlink) | **POST** /oauth/unlink | -*PartnerApi* | [**createPartner**](doc//PartnerApi.md#createpartner) | **POST** /partner/{id} | -*PartnerApi* | [**getPartners**](doc//PartnerApi.md#getpartners) | **GET** /partner | -*PartnerApi* | [**removePartner**](doc//PartnerApi.md#removepartner) | **DELETE** /partner/{id} | -*PersonApi* | [**getAllPeople**](doc//PersonApi.md#getallpeople) | **GET** /person | -*PersonApi* | [**getPerson**](doc//PersonApi.md#getperson) | **GET** /person/{id} | -*PersonApi* | [**getPersonAssets**](doc//PersonApi.md#getpersonassets) | **GET** /person/{id}/assets | -*PersonApi* | [**getPersonStatistics**](doc//PersonApi.md#getpersonstatistics) | **GET** /person/{id}/statistics | -*PersonApi* | [**getPersonThumbnail**](doc//PersonApi.md#getpersonthumbnail) | **GET** /person/{id}/thumbnail | -*PersonApi* | [**mergePerson**](doc//PersonApi.md#mergeperson) | **POST** /person/{id}/merge | -*PersonApi* | [**updatePeople**](doc//PersonApi.md#updatepeople) | **PUT** /person | -*PersonApi* | [**updatePerson**](doc//PersonApi.md#updateperson) | **PUT** /person/{id} | -*SearchApi* | [**getExploreData**](doc//SearchApi.md#getexploredata) | **GET** /search/explore | -*SearchApi* | [**search**](doc//SearchApi.md#search) | **GET** /search | -*SearchApi* | [**searchPerson**](doc//SearchApi.md#searchperson) | **GET** /search/person | -*ServerInfoApi* | [**getServerConfig**](doc//ServerInfoApi.md#getserverconfig) | **GET** /server-info/config | -*ServerInfoApi* | [**getServerFeatures**](doc//ServerInfoApi.md#getserverfeatures) | **GET** /server-info/features | -*ServerInfoApi* | [**getServerInfo**](doc//ServerInfoApi.md#getserverinfo) | **GET** /server-info | -*ServerInfoApi* | [**getServerVersion**](doc//ServerInfoApi.md#getserverversion) | **GET** /server-info/version | -*ServerInfoApi* | [**getStats**](doc//ServerInfoApi.md#getstats) | **GET** /server-info/stats | -*ServerInfoApi* | [**getSupportedMediaTypes**](doc//ServerInfoApi.md#getsupportedmediatypes) | **GET** /server-info/media-types | -*ServerInfoApi* | [**getTheme**](doc//ServerInfoApi.md#gettheme) | **GET** /server-info/theme | -*ServerInfoApi* | [**pingServer**](doc//ServerInfoApi.md#pingserver) | **GET** /server-info/ping | -*SharedLinkApi* | [**addSharedLinkAssets**](doc//SharedLinkApi.md#addsharedlinkassets) | **PUT** /shared-link/{id}/assets | -*SharedLinkApi* | [**createSharedLink**](doc//SharedLinkApi.md#createsharedlink) | **POST** /shared-link | -*SharedLinkApi* | [**getAllSharedLinks**](doc//SharedLinkApi.md#getallsharedlinks) | **GET** /shared-link | -*SharedLinkApi* | [**getMySharedLink**](doc//SharedLinkApi.md#getmysharedlink) | **GET** /shared-link/me | -*SharedLinkApi* | [**getSharedLinkById**](doc//SharedLinkApi.md#getsharedlinkbyid) | **GET** /shared-link/{id} | -*SharedLinkApi* | [**removeSharedLink**](doc//SharedLinkApi.md#removesharedlink) | **DELETE** /shared-link/{id} | -*SharedLinkApi* | [**removeSharedLinkAssets**](doc//SharedLinkApi.md#removesharedlinkassets) | **DELETE** /shared-link/{id}/assets | -*SharedLinkApi* | [**updateSharedLink**](doc//SharedLinkApi.md#updatesharedlink) | **PATCH** /shared-link/{id} | -*SystemConfigApi* | [**getConfig**](doc//SystemConfigApi.md#getconfig) | **GET** /system-config | -*SystemConfigApi* | [**getDefaults**](doc//SystemConfigApi.md#getdefaults) | **GET** /system-config/defaults | -*SystemConfigApi* | [**getStorageTemplateOptions**](doc//SystemConfigApi.md#getstoragetemplateoptions) | **GET** /system-config/storage-template-options | -*SystemConfigApi* | [**updateConfig**](doc//SystemConfigApi.md#updateconfig) | **PUT** /system-config | -*TagApi* | [**createTag**](doc//TagApi.md#createtag) | **POST** /tag | -*TagApi* | [**deleteTag**](doc//TagApi.md#deletetag) | **DELETE** /tag/{id} | -*TagApi* | [**getAllTags**](doc//TagApi.md#getalltags) | **GET** /tag | -*TagApi* | [**getTagAssets**](doc//TagApi.md#gettagassets) | **GET** /tag/{id}/assets | -*TagApi* | [**getTagById**](doc//TagApi.md#gettagbyid) | **GET** /tag/{id} | -*TagApi* | [**tagAssets**](doc//TagApi.md#tagassets) | **PUT** /tag/{id}/assets | -*TagApi* | [**untagAssets**](doc//TagApi.md#untagassets) | **DELETE** /tag/{id}/assets | -*TagApi* | [**updateTag**](doc//TagApi.md#updatetag) | **PATCH** /tag/{id} | -*UserApi* | [**createProfileImage**](doc//UserApi.md#createprofileimage) | **POST** /user/profile-image | -*UserApi* | [**createUser**](doc//UserApi.md#createuser) | **POST** /user | -*UserApi* | [**deleteUser**](doc//UserApi.md#deleteuser) | **DELETE** /user/{id} | -*UserApi* | [**getAllUsers**](doc//UserApi.md#getallusers) | **GET** /user | -*UserApi* | [**getMyUserInfo**](doc//UserApi.md#getmyuserinfo) | **GET** /user/me | -*UserApi* | [**getProfileImage**](doc//UserApi.md#getprofileimage) | **GET** /user/profile-image/{id} | -*UserApi* | [**getUserById**](doc//UserApi.md#getuserbyid) | **GET** /user/info/{id} | -*UserApi* | [**getUserCount**](doc//UserApi.md#getusercount) | **GET** /user/count | -*UserApi* | [**restoreUser**](doc//UserApi.md#restoreuser) | **POST** /user/{id}/restore | -*UserApi* | [**updateUser**](doc//UserApi.md#updateuser) | **PUT** /user | +*APIKeyApi* | [**createKey**](doc\/APIKeyApi.md#createkey) | **POST** /api-key | +*APIKeyApi* | [**deleteKey**](doc\/APIKeyApi.md#deletekey) | **DELETE** /api-key/{id} | +*APIKeyApi* | [**getKey**](doc\/APIKeyApi.md#getkey) | **GET** /api-key/{id} | +*APIKeyApi* | [**getKeys**](doc\/APIKeyApi.md#getkeys) | **GET** /api-key | +*APIKeyApi* | [**updateKey**](doc\/APIKeyApi.md#updatekey) | **PUT** /api-key/{id} | +*AlbumApi* | [**addAssetsToAlbum**](doc\/AlbumApi.md#addassetstoalbum) | **PUT** /album/{id}/assets | +*AlbumApi* | [**addUsersToAlbum**](doc\/AlbumApi.md#adduserstoalbum) | **PUT** /album/{id}/users | +*AlbumApi* | [**createAlbum**](doc\/AlbumApi.md#createalbum) | **POST** /album | +*AlbumApi* | [**deleteAlbum**](doc\/AlbumApi.md#deletealbum) | **DELETE** /album/{id} | +*AlbumApi* | [**getAlbumCount**](doc\/AlbumApi.md#getalbumcount) | **GET** /album/count | +*AlbumApi* | [**getAlbumInfo**](doc\/AlbumApi.md#getalbuminfo) | **GET** /album/{id} | +*AlbumApi* | [**getAllAlbums**](doc\/AlbumApi.md#getallalbums) | **GET** /album | +*AlbumApi* | [**removeAssetFromAlbum**](doc\/AlbumApi.md#removeassetfromalbum) | **DELETE** /album/{id}/assets | +*AlbumApi* | [**removeUserFromAlbum**](doc\/AlbumApi.md#removeuserfromalbum) | **DELETE** /album/{id}/user/{userId} | +*AlbumApi* | [**updateAlbumInfo**](doc\/AlbumApi.md#updatealbuminfo) | **PATCH** /album/{id} | +*AssetApi* | [**bulkUploadCheck**](doc\/AssetApi.md#bulkuploadcheck) | **POST** /asset/bulk-upload-check | +*AssetApi* | [**checkExistingAssets**](doc\/AssetApi.md#checkexistingassets) | **POST** /asset/exist | +*AssetApi* | [**deleteAssets**](doc\/AssetApi.md#deleteassets) | **DELETE** /asset | +*AssetApi* | [**downloadArchive**](doc\/AssetApi.md#downloadarchive) | **POST** /asset/download/archive | +*AssetApi* | [**downloadFile**](doc\/AssetApi.md#downloadfile) | **POST** /asset/download/{id} | +*AssetApi* | [**emptyTrash**](doc\/AssetApi.md#emptytrash) | **POST** /asset/trash/empty | +*AssetApi* | [**getAllAssets**](doc\/AssetApi.md#getallassets) | **GET** /asset | +*AssetApi* | [**getAssetById**](doc\/AssetApi.md#getassetbyid) | **GET** /asset/assetById/{id} | +*AssetApi* | [**getAssetSearchTerms**](doc\/AssetApi.md#getassetsearchterms) | **GET** /asset/search-terms | +*AssetApi* | [**getAssetStats**](doc\/AssetApi.md#getassetstats) | **GET** /asset/statistics | +*AssetApi* | [**getAssetThumbnail**](doc\/AssetApi.md#getassetthumbnail) | **GET** /asset/thumbnail/{id} | +*AssetApi* | [**getByTimeBucket**](doc\/AssetApi.md#getbytimebucket) | **GET** /asset/time-bucket | +*AssetApi* | [**getCuratedLocations**](doc\/AssetApi.md#getcuratedlocations) | **GET** /asset/curated-locations | +*AssetApi* | [**getCuratedObjects**](doc\/AssetApi.md#getcuratedobjects) | **GET** /asset/curated-objects | +*AssetApi* | [**getDownloadInfo**](doc\/AssetApi.md#getdownloadinfo) | **POST** /asset/download/info | +*AssetApi* | [**getMapMarkers**](doc\/AssetApi.md#getmapmarkers) | **GET** /asset/map-marker | +*AssetApi* | [**getMemoryLane**](doc\/AssetApi.md#getmemorylane) | **GET** /asset/memory-lane | +*AssetApi* | [**getRandom**](doc\/AssetApi.md#getrandom) | **GET** /asset/random | +*AssetApi* | [**getTimeBuckets**](doc\/AssetApi.md#gettimebuckets) | **GET** /asset/time-buckets | +*AssetApi* | [**getUserAssetsByDeviceId**](doc\/AssetApi.md#getuserassetsbydeviceid) | **GET** /asset/{deviceId} | +*AssetApi* | [**importFile**](doc\/AssetApi.md#importfile) | **POST** /asset/import | +*AssetApi* | [**restoreAssets**](doc\/AssetApi.md#restoreassets) | **POST** /asset/restore | +*AssetApi* | [**restoreTrash**](doc\/AssetApi.md#restoretrash) | **POST** /asset/trash/restore | +*AssetApi* | [**runAssetJobs**](doc\/AssetApi.md#runassetjobs) | **POST** /asset/jobs | +*AssetApi* | [**searchAsset**](doc\/AssetApi.md#searchasset) | **POST** /asset/search | +*AssetApi* | [**serveFile**](doc\/AssetApi.md#servefile) | **GET** /asset/file/{id} | +*AssetApi* | [**updateAsset**](doc\/AssetApi.md#updateasset) | **PUT** /asset/{id} | +*AssetApi* | [**updateAssets**](doc\/AssetApi.md#updateassets) | **PUT** /asset | +*AssetApi* | [**updateStackParent**](doc\/AssetApi.md#updatestackparent) | **PUT** /asset/stack/parent | +*AssetApi* | [**uploadFile**](doc\/AssetApi.md#uploadfile) | **POST** /asset/upload | +*AuditApi* | [**fixAuditFiles**](doc\/AuditApi.md#fixauditfiles) | **POST** /audit/file-report/fix | +*AuditApi* | [**getAuditDeletes**](doc\/AuditApi.md#getauditdeletes) | **GET** /audit/deletes | +*AuditApi* | [**getAuditFiles**](doc\/AuditApi.md#getauditfiles) | **GET** /audit/file-report | +*AuditApi* | [**getFileChecksums**](doc\/AuditApi.md#getfilechecksums) | **POST** /audit/file-report/checksum | +*AuthenticationApi* | [**adminSignUp**](doc\/AuthenticationApi.md#adminsignup) | **POST** /auth/admin-sign-up | +*AuthenticationApi* | [**changePassword**](doc\/AuthenticationApi.md#changepassword) | **POST** /auth/change-password | +*AuthenticationApi* | [**getAuthDevices**](doc\/AuthenticationApi.md#getauthdevices) | **GET** /auth/devices | +*AuthenticationApi* | [**login**](doc\/AuthenticationApi.md#login) | **POST** /auth/login | +*AuthenticationApi* | [**logout**](doc\/AuthenticationApi.md#logout) | **POST** /auth/logout | +*AuthenticationApi* | [**logoutAuthDevice**](doc\/AuthenticationApi.md#logoutauthdevice) | **DELETE** /auth/devices/{id} | +*AuthenticationApi* | [**logoutAuthDevices**](doc\/AuthenticationApi.md#logoutauthdevices) | **DELETE** /auth/devices | +*AuthenticationApi* | [**validateAccessToken**](doc\/AuthenticationApi.md#validateaccesstoken) | **POST** /auth/validateToken | +*JobApi* | [**getAllJobsStatus**](doc\/JobApi.md#getalljobsstatus) | **GET** /jobs | +*JobApi* | [**sendJobCommand**](doc\/JobApi.md#sendjobcommand) | **PUT** /jobs/{id} | +*LibraryApi* | [**createLibrary**](doc\/LibraryApi.md#createlibrary) | **POST** /library | +*LibraryApi* | [**deleteLibrary**](doc\/LibraryApi.md#deletelibrary) | **DELETE** /library/{id} | +*LibraryApi* | [**getAllForUser**](doc\/LibraryApi.md#getallforuser) | **GET** /library | +*LibraryApi* | [**getLibraryInfo**](doc\/LibraryApi.md#getlibraryinfo) | **GET** /library/{id} | +*LibraryApi* | [**getLibraryStatistics**](doc\/LibraryApi.md#getlibrarystatistics) | **GET** /library/{id}/statistics | +*LibraryApi* | [**removeOfflineFiles**](doc\/LibraryApi.md#removeofflinefiles) | **POST** /library/{id}/removeOffline | +*LibraryApi* | [**scanLibrary**](doc\/LibraryApi.md#scanlibrary) | **POST** /library/{id}/scan | +*LibraryApi* | [**updateLibrary**](doc\/LibraryApi.md#updatelibrary) | **PUT** /library/{id} | +*OAuthApi* | [**authorizeOAuth**](doc\/OAuthApi.md#authorizeoauth) | **POST** /oauth/authorize | +*OAuthApi* | [**callback**](doc\/OAuthApi.md#callback) | **POST** /oauth/callback | +*OAuthApi* | [**generateConfig**](doc\/OAuthApi.md#generateconfig) | **POST** /oauth/config | +*OAuthApi* | [**link**](doc\/OAuthApi.md#link) | **POST** /oauth/link | +*OAuthApi* | [**mobileRedirect**](doc\/OAuthApi.md#mobileredirect) | **GET** /oauth/mobile-redirect | +*OAuthApi* | [**unlink**](doc\/OAuthApi.md#unlink) | **POST** /oauth/unlink | +*PartnerApi* | [**createPartner**](doc\/PartnerApi.md#createpartner) | **POST** /partner/{id} | +*PartnerApi* | [**getPartners**](doc\/PartnerApi.md#getpartners) | **GET** /partner | +*PartnerApi* | [**removePartner**](doc\/PartnerApi.md#removepartner) | **DELETE** /partner/{id} | +*PersonApi* | [**getAllPeople**](doc\/PersonApi.md#getallpeople) | **GET** /person | +*PersonApi* | [**getPerson**](doc\/PersonApi.md#getperson) | **GET** /person/{id} | +*PersonApi* | [**getPersonAlbums**](doc\/PersonApi.md#getpersonalbums) | **GET** /person/{id}/albums | +*PersonApi* | [**getPersonAssets**](doc\/PersonApi.md#getpersonassets) | **GET** /person/{id}/assets | +*PersonApi* | [**getPersonStatistics**](doc\/PersonApi.md#getpersonstatistics) | **GET** /person/{id}/statistics | +*PersonApi* | [**getPersonThumbnail**](doc\/PersonApi.md#getpersonthumbnail) | **GET** /person/{id}/thumbnail | +*PersonApi* | [**mergePerson**](doc\/PersonApi.md#mergeperson) | **POST** /person/{id}/merge | +*PersonApi* | [**updatePeople**](doc\/PersonApi.md#updatepeople) | **PUT** /person | +*PersonApi* | [**updatePerson**](doc\/PersonApi.md#updateperson) | **PUT** /person/{id} | +*SearchApi* | [**getExploreData**](doc\/SearchApi.md#getexploredata) | **GET** /search/explore | +*SearchApi* | [**search**](doc\/SearchApi.md#search) | **GET** /search | +*SearchApi* | [**searchPerson**](doc\/SearchApi.md#searchperson) | **GET** /search/person | +*ServerInfoApi* | [**getServerConfig**](doc\/ServerInfoApi.md#getserverconfig) | **GET** /server-info/config | +*ServerInfoApi* | [**getServerFeatures**](doc\/ServerInfoApi.md#getserverfeatures) | **GET** /server-info/features | +*ServerInfoApi* | [**getServerInfo**](doc\/ServerInfoApi.md#getserverinfo) | **GET** /server-info | +*ServerInfoApi* | [**getServerVersion**](doc\/ServerInfoApi.md#getserverversion) | **GET** /server-info/version | +*ServerInfoApi* | [**getStats**](doc\/ServerInfoApi.md#getstats) | **GET** /server-info/stats | +*ServerInfoApi* | [**getSupportedMediaTypes**](doc\/ServerInfoApi.md#getsupportedmediatypes) | **GET** /server-info/media-types | +*ServerInfoApi* | [**getTheme**](doc\/ServerInfoApi.md#gettheme) | **GET** /server-info/theme | +*ServerInfoApi* | [**pingServer**](doc\/ServerInfoApi.md#pingserver) | **GET** /server-info/ping | +*SharedLinkApi* | [**addSharedLinkAssets**](doc\/SharedLinkApi.md#addsharedlinkassets) | **PUT** /shared-link/{id}/assets | +*SharedLinkApi* | [**createSharedLink**](doc\/SharedLinkApi.md#createsharedlink) | **POST** /shared-link | +*SharedLinkApi* | [**getAllSharedLinks**](doc\/SharedLinkApi.md#getallsharedlinks) | **GET** /shared-link | +*SharedLinkApi* | [**getMySharedLink**](doc\/SharedLinkApi.md#getmysharedlink) | **GET** /shared-link/me | +*SharedLinkApi* | [**getSharedLinkById**](doc\/SharedLinkApi.md#getsharedlinkbyid) | **GET** /shared-link/{id} | +*SharedLinkApi* | [**removeSharedLink**](doc\/SharedLinkApi.md#removesharedlink) | **DELETE** /shared-link/{id} | +*SharedLinkApi* | [**removeSharedLinkAssets**](doc\/SharedLinkApi.md#removesharedlinkassets) | **DELETE** /shared-link/{id}/assets | +*SharedLinkApi* | [**updateSharedLink**](doc\/SharedLinkApi.md#updatesharedlink) | **PATCH** /shared-link/{id} | +*SystemConfigApi* | [**getConfig**](doc\/SystemConfigApi.md#getconfig) | **GET** /system-config | +*SystemConfigApi* | [**getDefaults**](doc\/SystemConfigApi.md#getdefaults) | **GET** /system-config/defaults | +*SystemConfigApi* | [**getStorageTemplateOptions**](doc\/SystemConfigApi.md#getstoragetemplateoptions) | **GET** /system-config/storage-template-options | +*SystemConfigApi* | [**updateConfig**](doc\/SystemConfigApi.md#updateconfig) | **PUT** /system-config | +*TagApi* | [**createTag**](doc\/TagApi.md#createtag) | **POST** /tag | +*TagApi* | [**deleteTag**](doc\/TagApi.md#deletetag) | **DELETE** /tag/{id} | +*TagApi* | [**getAllTags**](doc\/TagApi.md#getalltags) | **GET** /tag | +*TagApi* | [**getTagAssets**](doc\/TagApi.md#gettagassets) | **GET** /tag/{id}/assets | +*TagApi* | [**getTagById**](doc\/TagApi.md#gettagbyid) | **GET** /tag/{id} | +*TagApi* | [**tagAssets**](doc\/TagApi.md#tagassets) | **PUT** /tag/{id}/assets | +*TagApi* | [**untagAssets**](doc\/TagApi.md#untagassets) | **DELETE** /tag/{id}/assets | +*TagApi* | [**updateTag**](doc\/TagApi.md#updatetag) | **PATCH** /tag/{id} | +*UserApi* | [**createProfileImage**](doc\/UserApi.md#createprofileimage) | **POST** /user/profile-image | +*UserApi* | [**createUser**](doc\/UserApi.md#createuser) | **POST** /user | +*UserApi* | [**deleteUser**](doc\/UserApi.md#deleteuser) | **DELETE** /user/{id} | +*UserApi* | [**getAllUsers**](doc\/UserApi.md#getallusers) | **GET** /user | +*UserApi* | [**getMyUserInfo**](doc\/UserApi.md#getmyuserinfo) | **GET** /user/me | +*UserApi* | [**getProfileImage**](doc\/UserApi.md#getprofileimage) | **GET** /user/profile-image/{id} | +*UserApi* | [**getUserById**](doc\/UserApi.md#getuserbyid) | **GET** /user/info/{id} | +*UserApi* | [**getUserCount**](doc\/UserApi.md#getusercount) | **GET** /user/count | +*UserApi* | [**restoreUser**](doc\/UserApi.md#restoreuser) | **POST** /user/{id}/restore | +*UserApi* | [**updateUser**](doc\/UserApi.md#updateuser) | **PUT** /user | ## Documentation For Models - - [APIKeyCreateDto](doc//APIKeyCreateDto.md) - - [APIKeyCreateResponseDto](doc//APIKeyCreateResponseDto.md) - - [APIKeyResponseDto](doc//APIKeyResponseDto.md) - - [APIKeyUpdateDto](doc//APIKeyUpdateDto.md) - - [AddUsersDto](doc//AddUsersDto.md) - - [AdminSignupResponseDto](doc//AdminSignupResponseDto.md) - - [AlbumCountResponseDto](doc//AlbumCountResponseDto.md) - - [AlbumResponseDto](doc//AlbumResponseDto.md) - - [AllJobStatusResponseDto](doc//AllJobStatusResponseDto.md) - - [AssetBulkDeleteDto](doc//AssetBulkDeleteDto.md) - - [AssetBulkUpdateDto](doc//AssetBulkUpdateDto.md) - - [AssetBulkUploadCheckDto](doc//AssetBulkUploadCheckDto.md) - - [AssetBulkUploadCheckItem](doc//AssetBulkUploadCheckItem.md) - - [AssetBulkUploadCheckResponseDto](doc//AssetBulkUploadCheckResponseDto.md) - - [AssetBulkUploadCheckResult](doc//AssetBulkUploadCheckResult.md) - - [AssetFileUploadResponseDto](doc//AssetFileUploadResponseDto.md) - - [AssetIdsDto](doc//AssetIdsDto.md) - - [AssetIdsResponseDto](doc//AssetIdsResponseDto.md) - - [AssetJobName](doc//AssetJobName.md) - - [AssetJobsDto](doc//AssetJobsDto.md) - - [AssetResponseDto](doc//AssetResponseDto.md) - - [AssetStatsResponseDto](doc//AssetStatsResponseDto.md) - - [AssetTypeEnum](doc//AssetTypeEnum.md) - - [AudioCodec](doc//AudioCodec.md) - - [AuditDeletesResponseDto](doc//AuditDeletesResponseDto.md) - - [AuthDeviceResponseDto](doc//AuthDeviceResponseDto.md) - - [BulkIdResponseDto](doc//BulkIdResponseDto.md) - - [BulkIdsDto](doc//BulkIdsDto.md) - - [CLIPConfig](doc//CLIPConfig.md) - - [CLIPMode](doc//CLIPMode.md) - - [CQMode](doc//CQMode.md) - - [ChangePasswordDto](doc//ChangePasswordDto.md) - - [CheckExistingAssetsDto](doc//CheckExistingAssetsDto.md) - - [CheckExistingAssetsResponseDto](doc//CheckExistingAssetsResponseDto.md) - - [CitiesFile](doc//CitiesFile.md) - - [ClassificationConfig](doc//ClassificationConfig.md) - - [Colorspace](doc//Colorspace.md) - - [CreateAlbumDto](doc//CreateAlbumDto.md) - - [CreateLibraryDto](doc//CreateLibraryDto.md) - - [CreateProfileImageResponseDto](doc//CreateProfileImageResponseDto.md) - - [CreateTagDto](doc//CreateTagDto.md) - - [CreateUserDto](doc//CreateUserDto.md) - - [CuratedLocationsResponseDto](doc//CuratedLocationsResponseDto.md) - - [CuratedObjectsResponseDto](doc//CuratedObjectsResponseDto.md) - - [DownloadArchiveInfo](doc//DownloadArchiveInfo.md) - - [DownloadInfoDto](doc//DownloadInfoDto.md) - - [DownloadResponseDto](doc//DownloadResponseDto.md) - - [EntityType](doc//EntityType.md) - - [ExifResponseDto](doc//ExifResponseDto.md) - - [FileChecksumDto](doc//FileChecksumDto.md) - - [FileChecksumResponseDto](doc//FileChecksumResponseDto.md) - - [FileReportDto](doc//FileReportDto.md) - - [FileReportFixDto](doc//FileReportFixDto.md) - - [FileReportItemDto](doc//FileReportItemDto.md) - - [ImportAssetDto](doc//ImportAssetDto.md) - - [JobCommand](doc//JobCommand.md) - - [JobCommandDto](doc//JobCommandDto.md) - - [JobCountsDto](doc//JobCountsDto.md) - - [JobName](doc//JobName.md) - - [JobSettingsDto](doc//JobSettingsDto.md) - - [JobStatusDto](doc//JobStatusDto.md) - - [LibraryResponseDto](doc//LibraryResponseDto.md) - - [LibraryStatsResponseDto](doc//LibraryStatsResponseDto.md) - - [LibraryType](doc//LibraryType.md) - - [LoginCredentialDto](doc//LoginCredentialDto.md) - - [LoginResponseDto](doc//LoginResponseDto.md) - - [LogoutResponseDto](doc//LogoutResponseDto.md) - - [MapMarkerResponseDto](doc//MapMarkerResponseDto.md) - - [MemoryLaneResponseDto](doc//MemoryLaneResponseDto.md) - - [MergePersonDto](doc//MergePersonDto.md) - - [ModelType](doc//ModelType.md) - - [OAuthAuthorizeResponseDto](doc//OAuthAuthorizeResponseDto.md) - - [OAuthCallbackDto](doc//OAuthCallbackDto.md) - - [OAuthConfigDto](doc//OAuthConfigDto.md) - - [OAuthConfigResponseDto](doc//OAuthConfigResponseDto.md) - - [PathEntityType](doc//PathEntityType.md) - - [PathType](doc//PathType.md) - - [PeopleResponseDto](doc//PeopleResponseDto.md) - - [PeopleUpdateDto](doc//PeopleUpdateDto.md) - - [PeopleUpdateItem](doc//PeopleUpdateItem.md) - - [PersonResponseDto](doc//PersonResponseDto.md) - - [PersonStatisticsResponseDto](doc//PersonStatisticsResponseDto.md) - - [PersonUpdateDto](doc//PersonUpdateDto.md) - - [QueueStatusDto](doc//QueueStatusDto.md) - - [RecognitionConfig](doc//RecognitionConfig.md) - - [ScanLibraryDto](doc//ScanLibraryDto.md) - - [SearchAlbumResponseDto](doc//SearchAlbumResponseDto.md) - - [SearchAssetDto](doc//SearchAssetDto.md) - - [SearchAssetResponseDto](doc//SearchAssetResponseDto.md) - - [SearchExploreItem](doc//SearchExploreItem.md) - - [SearchExploreResponseDto](doc//SearchExploreResponseDto.md) - - [SearchFacetCountResponseDto](doc//SearchFacetCountResponseDto.md) - - [SearchFacetResponseDto](doc//SearchFacetResponseDto.md) - - [SearchResponseDto](doc//SearchResponseDto.md) - - [ServerConfigDto](doc//ServerConfigDto.md) - - [ServerFeaturesDto](doc//ServerFeaturesDto.md) - - [ServerInfoResponseDto](doc//ServerInfoResponseDto.md) - - [ServerMediaTypesResponseDto](doc//ServerMediaTypesResponseDto.md) - - [ServerPingResponse](doc//ServerPingResponse.md) - - [ServerStatsResponseDto](doc//ServerStatsResponseDto.md) - - [ServerThemeDto](doc//ServerThemeDto.md) - - [ServerVersionResponseDto](doc//ServerVersionResponseDto.md) - - [SharedLinkCreateDto](doc//SharedLinkCreateDto.md) - - [SharedLinkEditDto](doc//SharedLinkEditDto.md) - - [SharedLinkResponseDto](doc//SharedLinkResponseDto.md) - - [SharedLinkType](doc//SharedLinkType.md) - - [SignUpDto](doc//SignUpDto.md) - - [SmartInfoResponseDto](doc//SmartInfoResponseDto.md) - - [SystemConfigDto](doc//SystemConfigDto.md) - - [SystemConfigFFmpegDto](doc//SystemConfigFFmpegDto.md) - - [SystemConfigJobDto](doc//SystemConfigJobDto.md) - - [SystemConfigMachineLearningDto](doc//SystemConfigMachineLearningDto.md) - - [SystemConfigMapDto](doc//SystemConfigMapDto.md) - - [SystemConfigNewVersionCheckDto](doc//SystemConfigNewVersionCheckDto.md) - - [SystemConfigOAuthDto](doc//SystemConfigOAuthDto.md) - - [SystemConfigPasswordLoginDto](doc//SystemConfigPasswordLoginDto.md) - - [SystemConfigReverseGeocodingDto](doc//SystemConfigReverseGeocodingDto.md) - - [SystemConfigStorageTemplateDto](doc//SystemConfigStorageTemplateDto.md) - - [SystemConfigTemplateStorageOptionDto](doc//SystemConfigTemplateStorageOptionDto.md) - - [SystemConfigThemeDto](doc//SystemConfigThemeDto.md) - - [SystemConfigThumbnailDto](doc//SystemConfigThumbnailDto.md) - - [SystemConfigTrashDto](doc//SystemConfigTrashDto.md) - - [TagResponseDto](doc//TagResponseDto.md) - - [TagTypeEnum](doc//TagTypeEnum.md) - - [ThumbnailFormat](doc//ThumbnailFormat.md) - - [TimeBucketResponseDto](doc//TimeBucketResponseDto.md) - - [TimeBucketSize](doc//TimeBucketSize.md) - - [ToneMapping](doc//ToneMapping.md) - - [TranscodeHWAccel](doc//TranscodeHWAccel.md) - - [TranscodePolicy](doc//TranscodePolicy.md) - - [UpdateAlbumDto](doc//UpdateAlbumDto.md) - - [UpdateAssetDto](doc//UpdateAssetDto.md) - - [UpdateLibraryDto](doc//UpdateLibraryDto.md) - - [UpdateStackParentDto](doc//UpdateStackParentDto.md) - - [UpdateTagDto](doc//UpdateTagDto.md) - - [UpdateUserDto](doc//UpdateUserDto.md) - - [UsageByUserDto](doc//UsageByUserDto.md) - - [UserCountResponseDto](doc//UserCountResponseDto.md) - - [UserResponseDto](doc//UserResponseDto.md) - - [ValidateAccessTokenResponseDto](doc//ValidateAccessTokenResponseDto.md) - - [VideoCodec](doc//VideoCodec.md) + - [APIKeyCreateDto](doc\/APIKeyCreateDto.md) + - [APIKeyCreateResponseDto](doc\/APIKeyCreateResponseDto.md) + - [APIKeyResponseDto](doc\/APIKeyResponseDto.md) + - [APIKeyUpdateDto](doc\/APIKeyUpdateDto.md) + - [AddUsersDto](doc\/AddUsersDto.md) + - [AdminSignupResponseDto](doc\/AdminSignupResponseDto.md) + - [AlbumCountResponseDto](doc\/AlbumCountResponseDto.md) + - [AlbumResponseDto](doc\/AlbumResponseDto.md) + - [AlbumsForPersonResponseDto](doc\/AlbumsForPersonResponseDto.md) + - [AllJobStatusResponseDto](doc\/AllJobStatusResponseDto.md) + - [AssetBulkDeleteDto](doc\/AssetBulkDeleteDto.md) + - [AssetBulkUpdateDto](doc\/AssetBulkUpdateDto.md) + - [AssetBulkUploadCheckDto](doc\/AssetBulkUploadCheckDto.md) + - [AssetBulkUploadCheckItem](doc\/AssetBulkUploadCheckItem.md) + - [AssetBulkUploadCheckResponseDto](doc\/AssetBulkUploadCheckResponseDto.md) + - [AssetBulkUploadCheckResult](doc\/AssetBulkUploadCheckResult.md) + - [AssetFileUploadResponseDto](doc\/AssetFileUploadResponseDto.md) + - [AssetIdsDto](doc\/AssetIdsDto.md) + - [AssetIdsResponseDto](doc\/AssetIdsResponseDto.md) + - [AssetJobName](doc\/AssetJobName.md) + - [AssetJobsDto](doc\/AssetJobsDto.md) + - [AssetResponseDto](doc\/AssetResponseDto.md) + - [AssetStatsResponseDto](doc\/AssetStatsResponseDto.md) + - [AssetTypeEnum](doc\/AssetTypeEnum.md) + - [AudioCodec](doc\/AudioCodec.md) + - [AuditDeletesResponseDto](doc\/AuditDeletesResponseDto.md) + - [AuthDeviceResponseDto](doc\/AuthDeviceResponseDto.md) + - [BulkIdResponseDto](doc\/BulkIdResponseDto.md) + - [BulkIdsDto](doc\/BulkIdsDto.md) + - [CLIPConfig](doc\/CLIPConfig.md) + - [CLIPMode](doc\/CLIPMode.md) + - [CQMode](doc\/CQMode.md) + - [ChangePasswordDto](doc\/ChangePasswordDto.md) + - [CheckExistingAssetsDto](doc\/CheckExistingAssetsDto.md) + - [CheckExistingAssetsResponseDto](doc\/CheckExistingAssetsResponseDto.md) + - [CitiesFile](doc\/CitiesFile.md) + - [ClassificationConfig](doc\/ClassificationConfig.md) + - [Colorspace](doc\/Colorspace.md) + - [CreateAlbumDto](doc\/CreateAlbumDto.md) + - [CreateLibraryDto](doc\/CreateLibraryDto.md) + - [CreateProfileImageResponseDto](doc\/CreateProfileImageResponseDto.md) + - [CreateTagDto](doc\/CreateTagDto.md) + - [CreateUserDto](doc\/CreateUserDto.md) + - [CuratedLocationsResponseDto](doc\/CuratedLocationsResponseDto.md) + - [CuratedObjectsResponseDto](doc\/CuratedObjectsResponseDto.md) + - [DownloadArchiveInfo](doc\/DownloadArchiveInfo.md) + - [DownloadInfoDto](doc\/DownloadInfoDto.md) + - [DownloadResponseDto](doc\/DownloadResponseDto.md) + - [EntityType](doc\/EntityType.md) + - [ExifResponseDto](doc\/ExifResponseDto.md) + - [FileChecksumDto](doc\/FileChecksumDto.md) + - [FileChecksumResponseDto](doc\/FileChecksumResponseDto.md) + - [FileReportDto](doc\/FileReportDto.md) + - [FileReportFixDto](doc\/FileReportFixDto.md) + - [FileReportItemDto](doc\/FileReportItemDto.md) + - [ImportAssetDto](doc\/ImportAssetDto.md) + - [JobCommand](doc\/JobCommand.md) + - [JobCommandDto](doc\/JobCommandDto.md) + - [JobCountsDto](doc\/JobCountsDto.md) + - [JobName](doc\/JobName.md) + - [JobSettingsDto](doc\/JobSettingsDto.md) + - [JobStatusDto](doc\/JobStatusDto.md) + - [LibraryResponseDto](doc\/LibraryResponseDto.md) + - [LibraryStatsResponseDto](doc\/LibraryStatsResponseDto.md) + - [LibraryType](doc\/LibraryType.md) + - [LoginCredentialDto](doc\/LoginCredentialDto.md) + - [LoginResponseDto](doc\/LoginResponseDto.md) + - [LogoutResponseDto](doc\/LogoutResponseDto.md) + - [MapMarkerResponseDto](doc\/MapMarkerResponseDto.md) + - [MemoryLaneResponseDto](doc\/MemoryLaneResponseDto.md) + - [MergePersonDto](doc\/MergePersonDto.md) + - [ModelType](doc\/ModelType.md) + - [OAuthAuthorizeResponseDto](doc\/OAuthAuthorizeResponseDto.md) + - [OAuthCallbackDto](doc\/OAuthCallbackDto.md) + - [OAuthConfigDto](doc\/OAuthConfigDto.md) + - [OAuthConfigResponseDto](doc\/OAuthConfigResponseDto.md) + - [PathEntityType](doc\/PathEntityType.md) + - [PathType](doc\/PathType.md) + - [PeopleResponseDto](doc\/PeopleResponseDto.md) + - [PeopleUpdateDto](doc\/PeopleUpdateDto.md) + - [PeopleUpdateItem](doc\/PeopleUpdateItem.md) + - [PersonResponseDto](doc\/PersonResponseDto.md) + - [PersonStatisticsResponseDto](doc\/PersonStatisticsResponseDto.md) + - [PersonUpdateDto](doc\/PersonUpdateDto.md) + - [QueueStatusDto](doc\/QueueStatusDto.md) + - [RecognitionConfig](doc\/RecognitionConfig.md) + - [ScanLibraryDto](doc\/ScanLibraryDto.md) + - [SearchAlbumResponseDto](doc\/SearchAlbumResponseDto.md) + - [SearchAssetDto](doc\/SearchAssetDto.md) + - [SearchAssetResponseDto](doc\/SearchAssetResponseDto.md) + - [SearchExploreItem](doc\/SearchExploreItem.md) + - [SearchExploreResponseDto](doc\/SearchExploreResponseDto.md) + - [SearchFacetCountResponseDto](doc\/SearchFacetCountResponseDto.md) + - [SearchFacetResponseDto](doc\/SearchFacetResponseDto.md) + - [SearchResponseDto](doc\/SearchResponseDto.md) + - [ServerConfigDto](doc\/ServerConfigDto.md) + - [ServerFeaturesDto](doc\/ServerFeaturesDto.md) + - [ServerInfoResponseDto](doc\/ServerInfoResponseDto.md) + - [ServerMediaTypesResponseDto](doc\/ServerMediaTypesResponseDto.md) + - [ServerPingResponse](doc\/ServerPingResponse.md) + - [ServerStatsResponseDto](doc\/ServerStatsResponseDto.md) + - [ServerThemeDto](doc\/ServerThemeDto.md) + - [ServerVersionResponseDto](doc\/ServerVersionResponseDto.md) + - [SharedLinkCreateDto](doc\/SharedLinkCreateDto.md) + - [SharedLinkEditDto](doc\/SharedLinkEditDto.md) + - [SharedLinkResponseDto](doc\/SharedLinkResponseDto.md) + - [SharedLinkType](doc\/SharedLinkType.md) + - [SignUpDto](doc\/SignUpDto.md) + - [SmartInfoResponseDto](doc\/SmartInfoResponseDto.md) + - [SystemConfigDto](doc\/SystemConfigDto.md) + - [SystemConfigFFmpegDto](doc\/SystemConfigFFmpegDto.md) + - [SystemConfigJobDto](doc\/SystemConfigJobDto.md) + - [SystemConfigMachineLearningDto](doc\/SystemConfigMachineLearningDto.md) + - [SystemConfigMapDto](doc\/SystemConfigMapDto.md) + - [SystemConfigNewVersionCheckDto](doc\/SystemConfigNewVersionCheckDto.md) + - [SystemConfigOAuthDto](doc\/SystemConfigOAuthDto.md) + - [SystemConfigPasswordLoginDto](doc\/SystemConfigPasswordLoginDto.md) + - [SystemConfigReverseGeocodingDto](doc\/SystemConfigReverseGeocodingDto.md) + - [SystemConfigStorageTemplateDto](doc\/SystemConfigStorageTemplateDto.md) + - [SystemConfigTemplateStorageOptionDto](doc\/SystemConfigTemplateStorageOptionDto.md) + - [SystemConfigThemeDto](doc\/SystemConfigThemeDto.md) + - [SystemConfigThumbnailDto](doc\/SystemConfigThumbnailDto.md) + - [SystemConfigTrashDto](doc\/SystemConfigTrashDto.md) + - [TagResponseDto](doc\/TagResponseDto.md) + - [TagTypeEnum](doc\/TagTypeEnum.md) + - [ThumbnailFormat](doc\/ThumbnailFormat.md) + - [TimeBucketResponseDto](doc\/TimeBucketResponseDto.md) + - [TimeBucketSize](doc\/TimeBucketSize.md) + - [ToneMapping](doc\/ToneMapping.md) + - [TranscodeHWAccel](doc\/TranscodeHWAccel.md) + - [TranscodePolicy](doc\/TranscodePolicy.md) + - [UpdateAlbumDto](doc\/UpdateAlbumDto.md) + - [UpdateAssetDto](doc\/UpdateAssetDto.md) + - [UpdateLibraryDto](doc\/UpdateLibraryDto.md) + - [UpdateStackParentDto](doc\/UpdateStackParentDto.md) + - [UpdateTagDto](doc\/UpdateTagDto.md) + - [UpdateUserDto](doc\/UpdateUserDto.md) + - [UsageByUserDto](doc\/UsageByUserDto.md) + - [UserCountResponseDto](doc\/UserCountResponseDto.md) + - [UserResponseDto](doc\/UserResponseDto.md) + - [ValidateAccessTokenResponseDto](doc\/ValidateAccessTokenResponseDto.md) + - [VideoCodec](doc\/VideoCodec.md) ## Documentation For Authorization diff --git a/mobile/openapi/doc/AlbumsForPersonResponseDto.md b/mobile/openapi/doc/AlbumsForPersonResponseDto.md new file mode 100644 index 0000000000000..1dcee6b42fbca --- /dev/null +++ b/mobile/openapi/doc/AlbumsForPersonResponseDto.md @@ -0,0 +1,16 @@ +# openapi.model.AlbumsForPersonResponseDto + +## Load the model package +```dart +import 'package:openapi/api.dart'; +``` + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**albumId** | **String** | | +**assetCount** | **int** | | + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/mobile/openapi/doc/PersonApi.md b/mobile/openapi/doc/PersonApi.md index 73a35f0f335c7..cf0886b8586c6 100644 --- a/mobile/openapi/doc/PersonApi.md +++ b/mobile/openapi/doc/PersonApi.md @@ -11,6 +11,7 @@ Method | HTTP request | Description ------------- | ------------- | ------------- [**getAllPeople**](PersonApi.md#getallpeople) | **GET** /person | [**getPerson**](PersonApi.md#getperson) | **GET** /person/{id} | +[**getPersonAlbums**](PersonApi.md#getpersonalbums) | **GET** /person/{id}/albums | [**getPersonAssets**](PersonApi.md#getpersonassets) | **GET** /person/{id}/assets | [**getPersonStatistics**](PersonApi.md#getpersonstatistics) | **GET** /person/{id}/statistics | [**getPersonThumbnail**](PersonApi.md#getpersonthumbnail) | **GET** /person/{id}/thumbnail | @@ -129,6 +130,61 @@ Name | Type | Description | Notes [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **getPersonAlbums** +> List getPersonAlbums(id) + + + +### Example +```dart +import 'package:openapi/api.dart'; +// TODO Configure API key authorization: cookie +//defaultApiClient.getAuthentication('cookie').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('cookie').apiKeyPrefix = 'Bearer'; +// TODO Configure API key authorization: api_key +//defaultApiClient.getAuthentication('api_key').apiKey = 'YOUR_API_KEY'; +// uncomment below to setup prefix (e.g. Bearer) for API key, if needed +//defaultApiClient.getAuthentication('api_key').apiKeyPrefix = 'Bearer'; +// TODO Configure HTTP Bearer authorization: bearer +// Case 1. Use String Token +//defaultApiClient.getAuthentication('bearer').setAccessToken('YOUR_ACCESS_TOKEN'); +// Case 2. Use Function which generate token. +// String yourTokenGeneratorFunction() { ... } +//defaultApiClient.getAuthentication('bearer').setAccessToken(yourTokenGeneratorFunction); + +final api_instance = PersonApi(); +final id = 38400000-8cf0-11bd-b23e-10b96e4ef00d; // String | + +try { + final result = api_instance.getPersonAlbums(id); + print(result); +} catch (e) { + print('Exception when calling PersonApi->getPersonAlbums: $e\n'); +} +``` + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **id** | **String**| | + +### Return type + +[**List**](AlbumsForPersonResponseDto.md) + +### Authorization + +[cookie](../README.md#cookie), [api_key](../README.md#api_key), [bearer](../README.md#bearer) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **getPersonAssets** > List getPersonAssets(id) diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index 22c4a23e618ad..6f57dc98e7cf5 100644 --- a/mobile/openapi/lib/api.dart +++ b/mobile/openapi/lib/api.dart @@ -53,6 +53,7 @@ part 'model/add_users_dto.dart'; part 'model/admin_signup_response_dto.dart'; part 'model/album_count_response_dto.dart'; part 'model/album_response_dto.dart'; +part 'model/albums_for_person_response_dto.dart'; part 'model/all_job_status_response_dto.dart'; part 'model/asset_bulk_delete_dto.dart'; part 'model/asset_bulk_update_dto.dart'; diff --git a/mobile/openapi/lib/api/person_api.dart b/mobile/openapi/lib/api/person_api.dart index e4ab011a6b99b..7345a1b282d7e 100644 --- a/mobile/openapi/lib/api/person_api.dart +++ b/mobile/openapi/lib/api/person_api.dart @@ -115,6 +115,57 @@ class PersonApi { return null; } + /// Performs an HTTP 'GET /person/{id}/albums' operation and returns the [Response]. + /// Parameters: + /// + /// * [String] id (required): + Future getPersonAlbumsWithHttpInfo(String id,) async { + // ignore: prefer_const_declarations + final path = r'/person/{id}/albums' + .replaceAll('{id}', id); + + // ignore: prefer_final_locals + Object? postBody; + + final queryParams = []; + final headerParams = {}; + final formParams = {}; + + const contentTypes = []; + + + return apiClient.invokeAPI( + path, + 'GET', + queryParams, + postBody, + headerParams, + formParams, + contentTypes.isEmpty ? null : contentTypes.first, + ); + } + + /// Parameters: + /// + /// * [String] id (required): + Future?> getPersonAlbums(String id,) async { + final response = await getPersonAlbumsWithHttpInfo(id,); + if (response.statusCode >= HttpStatus.badRequest) { + throw ApiException(response.statusCode, await _decodeBodyBytes(response)); + } + // When a remote server returns no body with a status of 204, we shall not decode it. + // At the time of writing this, `dart:convert` will throw an "Unexpected end of input" + // FormatException when trying to decode an empty string. + if (response.body.isNotEmpty && response.statusCode != HttpStatus.noContent) { + final responseBody = await _decodeBodyBytes(response); + return (await apiClient.deserializeAsync(responseBody, 'List') as List) + .cast() + .toList(); + + } + return null; + } + /// Performs an HTTP 'GET /person/{id}/assets' operation and returns the [Response]. /// Parameters: /// diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 2bd9411af86bd..e767b21e7577c 100644 --- a/mobile/openapi/lib/api_client.dart +++ b/mobile/openapi/lib/api_client.dart @@ -197,6 +197,8 @@ class ApiClient { return AlbumCountResponseDto.fromJson(value); case 'AlbumResponseDto': return AlbumResponseDto.fromJson(value); + case 'AlbumsForPersonResponseDto': + return AlbumsForPersonResponseDto.fromJson(value); case 'AllJobStatusResponseDto': return AllJobStatusResponseDto.fromJson(value); case 'AssetBulkDeleteDto': diff --git a/mobile/openapi/lib/model/albums_for_person_response_dto.dart b/mobile/openapi/lib/model/albums_for_person_response_dto.dart new file mode 100644 index 0000000000000..cb917e852260a --- /dev/null +++ b/mobile/openapi/lib/model/albums_for_person_response_dto.dart @@ -0,0 +1,106 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.12 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +part of openapi.api; + +class AlbumsForPersonResponseDto { + /// Returns a new [AlbumsForPersonResponseDto] instance. + AlbumsForPersonResponseDto({ + required this.albumId, + required this.assetCount, + }); + + String albumId; + + int assetCount; + + @override + bool operator ==(Object other) => identical(this, other) || other is AlbumsForPersonResponseDto && + other.albumId == albumId && + other.assetCount == assetCount; + + @override + int get hashCode => + // ignore: unnecessary_parenthesis + (albumId.hashCode) + + (assetCount.hashCode); + + @override + String toString() => 'AlbumsForPersonResponseDto[albumId=$albumId, assetCount=$assetCount]'; + + Map toJson() { + final json = {}; + json[r'albumId'] = this.albumId; + json[r'assetCount'] = this.assetCount; + return json; + } + + /// Returns a new [AlbumsForPersonResponseDto] instance and imports its values from + /// [value] if it's a [Map], null otherwise. + // ignore: prefer_constructors_over_static_methods + static AlbumsForPersonResponseDto? fromJson(dynamic value) { + if (value is Map) { + final json = value.cast(); + + return AlbumsForPersonResponseDto( + albumId: mapValueOfType(json, r'albumId')!, + assetCount: mapValueOfType(json, r'assetCount')!, + ); + } + return null; + } + + static List listFromJson(dynamic json, {bool growable = false,}) { + final result = []; + if (json is List && json.isNotEmpty) { + for (final row in json) { + final value = AlbumsForPersonResponseDto.fromJson(row); + if (value != null) { + result.add(value); + } + } + } + return result.toList(growable: growable); + } + + static Map mapFromJson(dynamic json) { + final map = {}; + if (json is Map && json.isNotEmpty) { + json = json.cast(); // ignore: parameter_assignments + for (final entry in json.entries) { + final value = AlbumsForPersonResponseDto.fromJson(entry.value); + if (value != null) { + map[entry.key] = value; + } + } + } + return map; + } + + // maps a json object with a list of AlbumsForPersonResponseDto-objects as value to a dart map + static Map> mapListFromJson(dynamic json, {bool growable = false,}) { + final map = >{}; + if (json is Map && json.isNotEmpty) { + // ignore: parameter_assignments + json = json.cast(); + for (final entry in json.entries) { + map[entry.key] = AlbumsForPersonResponseDto.listFromJson(entry.value, growable: growable,); + } + } + return map; + } + + /// The list of required keys that must be present in a JSON. + static const requiredKeys = { + 'albumId', + 'assetCount', + }; +} + diff --git a/mobile/openapi/test/albums_for_person_response_dto_test.dart b/mobile/openapi/test/albums_for_person_response_dto_test.dart new file mode 100644 index 0000000000000..0eaa0ada1a706 --- /dev/null +++ b/mobile/openapi/test/albums_for_person_response_dto_test.dart @@ -0,0 +1,32 @@ +// +// AUTO-GENERATED FILE, DO NOT MODIFY! +// +// @dart=2.12 + +// ignore_for_file: unused_element, unused_import +// ignore_for_file: always_put_required_named_parameters_first +// ignore_for_file: constant_identifier_names +// ignore_for_file: lines_longer_than_80_chars + +import 'package:openapi/api.dart'; +import 'package:test/test.dart'; + +// tests for AlbumsForPersonResponseDto +void main() { + // final instance = AlbumsForPersonResponseDto(); + + group('test AlbumsForPersonResponseDto', () { + // String albumId + test('to test the property `albumId`', () async { + // TODO + }); + + // int assetCount + test('to test the property `assetCount`', () async { + // TODO + }); + + + }); + +} diff --git a/mobile/openapi/test/person_api_test.dart b/mobile/openapi/test/person_api_test.dart index b0feeb1160831..1fc800d4acceb 100644 --- a/mobile/openapi/test/person_api_test.dart +++ b/mobile/openapi/test/person_api_test.dart @@ -27,6 +27,11 @@ void main() { // TODO }); + //Future> getPersonAlbums(String id) async + test('test getPersonAlbums', () async { + // TODO + }); + //Future> getPersonAssets(String id) async test('test getPersonAssets', () async { // TODO diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index ab9b16170b8b4..dc335c4101eed 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -3549,6 +3549,51 @@ ] } }, + "/person/{id}/albums": { + "get": { + "operationId": "getPersonAlbums", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/AlbumsForPersonResponseDto" + }, + "type": "array" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "Person" + ] + } + }, "/person/{id}/assets": { "get": { "operationId": "getPersonAssets", @@ -5696,6 +5741,22 @@ ], "type": "object" }, + "AlbumsForPersonResponseDto": { + "properties": { + "albumId": { + "format": "uuid", + "type": "string" + }, + "assetCount": { + "type": "integer" + } + }, + "required": [ + "albumId", + "assetCount" + ], + "type": "object" + }, "AllJobStatusResponseDto": { "properties": { "backgroundTask": { diff --git a/server/src/domain/album/album-response.dto.ts b/server/src/domain/album/album-response.dto.ts index 9f0e134c746f4..4a05b6efce72c 100644 --- a/server/src/domain/album/album-response.dto.ts +++ b/server/src/domain/album/album-response.dto.ts @@ -2,6 +2,9 @@ import { AlbumEntity } from '@app/infra/entities'; import { ApiProperty } from '@nestjs/swagger'; import { AssetResponseDto, mapAsset } from '../asset'; import { UserResponseDto, mapUser } from '../user'; +import { ValidateUUID } from '../domain.util'; +import { AlbumAssetCount } from '../repositories/album.repository'; + export class AlbumResponseDto { id!: string; @@ -23,6 +26,20 @@ export class AlbumResponseDto { endDate?: Date; } +export class AlbumsForPersonResponseDto { + @ValidateUUID() + albumId!: string; + @ApiProperty({ type: 'integer' }) + assetCount!: number; +} + +export function mapAlbumCount(entity: AlbumAssetCount): AlbumsForPersonResponseDto { + return { + albumId: entity.albumId, + assetCount: entity.assetCount, + }; +} + export const mapAlbum = (entity: AlbumEntity, withAssets: boolean): AlbumResponseDto => { const sharedUsers: UserResponseDto[] = []; diff --git a/server/src/domain/person/person.service.ts b/server/src/domain/person/person.service.ts index dcf5dbb78df65..a1e77fea006e9 100644 --- a/server/src/domain/person/person.service.ts +++ b/server/src/domain/person/person.service.ts @@ -37,6 +37,7 @@ import { PersonUpdateDto, mapPerson, } from './person.dto'; +import { AlbumsForPersonResponseDto, mapAlbumCount } from '../album/album-response.dto'; @Injectable() export class PersonService { @@ -106,6 +107,12 @@ export class PersonService { return assets.map((asset) => mapAsset(asset)); } + async getAlbums(authUser: AuthUserDto, id: string): Promise { + await this.access.requirePermission(authUser, Permission.PERSON_READ, id); + const albums = await this.repository.getAlbums(id); + return albums.map((album) => mapAlbumCount(album)); + } + async update(authUser: AuthUserDto, id: string, dto: PersonUpdateDto): Promise { await this.access.requirePermission(authUser, Permission.PERSON_WRITE, id); let person = await this.findOrFail(id); diff --git a/server/src/domain/repositories/person.repository.ts b/server/src/domain/repositories/person.repository.ts index 2554a8a6f969e..a0173cc8feabf 100644 --- a/server/src/domain/repositories/person.repository.ts +++ b/server/src/domain/repositories/person.repository.ts @@ -1,4 +1,5 @@ import { AssetEntity, AssetFaceEntity, PersonEntity } from '@app/infra/entities'; +import { AlbumAssetCount } from './album.repository'; export const IPersonRepository = 'IPersonRepository'; @@ -36,6 +37,7 @@ export interface IPersonRepository { getAssets(personId: string): Promise; prepareReassignFaces(data: UpdateFacesData): Promise; reassignFaces(data: UpdateFacesData): Promise; + getAlbums(personId: string): Promise; create(entity: Partial): Promise; update(entity: Partial): Promise; diff --git a/server/src/immich/controllers/person.controller.ts b/server/src/immich/controllers/person.controller.ts index e581fddb1a28e..0ae03c91e6a79 100644 --- a/server/src/immich/controllers/person.controller.ts +++ b/server/src/immich/controllers/person.controller.ts @@ -1,4 +1,5 @@ import { + AlbumsForPersonResponseDto, AssetResponseDto, AuthUserDto, BulkIdResponseDto, @@ -84,4 +85,9 @@ export class PersonController { ): Promise { return this.service.mergePerson(authUser, id, dto); } + + @Get(':id/albums') + getPersonAlbums(@AuthUser() authUser: AuthUserDto, @Param() { id }: UUIDParamDto): Promise { + return this.service.getAlbums(authUser, id); + } } diff --git a/server/src/infra/repositories/person.repository.ts b/server/src/infra/repositories/person.repository.ts index 12bd476053fff..9282b35536827 100644 --- a/server/src/infra/repositories/person.repository.ts +++ b/server/src/infra/repositories/person.repository.ts @@ -1,4 +1,5 @@ import { + AlbumAssetCount, AssetFaceId, IPersonRepository, PersonNameSearchOptions, @@ -8,13 +9,14 @@ import { } from '@app/domain'; import { InjectRepository } from '@nestjs/typeorm'; import { In, Repository } from 'typeorm'; -import { AssetEntity, AssetFaceEntity, PersonEntity } from '../entities'; +import { AlbumEntity, AssetEntity, AssetFaceEntity, PersonEntity } from '../entities'; export class PersonRepository implements IPersonRepository { constructor( @InjectRepository(AssetEntity) private assetRepository: Repository, @InjectRepository(PersonEntity) private personRepository: Repository, @InjectRepository(AssetFaceEntity) private assetFaceRepository: Repository, + @InjectRepository(AlbumEntity) private albumRepository: Repository, ) {} /** @@ -159,6 +161,25 @@ export class PersonRepository implements IPersonRepository { }); } + async getAlbums(personId: string): Promise { + const countByAlbums = await this.albumRepository + .createQueryBuilder('album') + .select('album.id') + .addSelect('COUNT(albums_assets.assetsId)', 'asset_count') + .innerJoin('albums_assets_assets', 'albums_assets', 'albums_assets.albumsId = album.id') + .innerJoin('asset_faces', 'asset_faces', 'asset_faces.assetId = albums_assets.assetId') + .innerJoin('person', 'person', 'asset_faces.personId = person.id') + .where('person.id = :personId', { personId }) + .groupBy('person.id, album.name') + .orderBy('person.id, album.name') + .getRawMany(); + + return countByAlbums.map((albumCount) => ({ + albumId: albumCount['album_id'], + assetCount: Number(albumCount['asset_count']), + })); + } + create(entity: Partial): Promise { return this.personRepository.save(entity); } diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index b1714e2764327..48977baf7c6e1 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -277,6 +277,25 @@ export interface AlbumResponseDto { */ 'updatedAt': string; } +/** + * + * @export + * @interface AlbumsForPersonResponseDto + */ +export interface AlbumsForPersonResponseDto { + /** + * + * @type {string} + * @memberof AlbumsForPersonResponseDto + */ + 'albumId': string; + /** + * + * @type {number} + * @memberof AlbumsForPersonResponseDto + */ + 'assetCount': number; +} /** * * @export @@ -11905,6 +11924,48 @@ export const PersonApiAxiosParamCreator = function (configuration?: Configuratio + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getPersonAlbums: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getPersonAlbums', 'id', id) + const localVarPath = `/person/{id}/albums` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication cookie required + + // authentication api_key required + await setApiKeyToObject(localVarHeaderParameter, "x-api-key", configuration) + + // authentication bearer required + // http bearer authentication required + await setBearerAuthToObject(localVarHeaderParameter, configuration) + + + setSearchParams(localVarUrlObj, localVarQueryParameter); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; @@ -12210,6 +12271,16 @@ export const PersonApiFp = function(configuration?: Configuration) { const localVarAxiosArgs = await localVarAxiosParamCreator.getPerson(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, + /** + * + * @param {string} id + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async getPersonAlbums(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise>> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getPersonAlbums(id, options); + return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); + }, /** * * @param {string} id @@ -12300,6 +12371,15 @@ export const PersonApiFactory = function (configuration?: Configuration, basePat getPerson(requestParameters: PersonApiGetPersonRequest, options?: AxiosRequestConfig): AxiosPromise { return localVarFp.getPerson(requestParameters.id, options).then((request) => request(axios, basePath)); }, + /** + * + * @param {PersonApiGetPersonAlbumsRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + getPersonAlbums(requestParameters: PersonApiGetPersonAlbumsRequest, options?: AxiosRequestConfig): AxiosPromise> { + return localVarFp.getPersonAlbums(requestParameters.id, options).then((request) => request(axios, basePath)); + }, /** * * @param {PersonApiGetPersonAssetsRequest} requestParameters Request parameters. @@ -12385,6 +12465,20 @@ export interface PersonApiGetPersonRequest { readonly id: string } +/** + * Request parameters for getPersonAlbums operation in PersonApi. + * @export + * @interface PersonApiGetPersonAlbumsRequest + */ +export interface PersonApiGetPersonAlbumsRequest { + /** + * + * @type {string} + * @memberof PersonApiGetPersonAlbums + */ + readonly id: string +} + /** * Request parameters for getPersonAssets operation in PersonApi. * @export @@ -12512,6 +12606,17 @@ export class PersonApi extends BaseAPI { return PersonApiFp(this.configuration).getPerson(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } + /** + * + * @param {PersonApiGetPersonAlbumsRequest} requestParameters Request parameters. + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof PersonApi + */ + public getPersonAlbums(requestParameters: PersonApiGetPersonAlbumsRequest, options?: AxiosRequestConfig) { + return PersonApiFp(this.configuration).getPersonAlbums(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); + } + /** * * @param {PersonApiGetPersonAssetsRequest} requestParameters Request parameters.