Skip to content

Commit 3c1f89e

Browse files
committed
Normalize creator props to User relationships
1 parent 18f2dda commit 3c1f89e

File tree

8 files changed

+58
-25
lines changed

8 files changed

+58
-25
lines changed

src/components/post/dto/post.dto.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@ import { DateTime } from 'luxon';
33
import { keys as keysOf } from 'ts-transformer-keys';
44
import { BaseNode } from '~/core/database/results';
55
import { e } from '~/core/edgedb';
6-
import { RegisterResource } from '~/core/resources';
6+
import { LinkTo, RegisterResource } from '~/core/resources';
77
import {
88
DateTimeField,
9-
ID,
109
Resource,
1110
Secured,
1211
SecuredProps,
@@ -26,7 +25,7 @@ export class Post extends Resource {
2625

2726
readonly parent: BaseNode;
2827

29-
readonly creator: Secured<ID>;
28+
readonly creator: Secured<LinkTo<'User'>>;
3029

3130
@Field(() => PostType)
3231
readonly type: PostType;

src/components/post/post.repository.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export class PostRepository extends DtoRepository<typeof Post, [Session] | []>(
2424
) {
2525
async create(input: CreatePost, session: Session) {
2626
const initialProps = {
27-
creator: session.userId,
2827
type: input.type,
2928
shareability: input.shareability,
3029
body: input.body,
@@ -35,8 +34,13 @@ export class PostRepository extends DtoRepository<typeof Post, [Session] | []>(
3534
.apply(matchRequestingUser(session))
3635
.apply(await createNode(Post, { initialProps }))
3736
.apply(
38-
createRelationships(Post, 'in', {
39-
post: ['BaseNode', input.parentId],
37+
createRelationships(Post, {
38+
in: {
39+
post: ['BaseNode', input.parentId],
40+
},
41+
out: {
42+
creator: ['User', session.userId],
43+
},
4044
}),
4145
)
4246
.apply(this.hydrate())
@@ -115,10 +119,16 @@ export class PostRepository extends DtoRepository<typeof Post, [Session] | []>(
115119
relation('in', '', 'post', ACTIVE),
116120
node('parent', 'BaseNode'),
117121
])
122+
.match([
123+
node('node'),
124+
relation('out', '', 'creator', ACTIVE),
125+
node('creator', 'User'),
126+
])
118127
.apply(matchProps())
119128
.return<{ dto: DbTypeOf<Post> }>(
120129
merge('props', {
121130
parent: 'parent',
131+
creator: 'creator { .id }',
122132
}).as('dto'),
123133
);
124134
}

src/components/post/post.resolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export class PostResolver {
5555
@Parent() post: Post,
5656
@Loader(UserLoader) users: LoaderOf<UserLoader>,
5757
): Promise<SecuredUser> {
58-
return await mapSecuredValue(post.creator, (id) => users.load(id));
58+
return await mapSecuredValue(post.creator, ({ id }) => users.load(id));
5959
}
6060

6161
@Mutation(() => UpdatePostOutput, {

src/components/progress-report/media/dto/media.dto.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@ import {
99
Variant,
1010
VariantOf,
1111
} from '~/common';
12-
import { SetDbType } from '~/core';
12+
import { LinkTo, SetDbType } from '~/core';
1313
import { e } from '~/core/edgedb';
1414
import { RegisterResource } from '~/core/resources';
1515
import { FileId, Media } from '../../../file';
16-
import { User } from '../../../user';
1716
import { ProgressReport } from '../../dto';
1817
import { ProgressReportHighlight } from '../../dto/highlights.dto';
1918
import { MediaCategory } from '../media-category.enum';
@@ -53,7 +52,7 @@ export class ProgressReportMedia extends Resource {
5352
@IdField()
5453
readonly variantGroup: VariantGroup;
5554

56-
readonly creator: IdOf<User>;
55+
readonly creator: LinkTo<'User'>;
5756
}
5857

5958
export type MediaVariant = VariantOf<typeof ProgressReportMedia>;

src/components/progress-report/media/progress-report-media.repository.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
import { DbTypeOf, DtoRepository } from '~/core';
1313
import {
1414
ACTIVE,
15-
apoc,
1615
createNode,
1716
createRelationships,
1817
filter,
@@ -169,10 +168,14 @@ export class ProgressReportMediaRepository extends DtoRepository<
169168
baseNodeProps: {
170169
variant: input.variant.key,
171170
category: input.category,
172-
creator: session.userId,
173171
},
174172
}),
175173
)
174+
.apply(
175+
createRelationships(this.resource, 'out', {
176+
creator: ['User', session.userId],
177+
}),
178+
)
176179
.apply(
177180
createRelationships(this.resource, 'in', {
178181
child: variable('variantGroup'),
@@ -184,7 +187,10 @@ export class ProgressReportMediaRepository extends DtoRepository<
184187
}),
185188
)
186189
.return<{ dto: Omit<DbTypeOf<ReportMedia>, 'media' | 'file'> }>(
187-
apoc.convert.toMap('node').as('dto'),
190+
merge('node', {
191+
report: 'report.id',
192+
creator: 'creator { .id }',
193+
}).as('dto'),
188194
);
189195
const results = await query.first();
190196
if (results) {
@@ -262,6 +268,11 @@ export class ProgressReportMediaRepository extends DtoRepository<
262268
relation('out', '', 'fileNode', ACTIVE),
263269
node('file', 'File'),
264270
],
271+
[
272+
node('node'),
273+
relation('out', '', 'creator', ACTIVE),
274+
node('creator', 'User'),
275+
],
265276
])
266277
.subQuery('file', (sub) =>
267278
sub
@@ -282,6 +293,7 @@ export class ProgressReportMediaRepository extends DtoRepository<
282293
variantGroup: 'variantGroup.id',
283294
file: 'file.id',
284295
media: 'media.id',
296+
creator: 'creator { .id }',
285297
sensitivity: 'sensitivity',
286298
scope: 'scope',
287299
}).as('dto'),

src/components/prompts/dto/prompt-response.dto.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ import {
1818
UnsecuredDto,
1919
Variant,
2020
} from '~/common';
21-
import { LinkToUnknown } from '~/core';
21+
import { LinkTo, LinkToUnknown } from '~/core';
2222
import { BaseNode } from '~/core/database/results';
23-
import { User } from '../../user';
2423
import { Prompt, SecuredPrompt } from './prompt.dto';
2524

2625
@ObjectType()
@@ -46,7 +45,7 @@ export abstract class VariantResponse<Key extends string = string> {
4645
@Field()
4746
readonly response: SecuredRichTextNullable;
4847

49-
readonly creator: Secured<IdOf<User>>;
48+
readonly creator: Secured<LinkTo<'User'>>;
5049

5150
@Field(() => DateTime, { nullable: true })
5251
readonly modifiedAt?: DateTime;
@@ -65,7 +64,7 @@ export class PromptVariantResponse<
6564
responses: [VariantResponse],
6665
} satisfies ResourceRelationsShape;
6766

68-
readonly creator: Secured<IdOf<User>>;
67+
readonly creator: Secured<LinkTo<'User'>>;
6968

7069
readonly parent: BaseNode;
7170

src/components/prompts/prompt-variant-response.repository.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ export const PromptVariantResponseRepository = <
101101
relation('out', undefined, 'child'),
102102
node('node'),
103103
])
104+
.match([
105+
node('parent'),
106+
relation('out', undefined, 'creator'),
107+
node('creator', 'User'),
108+
])
104109
.match([
105110
node('node'),
106111
relation('out', undefined, 'prompt'),
@@ -124,6 +129,7 @@ export const PromptVariantResponseRepository = <
124129
.return<{ dto: DbTypeOf<InstanceType<TResourceStatic>> }>(
125130
merge('node', {
126131
parent: 'parent',
132+
creator: 'creator { .id }',
127133
prompt: 'prompt.value',
128134
responses: 'responses',
129135
}).as('dto'),
@@ -145,7 +151,6 @@ export const PromptVariantResponseRepository = <
145151
.apply(
146152
await createNode(resource, {
147153
baseNodeProps: {
148-
creator: session.userId,
149154
createdAt,
150155
modifiedAt: createdAt,
151156
},
@@ -155,8 +160,13 @@ export const PromptVariantResponseRepository = <
155160
}),
156161
)
157162
.apply(
158-
createRelationships(resource, 'in', {
159-
child: ['BaseNode', input.resource],
163+
createRelationships(resource, {
164+
in: {
165+
child: ['BaseNode', input.resource],
166+
},
167+
out: {
168+
creator: ['User', session.userId],
169+
},
160170
}),
161171
)
162172
.apply(this.hydrate(session))
@@ -176,7 +186,6 @@ export const PromptVariantResponseRepository = <
176186
baseNodeProps: {
177187
variant: input.variant,
178188
response: variable(responseVar.toString()),
179-
creator: session.userId,
180189
},
181190
});
182191
await query
@@ -210,8 +219,13 @@ export const PromptVariantResponseRepository = <
210219
.comment('create new response for variant')
211220
.apply(newResponse)
212221
.apply(
213-
createRelationships(resource, 'in', {
214-
child: variable('parent'),
222+
createRelationships(resource, {
223+
in: {
224+
child: variable('parent'),
225+
},
226+
out: {
227+
creator: ['User', session.userId],
228+
},
215229
}),
216230
)
217231
.return('count(node) as updatedResponseCount'),

src/components/prompts/prompt-variant-response.resolver.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export class PromptVariantResponseResolver {
2828
@Parent() response: PromptVariantResponse,
2929
@Loader(UserLoader) users: LoaderOf<UserLoader>,
3030
) {
31-
return await mapSecuredValue(response.creator, users.load.bind(users));
31+
return await mapSecuredValue(response.creator, ({ id }) => users.load(id));
3232
}
3333
}
3434

@@ -39,6 +39,6 @@ export class VariantResponseResolver {
3939
@Parent() response: VariantResponse,
4040
@Loader(UserLoader) users: LoaderOf<UserLoader>,
4141
) {
42-
return await mapSecuredValue(response.creator, users.load.bind(users));
42+
return await mapSecuredValue(response.creator, ({ id }) => users.load(id));
4343
}
4444
}

0 commit comments

Comments
 (0)