Skip to content

Commit ff509e4

Browse files
committed
[EdgeDB] Engagement repo w/ polymorphic hydration
1 parent d4c7e57 commit ff509e4

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

src/components/engagement/dto/engagement.dto.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ export class InternshipEngagement extends Engagement {
222222
export const engagementRange = (engagement: UnsecuredDto<Engagement>) =>
223223
DateInterval.tryFrom(engagement.startDate, engagement.endDate);
224224

225+
export const EngagementConcretes = {
226+
LanguageEngagement,
227+
InternshipEngagement,
228+
};
229+
225230
declare module '~/core/resources/map' {
226231
interface ResourceMap {
227232
Engagement: typeof Engagement;
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import { Injectable, Type } from '@nestjs/common';
2+
import { ModuleRef } from '@nestjs/core';
3+
import { LazyGetter } from 'lazy-get-decorator';
4+
import { PublicOf } from '~/common';
5+
import { grabInstances } from '~/common/instance-maps';
6+
import { e, RepoFor } from '~/core/edgedb';
7+
import {
8+
EngagementConcretes as ConcreteTypes,
9+
CreateInternshipEngagement,
10+
CreateLanguageEngagement,
11+
IEngagement,
12+
UpdateInternshipEngagement,
13+
UpdateLanguageEngagement,
14+
} from './dto';
15+
import { EngagementRepository } from './engagement.repository';
16+
17+
const baseHydrate = e.shape(e.Engagement, (engagement) => ({
18+
...engagement['*'],
19+
__typename: engagement.__type__.name,
20+
project: {
21+
id: true,
22+
status: true,
23+
type: true,
24+
},
25+
parent: e.tuple({
26+
identity: engagement.project.id,
27+
labels: e.array_agg(e.set(engagement.project.__type__.name.slice(9, null))),
28+
properties: e.tuple({
29+
id: engagement.project.id,
30+
createdAt: engagement.project.createdAt,
31+
}),
32+
}),
33+
ceremony: true,
34+
completeDate: engagement.completedDate, // TODO fix in schema
35+
}));
36+
37+
const languageExtraHydrate = {
38+
language: true,
39+
firstScripture: true,
40+
lukePartnership: true,
41+
openToInvestorVisit: true,
42+
sentPrintingDate: true,
43+
paratextRegistryId: true,
44+
pnp: true,
45+
historicGoal: true,
46+
} as const;
47+
48+
const internshipExtraHydrate = {
49+
countryOfOrigin: true,
50+
intern: true,
51+
mentor: true,
52+
position: true,
53+
methodologies: true,
54+
growthPlan: true,
55+
} as const;
56+
57+
const languageHydrate = e.shape(e.LanguageEngagement, (le) => ({
58+
...baseHydrate(le),
59+
__typename: le.__type__.name,
60+
...languageExtraHydrate,
61+
}));
62+
63+
const internshipHydrate = e.shape(e.InternshipEngagement, (ie) => ({
64+
...baseHydrate(ie),
65+
__typename: ie.__type__.name,
66+
...internshipExtraHydrate,
67+
}));
68+
69+
const hydrate = e.shape(e.Engagement, (engagement) => ({
70+
...baseHydrate(engagement),
71+
...e.is(e.LanguageEngagement, languageExtraHydrate),
72+
...e.is(e.InternshipEngagement, internshipExtraHydrate),
73+
}));
74+
75+
export const ConcreteRepos = {
76+
LanguageEngagement: class LanguageEngagementRepository extends RepoFor(
77+
ConcreteTypes.LanguageEngagement,
78+
{
79+
hydrate: languageHydrate,
80+
},
81+
) {},
82+
83+
InternshipEngagement: class InternshipEngagementRepository extends RepoFor(
84+
ConcreteTypes.InternshipEngagement,
85+
{
86+
hydrate: internshipHydrate,
87+
},
88+
) {},
89+
} satisfies Record<keyof typeof ConcreteTypes, Type>;
90+
91+
@Injectable()
92+
export class EngagementEdgeDBRepository
93+
extends RepoFor(IEngagement, {
94+
hydrate,
95+
omit: ['create', 'update'],
96+
})
97+
implements PublicOf<EngagementRepository>
98+
{
99+
constructor(private readonly moduleRef: ModuleRef) {
100+
super();
101+
}
102+
103+
@LazyGetter() protected get concretes() {
104+
return grabInstances(this.moduleRef, ConcreteRepos);
105+
}
106+
107+
async createLanguageEngagement(input: CreateLanguageEngagement) {
108+
return await this.concretes.LanguageEngagement.create(input);
109+
}
110+
111+
async createInternshipEngagement(input: CreateInternshipEngagement) {
112+
return await this.concretes.InternshipEngagement.create(input);
113+
}
114+
115+
get getActualLanguageChanges() {
116+
return this.concretes.LanguageEngagement.getActualChanges;
117+
}
118+
119+
get getActualInternshipChanges() {
120+
return this.concretes.InternshipEngagement.getActualChanges;
121+
}
122+
123+
async updateLanguage(input: UpdateLanguageEngagement) {
124+
return await this.concretes.LanguageEngagement.update(input);
125+
}
126+
127+
async updateInternship(input: UpdateInternshipEngagement) {
128+
return await this.concretes.InternshipEngagement.update(input);
129+
}
130+
}

src/components/engagement/engagement.module.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { forwardRef, Module } from '@nestjs/common';
2+
import { splitDb } from '~/core';
23
import { AuthorizationModule } from '../authorization/authorization.module';
34
import { CeremonyModule } from '../ceremony/ceremony.module';
45
import { FileModule } from '../file/file.module';
@@ -7,6 +8,7 @@ import { LocationModule } from '../location/location.module';
78
import { ProductModule } from '../product/product.module';
89
import { ProjectModule } from '../project/project.module';
910
import { EngagementStatusResolver } from './engagement-status.resolver';
11+
import { EngagementEdgeDBRepository } from './engagement.edgedb.repository';
1012
import { EngagementLoader } from './engagement.loader';
1113
import { EngagementRepository } from './engagement.repository';
1214
import { EngagementResolver } from './engagement.resolver';
@@ -38,7 +40,7 @@ import { EngagementProductConnectionResolver } from './product-connection.resolv
3840
EngagementProductConnectionResolver,
3941
EngagementRules,
4042
EngagementService,
41-
EngagementRepository,
43+
splitDb(EngagementRepository, EngagementEdgeDBRepository),
4244
EngagementLoader,
4345
...Object.values(handlers),
4446
FixNullMethodologiesMigration,

0 commit comments

Comments
 (0)