Skip to content

Commit

Permalink
WIP add ChatBot support
Browse files Browse the repository at this point in the history
  • Loading branch information
twrichards committed May 29, 2024
1 parent ac6978d commit 35a3b36
Show file tree
Hide file tree
Showing 24 changed files with 1,291 additions and 118 deletions.
6 changes: 6 additions & 0 deletions bootstrapping-lambda/src/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ const corsOptions: cors.CorsOptions = {
server.use(express.json());
server.use(cors(corsOptions));

server.post("/bot/:pinboardId/:replyToItemId", (request, response) => {

Check warning on line 47 in bootstrapping-lambda/src/server.ts

View workflow job for this annotation

GitHub Actions / CI

'request' is defined but never used

Check warning on line 47 in bootstrapping-lambda/src/server.ts

View workflow job for this annotation

GitHub Actions / CI

'response' is defined but never used
//TODO check request for valid auth token
//TODO build CreateItemInput,
// TODO make http request to appsync endpoint using token from request (or possibly new token)
});

server.post("/search", getAuthMiddleware(), (_, response) => {
response.setHeader("Access-Control-Allow-Credentials", "true");
return response.json(Object.values(StageMetric));
Expand Down
63 changes: 39 additions & 24 deletions cdk/lib/__snapshots__/stack.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2275,7 +2275,7 @@ type Query {
listItems(pinboardId: String!): [Item]
listLastItemSeenByUsers(pinboardId: String!): [LastItemSeenByUser]
getMyUser: MyUser
searchMentionableUsers(prefix: String!): UsersAndGroups
searchMentionableUsers(prefix: String!): UsersGroupsAndChatBots
getUsers(emails: [String!]!): [User]
getGroupPinboardIds: [PinboardIdWithClaimCounts!]!
getItemCounts(pinboardIds: [String!]!): [PinboardIdWithItemCounts!]!
Expand Down Expand Up @@ -2320,7 +2320,8 @@ type Subscription {
type MentionHandle {
label: String!
isMe: Boolean!
isMe: Boolean
isBot: Boolean
}
type Item {
Expand All @@ -2333,6 +2334,7 @@ type Item {
pinboardId: String!
mentions: [MentionHandle!]
groupMentions: [MentionHandle!]
chatBotMentions: [MentionHandle!]
claimedByEmail: String
claimable: Boolean!
relatedItemId: String
Expand Down Expand Up @@ -2370,9 +2372,16 @@ type Group {
memberEmails: [String!]!
}
type UsersAndGroups {
type ChatBot {
shorthand: String!
description: String!
avatarUrl: String
}
type UsersGroupsAndChatBots {
users: [User!]!
groups: [Group!]!
chatBots: [ChatBot!]!
}
type WorkflowStub {
Expand Down Expand Up @@ -2410,6 +2419,7 @@ input CreateItemInput {
pinboardId: String!
mentions: [String!]
groupMentions: [String!]
chatBotMentions: [String!]
claimable: Boolean
relatedItemId: String
}
Expand Down Expand Up @@ -2492,7 +2502,7 @@ type PinboardIdWithItemCounts {
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "addManuallyOpenedPinboardIds",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2513,7 +2523,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "claimItem",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2534,7 +2544,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "createItem",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2555,7 +2565,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "deleteItem",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2576,7 +2586,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "editItem",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2597,7 +2607,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "removeManuallyOpenedPinboardIds",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2618,7 +2628,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "seenItem",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2639,7 +2649,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "setWebPushSubscriptionForUser",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2660,7 +2670,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "visitTourStep",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Mutation",
},
Expand All @@ -2681,7 +2691,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "getGroupPinboardIds",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2702,7 +2712,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "getItemCounts",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2723,7 +2733,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "getMyUser",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2744,7 +2754,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "getUsers",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2765,7 +2775,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "listItems",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2786,7 +2796,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "listLastItemSeenByUsers",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2807,7 +2817,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "database_bridge_lambda_ds",
"FieldName": "searchMentionableUsers",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand Down Expand Up @@ -2932,7 +2942,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "grid_bridge_lambda_ds",
"FieldName": "asGridPayload",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -2953,7 +2963,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "grid_bridge_lambda_ds",
"FieldName": "getGridSearchSummary",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand Down Expand Up @@ -3078,7 +3088,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "workflow_bridge_lambda_ds",
"FieldName": "getPinboardByComposerId",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -3099,7 +3109,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "workflow_bridge_lambda_ds",
"FieldName": "getPinboardsByIds",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand All @@ -3120,7 +3130,7 @@ $util.toJson($ctx.result)",
"DataSourceName": "workflow_bridge_lambda_ds",
"FieldName": "listPinboards",
"Kind": "UNIT",
"ResponseMappingTemplate": "## schema checksum : aa02bae16942e48366fa36a1cd643d16
"ResponseMappingTemplate": "## schema checksum : 51a0add4d309eaf60c5fce1924e07115
$util.toJson($ctx.result)",
"TypeName": "Query",
},
Expand Down Expand Up @@ -4121,6 +4131,11 @@ $util.toJson($ctx.result)",
"Properties": Object {
"PolicyDocument": Object {
"Statement": Array [
Object {
"Action": "ram:GetResourceShareAssociations",
"Effect": "Allow",
"Resource": "*",
},
Object {
"Action": "rds-db:connect",
"Effect": "Allow",
Expand Down
9 changes: 8 additions & 1 deletion cdk/lib/stack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,14 @@ export class PinBoardStack extends GuStack {
deployBucket,
`${this.stack}/${this.stage}/${DATABASE_BRIDGE_LAMBDA_BASENAME}/${DATABASE_BRIDGE_LAMBDA_BASENAME}.zip`
),
initialPolicy: [],
initialPolicy: [
// to lookup chatbots shared from other accounts
new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ["ram:GetResourceShareAssociations"],
resources: ["*"],
}),
],
vpc: accountVpc,
securityGroups: [databaseSecurityGroup],
}
Expand Down
9 changes: 9 additions & 0 deletions client/gql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,10 @@ const itemReturnFields = `
label
isMe
}
chatBotMentions {
label
isMe
}
claimedByEmail
claimable
relatedItemId
Expand Down Expand Up @@ -133,6 +137,11 @@ export const gqlSearchMentionableUsers = (prefix: string) => gql`
name
memberEmails
}
chatBots {
shorthand
description
avatarUrl
}
}
}
`;
Expand Down
44 changes: 26 additions & 18 deletions client/src/avatarRoundel.tsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,37 @@
import { css } from "@emotion/react";
import { neutral } from "@guardian/source-foundations";
import React from "react";
import { Group, User } from "../../shared/graphql/graphql";
import { ChatBot, Group, User } from "../../shared/graphql/graphql";
import { composer } from "../colours";
import { agateSans } from "../fontNormaliser";
import { isUser } from "../../shared/graphql/extraTypes";
import {
hasAvatarUrl,
isChatBot,
isGroup,
isUser,
} from "../../shared/graphql/extraTypes";

interface AvatarRoundelProps {
maybeUserOrGroup: User | Group | undefined;
maybeUserOrGroupOrChatBot: User | Group | ChatBot | undefined;
size: number;
fallback: string;
}

export const AvatarRoundel = ({
maybeUserOrGroup,
maybeUserOrGroupOrChatBot,
size,
fallback,
}: AvatarRoundelProps) =>
maybeUserOrGroup && isUser(maybeUserOrGroup) && maybeUserOrGroup.avatarUrl ? (
hasAvatarUrl(maybeUserOrGroupOrChatBot) &&
maybeUserOrGroupOrChatBot.avatarUrl ? (
<img
key={fallback}
css={css`
border-radius: 50%;
width: ${size}px;
height: ${size}px;
`}
src={maybeUserOrGroup.avatarUrl}
src={maybeUserOrGroupOrChatBot.avatarUrl}
draggable={false}
/>
) : (
Expand All @@ -35,7 +41,9 @@ export const AvatarRoundel = ({
height: ${size}px;
border-radius: 50%;
box-shadow: 0 0 1px ${neutral[93]};
background-color: ${composer.primary[300]};
background-color: ${isChatBot(maybeUserOrGroupOrChatBot)
? "none"
: composer.primary[300]};
color: ${neutral[100]};
display: flex;
flex-shrink: 0;
Expand All @@ -47,17 +55,17 @@ export const AvatarRoundel = ({
line-height: ${size}px;
`}
>
{maybeUserOrGroup ? (
isUser(maybeUserOrGroup) ? (
<React.Fragment>
{maybeUserOrGroup.firstName.charAt(0).toUpperCase()}
{maybeUserOrGroup.lastName?.charAt(0).toUpperCase()}
</React.Fragment>
) : (
maybeUserOrGroup.memberEmails?.length
)
) : (
fallback.charAt(0).toUpperCase()
{isUser(maybeUserOrGroupOrChatBot) && (
<React.Fragment>
{maybeUserOrGroupOrChatBot.firstName.charAt(0).toUpperCase()}
{maybeUserOrGroupOrChatBot.lastName?.charAt(0).toUpperCase()}
</React.Fragment>
)}
{isGroup(maybeUserOrGroupOrChatBot) &&
maybeUserOrGroupOrChatBot.memberEmails?.length}
{isChatBot(maybeUserOrGroupOrChatBot) && (
<span>🤖</span> /* TODO replace with actual bot SVG */
)}
{!maybeUserOrGroupOrChatBot && fallback.charAt(0).toUpperCase()}
</span>
);
Loading

0 comments on commit 35a3b36

Please sign in to comment.