From b44f8d52eed2a62729d9c7f039660f2734a32b49 Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Thu, 3 Aug 2023 14:17:38 -0400 Subject: [PATCH] refactor(server): standardize user controller (#3501) * chore: remove redundant sortint * chore: standardize user controller * chore: open api * fix: web dtos --- cli/src/api/open-api/api.ts | 96 +++++++-------- mobile/openapi/README.md | Bin 18304 -> 18288 bytes mobile/openapi/doc/UserApi.md | Bin 19147 -> 19067 bytes mobile/openapi/lib/api/user_api.dart | Bin 16351 -> 16207 bytes mobile/openapi/test/user_api_test.dart | Bin 1765 -> 1749 bytes server/immich-openapi-specs.json | 16 +-- .../admin-cli/commands/list-users.command.ts | 2 +- server/src/domain/user/dto/user-id.dto.ts | 9 -- server/src/domain/user/user.service.spec.ts | 60 +++++----- server/src/domain/user/user.service.ts | 18 +-- server/src/immich/app.utils.ts | 4 - .../src/immich/controllers/user.controller.ts | 52 ++++---- web/src/api/open-api/api.ts | 112 +++++++++--------- .../admin-page/delete-confirm-dialoge.svelte | 2 +- .../admin-page/restore-dialoge.svelte | 2 +- .../components/album-page/album-card.svelte | 2 +- .../(user)/partners/[userId]/+page.server.ts | 2 +- 17 files changed, 182 insertions(+), 195 deletions(-) delete mode 100644 server/src/domain/user/dto/user-id.dto.ts diff --git a/cli/src/api/open-api/api.ts b/cli/src/api/open-api/api.ts index edee31354..4e86e8838 100644 --- a/cli/src/api/open-api/api.ts +++ b/cli/src/api/open-api/api.ts @@ -12111,15 +12111,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - deleteUser: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('deleteUser', 'userId', userId) - const localVarPath = `/user/{userId}` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + deleteUser: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteUser', 'id', id) + const localVarPath = `/user/{id}` + .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; @@ -12236,15 +12236,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getProfileImage: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('getProfileImage', 'userId', userId) - const localVarPath = `/user/profile-image/{userId}` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + getProfileImage: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getProfileImage', 'id', id) + const localVarPath = `/user/profile-image/{id}` + .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; @@ -12278,15 +12278,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getUserById: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('getUserById', 'userId', userId) - const localVarPath = `/user/info/{userId}` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + getUserById: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getUserById', 'id', id) + const localVarPath = `/user/info/{id}` + .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; @@ -12354,15 +12354,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - restoreUser: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('restoreUser', 'userId', userId) - const localVarPath = `/user/{userId}/restore` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + restoreUser: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('restoreUser', 'id', id) + const localVarPath = `/user/{id}/restore` + .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; @@ -12470,12 +12470,12 @@ export const UserApiFp = function(configuration?: Configuration) { }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async deleteUser(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.deleteUser(userId, options); + async deleteUser(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteUser(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -12499,22 +12499,22 @@ export const UserApiFp = function(configuration?: Configuration) { }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getProfileImage(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getProfileImage(userId, options); + async getProfileImage(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getProfileImage(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getUserById(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getUserById(userId, options); + async getUserById(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getUserById(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -12529,12 +12529,12 @@ export const UserApiFp = function(configuration?: Configuration) { }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async restoreUser(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.restoreUser(userId, options); + async restoreUser(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.restoreUser(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -12582,7 +12582,7 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? * @throws {RequiredError} */ deleteUser(requestParameters: UserApiDeleteUserRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.deleteUser(requestParameters.userId, options).then((request) => request(axios, basePath)); + return localVarFp.deleteUser(requestParameters.id, options).then((request) => request(axios, basePath)); }, /** * @@ -12608,7 +12608,7 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? * @throws {RequiredError} */ getProfileImage(requestParameters: UserApiGetProfileImageRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.getProfileImage(requestParameters.userId, options).then((request) => request(axios, basePath)); + return localVarFp.getProfileImage(requestParameters.id, options).then((request) => request(axios, basePath)); }, /** * @@ -12617,7 +12617,7 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? * @throws {RequiredError} */ getUserById(requestParameters: UserApiGetUserByIdRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.getUserById(requestParameters.userId, options).then((request) => request(axios, basePath)); + return localVarFp.getUserById(requestParameters.id, options).then((request) => request(axios, basePath)); }, /** * @@ -12635,7 +12635,7 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? * @throws {RequiredError} */ restoreUser(requestParameters: UserApiRestoreUserRequest, options?: AxiosRequestConfig): AxiosPromise { - return localVarFp.restoreUser(requestParameters.userId, options).then((request) => request(axios, basePath)); + return localVarFp.restoreUser(requestParameters.id, options).then((request) => request(axios, basePath)); }, /** * @@ -12688,7 +12688,7 @@ export interface UserApiDeleteUserRequest { * @type {string} * @memberof UserApiDeleteUser */ - readonly userId: string + readonly id: string } /** @@ -12716,7 +12716,7 @@ export interface UserApiGetProfileImageRequest { * @type {string} * @memberof UserApiGetProfileImage */ - readonly userId: string + readonly id: string } /** @@ -12730,7 +12730,7 @@ export interface UserApiGetUserByIdRequest { * @type {string} * @memberof UserApiGetUserById */ - readonly userId: string + readonly id: string } /** @@ -12758,7 +12758,7 @@ export interface UserApiRestoreUserRequest { * @type {string} * @memberof UserApiRestoreUser */ - readonly userId: string + readonly id: string } /** @@ -12812,7 +12812,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public deleteUser(requestParameters: UserApiDeleteUserRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).deleteUser(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).deleteUser(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** @@ -12844,7 +12844,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public getProfileImage(requestParameters: UserApiGetProfileImageRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).getProfileImage(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).getProfileImage(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** @@ -12855,7 +12855,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public getUserById(requestParameters: UserApiGetUserByIdRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).getUserById(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).getUserById(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** @@ -12877,7 +12877,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public restoreUser(requestParameters: UserApiRestoreUserRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).restoreUser(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).restoreUser(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index 3facfaa7d84139a112a176ed7d4c7c3bee3e696d..7e2721348aa5589a44ea53a2f8566e840ddf43e7 100644 GIT binary patch delta 52 tcmZqZXZ+B|xWP%6IWwhp@<$!v$uYX$;OrbdCpi0r-W0~n&58Q*5&$mm6kz}W delta 58 vcmey+$Jo%%xWP%6wX`_3$aAv4p2Xy6-Oq4dIGiOj`LJFugts|RUtR(Lgs~MT diff --git a/mobile/openapi/doc/UserApi.md b/mobile/openapi/doc/UserApi.md index 4c7d2b69796e50ee411e45a184d51a17be040eb9..638c59fa3c98a4861fc573bb2ee4bcf932a84740 100644 GIT binary patch delta 192 zcmX>-mGSo!#tlmt88auZWV`_++nC&d~yJ%%Ayz)J6kk7NFQW`?$%s#krX> zQzknK_)oT$=m*N3mxvcYRkBl80H#DvZwgS~c?s>!kMvFftw1t~FFmy+v^cfMsnRn= l18U+7(+OY`?=f!Xw%EputUe27Gh*Gp(` z-lTU5>cGt?_GUrVfGmqKodCD&9^>ZI=G&OD*%&8Slv-SpUxez`2XL*o88@GGTE`9m D^X_Pp diff --git a/mobile/openapi/lib/api/user_api.dart b/mobile/openapi/lib/api/user_api.dart index f187652ac2437552472a680722b10fe1b4c9bcf3..110528d40c1dd029608bfcce80bfe66aeb06e668 100644 GIT binary patch delta 411 zcmca#f4*)*EI)H*O6}wejGmJhm~k*>PF`y!K3TzpYw~S=IUw&Jzdw+4)R15Ys#4cc z$lQFscV_C7_X&wJWu|P-W7A@q{GKmibE@bmZX9N>Ra6F> z?Kk-p6ECxVH5MCo>2E=DP=Ja8)Rs9aGK`s<_o{R<;V}D%x;(^e_RPGre1c|cPR`L1 zhMIlXfL++B(laGIvn0c#q@=(TXn+QimnNT*=Gq*q>&^yLztT7wNJ0Wj6KtVBP-(4x wQEG8Xeo?AAmjW2*6{QyBBqpai=HzIoS0lpkIwM%O4Ul|iW{(nXdo7jN0L7<}2LJ#7 delta 525 zcmX?KcfWo^EI(^$acYt0fYMh(BL=SRf zvEKz|8qn^^Cz<#N+Aqa8*-wAVF@y+_ofs7Eg)Z_&$Nf4&oWHr_YP!*Gv*$x2!ynYb8 delta 68 zcmcc0`;>Qs5Hnk8acYrg%H&2?@y*)Ifs6>g)Z`f~NeHgoWGU7M2(I{KVYWj689^5C diff --git a/server/immich-openapi-specs.json b/server/immich-openapi-specs.json index 53148546d..09091b919 100644 --- a/server/immich-openapi-specs.json +++ b/server/immich-openapi-specs.json @@ -4206,12 +4206,12 @@ ] } }, - "/user/info/{userId}": { + "/user/info/{id}": { "get": { "operationId": "getUserById", "parameters": [ { - "name": "userId", + "name": "id", "required": true, "in": "path", "schema": { @@ -4323,12 +4323,12 @@ ] } }, - "/user/profile-image/{userId}": { + "/user/profile-image/{id}": { "get": { "operationId": "getProfileImage", "parameters": [ { - "name": "userId", + "name": "id", "required": true, "in": "path", "schema": { @@ -4365,12 +4365,12 @@ ] } }, - "/user/{userId}": { + "/user/{id}": { "delete": { "operationId": "deleteUser", "parameters": [ { - "name": "userId", + "name": "id", "required": true, "in": "path", "schema": { @@ -4407,12 +4407,12 @@ ] } }, - "/user/{userId}/restore": { + "/user/{id}/restore": { "post": { "operationId": "restoreUser", "parameters": [ { - "name": "userId", + "name": "id", "required": true, "in": "path", "schema": { diff --git a/server/src/admin-cli/commands/list-users.command.ts b/server/src/admin-cli/commands/list-users.command.ts index 58513ffe1..15ab0a240 100644 --- a/server/src/admin-cli/commands/list-users.command.ts +++ b/server/src/admin-cli/commands/list-users.command.ts @@ -13,7 +13,7 @@ export class ListUsersCommand extends CommandRunner { async run(): Promise { try { - const users = await this.userService.getAllUsers(CLI_USER, true); + const users = await this.userService.getAll(CLI_USER, true); console.dir(users); } catch (error) { console.error(error); diff --git a/server/src/domain/user/dto/user-id.dto.ts b/server/src/domain/user/dto/user-id.dto.ts deleted file mode 100644 index ce23581e3..000000000 --- a/server/src/domain/user/dto/user-id.dto.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ApiProperty } from '@nestjs/swagger'; -import { IsNotEmpty, IsUUID } from 'class-validator'; - -export class UserIdDto { - @IsNotEmpty() - @IsUUID('4') - @ApiProperty({ format: 'uuid' }) - userId!: string; -} diff --git a/server/src/domain/user/user.service.spec.ts b/server/src/domain/user/user.service.spec.ts index efb5e3d5d..a573a8c20 100644 --- a/server/src/domain/user/user.service.spec.ts +++ b/server/src/domain/user/user.service.spec.ts @@ -136,11 +136,11 @@ describe(UserService.name, () => { when(userMock.get).calledWith(immichUser.id, undefined).mockResolvedValue(immichUser); }); - describe('getAllUsers', () => { + describe('getAll', () => { it('should get all users', async () => { userMock.getList.mockResolvedValue([adminUser]); - const response = await sut.getAllUsers(adminUserAuth, false); + const response = await sut.getAll(adminUserAuth, false); expect(userMock.getList).toHaveBeenCalledWith({ withDeleted: true }); expect(response).toEqual([ @@ -163,11 +163,11 @@ describe(UserService.name, () => { }); }); - describe('getUserById', () => { + describe('get', () => { it('should get a user by id', async () => { userMock.get.mockResolvedValue(adminUser); - const response = await sut.getUserById(adminUser.id); + const response = await sut.get(adminUser.id); expect(userMock.get).toHaveBeenCalledWith(adminUser.id, false); expect(response).toEqual(adminUserResponse); @@ -176,17 +176,17 @@ describe(UserService.name, () => { it('should throw an error if a user is not found', async () => { userMock.get.mockResolvedValue(null); - await expect(sut.getUserById(adminUser.id)).rejects.toBeInstanceOf(NotFoundException); + await expect(sut.get(adminUser.id)).rejects.toBeInstanceOf(NotFoundException); expect(userMock.get).toHaveBeenCalledWith(adminUser.id, false); }); }); - describe('getUserInfo', () => { + describe('getMe', () => { it("should get the auth user's info", async () => { userMock.get.mockResolvedValue(adminUser); - const response = await sut.getUserInfo(adminUser); + const response = await sut.getMe(adminUser); expect(userMock.get).toHaveBeenCalledWith(adminUser.id, undefined); expect(response).toEqual(adminUserResponse); @@ -195,17 +195,17 @@ describe(UserService.name, () => { it('should throw an error if a user is not found', async () => { userMock.get.mockResolvedValue(null); - await expect(sut.getUserInfo(adminUser)).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.getMe(adminUser)).rejects.toBeInstanceOf(BadRequestException); expect(userMock.get).toHaveBeenCalledWith(adminUser.id, undefined); }); }); - describe('getUserCount', () => { + describe('getCount', () => { it('should get the user count', async () => { userMock.getList.mockResolvedValue([adminUser]); - const response = await sut.getUserCount({}); + const response = await sut.getCount({}); expect(userMock.getList).toHaveBeenCalled(); expect(response).toEqual({ userCount: 1 }); @@ -221,14 +221,14 @@ describe(UserService.name, () => { when(userMock.update).calledWith(update.id, update).mockResolvedValueOnce(updatedImmichUser); - const updatedUser = await sut.updateUser(immichUserAuth, update); + const updatedUser = await sut.update(immichUserAuth, update); expect(updatedUser.shouldChangePassword).toEqual(true); }); it('should not set an empty string for storage label', async () => { userMock.update.mockResolvedValue(updatedImmichUser); - await sut.updateUser(adminUserAuth, { id: immichUser.id, storageLabel: '' }); + await sut.update(adminUserAuth, { id: immichUser.id, storageLabel: '' }); expect(userMock.update).toHaveBeenCalledWith(immichUser.id, { id: immichUser.id, storageLabel: null }); }); @@ -236,7 +236,7 @@ describe(UserService.name, () => { it('should omit a storage label set by non-admin users', async () => { userMock.update.mockResolvedValue(updatedImmichUser); - await sut.updateUser(immichUserAuth, { id: immichUser.id, storageLabel: 'admin' }); + await sut.update(immichUserAuth, { id: immichUser.id, storageLabel: 'admin' }); expect(userMock.update).toHaveBeenCalledWith(immichUser.id, { id: immichUser.id }); }); @@ -249,7 +249,7 @@ describe(UserService.name, () => { id: 'not_immich_auth_user_id', }); - const result = sut.updateUser(immichUserAuth, { + const result = sut.update(immichUserAuth, { id: 'not_immich_auth_user_id', password: 'I take over your account now', }); @@ -262,7 +262,7 @@ describe(UserService.name, () => { userMock.get.mockResolvedValue(immichUser); userMock.update.mockResolvedValue(immichUser); - await sut.updateUser(immichUser, dto); + await sut.update(immichUser, dto); expect(userMock.update).toHaveBeenCalledWith(immichUser.id, { id: 'user-id', @@ -276,7 +276,7 @@ describe(UserService.name, () => { userMock.get.mockResolvedValue(immichUser); userMock.getByEmail.mockResolvedValue(adminUser); - await expect(sut.updateUser(immichUser, dto)).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.update(immichUser, dto)).rejects.toBeInstanceOf(BadRequestException); expect(userMock.update).not.toHaveBeenCalled(); }); @@ -287,7 +287,7 @@ describe(UserService.name, () => { userMock.get.mockResolvedValue(immichUser); userMock.getByStorageLabel.mockResolvedValue(adminUser); - await expect(sut.updateUser(adminUser, dto)).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.update(adminUser, dto)).rejects.toBeInstanceOf(BadRequestException); expect(userMock.update).not.toHaveBeenCalled(); }); @@ -300,7 +300,7 @@ describe(UserService.name, () => { when(userMock.update).calledWith(immichUser.id, update).mockResolvedValueOnce(updatedImmichUser); - const result = await sut.updateUser(adminUserAuth, update); + const result = await sut.update(adminUserAuth, update); expect(result).toBeDefined(); expect(result.id).toEqual(updatedImmichUser.id); @@ -310,7 +310,7 @@ describe(UserService.name, () => { it('update user information should throw error if user not found', async () => { when(userMock.get).calledWith(immichUser.id, undefined).mockResolvedValueOnce(null); - const result = sut.updateUser(adminUser, { + const result = sut.update(adminUser, { id: immichUser.id, shouldChangePassword: true, }); @@ -324,7 +324,7 @@ describe(UserService.name, () => { when(userMock.get).calledWith(adminUser.id).mockResolvedValueOnce(null); when(userMock.update).calledWith(adminUser.id, dto).mockResolvedValueOnce(adminUser); - await sut.updateUser(adminUser, dto); + await sut.update(adminUser, dto); expect(userMock.update).toHaveBeenCalledWith(adminUser.id, dto); }); @@ -334,31 +334,31 @@ describe(UserService.name, () => { when(userMock.get).calledWith(immichUser.id).mockResolvedValueOnce(immichUser); - await expect(sut.updateUser(adminUser, dto)).rejects.toBeInstanceOf(BadRequestException); + await expect(sut.update(adminUser, dto)).rejects.toBeInstanceOf(BadRequestException); }); }); - describe('restoreUser', () => { + describe('restore', () => { it('should require an admin', async () => { when(userMock.get).calledWith(adminUser.id, true).mockResolvedValue(adminUser); - await expect(sut.restoreUser(immichUserAuth, adminUser.id)).rejects.toBeInstanceOf(ForbiddenException); + await expect(sut.restore(immichUserAuth, adminUser.id)).rejects.toBeInstanceOf(ForbiddenException); expect(userMock.get).toHaveBeenCalledWith(adminUser.id, true); }); it('should require the auth user be an admin', async () => { - await expect(sut.deleteUser(immichUserAuth, adminUserAuth.id)).rejects.toBeInstanceOf(ForbiddenException); + await expect(sut.delete(immichUserAuth, adminUserAuth.id)).rejects.toBeInstanceOf(ForbiddenException); expect(userMock.delete).not.toHaveBeenCalled(); }); }); - describe('deleteUser', () => { + describe('delete', () => { it('cannot delete admin user', async () => { - await expect(sut.deleteUser(adminUserAuth, adminUserAuth.id)).rejects.toBeInstanceOf(ForbiddenException); + await expect(sut.delete(adminUserAuth, adminUserAuth.id)).rejects.toBeInstanceOf(ForbiddenException); }); it('should require the auth user be an admin', async () => { - await expect(sut.deleteUser(immichUserAuth, adminUserAuth.id)).rejects.toBeInstanceOf(ForbiddenException); + await expect(sut.delete(immichUserAuth, adminUserAuth.id)).rejects.toBeInstanceOf(ForbiddenException); expect(userMock.delete).not.toHaveBeenCalled(); }); @@ -369,7 +369,7 @@ describe(UserService.name, () => { when(userMock.getAdmin).calledWith().mockResolvedValueOnce(null); await expect( - sut.createUser({ + sut.create({ email: 'john_smith@email.com', firstName: 'John', lastName: 'Smith', @@ -394,7 +394,7 @@ describe(UserService.name, () => { it('should throw an error if the user does not exist', async () => { userMock.get.mockResolvedValue(null); - await expect(sut.getUserProfileImage(adminUserAuth.id)).rejects.toBeInstanceOf(NotFoundException); + await expect(sut.getProfileImage(adminUserAuth.id)).rejects.toBeInstanceOf(NotFoundException); expect(userMock.get).toHaveBeenCalledWith(adminUserAuth.id, undefined); }); @@ -402,7 +402,7 @@ describe(UserService.name, () => { it('should throw an error if the user does not have a picture', async () => { userMock.get.mockResolvedValue(adminUser); - await expect(sut.getUserProfileImage(adminUserAuth.id)).rejects.toBeInstanceOf(NotFoundException); + await expect(sut.getProfileImage(adminUserAuth.id)).rejects.toBeInstanceOf(NotFoundException); expect(userMock.get).toHaveBeenCalledWith(adminUserAuth.id, undefined); }); diff --git a/server/src/domain/user/user.service.ts b/server/src/domain/user/user.service.ts index d66815195..2568db185 100644 --- a/server/src/domain/user/user.service.ts +++ b/server/src/domain/user/user.service.ts @@ -39,12 +39,12 @@ export class UserService { this.userCore = new UserCore(userRepository, cryptoRepository); } - async getAllUsers(authUser: AuthUserDto, isAll: boolean): Promise { + async getAll(authUser: AuthUserDto, isAll: boolean): Promise { const users = await this.userCore.getList({ withDeleted: !isAll }); return users.map(mapUser); } - async getUserById(userId: string, withDeleted = false): Promise { + async get(userId: string, withDeleted = false): Promise { const user = await this.userCore.get(userId, withDeleted); if (!user) { throw new NotFoundException('User not found'); @@ -53,7 +53,7 @@ export class UserService { return mapUser(user); } - async getUserInfo(authUser: AuthUserDto): Promise { + async getMe(authUser: AuthUserDto): Promise { const user = await this.userCore.get(authUser.id); if (!user) { throw new BadRequestException('User not found'); @@ -61,7 +61,7 @@ export class UserService { return mapUser(user); } - async getUserCount(dto: UserCountDto): Promise { + async getCount(dto: UserCountDto): Promise { let users = await this.userCore.getList(); if (dto.admin) { @@ -71,12 +71,12 @@ export class UserService { return mapUserCountResponse(users.length); } - async createUser(createUserDto: CreateUserDto): Promise { + async create(createUserDto: CreateUserDto): Promise { const createdUser = await this.userCore.createUser(createUserDto); return mapUser(createdUser); } - async updateUser(authUser: AuthUserDto, dto: UpdateUserDto): Promise { + async update(authUser: AuthUserDto, dto: UpdateUserDto): Promise { const user = await this.userCore.get(dto.id); if (!user) { throw new NotFoundException('User not found'); @@ -86,7 +86,7 @@ export class UserService { return mapUser(updatedUser); } - async deleteUser(authUser: AuthUserDto, userId: string): Promise { + async delete(authUser: AuthUserDto, userId: string): Promise { const user = await this.userCore.get(userId); if (!user) { throw new BadRequestException('User not found'); @@ -95,7 +95,7 @@ export class UserService { return mapUser(deletedUser); } - async restoreUser(authUser: AuthUserDto, userId: string): Promise { + async restore(authUser: AuthUserDto, userId: string): Promise { const user = await this.userCore.get(userId, true); if (!user) { throw new BadRequestException('User not found'); @@ -112,7 +112,7 @@ export class UserService { return mapCreateProfileImageResponse(updatedUser.id, updatedUser.profileImagePath); } - async getUserProfileImage(userId: string): Promise { + async getProfileImage(userId: string): Promise { const user = await this.userCore.get(userId); if (!user) { throw new NotFoundException('User not found'); diff --git a/server/src/immich/app.utils.ts b/server/src/immich/app.utils.ts index 707e5e6ca..285854fbc 100644 --- a/server/src/immich/app.utils.ts +++ b/server/src/immich/app.utils.ts @@ -48,11 +48,7 @@ function sortKeys(obj: T): T { } const patchOpenAPI = (document: OpenAPIObject) => { - for (const [key, value] of Object.entries(document.paths)) { - document.paths[key] = sortKeys(value); - } document.paths = sortKeys(document.paths); - if (document.components?.schemas) { document.components.schemas = sortKeys(document.components.schemas); } diff --git a/server/src/immich/controllers/user.controller.ts b/server/src/immich/controllers/user.controller.ts index e9fc64c88..7816e6198 100644 --- a/server/src/immich/controllers/user.controller.ts +++ b/server/src/immich/controllers/user.controller.ts @@ -2,14 +2,13 @@ import { AuthUserDto, CreateProfileImageDto, CreateProfileImageResponseDto, - CreateUserDto, - UpdateUserDto, - UserCountDto, + CreateUserDto as CreateDto, + UpdateUserDto as UpdateDto, + UserCountDto as CountDto, UserCountResponseDto, UserResponseDto, UserService, } from '@app/domain'; -import { UserIdDto } from '@app/domain/user/dto/user-id.dto'; import { Body, Controller, @@ -30,6 +29,7 @@ import { Response as Res } from 'express'; import { AdminRoute, Authenticated, AuthUser, PublicRoute } from '../app.guard'; import { FileUploadInterceptor, Route } from '../app.interceptor'; import { UseValidation } from '../app.utils'; +import { UUIDParamDto } from './dto/uuid-param.dto'; @ApiTags('User') @Controller(Route.USER) @@ -40,53 +40,53 @@ export class UserController { @Get() getAllUsers(@AuthUser() authUser: AuthUserDto, @Query('isAll') isAll: boolean): Promise { - return this.service.getAllUsers(authUser, isAll); + return this.service.getAll(authUser, isAll); } - @Get('/info/:userId') - getUserById(@Param() { userId }: UserIdDto): Promise { - return this.service.getUserById(userId); + @Get('info/:id') + getUserById(@Param() { id }: UUIDParamDto): Promise { + return this.service.get(id); } @Get('me') getMyUserInfo(@AuthUser() authUser: AuthUserDto): Promise { - return this.service.getUserInfo(authUser); + return this.service.getMe(authUser); } @AdminRoute() @Post() - createUser(@Body() createUserDto: CreateUserDto): Promise { - return this.service.createUser(createUserDto); + createUser(@Body() createUserDto: CreateDto): Promise { + return this.service.create(createUserDto); } @PublicRoute() - @Get('/count') - getUserCount(@Query() dto: UserCountDto): Promise { - return this.service.getUserCount(dto); + @Get('count') + getUserCount(@Query() dto: CountDto): Promise { + return this.service.getCount(dto); } @AdminRoute() - @Delete('/:userId') - deleteUser(@AuthUser() authUser: AuthUserDto, @Param() { userId }: UserIdDto): Promise { - return this.service.deleteUser(authUser, userId); + @Delete(':id') + deleteUser(@AuthUser() authUser: AuthUserDto, @Param() { id }: UUIDParamDto): Promise { + return this.service.delete(authUser, id); } @AdminRoute() - @Post('/:userId/restore') - restoreUser(@AuthUser() authUser: AuthUserDto, @Param() { userId }: UserIdDto): Promise { - return this.service.restoreUser(authUser, userId); + @Post(':id/restore') + restoreUser(@AuthUser() authUser: AuthUserDto, @Param() { id }: UUIDParamDto): Promise { + return this.service.restore(authUser, id); } // TODO: replace with @Put(':id') @Put() - updateUser(@AuthUser() authUser: AuthUserDto, @Body() updateUserDto: UpdateUserDto): Promise { - return this.service.updateUser(authUser, updateUserDto); + updateUser(@AuthUser() authUser: AuthUserDto, @Body() updateUserDto: UpdateDto): Promise { + return this.service.update(authUser, updateUserDto); } @UseInterceptors(FileUploadInterceptor) @ApiConsumes('multipart/form-data') @ApiBody({ description: 'A new avatar for the user', type: CreateProfileImageDto }) - @Post('/profile-image') + @Post('profile-image') createProfileImage( @AuthUser() authUser: AuthUserDto, @UploadedFile() fileInfo: Express.Multer.File, @@ -94,10 +94,10 @@ export class UserController { return this.service.createProfileImage(authUser, fileInfo); } - @Get('/profile-image/:userId') + @Get('profile-image/:id') @Header('Cache-Control', 'private, no-cache, no-transform') - async getProfileImage(@Param() { userId }: UserIdDto, @Response({ passthrough: true }) res: Res): Promise { - const readableStream = await this.service.getUserProfileImage(userId); + async getProfileImage(@Param() { id }: UUIDParamDto, @Response({ passthrough: true }) res: Res): Promise { + const readableStream = await this.service.getProfileImage(id); res.header('Content-Type', 'image/jpeg'); return new StreamableFile(readableStream); } diff --git a/web/src/api/open-api/api.ts b/web/src/api/open-api/api.ts index 4cf39af6d..2d330f6f2 100644 --- a/web/src/api/open-api/api.ts +++ b/web/src/api/open-api/api.ts @@ -12180,15 +12180,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - deleteUser: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('deleteUser', 'userId', userId) - const localVarPath = `/user/{userId}` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + deleteUser: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('deleteUser', 'id', id) + const localVarPath = `/user/{id}` + .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; @@ -12305,15 +12305,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getProfileImage: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('getProfileImage', 'userId', userId) - const localVarPath = `/user/profile-image/{userId}` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + getProfileImage: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getProfileImage', 'id', id) + const localVarPath = `/user/profile-image/{id}` + .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; @@ -12347,15 +12347,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getUserById: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('getUserById', 'userId', userId) - const localVarPath = `/user/info/{userId}` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + getUserById: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('getUserById', 'id', id) + const localVarPath = `/user/info/{id}` + .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; @@ -12423,15 +12423,15 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - restoreUser: async (userId: string, options: AxiosRequestConfig = {}): Promise => { - // verify required parameter 'userId' is not null or undefined - assertParamExists('restoreUser', 'userId', userId) - const localVarPath = `/user/{userId}/restore` - .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + restoreUser: async (id: string, options: AxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('restoreUser', 'id', id) + const localVarPath = `/user/{id}/restore` + .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; @@ -12539,12 +12539,12 @@ export const UserApiFp = function(configuration?: Configuration) { }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async deleteUser(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.deleteUser(userId, options); + async deleteUser(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.deleteUser(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -12568,22 +12568,22 @@ export const UserApiFp = function(configuration?: Configuration) { }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getProfileImage(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getProfileImage(userId, options); + async getProfileImage(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getProfileImage(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async getUserById(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.getUserById(userId, options); + async getUserById(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.getUserById(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -12598,12 +12598,12 @@ export const UserApiFp = function(configuration?: Configuration) { }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - async restoreUser(userId: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { - const localVarAxiosArgs = await localVarAxiosParamCreator.restoreUser(userId, options); + async restoreUser(id: string, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.restoreUser(id, options); return createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration); }, /** @@ -12646,12 +12646,12 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - deleteUser(userId: string, options?: any): AxiosPromise { - return localVarFp.deleteUser(userId, options).then((request) => request(axios, basePath)); + deleteUser(id: string, options?: any): AxiosPromise { + return localVarFp.deleteUser(id, options).then((request) => request(axios, basePath)); }, /** * @@ -12672,21 +12672,21 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getProfileImage(userId: string, options?: any): AxiosPromise { - return localVarFp.getProfileImage(userId, options).then((request) => request(axios, basePath)); + getProfileImage(id: string, options?: any): AxiosPromise { + return localVarFp.getProfileImage(id, options).then((request) => request(axios, basePath)); }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - getUserById(userId: string, options?: any): AxiosPromise { - return localVarFp.getUserById(userId, options).then((request) => request(axios, basePath)); + getUserById(id: string, options?: any): AxiosPromise { + return localVarFp.getUserById(id, options).then((request) => request(axios, basePath)); }, /** * @@ -12699,12 +12699,12 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? }, /** * - * @param {string} userId + * @param {string} id * @param {*} [options] Override http request option. * @throws {RequiredError} */ - restoreUser(userId: string, options?: any): AxiosPromise { - return localVarFp.restoreUser(userId, options).then((request) => request(axios, basePath)); + restoreUser(id: string, options?: any): AxiosPromise { + return localVarFp.restoreUser(id, options).then((request) => request(axios, basePath)); }, /** * @@ -12757,7 +12757,7 @@ export interface UserApiDeleteUserRequest { * @type {string} * @memberof UserApiDeleteUser */ - readonly userId: string + readonly id: string } /** @@ -12785,7 +12785,7 @@ export interface UserApiGetProfileImageRequest { * @type {string} * @memberof UserApiGetProfileImage */ - readonly userId: string + readonly id: string } /** @@ -12799,7 +12799,7 @@ export interface UserApiGetUserByIdRequest { * @type {string} * @memberof UserApiGetUserById */ - readonly userId: string + readonly id: string } /** @@ -12827,7 +12827,7 @@ export interface UserApiRestoreUserRequest { * @type {string} * @memberof UserApiRestoreUser */ - readonly userId: string + readonly id: string } /** @@ -12881,7 +12881,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public deleteUser(requestParameters: UserApiDeleteUserRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).deleteUser(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).deleteUser(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** @@ -12913,7 +12913,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public getProfileImage(requestParameters: UserApiGetProfileImageRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).getProfileImage(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).getProfileImage(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** @@ -12924,7 +12924,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public getUserById(requestParameters: UserApiGetUserByIdRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).getUserById(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).getUserById(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** @@ -12946,7 +12946,7 @@ export class UserApi extends BaseAPI { * @memberof UserApi */ public restoreUser(requestParameters: UserApiRestoreUserRequest, options?: AxiosRequestConfig) { - return UserApiFp(this.configuration).restoreUser(requestParameters.userId, options).then((request) => request(this.axios, this.basePath)); + return UserApiFp(this.configuration).restoreUser(requestParameters.id, options).then((request) => request(this.axios, this.basePath)); } /** diff --git a/web/src/lib/components/admin-page/delete-confirm-dialoge.svelte b/web/src/lib/components/admin-page/delete-confirm-dialoge.svelte index 2e703de8e..1b7261544 100644 --- a/web/src/lib/components/admin-page/delete-confirm-dialoge.svelte +++ b/web/src/lib/components/admin-page/delete-confirm-dialoge.svelte @@ -10,7 +10,7 @@ const deleteUser = async () => { try { - const deletedUser = await api.userApi.deleteUser({ userId: user.id }); + const deletedUser = await api.userApi.deleteUser({ id: user.id }); if (deletedUser.data.deletedAt != null) { dispatch('user-delete-success'); } else { diff --git a/web/src/lib/components/admin-page/restore-dialoge.svelte b/web/src/lib/components/admin-page/restore-dialoge.svelte index 7ee68daef..4e4517045 100644 --- a/web/src/lib/components/admin-page/restore-dialoge.svelte +++ b/web/src/lib/components/admin-page/restore-dialoge.svelte @@ -8,7 +8,7 @@ const dispatch = createEventDispatcher(); const restoreUser = async () => { - const restoredUser = await api.userApi.restoreUser({ userId: user.id }); + const restoredUser = await api.userApi.restoreUser({ id: user.id }); if (restoredUser.data.deletedAt == null) dispatch('user-restore-success'); else dispatch('user-restore-fail'); }; diff --git a/web/src/lib/components/album-page/album-card.svelte b/web/src/lib/components/album-page/album-card.svelte index 9d6817c92..0aa2ea867 100644 --- a/web/src/lib/components/album-page/album-card.svelte +++ b/web/src/lib/components/album-page/album-card.svelte @@ -52,7 +52,7 @@ }); const getAlbumOwnerInfo = async (): Promise => { - const { data } = await api.userApi.getUserById({ userId: album.ownerId }); + const { data } = await api.userApi.getUserById({ id: album.ownerId }); return data; }; diff --git a/web/src/routes/(user)/partners/[userId]/+page.server.ts b/web/src/routes/(user)/partners/[userId]/+page.server.ts index 58ed9fb3d..13fbb1c10 100644 --- a/web/src/routes/(user)/partners/[userId]/+page.server.ts +++ b/web/src/routes/(user)/partners/[userId]/+page.server.ts @@ -9,7 +9,7 @@ export const load: PageServerLoad = async ({ params, parent, locals: { api } }) throw redirect(302, AppRoute.AUTH_LOGIN); } - const { data: partner } = await api.userApi.getUserById({ userId: params['userId'] }); + const { data: partner } = await api.userApi.getUserById({ id: params['userId'] }); return { user,