Skip to content

Commit 31498c2

Browse files
brentkulwickiBrent KulwickiCarsonF
authored
Add Partner.languages (#3078)
Co-authored-by: Brent Kulwicki <[email protected]> Co-authored-by: Carson Full <[email protected]>
1 parent b4757bc commit 31498c2

File tree

5 files changed

+60
-0
lines changed

5 files changed

+60
-0
lines changed

src/components/language/dto/list-language.dto.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Field, InputType, ObjectType } from '@nestjs/graphql';
22
import {
33
FilterField,
4+
ID,
45
PaginatedList,
56
SecuredList,
67
SensitivitiesFilter,
@@ -46,6 +47,8 @@ export abstract class LanguageFilters {
4647
nullable: true,
4748
})
4849
readonly pinned?: boolean;
50+
51+
readonly partnerId?: ID;
4952
}
5053

5154
@InputType()

src/components/language/language.repository.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,17 @@ export class LanguageRepository extends DtoRepository<
180180
leastOfThese: filter.propVal(),
181181
isSignLanguage: filter.propVal(),
182182
isDialect: filter.propVal(),
183+
partnerId: filter.pathExists((id) => [
184+
node('node'),
185+
relation('in', '', 'language', ACTIVE),
186+
node('', 'LanguageEngagement'),
187+
relation('in', '', 'engagement', ACTIVE),
188+
node('', 'Project'),
189+
relation('out', '', 'partnership', ACTIVE),
190+
node('', 'Partnership'),
191+
relation('out', '', 'partner', ACTIVE),
192+
node('', 'Partner', { id }),
193+
]),
183194
presetInventory: ({ value, query }) => {
184195
query.apply(this.isPresetInventory()).with('*');
185196
const condition = equals('true', true);

src/components/partner/partner.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { forwardRef, Module } from '@nestjs/common';
22
import { AuthorizationModule } from '../authorization/authorization.module';
3+
import { LanguageModule } from '../language/language.module';
34
import { OrganizationModule } from '../organization/organization.module';
45
import { ProjectModule } from '../project/project.module';
56
import { UserModule } from '../user/user.module';
@@ -11,6 +12,7 @@ import { PartnerService } from './partner.service';
1112
@Module({
1213
imports: [
1314
forwardRef(() => AuthorizationModule),
15+
forwardRef(() => LanguageModule),
1416
forwardRef(() => ProjectModule),
1517
forwardRef(() => OrganizationModule),
1618
forwardRef(() => UserModule),

src/components/partner/partner.resolver.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import {
2020
import { Loader, LoaderOf } from '../../core';
2121
import { FieldRegionLoader, SecuredFieldRegions } from '../field-region';
2222
import {
23+
LanguageListInput,
2324
LanguageLoader,
25+
SecuredLanguageList,
2426
SecuredLanguageNullable,
2527
SecuredLanguages,
2628
} from '../language';
@@ -148,6 +150,24 @@ export class PartnerResolver {
148150
return list;
149151
}
150152

153+
@ResolveField(() => SecuredLanguageList, {
154+
description: "Languages of the partner's affiliated translation projects",
155+
})
156+
async languages(
157+
@AnonSession() session: Session,
158+
@Parent() partner: Partner,
159+
@ListArg(LanguageListInput) input: LanguageListInput,
160+
@Loader(LanguageLoader) loader: LoaderOf<LanguageLoader>,
161+
): Promise<SecuredLanguageList> {
162+
const list = await this.partnerService.listLanguages(
163+
partner,
164+
input,
165+
session,
166+
);
167+
loader.primeAll(list.items);
168+
return list;
169+
}
170+
151171
@Mutation(() => CreatePartnerOutput, {
152172
description: 'Create a partner',
153173
})

src/components/partner/partner.service.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ import {
1414
import { HandleIdLookup, ILogger, Logger, ResourceLoader } from '../../core';
1515
import { mapListResults } from '../../core/database/results';
1616
import { Privileges } from '../authorization';
17+
import {
18+
LanguageListInput,
19+
LanguageService,
20+
SecuredLanguageList,
21+
} from '../language';
1722
import { Location, LocationLoader, LocationType } from '../location';
1823
import { FinancialReportingType } from '../partnership/dto';
1924
import {
@@ -39,6 +44,8 @@ export class PartnerService {
3944
private readonly privileges: Privileges,
4045
@Inject(forwardRef(() => ProjectService))
4146
private readonly projectService: ProjectService & {},
47+
@Inject(forwardRef(() => LanguageService))
48+
private readonly languageService: LanguageService & {},
4249
private readonly repo: PartnerRepository,
4350
private readonly resourceLoader: ResourceLoader,
4451
) {}
@@ -178,6 +185,23 @@ export class PartnerService {
178185
};
179186
}
180187

188+
async listLanguages(
189+
partner: Partner,
190+
input: LanguageListInput,
191+
session: Session,
192+
): Promise<SecuredLanguageList> {
193+
const languageListOutput = await this.languageService.list(
194+
{ ...input, filter: { ...input.filter, partnerId: partner.id } },
195+
session,
196+
);
197+
return {
198+
...languageListOutput,
199+
canRead: true,
200+
// non-owned list
201+
canCreate: false,
202+
};
203+
}
204+
181205
protected verifyFinancialReportingType(
182206
financialReportingTypes: FinancialReportingType[] | undefined,
183207
types: PartnerType[] | undefined,

0 commit comments

Comments
 (0)