diff --git a/packages/api/src/resolvers/recommendations/index.ts b/packages/api/src/resolvers/recommendations/index.ts index 8dd3b1d09..bb1a48aac 100644 --- a/packages/api/src/resolvers/recommendations/index.ts +++ b/packages/api/src/resolvers/recommendations/index.ts @@ -25,6 +25,7 @@ import { } from '../../generated/graphql' import { createGroup, + createLabelAndRuleForGroup, getInviteUrl, getRecommendationGroups, joinGroup, @@ -71,6 +72,8 @@ export const createGroupResolver = authorized< expiresInDays: input.expiresInDays, }) + await createLabelAndRuleForGroup(uid, group.name) + const inviteUrl = getInviteUrl(invite) const user = userDataToUser(userData) @@ -263,6 +266,8 @@ export const joinGroupResolver = authorized< const group = await joinGroup(user, inviteCode) + await createLabelAndRuleForGroup(user.id, group.name) + return { group, } diff --git a/packages/api/src/services/groups.ts b/packages/api/src/services/groups.ts index 2cebfaa91..716ccdddc 100644 --- a/packages/api/src/services/groups.ts +++ b/packages/api/src/services/groups.ts @@ -8,6 +8,9 @@ import { RecommendationGroup, User as GraphqlUser } from '../generated/graphql' import { getRepository } from '../entity/utils' import { homePageURL } from '../env' import { userDataToUser } from '../utils/helpers' +import { createLabel } from './labels' +import { createRule } from './rules' +import { RuleActionType } from '../entity/rule' export const createGroup = async (input: { admin: User @@ -200,3 +203,27 @@ export const leaveGroup = async ( return true }) } + +export const createLabelAndRuleForGroup = async ( + userId: string, + groupName: string +) => { + // create a new label for the group + const label = await createLabel(userId, { name: groupName }) + + // create a rule to add the label to all pages in the group + await createRule(userId, { + name: groupName, + actions: [ + { + type: RuleActionType.AddLabel, + params: [label.id], + }, + { + type: RuleActionType.SendNotification, + params: [groupName], + }, + ], + filter: `recommendedBy:"${groupName}"`, + }) +} diff --git a/packages/api/src/services/labels.ts b/packages/api/src/services/labels.ts index cb8432b06..b20baeee2 100644 --- a/packages/api/src/services/labels.ts +++ b/packages/api/src/services/labels.ts @@ -6,6 +6,7 @@ import { addLabelInPage } from '../elastic/labels' import { getRepository } from '../entity/utils' import { Link } from '../entity/link' import DataLoader from 'dataloader' +import { generateRandomColor } from '../utils/helpers' const batchGetLabelsFromLinkIds = async ( linkIds: readonly string[] @@ -76,3 +77,29 @@ export const getLabelsByIds = async ( select: ['id', 'name', 'color', 'description', 'createdAt'], }) } + +export const createLabel = async ( + userId: string, + label: { + name: string + color?: string + description?: string + } +): Promise