Skip to content

Commit 7630d6d

Browse files
Add 'isStarred' to table and mutate from client
Co-Authored-By: Tom Richards <19289579+twrichards@users.noreply.github.com>
1 parent 46861fd commit 7630d6d

File tree

13 files changed

+91
-28
lines changed

13 files changed

+91
-28
lines changed

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

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2268,6 +2268,7 @@ type Mutation {
22682268
editItem(itemId: String!, input: EditItemInput!): Item
22692269
deleteItem(itemId: String!): Item
22702270
claimItem(itemId: String!): Claimed
2271+
setIsStarred(itemId: String!, isStarred: Boolean!): Item
22712272
seenItem(input: LastItemSeenByUserInput!): LastItemSeenByUser
22722273
setWebPushSubscriptionForUser(webPushSubscription: AWSJSON): MyUser
22732274
addManuallyOpenedPinboardIds(pinboardId: String!, maybeEmailOverride: String): MyUser
@@ -2278,7 +2279,7 @@ type Mutation {
22782279
type Subscription {
22792280
onMutateItem(
22802281
pinboardId: String
2281-
): Item @aws_subscribe(mutations: [\\"createItem\\", \\"editItem\\", \\"deleteItem\\"])
2282+
): Item @aws_subscribe(mutations: [\\"createItem\\", \\"editItem\\", \\"deleteItem\\", \\"setIsStarred\\"])
22822283
22832284
onClaimItem(
22842285
pinboardId: String
@@ -2313,6 +2314,7 @@ type Item {
23132314
relatedItemId: String
23142315
editHistory: [AWSDateTime!]
23152316
deletedAt: AWSDateTime
2317+
isStarred: Boolean!
23162318
}
23172319
23182320
type LastItemSeenByUser {
@@ -2467,7 +2469,7 @@ type PinboardIdWithItemCounts {
24672469
"DataSourceName": "database_bridge_lambda_ds",
24682470
"FieldName": "addManuallyOpenedPinboardIds",
24692471
"Kind": "UNIT",
2470-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2472+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
24712473
$util.toJson($ctx.result)",
24722474
"TypeName": "Mutation",
24732475
},
@@ -2488,7 +2490,7 @@ $util.toJson($ctx.result)",
24882490
"DataSourceName": "database_bridge_lambda_ds",
24892491
"FieldName": "claimItem",
24902492
"Kind": "UNIT",
2491-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2493+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
24922494
$util.toJson($ctx.result)",
24932495
"TypeName": "Mutation",
24942496
},
@@ -2509,7 +2511,7 @@ $util.toJson($ctx.result)",
25092511
"DataSourceName": "database_bridge_lambda_ds",
25102512
"FieldName": "createItem",
25112513
"Kind": "UNIT",
2512-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2514+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
25132515
$util.toJson($ctx.result)",
25142516
"TypeName": "Mutation",
25152517
},
@@ -2530,7 +2532,7 @@ $util.toJson($ctx.result)",
25302532
"DataSourceName": "database_bridge_lambda_ds",
25312533
"FieldName": "deleteItem",
25322534
"Kind": "UNIT",
2533-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2535+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
25342536
$util.toJson($ctx.result)",
25352537
"TypeName": "Mutation",
25362538
},
@@ -2551,7 +2553,7 @@ $util.toJson($ctx.result)",
25512553
"DataSourceName": "database_bridge_lambda_ds",
25522554
"FieldName": "editItem",
25532555
"Kind": "UNIT",
2554-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2556+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
25552557
$util.toJson($ctx.result)",
25562558
"TypeName": "Mutation",
25572559
},
@@ -2572,7 +2574,7 @@ $util.toJson($ctx.result)",
25722574
"DataSourceName": "database_bridge_lambda_ds",
25732575
"FieldName": "removeManuallyOpenedPinboardIds",
25742576
"Kind": "UNIT",
2575-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2577+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
25762578
$util.toJson($ctx.result)",
25772579
"TypeName": "Mutation",
25782580
},
@@ -2593,7 +2595,28 @@ $util.toJson($ctx.result)",
25932595
"DataSourceName": "database_bridge_lambda_ds",
25942596
"FieldName": "seenItem",
25952597
"Kind": "UNIT",
2596-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2598+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
2599+
$util.toJson($ctx.result)",
2600+
"TypeName": "Mutation",
2601+
},
2602+
"Type": "AWS::AppSync::Resolver",
2603+
},
2604+
"pinboardappsyncapidatabasebridgelambdadsMutationsetIsStarredResolver7A053545": Object {
2605+
"DependsOn": Array [
2606+
"pinboardappsyncapidatabasebridgelambdads970CB9A7",
2607+
"pinboardappsyncapiSchema868D9F5B",
2608+
],
2609+
"Properties": Object {
2610+
"ApiId": Object {
2611+
"Fn::GetAtt": Array [
2612+
"pinboardappsyncapi9D519400",
2613+
"ApiId",
2614+
],
2615+
},
2616+
"DataSourceName": "database_bridge_lambda_ds",
2617+
"FieldName": "setIsStarred",
2618+
"Kind": "UNIT",
2619+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
25972620
$util.toJson($ctx.result)",
25982621
"TypeName": "Mutation",
25992622
},
@@ -2614,7 +2637,7 @@ $util.toJson($ctx.result)",
26142637
"DataSourceName": "database_bridge_lambda_ds",
26152638
"FieldName": "setWebPushSubscriptionForUser",
26162639
"Kind": "UNIT",
2617-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2640+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
26182641
$util.toJson($ctx.result)",
26192642
"TypeName": "Mutation",
26202643
},
@@ -2635,7 +2658,7 @@ $util.toJson($ctx.result)",
26352658
"DataSourceName": "database_bridge_lambda_ds",
26362659
"FieldName": "visitTourStep",
26372660
"Kind": "UNIT",
2638-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2661+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
26392662
$util.toJson($ctx.result)",
26402663
"TypeName": "Mutation",
26412664
},
@@ -2656,7 +2679,7 @@ $util.toJson($ctx.result)",
26562679
"DataSourceName": "database_bridge_lambda_ds",
26572680
"FieldName": "getGroupPinboardIds",
26582681
"Kind": "UNIT",
2659-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2682+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
26602683
$util.toJson($ctx.result)",
26612684
"TypeName": "Query",
26622685
},
@@ -2677,7 +2700,7 @@ $util.toJson($ctx.result)",
26772700
"DataSourceName": "database_bridge_lambda_ds",
26782701
"FieldName": "getItemCounts",
26792702
"Kind": "UNIT",
2680-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2703+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
26812704
$util.toJson($ctx.result)",
26822705
"TypeName": "Query",
26832706
},
@@ -2698,7 +2721,7 @@ $util.toJson($ctx.result)",
26982721
"DataSourceName": "database_bridge_lambda_ds",
26992722
"FieldName": "getMyUser",
27002723
"Kind": "UNIT",
2701-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2724+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
27022725
$util.toJson($ctx.result)",
27032726
"TypeName": "Query",
27042727
},
@@ -2719,7 +2742,7 @@ $util.toJson($ctx.result)",
27192742
"DataSourceName": "database_bridge_lambda_ds",
27202743
"FieldName": "getUsers",
27212744
"Kind": "UNIT",
2722-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2745+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
27232746
$util.toJson($ctx.result)",
27242747
"TypeName": "Query",
27252748
},
@@ -2740,7 +2763,7 @@ $util.toJson($ctx.result)",
27402763
"DataSourceName": "database_bridge_lambda_ds",
27412764
"FieldName": "listItems",
27422765
"Kind": "UNIT",
2743-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2766+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
27442767
$util.toJson($ctx.result)",
27452768
"TypeName": "Query",
27462769
},
@@ -2761,7 +2784,7 @@ $util.toJson($ctx.result)",
27612784
"DataSourceName": "database_bridge_lambda_ds",
27622785
"FieldName": "listLastItemSeenByUsers",
27632786
"Kind": "UNIT",
2764-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2787+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
27652788
$util.toJson($ctx.result)",
27662789
"TypeName": "Query",
27672790
},
@@ -2782,7 +2805,7 @@ $util.toJson($ctx.result)",
27822805
"DataSourceName": "database_bridge_lambda_ds",
27832806
"FieldName": "searchMentionableUsers",
27842807
"Kind": "UNIT",
2785-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2808+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
27862809
$util.toJson($ctx.result)",
27872810
"TypeName": "Query",
27882811
},
@@ -2907,7 +2930,7 @@ $util.toJson($ctx.result)",
29072930
"DataSourceName": "grid_bridge_lambda_ds",
29082931
"FieldName": "asGridPayload",
29092932
"Kind": "UNIT",
2910-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2933+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
29112934
$util.toJson($ctx.result)",
29122935
"TypeName": "Query",
29132936
},
@@ -2928,7 +2951,7 @@ $util.toJson($ctx.result)",
29282951
"DataSourceName": "grid_bridge_lambda_ds",
29292952
"FieldName": "getGridSearchSummary",
29302953
"Kind": "UNIT",
2931-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
2954+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
29322955
$util.toJson($ctx.result)",
29332956
"TypeName": "Query",
29342957
},
@@ -3053,7 +3076,7 @@ $util.toJson($ctx.result)",
30533076
"DataSourceName": "workflow_bridge_lambda_ds",
30543077
"FieldName": "getPinboardByComposerId",
30553078
"Kind": "UNIT",
3056-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3079+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
30573080
$util.toJson($ctx.result)",
30583081
"TypeName": "Query",
30593082
},
@@ -3074,7 +3097,7 @@ $util.toJson($ctx.result)",
30743097
"DataSourceName": "workflow_bridge_lambda_ds",
30753098
"FieldName": "getPinboardsByIds",
30763099
"Kind": "UNIT",
3077-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3100+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
30783101
$util.toJson($ctx.result)",
30793102
"TypeName": "Query",
30803103
},
@@ -3095,7 +3118,7 @@ $util.toJson($ctx.result)",
30953118
"DataSourceName": "workflow_bridge_lambda_ds",
30963119
"FieldName": "listPinboards",
30973120
"Kind": "UNIT",
3098-
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
3121+
"ResponseMappingTemplate": "## schema checksum : b72f387aabaad7462e0e00a8ab981ffc
30993122
$util.toJson($ctx.result)",
31003123
"TypeName": "Query",
31013124
},

client/gql.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ const itemReturnFields = `
6868
relatedItemId
6969
editHistory
7070
deletedAt
71+
isStarred
7172
`;
7273

7374
// TODO: consider updating the resolver (cdk/stack.ts) to use a Query with a secondary index (if performance degrades when we have lots of items)
@@ -241,6 +242,14 @@ export const gqlOnClaimItem = (pinboardId: string) => gql`
241242
}
242243
`;
243244

245+
export const gqlSetIsStarred = gql`
246+
mutation SetIsStarred($itemId: String!, $isStarred: Boolean!) {
247+
setIsStarred(itemId: $itemId, isStarred: $isStarred) {
248+
${itemReturnFields}
249+
}
250+
}
251+
`;
252+
244253
const gridBadgeFields = `
245254
text
246255
color

client/src/itemHoverMenu.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { useConfirmModal } from "./modal";
99
import { scrollbarsCss } from "./styling";
1010
import { composer } from "../colours";
1111
import { useMutation } from "@apollo/client";
12-
import { gqlDeleteItem } from "../gql";
12+
import { gqlDeleteItem, gqlSetIsStarred } from "../gql";
1313
import { Item } from "shared/graphql/graphql";
1414
import { PINBOARD_TELEMETRY_TYPE, TelemetryContext } from "./types/Telemetry";
1515
import { useTourProgress } from "./tour/tourState";
@@ -55,7 +55,12 @@ export const ItemHoverMenu = ({
5555
</div>
5656
</React.Fragment>
5757
);
58-
const [isStarred, setIsStarred] = React.useState(false);
58+
59+
const isStarred = item.isStarred;
60+
const [setIsStarred] = useMutation(gqlSetIsStarred);
61+
const toggleIsStarred = () => {
62+
setIsStarred({ variables: { itemId: item.id, isStarred: !isStarred } });
63+
};
5964

6065
useEffect(
6166
() => setMaybeDeleteItemModalElement(deleteConfirmModalElement),
@@ -141,7 +146,7 @@ export const ItemHoverMenu = ({
141146
`}
142147
>
143148
<button
144-
onClick={() => setIsStarred((isStarred) => !isStarred)}
149+
onClick={toggleIsStarred}
145150
title={isStarred ? "Unstar" : "Star"}
146151
>
147152
{isStarred ? <SvgStar /> : <SvgStarOutline />}

client/src/starred/starredMessages.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import ReactDOM from "react-dom";
33

44
export const STARRED_MESSAGES_HTML_TAG = "pinboard-starred-messages";
55

6-
interface StarredMessagesProps {}
6+
// interface StarredMessagesProps {}
77

8-
const StarredMessages = (props: StarredMessagesProps) => (
8+
const StarredMessages = (/* props: StarredMessagesProps */) => (
99
<div>
1010
<p>Starred Messages</p>
1111
</div>

client/src/tour/tourMessageReplies.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const buildMessageItem = (
2929
claimedByEmail: null,
3030
claimable: false,
3131
pinboardId: demoPinboardData.id,
32+
isStarred: false,
3233
});
3334

3435
export const replyTo = (

client/src/tour/tourState.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ export const TourStateProvider: React.FC = ({ children }) => {
302302
})),
303303
groupMentions: [], //TODO - map variables.input.groupMentions to mention handle,
304304
claimable: variables.input.claimable || false,
305+
isStarred: false,
305306
};
306307
setSuccessfulSends((prevSuccessfulSends) => [
307308
...prevSuccessfulSends,

database-bridge-lambda/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
getGroupPinboardIds,
1111
getItemCounts,
1212
listItems,
13+
setIsStarred,
1314
} from "./sql/Item";
1415
import { Sql } from "../../shared/database/types";
1516
import { listLastItemSeenByUsers, seenItem } from "./sql/LastItemSeenByUser";
@@ -42,6 +43,8 @@ const run = (
4243
return deleteItem(sql, args, userEmail);
4344
case "claimItem":
4445
return claimItem(sql, args, userEmail);
46+
case "setIsStarred":
47+
return setIsStarred(sql, args, userEmail);
4548
case "listItems":
4649
return listItems(sql, args, userEmail);
4750
case "seenItem":

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,19 @@ export const claimItem = (
143143
};
144144
});
145145

146+
export const setIsStarred = async (
147+
sql: Sql,
148+
args: { itemId: string; isStarred: boolean },
149+
userEmail: string
150+
) =>
151+
sql`
152+
UPDATE "Item"
153+
SET
154+
"isStarred" = ${args.isStarred}
155+
WHERE "id" = ${args.itemId}
156+
RETURNING ${fragmentItemFields(sql, userEmail)}
157+
`.then((rows) => rows[0]);
158+
146159
export const getGroupPinboardIds = async (
147160
sql: Sql,
148161
userEmail: string

notifications-lambda/run.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import { Item } from "shared/graphql/graphql";
4040
relatedItemId: null,
4141
editHistory: null,
4242
deletedAt: null,
43+
isStarred: false,
4344
} satisfies Item,
4445
users: [yourUser as UserWithWebPushSubscription],
4546
});

shared/database/local/runDatabaseSetup.ts

Lines changed: 2 additions & 0 deletions
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 isStarred column to Item table": () =>
89+
runSetupSqlFile(sql, "020-AddIsStarredColumnToItemTable.sql"),
8890
};
8991

9092
const allSteps = async () => {

0 commit comments

Comments
 (0)