/
feature-flag.resolver.ts
110 lines (94 loc) · 3.17 KB
/
feature-flag.resolver.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import {
Arg,
Args,
Ctx,
Field,
FieldResolver,
InputType,
Mutation,
Query,
Resolver,
Root
} from 'type-graphql';
import { Inject } from 'typedi';
import { BaseContext, StandardDeleteResponse, UserId } from '../../../../src';
import {
FeatureFlagCreateInput,
FeatureFlagUpdateArgs,
FeatureFlagWhereArgs,
FeatureFlagWhereInput,
FeatureFlagWhereUniqueInput
} from '../../generated';
import { FeatureFlagSegment } from '../feature-flag-segment/feature-flag-segment.model';
import { FeatureFlagUser } from '../feature-flag-user/feature-flag-user.model';
import { Project } from '../project/project.model';
import { FeatureFlag } from './feature-flag.model';
import { FeatureFlagService } from './feature-flag.service';
@InputType()
export class FeatureFlagsForUserInput {
@Field(() => String)
projKey: string;
@Field(() => String)
envKey: string;
@Field(() => String)
userKey: string;
}
@Resolver(FeatureFlag)
export class FeatureFlagResolver {
constructor(@Inject('FeatureFlagService') readonly service: FeatureFlagService) {}
@FieldResolver(() => Project)
project(@Root() featureFlag: FeatureFlag, @Ctx() ctx: BaseContext): Promise<Project> {
return ctx.dataLoader.loaders.FeatureFlag.project.load(featureFlag);
}
@FieldResolver(() => [FeatureFlagSegment])
featureFlagSegments(
@Root() featureFlag: FeatureFlag,
@Ctx() ctx: BaseContext
): Promise<FeatureFlagSegment[]> {
return ctx.dataLoader.loaders.FeatureFlag.featureFlagSegments.load(featureFlag);
}
@FieldResolver(() => [FeatureFlagUser])
featureFlagUsers(
@Root() featureFlag: FeatureFlag,
@Ctx() ctx: BaseContext
): Promise<FeatureFlagUser[]> {
return ctx.dataLoader.loaders.FeatureFlag.featureFlagUsers.load(featureFlag);
}
@Query(() => [FeatureFlag])
async featureFlags(@Args() { where, orderBy, limit, offset }: FeatureFlagWhereArgs): Promise<
FeatureFlag[]
> {
return this.service.find<FeatureFlagWhereInput>(where, orderBy, limit, offset);
}
// Custom resolver that has it's own InputType and calls into custom service method
@Query(() => [String])
async featureFlagsForUser(@Arg('where') where: FeatureFlagsForUserInput): Promise<string[]> {
return this.service.flagsForUser(where);
}
@Query(() => FeatureFlag)
async featureFlag(@Arg('where') where: FeatureFlagWhereUniqueInput): Promise<FeatureFlag> {
return this.service.findOne<FeatureFlagWhereUniqueInput>(where);
}
@Mutation(() => FeatureFlag)
async createFeatureFlag(
@Arg('data') data: FeatureFlagCreateInput,
@UserId() userId: string
): Promise<FeatureFlag> {
return this.service.create(data, userId);
}
@Mutation(() => FeatureFlag)
async updateFeatureFlag(
@Args() { data, where }: FeatureFlagUpdateArgs,
@UserId() userId: string
): Promise<FeatureFlag> {
return this.service.update(data, where, userId);
}
@Mutation(() => StandardDeleteResponse)
async deleteFeatureFlag(
@Arg('where') where: FeatureFlagWhereUniqueInput,
@UserId() userId: string
): Promise<StandardDeleteResponse> {
// TODO: deletes across all environments. Just takes project key and flag key
return this.service.delete(where, userId);
}
}