diff --git a/mobile/lib/widgets/common/user_avatar.dart b/mobile/lib/widgets/common/user_avatar.dart index c61a3adbeb..8dfe00b2b9 100644 --- a/mobile/lib/widgets/common/user_avatar.dart +++ b/mobile/lib/widgets/common/user_avatar.dart @@ -6,7 +6,7 @@ import 'package:immich_mobile/entities/user.entity.dart'; Widget userAvatar(BuildContext context, User u, {double? radius}) { final url = - "${Store.get(StoreKey.serverEndpoint)}/user/profile-image/${u.id}"; + "${Store.get(StoreKey.serverEndpoint)}/users/${u.id}/profile-image"; final nameFirstLetter = u.name.isNotEmpty ? u.name[0] : ""; return CircleAvatar( radius: radius, diff --git a/mobile/lib/widgets/common/user_circle_avatar.dart b/mobile/lib/widgets/common/user_circle_avatar.dart index 1f8529a80a..9dd924d98e 100644 --- a/mobile/lib/widgets/common/user_circle_avatar.dart +++ b/mobile/lib/widgets/common/user_circle_avatar.dart @@ -24,7 +24,7 @@ class UserCircleAvatar extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { bool isDarkTheme = Theme.of(context).brightness == Brightness.dark; final profileImageUrl = - '${Store.get(StoreKey.serverEndpoint)}/user/profile-image/${user.id}?d=${Random().nextInt(1024)}'; + '${Store.get(StoreKey.serverEndpoint)}/users/${user.id}/profile-image?d=${Random().nextInt(1024)}'; final textIcon = Text( user.name[0].toUpperCase(), diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index ad38d3f49e..c3a4921601 100644 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/lib/api/user_api.dart b/mobile/openapi/lib/api/user_api.dart index 09c0504710..301169cb9a 100644 Binary files a/mobile/openapi/lib/api/user_api.dart and b/mobile/openapi/lib/api/user_api.dart differ diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index cb334534bd..03dafc33cf 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -6327,49 +6327,6 @@ ] } }, - "/users/profile-image/{id}": { - "get": { - "operationId": "getProfileImage", - "parameters": [ - { - "name": "id", - "required": true, - "in": "path", - "schema": { - "format": "uuid", - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/octet-stream": { - "schema": { - "format": "binary", - "type": "string" - } - } - }, - "description": "" - } - }, - "security": [ - { - "bearer": [] - }, - { - "cookie": [] - }, - { - "api_key": [] - } - ], - "tags": [ - "User" - ] - } - }, "/users/{id}": { "delete": { "operationId": "deleteUser", @@ -6462,6 +6419,49 @@ ] } }, + "/users/{id}/profile-image": { + "get": { + "operationId": "getProfileImage", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "format": "uuid", + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/octet-stream": { + "schema": { + "format": "binary", + "type": "string" + } + } + }, + "description": "" + } + }, + "security": [ + { + "bearer": [] + }, + { + "cookie": [] + }, + { + "api_key": [] + } + ], + "tags": [ + "User" + ] + } + }, "/users/{id}/restore": { "post": { "operationId": "restoreUser", diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index 29a8f5c0fe..b830f0c280 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -2776,16 +2776,6 @@ export function createProfileImage({ createProfileImageDto }: { body: createProfileImageDto }))); } -export function getProfileImage({ id }: { - id: string; -}, opts?: Oazapfts.RequestOpts) { - return oazapfts.ok(oazapfts.fetchBlob<{ - status: 200; - data: Blob; - }>(`/users/profile-image/${encodeURIComponent(id)}`, { - ...opts - })); -} export function deleteUser({ id, deleteUserDto }: { id: string; deleteUserDto: DeleteUserDto; @@ -2809,6 +2799,16 @@ export function getUserById({ id }: { ...opts })); } +export function getProfileImage({ id }: { + id: string; +}, opts?: Oazapfts.RequestOpts) { + return oazapfts.ok(oazapfts.fetchBlob<{ + status: 200; + data: Blob; + }>(`/users/${encodeURIComponent(id)}/profile-image`, { + ...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 4c058e7aae..1b995c5944 100644 --- a/server/src/controllers/user.controller.ts +++ b/server/src/controllers/user.controller.ts @@ -101,7 +101,7 @@ export class UserController { return this.service.createProfileImage(auth, fileInfo); } - @Get('profile-image/:id') + @Get(':id/profile-image') @FileResponse() @Authenticated() async getProfileImage(@Res() res: Response, @Next() next: NextFunction, @Param() { id }: UUIDParamDto) { diff --git a/web/src/lib/utils.ts b/web/src/lib/utils.ts index 5c055b875d..60add8ae7a 100644 --- a/web/src/lib/utils.ts +++ b/web/src/lib/utils.ts @@ -169,7 +169,7 @@ export const getAssetThumbnailUrl = (...[assetId, format]: [string, ThumbnailFor }; export const getProfileImageUrl = (...[userId]: [string]) => { - const path = `/user/profile-image/${userId}`; + const path = `/users/${userId}/profile-image`; return createUrl(path); };