diff --git a/packages/api/src/resolvers/recommendations/index.ts b/packages/api/src/resolvers/recommendations/index.ts index 2f2e617b7..4b97cd652 100644 --- a/packages/api/src/resolvers/recommendations/index.ts +++ b/packages/api/src/resolvers/recommendations/index.ts @@ -39,6 +39,8 @@ import { getPageByParam } from '../../elastic/pages' import { enqueueRecommendation } from '../../utils/createTask' import { env } from '../../env' import { createLabel } from '../../services/labels' +import { createRule } from '../../services/rules' +import { RuleActionType } from '../../entity/rule' export const createGroupResolver = authorized< CreateGroupSuccess, @@ -73,7 +75,23 @@ export const createGroupResolver = authorized< }) // create a new label for the group - await createLabel(userData, { name: input.name }) + const label = await createLabel(userData, { name: input.name }) + + // create a rule to add the label to all pages in the group + await createRule(userData, { + name: input.name, + actions: [ + { + type: RuleActionType.AddLabel, + params: [label.id], + }, + { + type: RuleActionType.SendNotification, + params: [input.name], + }, + ], + filter: `recommendedBy:${group.name}`, + }) const inviteUrl = getInviteUrl(invite) const user = userDataToUser(userData) @@ -267,6 +285,25 @@ export const joinGroupResolver = authorized< const group = await joinGroup(user, inviteCode) + // create a new label for the group + const label = await createLabel(user, { name: group.name }) + + // create a rule to add the label to all pages in the group + await createRule(user, { + name: group.name, + actions: [ + { + type: RuleActionType.AddLabel, + params: [label.id], + }, + { + type: RuleActionType.SendNotification, + params: [group.name], + }, + ], + filter: `recommendedBy:${group.name}`, + }) + return { group, } diff --git a/packages/api/src/services/rules.ts b/packages/api/src/services/rules.ts new file mode 100644 index 000000000..b87bd6396 --- /dev/null +++ b/packages/api/src/services/rules.ts @@ -0,0 +1,28 @@ +import { User } from '../entity/user' +import { Rule, RuleAction } from '../entity/rule' +import { getRepository } from '../entity/utils' +import { ILike } from 'typeorm' + +export const createRule = async ( + user: User, + rule: { + name: string + description?: string + actions: RuleAction[] + filter: string + } +): Promise => { + const existingRule = await getRepository(Rule).findOneBy({ + user: { id: user.id }, + name: ILike(rule.name), + }) + + if (existingRule) { + return existingRule + } + + return getRepository(Rule).save({ + ...rule, + user: { id: user.id }, + }) +}