From 4ccd76fcdda782e69132ac11c37e804185649fc9 Mon Sep 17 00:00:00 2001 From: Carson Full Date: Tue, 4 Jun 2024 10:04:04 -0500 Subject: [PATCH] Expose `Language.engagements` --- .../engagement/dto/list-engagements.dto.ts | 2 ++ .../engagement/engagement.repository.ts | 5 +++++ src/components/language/language.resolver.ts | 20 +++++++++++++++++++ src/components/language/language.service.ts | 18 ++++++++++++++++- 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/components/engagement/dto/list-engagements.dto.ts b/src/components/engagement/dto/list-engagements.dto.ts index d8d62f3d9d..9487de4bb6 100644 --- a/src/components/engagement/dto/list-engagements.dto.ts +++ b/src/components/engagement/dto/list-engagements.dto.ts @@ -23,6 +23,8 @@ export abstract class EngagementFilters { readonly projectId?: ID; + readonly languageId?: ID; + readonly partnerId?: ID<'Partner'>; } diff --git a/src/components/engagement/engagement.repository.ts b/src/components/engagement/engagement.repository.ts index 386c67f308..1e24dc2811 100644 --- a/src/components/engagement/engagement.repository.ts +++ b/src/components/engagement/engagement.repository.ts @@ -381,6 +381,11 @@ export class EngagementRepository extends CommonRepository { relation('out', '', 'partner'), node('', 'Partner', { id }), ]), + languageId: filter.pathExists((id) => [ + node('node'), + relation('out', '', 'language'), + node('', 'Language', { id }), + ]), }), ) .apply( diff --git a/src/components/language/language.resolver.ts b/src/components/language/language.resolver.ts index 2dbcd7b6b0..0aebce4002 100644 --- a/src/components/language/language.resolver.ts +++ b/src/components/language/language.resolver.ts @@ -23,6 +23,8 @@ import { } from '~/common'; import { Loader, LoaderOf } from '~/core'; import { IdsAndView, IdsAndViewArg } from '../changeset/dto'; +import { EngagementLoader } from '../engagement'; +import { EngagementListInput, SecuredEngagementList } from '../engagement/dto'; import { LocationLoader } from '../location'; import { LocationListInput, SecuredLocationList } from '../location/dto'; import { ProjectLoader } from '../project'; @@ -149,6 +151,24 @@ export class LanguageResolver { return list; } + @ResolveField(() => SecuredEngagementList, { + description: "The list of the language's engagements.", + }) + async engagements( + @AnonSession() session: Session, + @Parent() language: Language, + @ListArg(EngagementListInput) input: EngagementListInput, + @Loader(EngagementLoader) loader: LoaderOf, + ): Promise { + const list = await this.langService.listEngagements( + language, + input, + session, + ); + loader.primeAll(list.items); + return list; + } + @Query(() => LanguageListOutput, { description: 'Look up languages', }) diff --git a/src/components/language/language.service.ts b/src/components/language/language.service.ts index 2ebc6fa830..43551719cd 100644 --- a/src/components/language/language.service.ts +++ b/src/components/language/language.service.ts @@ -13,7 +13,7 @@ import { import { HandleIdLookup, ILogger, Logger } from '~/core'; import { Privileges } from '../authorization'; import { EngagementService } from '../engagement'; -import { EngagementStatus } from '../engagement/dto'; +import { EngagementListInput, EngagementStatus } from '../engagement/dto'; import { LocationService } from '../location'; import { LocationListInput, SecuredLocationList } from '../location/dto'; import { ProjectService } from '../project'; @@ -165,6 +165,22 @@ export class LanguageService { }; } + async listEngagements( + language: Language, + input: EngagementListInput, + session: Session, + ) { + const list = await this.engagementService.list( + { ...input, filter: { ...input.filter, languageId: language.id } }, + session, + ); + return { + ...list, + canRead: true, + canCreate: false, + }; + } + async sponsorStartDate( language: Language, session: Session,