Skip to content

Commit 1875b0e

Browse files
authored
Merge pull request #2883 from SeedCompany/progress-report/media
Progress Report Media
2 parents d70fd6a + f435599 commit 1875b0e

31 files changed

+1391
-30
lines changed

src/common/variant.dto.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,29 @@ export type VariantOf<TResourceStatic extends ResourceShape<any>> =
7272
*/
7373
export const VariantInputField = <
7474
Res extends ResourceShape<any> & { Variants: readonly Variant[] },
75+
Many extends undefined | true = undefined,
7576
>(
7677
resource: Res,
7778
options: Omit<FieldOptions, 'defaultValue'> & {
78-
defaultValue?: Variant<VariantOf<Res>> | VariantOf<Res>;
79+
many?: Many;
80+
defaultValue?: Many extends true
81+
? ReadonlyArray<Variant<VariantOf<Res>> | VariantOf<Res>>
82+
: Variant<VariantOf<Res>> | VariantOf<Res>;
7983
} = {},
8084
) => {
81-
const { defaultValue, ...rest } = options;
85+
const { many, defaultValue, ...rest } = options;
8286

8387
// Resolve default to variant object
84-
const defaultVariant =
85-
typeof defaultValue === 'string'
86-
? resource.Variants.find((v) => v.key === options.defaultValue)
87-
: defaultValue;
88+
const resolveVariant = (value: Variant<VariantOf<Res>> | VariantOf<Res>) =>
89+
typeof value === 'string'
90+
? resource.Variants.find((v) => v.key === value)
91+
: value;
92+
const defaultVariant = many
93+
? (defaultValue as any[])?.map(resolveVariant)
94+
: resolveVariant(defaultValue as VariantOf<Res>);
8895

8996
return applyDecorators(
90-
Field(() => IDType, {
97+
Field(() => (many ? [IDType] : IDType), {
9198
// Don't put default value in schema as we are trying to keep specific
9299
// values out of schema, so they can be more dynamic.
93100
nullable: !!defaultValue,
@@ -97,11 +104,15 @@ export const VariantInputField = <
97104
if (value == null) {
98105
return defaultVariant;
99106
}
100-
return resource.Variants.find((v) => v.key === value) ?? value;
107+
if (many && Array.isArray(value)) {
108+
return value.map(resolveVariant);
109+
}
110+
return resolveVariant(value);
101111
}),
102112
IsIn(resource.Variants, {
103113
message: ({ value }) =>
104114
`Variant with key "${String(value)}" was not found`,
115+
each: many,
105116
}),
106117
);
107118
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import { owner, Policy } from '../util';
2+
3+
@Policy('all', (r) => r.ProgressReportMedia.when(owner).edit.delete)
4+
export class ProgressReportMediaOwnerPolicy {}

src/components/authorization/policies/by-role/consultant-manager.policy.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import { member, Policy, Role, sensMediumOrLower, sensOnlyLow } from '../util';
4646
r.ProgressReportCommunityStory,
4747
r.ProgressReportHighlight,
4848
r.ProgressReportTeamNews,
49+
r.ProgressReportMedia,
4950
r.ProgressReportVarianceExplanation,
5051
r.StepProgress,
5152
].map((it) => it.whenAny(member, sensMediumOrLower).read),

src/components/authorization/policies/by-role/consultant.policy.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { member, Policy, Role } from '../util';
1717
r.ProgressReportCommunityStory,
1818
r.ProgressReportHighlight,
1919
r.ProgressReportTeamNews,
20+
r.ProgressReportMedia,
2021
r.ProgressReportVarianceExplanation,
2122
r.StepProgress,
2223
].map((it) => it.when(member).read),

src/components/authorization/policies/by-role/field-partner.policy.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { member, Policy, Role, variant } from '../util';
2424
p.responses.whenAll(member, variant('draft')).edit,
2525
]),
2626
]),
27+
r.ProgressReportMedia.whenAll(member, variant('draft')).create.edit,
2728
r.ProgressReportWorkflowEvent.transitions(
2829
'Start',
2930
'In Progress -> In Review',

src/components/authorization/policies/by-role/marketing.policy.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
p.responses.read.when(variant('published')).edit,
2828
]),
2929
]),
30+
r.ProgressReportMedia.read.when(variant('published')).create.edit,
3031
r.ProgressReportVarianceExplanation.read.specifically((p) => p.comments.none),
3132
r.ProgressReportWorkflowEvent.read.transitions('Publish').execute,
3233
r.Project.read

src/components/authorization/policies/by-role/project-manager.policy.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ import {
6565
p.responses.whenAll(member, variant('draft', 'translated', 'fpm')).edit,
6666
]),
6767
]),
68+
[r.ProgressReportMedia].flatMap((it) => [
69+
it.whenAll(sensOnlyLow, variant('fpm', 'published')).read,
70+
it.when(member).read,
71+
it.whenAll(member, variant('draft', 'translated', 'fpm')).create.edit,
72+
]),
6873
r.ProgressReportVarianceExplanation.edit,
6974
r.ProgressReportWorkflowEvent.read.transitions(
7075
'Start',

src/components/authorization/policies/by-role/translator.policy.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ import { member, Policy, Role, variant } from '../util';
2929
p.responses.whenAll(member, variant('translated')).edit,
3030
]),
3131
]),
32+
[r.ProgressReportMedia].flatMap((it) => [
33+
it.when(member).read,
34+
it.whenAll(member, variant('translated')).create.edit,
35+
]),
3236
r.ProgressReportWorkflowEvent.transitions(
3337
'Translation Done',
3438
'Translation Reject',

src/components/authorization/policies/conditions/variant.condition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class VariantCondition<TResourceStatic extends ResourceShape<any>>
3333

3434
asCypherCondition(query: Query, _other: AsCypherParams<TResourceStatic>) {
3535
const variants = query.params.addParam([...this.variants], 'variants');
36-
return `node.variant = ${String(variants)}`; // TODO hand waving
36+
return `node.variant = ${String(variants)}`;
3737
}
3838

3939
union(this: void, conditions: this[]) {

src/components/authorization/policies/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export * from './by-role/staff-member.policy';
1919
export * from './by-role/translator.policy';
2020

2121
export * from './by-feature/engagements-create-delete.policy';
22+
export * from './by-feature/progress-report-media-owner.policy';
2223
export * from './by-feature/project-change-requests-beta.policy';
2324
export * from './by-feature/read-util-objects.policy';
2425
export * from './by-feature/user-can-edit-self.policy';

0 commit comments

Comments
 (0)