Skip to content

Commit a4c4519

Browse files
committed
add featureFlags JSONB column to database, added to the MyUser type (as json string) and updated via new mutation changeFeatureFlag
1 parent df69b6d commit a4c4519

File tree

8 files changed

+72
-22
lines changed

8 files changed

+72
-22
lines changed

cdk/lib/__snapshots__/stack.test.ts.snap

+44-21
Original file line numberDiff line numberDiff line change
@@ -2475,6 +2475,7 @@ type Mutation {
24752475
addManuallyOpenedPinboardIds(pinboardId: String!, maybeEmailOverride: String): MyUser
24762476
removeManuallyOpenedPinboardIds(pinboardIdToClose: String!): MyUser
24772477
visitTourStep(tourStepId: String!): MyUser
2478+
changeFeatureFlag(flagId: String!, newValue: Boolean!): MyUser
24782479
}
24792480
24802481
type Subscription {
@@ -2539,6 +2540,7 @@ type MyUser {
25392540
hasWebPushSubscription: Boolean
25402541
manuallyOpenedPinboardIds: [String!]
25412542
hasEverUsedTour: Boolean!
2543+
featureFlags: AWSJSON
25422544
}
25432545
25442546
type Group {
@@ -2669,7 +2671,28 @@ type PinboardIdWithItemCounts {
26692671
"DataSourceName": "database_bridge_lambda_ds",
26702672
"FieldName": "addManuallyOpenedPinboardIds",
26712673
"Kind": "UNIT",
2672-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2674+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
2675+
$util.toJson($ctx.result)",
2676+
"TypeName": "Mutation",
2677+
},
2678+
"Type": "AWS::AppSync::Resolver",
2679+
},
2680+
"pinboardappsyncapidatabasebridgelambdadsMutationchangeFeatureFlagResolver77AF20F3": Object {
2681+
"DependsOn": Array [
2682+
"pinboardappsyncapidatabasebridgelambdads970CB9A7",
2683+
"pinboardappsyncapiSchema868D9F5B",
2684+
],
2685+
"Properties": Object {
2686+
"ApiId": Object {
2687+
"Fn::GetAtt": Array [
2688+
"pinboardappsyncapi9D519400",
2689+
"ApiId",
2690+
],
2691+
},
2692+
"DataSourceName": "database_bridge_lambda_ds",
2693+
"FieldName": "changeFeatureFlag",
2694+
"Kind": "UNIT",
2695+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
26732696
$util.toJson($ctx.result)",
26742697
"TypeName": "Mutation",
26752698
},
@@ -2690,7 +2713,7 @@ $util.toJson($ctx.result)",
26902713
"DataSourceName": "database_bridge_lambda_ds",
26912714
"FieldName": "claimItem",
26922715
"Kind": "UNIT",
2693-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2716+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
26942717
$util.toJson($ctx.result)",
26952718
"TypeName": "Mutation",
26962719
},
@@ -2711,7 +2734,7 @@ $util.toJson($ctx.result)",
27112734
"DataSourceName": "database_bridge_lambda_ds",
27122735
"FieldName": "createItem",
27132736
"Kind": "UNIT",
2714-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2737+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
27152738
$util.toJson($ctx.result)",
27162739
"TypeName": "Mutation",
27172740
},
@@ -2732,7 +2755,7 @@ $util.toJson($ctx.result)",
27322755
"DataSourceName": "database_bridge_lambda_ds",
27332756
"FieldName": "deleteItem",
27342757
"Kind": "UNIT",
2735-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2758+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
27362759
$util.toJson($ctx.result)",
27372760
"TypeName": "Mutation",
27382761
},
@@ -2753,7 +2776,7 @@ $util.toJson($ctx.result)",
27532776
"DataSourceName": "database_bridge_lambda_ds",
27542777
"FieldName": "editItem",
27552778
"Kind": "UNIT",
2756-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2779+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
27572780
$util.toJson($ctx.result)",
27582781
"TypeName": "Mutation",
27592782
},
@@ -2774,7 +2797,7 @@ $util.toJson($ctx.result)",
27742797
"DataSourceName": "database_bridge_lambda_ds",
27752798
"FieldName": "removeManuallyOpenedPinboardIds",
27762799
"Kind": "UNIT",
2777-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2800+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
27782801
$util.toJson($ctx.result)",
27792802
"TypeName": "Mutation",
27802803
},
@@ -2795,7 +2818,7 @@ $util.toJson($ctx.result)",
27952818
"DataSourceName": "database_bridge_lambda_ds",
27962819
"FieldName": "seenItem",
27972820
"Kind": "UNIT",
2798-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2821+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
27992822
$util.toJson($ctx.result)",
28002823
"TypeName": "Mutation",
28012824
},
@@ -2816,7 +2839,7 @@ $util.toJson($ctx.result)",
28162839
"DataSourceName": "database_bridge_lambda_ds",
28172840
"FieldName": "setWebPushSubscriptionForUser",
28182841
"Kind": "UNIT",
2819-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2842+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
28202843
$util.toJson($ctx.result)",
28212844
"TypeName": "Mutation",
28222845
},
@@ -2837,7 +2860,7 @@ $util.toJson($ctx.result)",
28372860
"DataSourceName": "database_bridge_lambda_ds",
28382861
"FieldName": "visitTourStep",
28392862
"Kind": "UNIT",
2840-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2863+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
28412864
$util.toJson($ctx.result)",
28422865
"TypeName": "Mutation",
28432866
},
@@ -2858,7 +2881,7 @@ $util.toJson($ctx.result)",
28582881
"DataSourceName": "database_bridge_lambda_ds",
28592882
"FieldName": "getGroupPinboardIds",
28602883
"Kind": "UNIT",
2861-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2884+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
28622885
$util.toJson($ctx.result)",
28632886
"TypeName": "Query",
28642887
},
@@ -2879,7 +2902,7 @@ $util.toJson($ctx.result)",
28792902
"DataSourceName": "database_bridge_lambda_ds",
28802903
"FieldName": "getItemCounts",
28812904
"Kind": "UNIT",
2882-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2905+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
28832906
$util.toJson($ctx.result)",
28842907
"TypeName": "Query",
28852908
},
@@ -2900,7 +2923,7 @@ $util.toJson($ctx.result)",
29002923
"DataSourceName": "database_bridge_lambda_ds",
29012924
"FieldName": "getMyUser",
29022925
"Kind": "UNIT",
2903-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2926+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
29042927
$util.toJson($ctx.result)",
29052928
"TypeName": "Query",
29062929
},
@@ -2921,7 +2944,7 @@ $util.toJson($ctx.result)",
29212944
"DataSourceName": "database_bridge_lambda_ds",
29222945
"FieldName": "getUsers",
29232946
"Kind": "UNIT",
2924-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2947+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
29252948
$util.toJson($ctx.result)",
29262949
"TypeName": "Query",
29272950
},
@@ -2942,7 +2965,7 @@ $util.toJson($ctx.result)",
29422965
"DataSourceName": "database_bridge_lambda_ds",
29432966
"FieldName": "listItems",
29442967
"Kind": "UNIT",
2945-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2968+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
29462969
$util.toJson($ctx.result)",
29472970
"TypeName": "Query",
29482971
},
@@ -2963,7 +2986,7 @@ $util.toJson($ctx.result)",
29632986
"DataSourceName": "database_bridge_lambda_ds",
29642987
"FieldName": "listLastItemSeenByUsers",
29652988
"Kind": "UNIT",
2966-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2989+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
29672990
$util.toJson($ctx.result)",
29682991
"TypeName": "Query",
29692992
},
@@ -2984,7 +3007,7 @@ $util.toJson($ctx.result)",
29843007
"DataSourceName": "database_bridge_lambda_ds",
29853008
"FieldName": "searchMentionableUsers",
29863009
"Kind": "UNIT",
2987-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3010+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
29883011
$util.toJson($ctx.result)",
29893012
"TypeName": "Query",
29903013
},
@@ -3113,7 +3136,7 @@ $util.toJson($ctx.result)",
31133136
"DataSourceName": "grid_bridge_lambda_ds",
31143137
"FieldName": "asGridPayload",
31153138
"Kind": "UNIT",
3116-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3139+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
31173140
$util.toJson($ctx.result)",
31183141
"TypeName": "Query",
31193142
},
@@ -3134,7 +3157,7 @@ $util.toJson($ctx.result)",
31343157
"DataSourceName": "grid_bridge_lambda_ds",
31353158
"FieldName": "getGridSearchSummary",
31363159
"Kind": "UNIT",
3137-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3160+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
31383161
$util.toJson($ctx.result)",
31393162
"TypeName": "Query",
31403163
},
@@ -3263,7 +3286,7 @@ $util.toJson($ctx.result)",
32633286
"DataSourceName": "workflow_bridge_lambda_ds",
32643287
"FieldName": "getPinboardByComposerId",
32653288
"Kind": "UNIT",
3266-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3289+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
32673290
$util.toJson($ctx.result)",
32683291
"TypeName": "Query",
32693292
},
@@ -3284,7 +3307,7 @@ $util.toJson($ctx.result)",
32843307
"DataSourceName": "workflow_bridge_lambda_ds",
32853308
"FieldName": "getPinboardsByIds",
32863309
"Kind": "UNIT",
3287-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3310+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
32883311
$util.toJson($ctx.result)",
32893312
"TypeName": "Query",
32903313
},
@@ -3305,7 +3328,7 @@ $util.toJson($ctx.result)",
33053328
"DataSourceName": "workflow_bridge_lambda_ds",
33063329
"FieldName": "listPinboards",
33073330
"Kind": "UNIT",
3308-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3331+
"ResponseMappingTemplate": "## schema checksum : 7988db64c71d520310206ab1f55f3ca3
33093332
$util.toJson($ctx.result)",
33103333
"TypeName": "Query",
33113334
},

client/gql.ts

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ const myUserReturnFields = `${userReturnFields}
119119
hasWebPushSubscription
120120
manuallyOpenedPinboardIds
121121
hasEverUsedTour
122+
featureFlags
122123
`;
123124

124125
export const gqlSearchMentionableUsers = (prefix: string) => gql`

database-bridge-lambda/src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { Sql } from "../../shared/database/types";
1515
import { listLastItemSeenByUsers, seenItem } from "./sql/LastItemSeenByUser";
1616
import {
1717
addManuallyOpenedPinboardIds,
18+
changeFeatureFlag,
1819
getMyUser,
1920
getUsers,
2021
removeManuallyOpenedPinboardIds,
@@ -66,6 +67,8 @@ const run = (
6667
return getItemCounts(sql, args, userEmail);
6768
case "visitTourStep":
6869
return visitTourStep(sql, args, userEmail);
70+
case "changeFeatureFlag":
71+
return changeFeatureFlag(sql, args, userEmail);
6972
}
7073

7174
throw Error(

database-bridge-lambda/src/sql/User.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export const getUsers = (sql: Sql, args: { emails: string[] }) =>
4747
`;
4848

4949
const fragmentMyUserWithoutPushSubscriptionSecrets = (sql: Sql) =>
50-
sql`"email", "firstName", "lastName", "avatarUrl", "manuallyOpenedPinboardIds", "visitedTourSteps" IS NOT NULL AS "hasEverUsedTour", "webPushSubscription" IS NOT NULL AS "hasWebPushSubscription"`;
50+
sql`"email", "firstName", "lastName", "avatarUrl", "manuallyOpenedPinboardIds", "visitedTourSteps" IS NOT NULL AS "hasEverUsedTour", "webPushSubscription" IS NOT NULL AS "hasWebPushSubscription", "featureFlags"`;
5151

5252
export const getMyUser = (sql: Sql, userEmail: string) =>
5353
sql`
@@ -112,3 +112,20 @@ export const visitTourStep = async (
112112
WHERE "email" = ${userEmail}
113113
RETURNING ${fragmentMyUserWithoutPushSubscriptionSecrets(sql)}
114114
`.then((rows) => rows[0]);
115+
116+
export const changeFeatureFlag = async (
117+
sql: Sql,
118+
args: { flagId: string; newValue: boolean },
119+
userEmail: string
120+
) =>
121+
sql`
122+
UPDATE "User"
123+
SET "featureFlags" = jsonb_set(
124+
COALESCE("featureFlags", '{}'::jsonb),
125+
${[args.flagId]},
126+
to_jsonb(${args.newValue}),
127+
true
128+
)
129+
WHERE "email" = ${userEmail}
130+
RETURNING ${fragmentMyUserWithoutPushSubscriptionSecrets(sql)}
131+
`.then((rows) => rows[0]);

shared/database/local/runDatabaseSetup.ts

+2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ const runSetupTriggerSqlFile = (
8585
getEmailLambdaFunctionName(stage),
8686
EMAIL_DATABASE_TRIGGER_NAME
8787
),
88+
"add featureFlags column to User table": () =>
89+
runSetupSqlFile(sql, "020-AddFeatureFlagsColumnToUserTable.sql"),
8890
};
8991

9092
const allSteps = async () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE "User" ADD COLUMN "featureFlags" JSONB;

shared/graphql/operations.ts

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const MUTATIONS = {
3838
"addManuallyOpenedPinboardIds",
3939
"removeManuallyOpenedPinboardIds",
4040
"visitTourStep",
41+
"changeFeatureFlag",
4142
] as const,
4243
} as const;
4344

shared/graphql/schema.graphql

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type Mutation {
3232
addManuallyOpenedPinboardIds(pinboardId: String!, maybeEmailOverride: String): MyUser
3333
removeManuallyOpenedPinboardIds(pinboardIdToClose: String!): MyUser
3434
visitTourStep(tourStepId: String!): MyUser
35+
changeFeatureFlag(flagId: String!, newValue: Boolean!): MyUser
3536
}
3637

3738
type Subscription {
@@ -96,6 +97,7 @@ type MyUser {
9697
hasWebPushSubscription: Boolean
9798
manuallyOpenedPinboardIds: [String!]
9899
hasEverUsedTour: Boolean!
100+
featureFlags: AWSJSON
99101
}
100102

101103
type Group {

0 commit comments

Comments
 (0)