Skip to content

Commit 674d7f4

Browse files
authored
Add Partner.languagesOfConsulting (#2900)
1 parent 0f74304 commit 674d7f4

File tree

7 files changed

+65
-1
lines changed

7 files changed

+65
-1
lines changed

src/components/language/dto/language.dto.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ export class Language extends Interfaces {
193193
})
194194
export class SecuredLanguage extends SecuredProperty(Language) {}
195195

196+
@ObjectType({
197+
description: SecuredPropertyList.descriptionFor('a list of languages'),
198+
})
199+
export class SecuredLanguages extends SecuredPropertyList(Language) {}
200+
196201
@ObjectType({
197202
description: SecuredProperty.descriptionFor('a language or null'),
198203
})

src/components/partner/dto/create-partner.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ export abstract class CreatePartner {
5353
@IsId({ each: true })
5454
@Transform(({ value }) => uniq(value))
5555
readonly fieldRegions?: ReadonlyArray<IdOf<FieldRegion>> = [];
56+
57+
@Field(() => [IDType], { name: 'languagesOfConsulting', nullable: true })
58+
@Transform(({ value }) => uniq(value))
59+
readonly languagesOfConsulting?: ReadonlyArray<IdOf<Language>> = [];
5660
}
5761

5862
@InputType()

src/components/partner/dto/partner.dto.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,13 @@ export class Partner extends Interfaces {
7979
readonly languageOfWiderCommunication: Secured<IdOf<Language> | null>;
8080

8181
readonly fieldRegions: Required<Secured<ReadonlyArray<IdOf<FieldRegion>>>>;
82+
8283
readonly countries: Required<Secured<ReadonlyArray<IdOf<Location>>>>;
8384

85+
readonly languagesOfConsulting: Required<
86+
Secured<ReadonlyArray<IdOf<Language>>>
87+
>;
88+
8489
@DateTimeField()
8590
readonly modifiedAt: DateTime;
8691

src/components/partner/dto/update-partner.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ export abstract class UpdatePartner {
5353
@IsId({ each: true })
5454
@Transform(({ value }) => (value ? uniq(value) : undefined))
5555
readonly fieldRegions?: ReadonlyArray<IdOf<FieldRegion>>;
56+
57+
@Field(() => [IDType], { name: 'languagesOfConsulting', nullable: true })
58+
@Transform(({ value }) => (value ? uniq(value) : undefined))
59+
readonly languagesOfConsulting?: ReadonlyArray<IdOf<Language>>;
5660
}
5761

5862
@InputType()

src/components/partner/partner.repository.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ export class PartnerRepository extends DtoRepository<
6565
],
6666
fieldRegions: ['FieldRegion', input.fieldRegions],
6767
countries: ['Location', input.countries],
68+
languagesOfConsulting: ['Language', input.languagesOfConsulting],
6869
}),
6970
)
7071
.return<{ id: ID }>('node.id as id')
@@ -124,6 +125,17 @@ export class PartnerRepository extends DtoRepository<
124125
])
125126
.return(collect('countries.id').as('countriesIds')),
126127
)
128+
.subQuery('node', (sub) =>
129+
sub
130+
.match([
131+
node('node'),
132+
relation('out', '', 'languagesOfConsulting', ACTIVE),
133+
node('languagesOfConsulting', 'Language'),
134+
])
135+
.return(
136+
'collect(languagesOfConsulting.id) as languagesOfConsultingIds',
137+
),
138+
)
127139
.apply(matchProps())
128140
.optionalMatch([
129141
node('node'),
@@ -148,6 +160,7 @@ export class PartnerRepository extends DtoRepository<
148160
languageOfWiderCommunication: 'languageOfWiderCommunication.id',
149161
fieldRegions: 'fieldRegionsIds',
150162
countries: 'countriesIds',
163+
languagesOfConsulting: 'languagesOfConsultingIds',
151164
scope: 'scopedRoles',
152165
pinned: 'exists((:User { id: $requestingUser })-[:pinned]->(node))',
153166
}).as('dto'),

src/components/partner/partner.resolver.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,19 @@ import {
1111
ID,
1212
IdArg,
1313
ListArg,
14+
loadManyIgnoreMissingThrowAny,
1415
loadSecuredIds,
1516
LoggedInSession,
1617
mapSecuredValue,
1718
Session,
1819
} from '../../common';
1920
import { Loader, LoaderOf } from '../../core';
2021
import { FieldRegionLoader, SecuredFieldRegions } from '../field-region';
21-
import { LanguageLoader, SecuredLanguageNullable } from '../language';
22+
import {
23+
LanguageLoader,
24+
SecuredLanguageNullable,
25+
SecuredLanguages,
26+
} from '../language';
2227
import { LocationLoader, SecuredLocations } from '../location';
2328
import { OrganizationLoader, SecuredOrganization } from '../organization';
2429
import { PartnerLoader, PartnerService } from '../partner';
@@ -112,6 +117,19 @@ export class PartnerResolver {
112117
return await loadSecuredIds(loader, partner.countries);
113118
}
114119

120+
@ResolveField(() => SecuredLanguages)
121+
async languagesOfConsulting(
122+
@Parent() partner: Partner,
123+
@Loader(LanguageLoader) loader: LoaderOf<LanguageLoader>,
124+
): Promise<SecuredLanguages> {
125+
const { value: ids, ...rest } = partner.languagesOfConsulting;
126+
const value = await loadManyIgnoreMissingThrowAny(
127+
loader,
128+
ids.map((id) => ({ id, view: { active: true } } as const)),
129+
);
130+
return { ...rest, value };
131+
}
132+
115133
@ResolveField(() => SecuredProjectList, {
116134
description: 'The list of projects the partner has a partnership with.',
117135
})

src/components/partner/partner.service.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ export class PartnerService {
134134
languageOfWiderCommunicationId,
135135
fieldRegions,
136136
countries,
137+
languagesOfConsulting,
137138
...simpleChanges
138139
} = changes;
139140

@@ -187,6 +188,20 @@ export class PartnerService {
187188
}
188189
}
189190

191+
if (languagesOfConsulting) {
192+
try {
193+
await this.repo.updateRelationList({
194+
id: partner.id,
195+
relation: 'languagesOfConsulting',
196+
newList: languagesOfConsulting,
197+
});
198+
} catch (e) {
199+
throw e instanceof InputException
200+
? e.withField('partner.languagesOfConsulting')
201+
: e;
202+
}
203+
}
204+
190205
return await this.readOne(input.id, session);
191206
}
192207

0 commit comments

Comments
 (0)