From ecd018a82685b5be065b3b07b740b68d9bd4005d Mon Sep 17 00:00:00 2001 From: Jason Rasmussen Date: Wed, 22 May 2024 14:15:33 -0400 Subject: [PATCH] refactor(server): user info endpoint (#9668) * refactor(server): user info endpoint * chore: open api --- e2e/src/api/specs/user.e2e-spec.ts | 6 +- mobile/openapi/README.md | 2 +- mobile/openapi/lib/api/user_api.dart | 4 +- open-api/immich-openapi-specs.json | 82 ++++++++++----------- open-api/typescript-sdk/src/fetch-client.ts | 20 ++--- server/src/controllers/user.controller.ts | 16 ++-- 6 files changed, 64 insertions(+), 66 deletions(-) diff --git a/e2e/src/api/specs/user.e2e-spec.ts b/e2e/src/api/specs/user.e2e-spec.ts index 7518e732ec669..08b2d34ef6e2b 100644 --- a/e2e/src/api/specs/user.e2e-spec.ts +++ b/e2e/src/api/specs/user.e2e-spec.ts @@ -93,15 +93,15 @@ describe('/users', () => { }); }); - describe('GET /users/info/:id', () => { + describe('GET /users/:id', () => { it('should require authentication', async () => { - const { status } = await request(app).get(`/users/info/${admin.userId}`); + const { status } = await request(app).get(`/users/${admin.userId}`); expect(status).toEqual(401); }); it('should get the user info', async () => { const { status, body } = await request(app) - .get(`/users/info/${admin.userId}`) + .get(`/users/${admin.userId}`) .set('Authorization', `Bearer ${admin.accessToken}`); expect(status).toBe(200); expect(body).toMatchObject({ diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index e23b1fea7688e..ad38d3f49e6f5 100644 --- a/mobile/openapi/README.md +++ b/mobile/openapi/README.md @@ -220,7 +220,7 @@ Class | Method | HTTP request | Description *UserApi* | [**getAllUsers**](doc//UserApi.md#getallusers) | **GET** /users | *UserApi* | [**getMyUserInfo**](doc//UserApi.md#getmyuserinfo) | **GET** /users/me | *UserApi* | [**getProfileImage**](doc//UserApi.md#getprofileimage) | **GET** /users/profile-image/{id} | -*UserApi* | [**getUserById**](doc//UserApi.md#getuserbyid) | **GET** /users/info/{id} | +*UserApi* | [**getUserById**](doc//UserApi.md#getuserbyid) | **GET** /users/{id} | *UserApi* | [**restoreUser**](doc//UserApi.md#restoreuser) | **POST** /users/{id}/restore | *UserApi* | [**updateUser**](doc//UserApi.md#updateuser) | **PUT** /users | diff --git a/mobile/openapi/lib/api/user_api.dart b/mobile/openapi/lib/api/user_api.dart index 1f070d436f027..09c050471054e 100644 --- a/mobile/openapi/lib/api/user_api.dart +++ b/mobile/openapi/lib/api/user_api.dart @@ -346,13 +346,13 @@ class UserApi { return null; } - /// Performs an HTTP 'GET /users/info/{id}' operation and returns the [Response]. + /// Performs an HTTP 'GET /users/{id}' operation and returns the [Response]. /// Parameters: /// /// * [String] id (required): Future getUserByIdWithHttpInfo(String id,) async { // ignore: prefer_const_declarations - final path = r'/users/info/{id}' + final path = r'/users/{id}' .replaceAll('{id}', id); // ignore: prefer_final_locals diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index 929338b7347a1..cb334534bd4b1 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -6229,48 +6229,6 @@ ] } }, - "/users/info/{id}": { - "get": { - "operationId": "getUserById", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "format": "uuid", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserResponseDto" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "User" - ] - } - }, "/users/me": { "get": { "operationId": "getMyUserInfo", @@ -6462,6 +6420,46 @@ "tags": [ "User" ] + }, + "get": { + "operationId": "getUserById", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserResponseDto" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "User" + ] } }, "/users/{id}/restore": { diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 02ff002f01293..29a8f5c0feac8 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -2750,16 +2750,6 @@ export function updateUser({ updateUserDto }: { body: updateUserDto }))); } -export function getUserById({ id }: { - id: string; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchJson<{ - status: 200; - data: UserResponseDto; - }>(`/users/info/${encodeURIComponent(id)}`, { - ...opts - })); -} export function getMyUserInfo(opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; @@ -2809,6 +2799,16 @@ export function deleteUser({ id, deleteUserDto }: { body: deleteUserDto }))); } +export function getUserById({ id }: { + id: string; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchJson<{ + status: 200; + data: UserResponseDto; + }>(`/users/${encodeURIComponent(id)}`, { + ...opts + })); +} export function restoreUser({ id }: { id: string; }, opts?: Oazapfts.RequestOpts) { diff --git a/server/src/controllers/user.controller.ts b/server/src/controllers/user.controller.ts index a1720dd404671..4c058e7aaece6 100644 --- a/server/src/controllers/user.controller.ts +++ b/server/src/controllers/user.controller.ts @@ -41,10 +41,10 @@ export class UserController { return this.service.getAll(auth, isAll); } - @Get('info/:id') - @Authenticated() - getUserById(@Param() { id }: UUIDParamDto): Promise { - return this.service.get(id); + @Post() + @Authenticated({ admin: true }) + createUser(@Body() createUserDto: CreateUserDto): Promise { + return this.service.create(createUserDto); } @Get('me') @@ -53,10 +53,10 @@ export class UserController { return this.service.getMe(auth); } - @Post() - @Authenticated({ admin: true }) - createUser(@Body() createUserDto: CreateUserDto): Promise { - return this.service.create(createUserDto); + @Get(':id') + @Authenticated() + getUserById(@Param() { id }: UUIDParamDto): Promise { + return this.service.get(id); } @Delete('profile-image')