diff --git a/mobile/lib/services/partner.service.dart b/mobile/lib/services/partner.service.dart index 84f37ce7e1..8cd2fe424f 100644 --- a/mobile/lib/services/partner.service.dart +++ b/mobile/lib/services/partner.service.dart @@ -14,17 +14,6 @@ final partnerServiceProvider = Provider( ), ); -enum PartnerDirection { - sharedWith("shared-with"), - sharedBy("shared-by"); - - const PartnerDirection( - this._value, - ); - - final String _value; -} - class PartnerService { final ApiService _apiService; final Isar _db; @@ -34,8 +23,7 @@ class PartnerService { Future?> getPartners(PartnerDirection direction) async { try { - final userDtos = - await _apiService.partnersApi.getPartners(direction._value); + final userDtos = await _apiService.partnersApi.getPartners(direction); if (userDtos != null) { return userDtos.map((u) => User.fromPartnerDto(u)).toList(); } diff --git a/mobile/lib/services/user.service.dart b/mobile/lib/services/user.service.dart index 0d8d47b104..9631141c41 100644 --- a/mobile/lib/services/user.service.dart +++ b/mobile/lib/services/user.service.dart @@ -73,9 +73,9 @@ class UserService { Future?> getUsersFromServer() async { final List? users = await _getAllUsers(); final List? sharedBy = - await _partnerService.getPartners(PartnerDirection.sharedBy); + await _partnerService.getPartners(PartnerDirection.by); final List? sharedWith = - await _partnerService.getPartners(PartnerDirection.sharedWith); + await _partnerService.getPartners(PartnerDirection.with_); if (users == null || sharedBy == null || sharedWith == null) { _log.warning("Failed to refresh users"); diff --git a/mobile/openapi/README.md b/mobile/openapi/README.md index c3ef247ddc..674409d81d 100644 Binary files a/mobile/openapi/README.md and b/mobile/openapi/README.md differ diff --git a/mobile/openapi/lib/api.dart b/mobile/openapi/lib/api.dart index cda2bac4c5..e6a3907a24 100644 Binary files a/mobile/openapi/lib/api.dart and b/mobile/openapi/lib/api.dart differ diff --git a/mobile/openapi/lib/api/partners_api.dart b/mobile/openapi/lib/api/partners_api.dart index 3794e79079..ac0d03054a 100644 Binary files a/mobile/openapi/lib/api/partners_api.dart and b/mobile/openapi/lib/api/partners_api.dart differ diff --git a/mobile/openapi/lib/api_client.dart b/mobile/openapi/lib/api_client.dart index 32490a6820..2645a32813 100644 Binary files a/mobile/openapi/lib/api_client.dart and b/mobile/openapi/lib/api_client.dart differ diff --git a/mobile/openapi/lib/api_helper.dart b/mobile/openapi/lib/api_helper.dart index 762b728869..db8af0bfc2 100644 Binary files a/mobile/openapi/lib/api_helper.dart and b/mobile/openapi/lib/api_helper.dart differ diff --git a/mobile/openapi/lib/model/partner_direction.dart b/mobile/openapi/lib/model/partner_direction.dart new file mode 100644 index 0000000000..c43c0df75d Binary files /dev/null and b/mobile/openapi/lib/model/partner_direction.dart differ diff --git a/open-api/immich-openapi-specs.json b/open-api/immich-openapi-specs.json index b25e78da77..12472daf5b 100644 --- a/open-api/immich-openapi-specs.json +++ b/open-api/immich-openapi-specs.json @@ -3660,11 +3660,7 @@ "required": true, "in": "query", "schema": { - "enum": [ - "shared-by", - "shared-with" - ], - "type": "string" + "$ref": "#/components/schemas/PartnerDirection" } } ], @@ -9473,6 +9469,13 @@ ], "type": "object" }, + "PartnerDirection": { + "enum": [ + "shared-by", + "shared-with" + ], + "type": "string" + }, "PartnerResponseDto": { "properties": { "avatarColor": { diff --git a/open-api/typescript-sdk/src/fetch-client.ts b/open-api/typescript-sdk/src/fetch-client.ts index ac3f776991..0130c80946 100644 --- a/open-api/typescript-sdk/src/fetch-client.ts +++ b/open-api/typescript-sdk/src/fetch-client.ts @@ -2128,7 +2128,7 @@ export function unlinkOAuthAccount(opts?: Oazapfts.RequestOpts) { })); } export function getPartners({ direction }: { - direction: "shared-by" | "shared-with"; + direction: PartnerDirection; }, opts?: Oazapfts.RequestOpts) { return oazapfts.ok(oazapfts.fetchJson<{ status: 200; @@ -3131,6 +3131,10 @@ export enum Type2 { export enum MemoryType { OnThisDay = "on_this_day" } +export enum PartnerDirection { + SharedBy = "shared-by", + SharedWith = "shared-with" +} export enum PathEntityType { Asset = "asset", Person = "person", diff --git a/server/src/controllers/partner.controller.ts b/server/src/controllers/partner.controller.ts index 927078bf0b..208d571464 100644 --- a/server/src/controllers/partner.controller.ts +++ b/server/src/controllers/partner.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common'; import { ApiQuery, ApiTags } from '@nestjs/swagger'; import { AuthDto } from 'src/dtos/auth.dto'; -import { PartnerResponseDto, UpdatePartnerDto } from 'src/dtos/partner.dto'; +import { PartnerResponseDto, PartnerSearchDto, UpdatePartnerDto } from 'src/dtos/partner.dto'; import { PartnerDirection } from 'src/interfaces/partner.interface'; import { Auth, Authenticated } from 'src/middleware/auth.guard'; import { PartnerService } from 'src/services/partner.service'; @@ -16,8 +16,8 @@ export class PartnerController { @ApiQuery({ name: 'direction', type: 'string', enum: PartnerDirection, required: true }) @Authenticated() // TODO: remove 'direction' and convert to full query dto - getPartners(@Auth() auth: AuthDto, @Query('direction') direction: PartnerDirection): Promise { - return this.service.getAll(auth, direction); + getPartners(@Auth() auth: AuthDto, @Query() dto: PartnerSearchDto): Promise { + return this.service.search(auth, dto); } @Post(':id') diff --git a/server/src/dtos/partner.dto.ts b/server/src/dtos/partner.dto.ts index 187f8f341b..38573998d6 100644 --- a/server/src/dtos/partner.dto.ts +++ b/server/src/dtos/partner.dto.ts @@ -1,11 +1,19 @@ -import { IsNotEmpty } from 'class-validator'; +import { ApiProperty } from '@nestjs/swagger'; +import { IsEnum, IsNotEmpty } from 'class-validator'; import { UserResponseDto } from 'src/dtos/user.dto'; +import { PartnerDirection } from 'src/interfaces/partner.interface'; export class UpdatePartnerDto { @IsNotEmpty() inTimeline!: boolean; } +export class PartnerSearchDto { + @IsEnum(PartnerDirection) + @ApiProperty({ enum: PartnerDirection, enumName: 'PartnerDirection' }) + direction!: PartnerDirection; +} + export class PartnerResponseDto extends UserResponseDto { inTimeline?: boolean; } diff --git a/server/src/services/partner.service.spec.ts b/server/src/services/partner.service.spec.ts index 043b8ae71a..b2b3401251 100644 --- a/server/src/services/partner.service.spec.ts +++ b/server/src/services/partner.service.spec.ts @@ -21,16 +21,16 @@ describe(PartnerService.name, () => { expect(sut).toBeDefined(); }); - describe('getAll', () => { + describe('search', () => { it("should return a list of partners with whom I've shared my library", async () => { partnerMock.getAll.mockResolvedValue([partnerStub.adminToUser1, partnerStub.user1ToAdmin1]); - await expect(sut.getAll(authStub.user1, PartnerDirection.SharedBy)).resolves.toBeDefined(); + await expect(sut.search(authStub.user1, { direction: PartnerDirection.SharedBy })).resolves.toBeDefined(); expect(partnerMock.getAll).toHaveBeenCalledWith(authStub.user1.user.id); }); it('should return a list of partners who have shared their libraries with me', async () => { partnerMock.getAll.mockResolvedValue([partnerStub.adminToUser1, partnerStub.user1ToAdmin1]); - await expect(sut.getAll(authStub.user1, PartnerDirection.SharedWith)).resolves.toBeDefined(); + await expect(sut.search(authStub.user1, { direction: PartnerDirection.SharedWith })).resolves.toBeDefined(); expect(partnerMock.getAll).toHaveBeenCalledWith(authStub.user1.user.id); }); }); diff --git a/server/src/services/partner.service.ts b/server/src/services/partner.service.ts index e1d4e9738b..d26149dceb 100644 --- a/server/src/services/partner.service.ts +++ b/server/src/services/partner.service.ts @@ -1,7 +1,7 @@ import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { AccessCore, Permission } from 'src/cores/access.core'; import { AuthDto } from 'src/dtos/auth.dto'; -import { PartnerResponseDto, UpdatePartnerDto } from 'src/dtos/partner.dto'; +import { PartnerResponseDto, PartnerSearchDto, UpdatePartnerDto } from 'src/dtos/partner.dto'; import { mapUser } from 'src/dtos/user.dto'; import { PartnerEntity } from 'src/entities/partner.entity'; import { IAccessRepository } from 'src/interfaces/access.interface'; @@ -38,7 +38,7 @@ export class PartnerService { await this.repository.remove(partner); } - async getAll(auth: AuthDto, direction: PartnerDirection): Promise { + async search(auth: AuthDto, { direction }: PartnerSearchDto): Promise { const partners = await this.repository.getAll(auth.user.id); const key = direction === PartnerDirection.SharedBy ? 'sharedById' : 'sharedWithId'; return partners diff --git a/web/src/lib/components/user-settings-page/partner-selection-modal.svelte b/web/src/lib/components/user-settings-page/partner-selection-modal.svelte index 88cda3cc0c..3cff1cd1de 100644 --- a/web/src/lib/components/user-settings-page/partner-selection-modal.svelte +++ b/web/src/lib/components/user-settings-page/partner-selection-modal.svelte @@ -1,5 +1,5 @@