Skip to content

Commit 37eb5b8

Browse files
committed
Make update properties/relations implementation details of repos
1 parent cea7dc0 commit 37eb5b8

File tree

53 files changed

+536
-409
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+536
-409
lines changed

src/components/authorization/policy/executor/user-resource-privileges.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
UnauthorizedException,
1414
UnsecuredDto,
1515
} from '~/common';
16-
import { ChangesOf, isRelation } from '~/core/database/changes';
16+
import { AnyChangesOf, isRelation } from '~/core/database/changes';
1717
import {
1818
AnyAction,
1919
ChildListAction,
@@ -169,7 +169,7 @@ export class UserResourcePrivileges<
169169
* Verifies the current user can make the changes specified to the given object.
170170
*/
171171
verifyChanges(
172-
changes: ChangesOf<TResourceStatic['prototype']>,
172+
changes: AnyChangesOf<TResourceStatic['prototype']>,
173173
{
174174
pathPrefix: pathPrefixProp,
175175
}: {

src/components/budget/budget-record.repository.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable } from '@nestjs/common';
22
import { node, Query, relation } from 'cypher-query-builder';
3+
import { ChangesOf } from '~/core/database/changes';
34
import {
45
ID,
56
labelForView,
@@ -21,7 +22,13 @@ import {
2122
paginate,
2223
sorting,
2324
} from '../../core/database/query';
24-
import { BudgetRecord, BudgetRecordListInput, CreateBudgetRecord } from './dto';
25+
import {
26+
Budget,
27+
BudgetRecord,
28+
BudgetRecordListInput,
29+
CreateBudgetRecord,
30+
UpdateBudgetRecord,
31+
} from './dto';
2532

2633
interface BudgetRecordHydrateArgs {
2734
recordVar?: string;
@@ -66,6 +73,14 @@ export class BudgetRecordRepository extends DtoRepository<
6673
return result.id;
6774
}
6875

76+
async update(
77+
existing: BudgetRecord,
78+
changes: ChangesOf<Budget, UpdateBudgetRecord>,
79+
changeset?: ID,
80+
) {
81+
return await this.updateProperties(existing, changes, changeset);
82+
}
83+
6984
async doesRecordExist(input: CreateBudgetRecord) {
7085
const result = await this.db
7186
.query()

src/components/budget/budget.repository.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Injectable } from '@nestjs/common';
22
import { inArray, node, Query, relation } from 'cypher-query-builder';
33
import { pickBy } from 'lodash';
4+
import { ChangesOf } from '~/core/database/changes';
45
import {
56
ID,
67
labelForView,
@@ -34,6 +35,7 @@ import {
3435
BudgetRecord,
3536
CreateBudget,
3637
BudgetStatus as Status,
38+
UpdateBudget,
3739
} from './dto';
3840

3941
@Injectable()
@@ -88,6 +90,16 @@ export class BudgetRepository extends DtoRepository<
8890
return result.id;
8991
}
9092

93+
async update(
94+
existing: Budget,
95+
simpleChanges: Omit<
96+
ChangesOf<Budget, UpdateBudget>,
97+
'universalTemplateFile'
98+
>,
99+
) {
100+
return await this.updateProperties(existing, simpleChanges);
101+
}
102+
91103
async readMany(ids: readonly ID[], session: Session, view?: ObjectView) {
92104
const label = labelForView('Budget', view);
93105
return await this.db

src/components/budget/budget.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ export class BudgetService {
228228
universalTemplateFile,
229229
session,
230230
);
231-
return await this.budgetRepo.updateProperties(budget, simpleChanges);
231+
return await this.budgetRepo.update(budget, simpleChanges);
232232
}
233233

234234
async updateRecord(
@@ -249,7 +249,7 @@ export class BudgetService {
249249
this.privileges.for(session, BudgetRecord, br).verifyChanges(changes);
250250

251251
try {
252-
const result = await this.budgetRecordsRepo.updateProperties(
252+
const result = await this.budgetRecordsRepo.update(
253253
br,
254254
changes,
255255
changeset,

src/components/ceremony/ceremony.repository.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable } from '@nestjs/common';
22
import { node, Query, relation } from 'cypher-query-builder';
3+
import { ChangesOf } from '~/core/database/changes';
34
import { ID, Session, UnsecuredDto } from '../../common';
45
import { DtoRepository } from '../../core';
56
import {
@@ -12,7 +13,12 @@ import {
1213
requestingUser,
1314
sorting,
1415
} from '../../core/database/query';
15-
import { Ceremony, CeremonyListInput, CreateCeremony } from './dto';
16+
import {
17+
Ceremony,
18+
CeremonyListInput,
19+
CreateCeremony,
20+
UpdateCeremony,
21+
} from './dto';
1622

1723
@Injectable()
1824
export class CeremonyRepository extends DtoRepository<
@@ -35,6 +41,13 @@ export class CeremonyRepository extends DtoRepository<
3541
.first();
3642
}
3743

44+
async update(
45+
existing: Ceremony,
46+
changes: ChangesOf<Ceremony, UpdateCeremony>,
47+
) {
48+
return await this.updateProperties(existing, changes);
49+
}
50+
3851
protected hydrate(session: Session) {
3952
return (query: Query) =>
4053
query

src/components/ceremony/ceremony.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export class CeremonyService {
7777
const object = await this.readOne(input.id, session);
7878
const changes = this.ceremonyRepo.getActualChanges(object, input);
7979
this.privileges.for(session, Ceremony, object).verifyChanges(changes);
80-
return await this.ceremonyRepo.updateProperties(object, changes);
80+
return await this.ceremonyRepo.update(object, changes);
8181
}
8282

8383
async delete(id: ID, session: Session): Promise<void> {

src/components/comments/comment.repository.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { forwardRef, Inject, Injectable } from '@nestjs/common';
22
import { node, Query, relation } from 'cypher-query-builder';
33
import { DateTime } from 'luxon';
4+
import { ChangesOf } from '~/core/database/changes';
45
import { ID, Session, UnsecuredDto } from '../../common';
56
import { DatabaseService, DtoRepository } from '../../core';
67
import {
@@ -15,7 +16,12 @@ import {
1516
variable,
1617
} from '../../core/database/query';
1718
import { CommentThreadRepository } from './comment-thread.repository';
18-
import { Comment, CommentListInput, CreateCommentInput } from './dto';
19+
import {
20+
Comment,
21+
CommentListInput,
22+
CreateCommentInput,
23+
UpdateCommentInput,
24+
} from './dto';
1925

2026
@Injectable()
2127
export class CommentRepository extends DtoRepository(Comment) {
@@ -56,6 +62,13 @@ export class CommentRepository extends DtoRepository(Comment) {
5662
.first();
5763
}
5864

65+
async update(
66+
existing: UnsecuredDto<Comment>,
67+
changes: ChangesOf<Comment, UpdateCommentInput>,
68+
) {
69+
await this.updateProperties(existing, changes);
70+
}
71+
5972
override hydrate() {
6073
return (query: Query) =>
6174
query

src/components/comments/comment.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ export class CommentService {
136136

137137
const changes = this.repo.getActualChanges(object, input);
138138
this.privileges.for(session, Comment, object).verifyChanges(changes);
139-
await this.repo.updateProperties(object, changes);
139+
await this.repo.update(object, changes);
140140

141141
return await this.readOne(input.id, session);
142142
}

src/components/engagement/engagement.repository.ts

Lines changed: 35 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import {
1717
viewOfChangeset,
1818
} from '../../common';
1919
import { CommonRepository, DatabaseService, OnIndex } from '../../core';
20-
import { DbChanges, getChanges } from '../../core/database/changes';
20+
import { ChangesOf, getChanges } from '../../core/database/changes';
2121
import {
2222
ACTIVE,
2323
coalesce,
@@ -45,6 +45,8 @@ import {
4545
IEngagement,
4646
InternshipEngagement,
4747
LanguageEngagement,
48+
UpdateInternshipEngagement,
49+
UpdateLanguageEngagement,
4850
} from './dto';
4951

5052
export type LanguageOrEngagementId = MergeExclusive<
@@ -261,100 +263,52 @@ export class EngagementRepository extends CommonRepository {
261263

262264
getActualLanguageChanges = getChanges(LanguageEngagement);
263265

264-
async updateLanguageProperties(
265-
object: LanguageEngagement | UnsecuredDto<LanguageEngagement>,
266-
changes: DbChanges<LanguageEngagement>,
266+
async updateLanguage(
267+
existing: LanguageEngagement | UnsecuredDto<LanguageEngagement>,
268+
changes: ChangesOf<LanguageEngagement, UpdateLanguageEngagement>,
267269
changeset?: ID,
268270
): Promise<void> {
271+
const { pnp, ...simpleChanges } = changes;
272+
269273
await this.db.updateProperties({
270274
type: LanguageEngagement,
271-
object,
272-
changes,
275+
object: existing,
276+
changes: simpleChanges,
273277
changeset,
274278
});
275279
}
276280

277281
getActualInternshipChanges = getChanges(InternshipEngagement);
278282

279-
async updateMentor(id: ID, mentorId: ID) {
280-
await this.db
281-
.query()
282-
.match([node('newMentorUser', 'User', { id: mentorId })])
283-
.match([
284-
node('internshipEngagement', 'InternshipEngagement', {
285-
id,
286-
}),
287-
])
288-
.optionalMatch([
289-
node('internshipEngagement'),
290-
relation('out', 'rel', 'mentor', ACTIVE),
291-
node('oldMentorUser', 'User'),
292-
])
293-
.set({
294-
values: {
295-
rel: {
296-
active: false,
297-
},
298-
},
299-
})
300-
.create([
301-
node('internshipEngagement'),
302-
relation('out', '', 'mentor', {
303-
active: true,
304-
createdAt: DateTime.local(),
305-
}),
306-
node('newMentorUser'),
307-
])
308-
.return('internshipEngagement.id as id')
309-
.run();
310-
}
311-
312-
async updateCountryOfOrigin(id: ID, countryOfOriginId: ID) {
313-
await this.db
314-
.query()
315-
.match([
316-
node('newCountry', 'Location', {
317-
id: countryOfOriginId,
318-
}),
319-
])
320-
.match([
321-
node('internshipEngagement', 'InternshipEngagement', {
322-
id,
323-
}),
324-
])
325-
.optionalMatch([
326-
node('internshipEngagement'),
327-
relation('out', 'rel', 'countryOfOrigin', ACTIVE),
328-
node('oldCountry', 'Location'),
329-
])
330-
.set({
331-
values: {
332-
rel: {
333-
active: false,
334-
},
335-
},
336-
})
337-
.create([
338-
node('internshipEngagement'),
339-
relation('out', '', 'countryOfOrigin', {
340-
active: true,
341-
createdAt: DateTime.local(),
342-
}),
343-
node('newCountry'),
344-
])
345-
.return('internshipEngagement.id as id')
346-
.run();
347-
}
348-
349-
async updateInternshipProperties(
350-
object: InternshipEngagement | UnsecuredDto<InternshipEngagement>,
351-
changes: DbChanges<InternshipEngagement>,
283+
async updateInternship(
284+
existing: InternshipEngagement | UnsecuredDto<InternshipEngagement>,
285+
changes: ChangesOf<InternshipEngagement, UpdateInternshipEngagement>,
352286
changeset?: ID,
353287
): Promise<void> {
288+
const {
289+
mentorId,
290+
countryOfOriginId,
291+
growthPlan: _,
292+
...simpleChanges
293+
} = changes;
294+
295+
if (mentorId !== undefined) {
296+
await this.updateRelation('mentor', 'User', existing.id, mentorId);
297+
}
298+
299+
if (countryOfOriginId !== undefined) {
300+
await this.updateRelation(
301+
'countryOfOrigin',
302+
'Location',
303+
existing.id,
304+
countryOfOriginId,
305+
);
306+
}
307+
354308
await this.db.updateProperties({
355309
type: InternshipEngagement,
356-
object,
357-
changes,
310+
object: existing,
311+
changes: simpleChanges,
358312
changeset,
359313
});
360314
}

0 commit comments

Comments
 (0)