Skip to content

Commit ed0940f

Browse files
committed
Change ProjectFilters.mine/isMember to mean _active_ membership
1 parent 2093388 commit ed0940f

File tree

3 files changed

+33
-26
lines changed

3 files changed

+33
-26
lines changed

src/components/project/dto/list-projects.dto.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { InputType, ObjectType } from '@nestjs/graphql';
22
import { Type } from 'class-transformer';
33
import { ValidateNested } from 'class-validator';
4+
import { set } from 'lodash';
45
import {
56
DateFilter,
67
DateTimeFilter,
@@ -14,6 +15,7 @@ import {
1415
type Sensitivity,
1516
SortablePaginationInput,
1617
} from '~/common';
18+
import { Transform } from '~/common/transform.decorator';
1719
import { LocationFilters } from '../../location/dto';
1820
import { PartnershipFilters } from '../../partnership/dto';
1921
import { ProjectMemberFilters } from '../project-member/dto';
@@ -88,21 +90,17 @@ export abstract class ProjectFilters {
8890
@ValidateNested()
8991
readonly mouEnd?: DateFilter;
9092

91-
@OptionalField({
92-
description: 'only mine',
93-
deprecationReason: 'Use `isMember` instead.',
94-
})
95-
readonly mine?: boolean;
96-
97-
@OptionalField({
98-
description: 'Only projects that the requesting user is a member of',
99-
})
100-
readonly isMember?: boolean;
101-
10293
@FilterField(() => ProjectMemberFilters, {
10394
description:
10495
"Only projects with the requesting user's membership that matches these filters",
10596
})
97+
@Transform(({ value, obj }) => {
98+
// Only ran when GQL specifies membership
99+
if (value.active == null && (obj.mine || obj.isMember)) {
100+
value.active = true;
101+
}
102+
return value;
103+
})
106104
readonly membership?: ProjectMemberFilters & {};
107105

108106
@FilterField(() => ProjectMemberFilters, {
@@ -138,6 +136,28 @@ export abstract class ProjectFilters {
138136
readonly primaryLocation?: LocationFilters & {};
139137
}
140138

139+
Object.defineProperty(ProjectFilters.prototype, 'mine', {
140+
set(value: boolean) {
141+
// Ensure this is set when membership has not been declared
142+
value && !this.membership && set(this, 'membership.active', true);
143+
},
144+
});
145+
OptionalField(() => Boolean, {
146+
description: 'only mine',
147+
deprecationReason: 'Use `isMember` instead.',
148+
})(ProjectFilters.prototype, 'mine');
149+
150+
Object.defineProperty(ProjectFilters.prototype, 'isMember', {
151+
set(value: boolean) {
152+
// Ensure this is set when membership has not been declared
153+
value && !this.membership && set(this, 'membership.active', true);
154+
},
155+
});
156+
OptionalField(() => Boolean, {
157+
description:
158+
'Only projects that the requesting user is an active member of. false does nothing.',
159+
})(ProjectFilters.prototype, 'isMember');
160+
141161
@InputType()
142162
export class ProjectListInput extends SortablePaginationInput<keyof IProject>({
143163
defaultSort: 'name',

src/components/project/project-filters.query.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,6 @@ export const projectFilters = filter.define(() => ProjectFilters, {
3030
modifiedAt: filter.dateTimeProp(),
3131
mouStart: filter.dateTimeProp(),
3232
mouEnd: filter.dateTimeProp(),
33-
mine: filter.pathExistsWhenTrue([
34-
currentUser,
35-
relation('in', '', 'user'),
36-
node('', 'ProjectMember'),
37-
relation('in', '', 'member', ACTIVE),
38-
node('node'),
39-
]),
4033
languageId: filter.pathExists((id) => [
4134
node('node'),
4235
relation('out', '', 'engagement', ACTIVE),
@@ -51,13 +44,6 @@ export const projectFilters = filter.define(() => ProjectFilters, {
5144
relation('out', '', 'partner', ACTIVE),
5245
node('', 'Partner', { id }),
5346
]),
54-
isMember: filter.pathExistsWhenTrue([
55-
currentUser,
56-
relation('in', '', 'user'),
57-
node('', 'ProjectMember'),
58-
relation('in', '', 'member', ACTIVE),
59-
node('node'),
60-
]),
6147
membership: filter.sub(() => projectMemberFilters)((sub) =>
6248
sub.match([
6349
currentUser,

src/components/project/project.gel.repository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ export class ProjectGelRepository
172172
e.op(project.modifiedAt, '<=', input.modifiedAt.beforeInclusive),
173173
]
174174
: []),
175-
input.isMember != null && e.op(project.isMember, '=', input.isMember),
175+
input.membership != null && e.op('exists', project.membership),
176+
input.membership?.active && e.op(project.membership.active, '?=', true),
176177
input.pinned != null && e.op(project.pinned, '=', input.pinned),
177178
input.languageId &&
178179
e.op(

0 commit comments

Comments
 (0)