diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index 204d41616..a9beca613 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -36,6 +36,7 @@ import { deleteLabelResolver, deleteNewsletterEmailResolver, deleteReminderResolver, + deleteRuleResolver, deleteWebhookResolver, deviceTokensResolver, generateApiKeyResolver, @@ -177,6 +178,7 @@ export const functionResolvers = { deleteIntegration: deleteIntegrationResolver, optInFeature: optInFeatureResolver, setRule: setRuleResolver, + deleteRule: deleteRuleResolver, }, Query: { me: getMeUserResolver, @@ -619,4 +621,5 @@ export const functionResolvers = { ...resultResolveTypeResolver('SetRule'), ...resultResolveTypeResolver('Rules'), ...resultResolveTypeResolver('DeviceTokens'), + ...resultResolveTypeResolver('DeleteRule'), } diff --git a/packages/api/src/resolvers/rules/index.ts b/packages/api/src/resolvers/rules/index.ts index bbee1b0dc..456f127a0 100644 --- a/packages/api/src/resolvers/rules/index.ts +++ b/packages/api/src/resolvers/rules/index.ts @@ -1,5 +1,9 @@ import { authorized } from '../../utils/helpers' import { + DeleteRuleError, + DeleteRuleErrorCode, + DeleteRuleSuccess, + MutationDeleteRuleArgs, MutationSetRuleArgs, QueryRulesArgs, RulesError, @@ -105,3 +109,51 @@ export const rulesResolver = authorized< } } }) + +export const deleteRuleResolver = authorized< + DeleteRuleSuccess, + DeleteRuleError, + MutationDeleteRuleArgs +>(async (_, { id }, { claims, log }) => { + log.info('Deleting rule', { + id, + labels: { + source: 'resolver', + resolver: 'deleteRuleResolver', + uid: claims.uid, + }, + }) + + try { + const rule = await getRepository(Rule).findOneBy({ + id, + user: { id: claims.uid }, + }) + if (!rule) { + return { + errorCodes: [DeleteRuleErrorCode.NotFound], + } + } + + await getRepository(Rule).delete({ + id: rule.id, + }) + + return { + rule, + } + } catch (error) { + log.error('Error deleting rule', { + error, + labels: { + source: 'resolver', + resolver: 'deleteRuleResolver', + uid: claims.uid, + }, + }) + + return { + errorCodes: [DeleteRuleErrorCode.BadRequest], + } + } +}) diff --git a/packages/api/test/resolvers/rules.test.ts b/packages/api/test/resolvers/rules.test.ts index a3179ea3b..93bc3075e 100644 --- a/packages/api/test/resolvers/rules.test.ts +++ b/packages/api/test/resolvers/rules.test.ts @@ -130,4 +130,41 @@ describe('Rules Resolver', () => { expect(res.body.data.rules.rules.length).to.equal(1) }) }) + + describe('delete rules', () => { + let rule: Rule + + before(async () => { + rule = await getRepository(Rule).save({ + user: { id: user.id }, + name: 'test rule', + filter: 'test filter', + actions: [{ type: RuleActionType.SendNotification, params: [] }], + enabled: true, + }) + }) + + const deleteRulesQuery = (id: string) => ` + mutation { + deleteRule(id: "${id}") { + ... on DeleteRuleSuccess { + rule { + id + } + } + ... on DeleteRuleError { + errorCodes + } + } + } + ` + + it('should delete rules', async () => { + const res = await graphqlRequest( + deleteRulesQuery(rule.id), + authToken + ).expect(200) + expect(res.body.data.deleteRule.rule.id).to.equal(rule.id) + }) + }) })