From 85241993c738e3c6379a2e7183bbe2841fccc128 Mon Sep 17 00:00:00 2001 From: quangtuanitmo18 Date: Mon, 2 Mar 2026 02:45:07 +0300 Subject: [PATCH 1/5] feat: add api remove event --- src/models/eventsFactory.js | 33 +++++++++++++++++++++++++++++++++ src/resolvers/event.js | 16 ++++++++++++++++ src/typeDefs/event.ts | 15 +++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/src/models/eventsFactory.js b/src/models/eventsFactory.js index bf3efb13..c9c5fb13 100644 --- a/src/models/eventsFactory.js +++ b/src/models/eventsFactory.js @@ -875,6 +875,39 @@ class EventsFactory extends Factory { return collection.updateOne(query, update); } + /** + * Remove a single event and all related data (repetitions, daily events) + * + * @param {string|ObjectId} eventId - id of the original event to remove + * @return {Promise} + */ + async removeEvent(eventId) { + const eventsCollection = this.getCollection(this.TYPES.EVENTS); + + const event = await eventsCollection.findOne({ _id: new ObjectId(eventId) }); + + if (!event) { + throw new Error(`Event not found for eventId: ${eventId}`); + } + + const { groupHash } = event; + + // Delete original event + const result = await eventsCollection.deleteOne({ _id: new ObjectId(eventId) }); + + // Delete all repetitions with same groupHash + if (await this.isCollectionExists(this.TYPES.REPETITIONS)) { + await this.getCollection(this.TYPES.REPETITIONS).deleteMany({ groupHash }); + } + + // Delete all daily event records with same groupHash + if (await this.isCollectionExists(this.TYPES.DAILY_EVENTS)) { + await this.getCollection(this.TYPES.DAILY_EVENTS).deleteMany({ groupHash }); + } + + return result; + } + /** * Remove all project events * diff --git a/src/resolvers/event.js b/src/resolvers/event.js index c3c44971..06f1f33b 100644 --- a/src/resolvers/event.js +++ b/src/resolvers/event.js @@ -153,6 +153,22 @@ module.exports = { return !!result.acknowledged; }, + /** + * Remove event and all related data (repetitions, daily events) + * + * @param {ResolverObj} _obj - resolver context + * @param {string} projectId - project id + * @param {string} eventId - event id to remove + * @return {Promise} + */ + async removeEvent(_obj, { projectId, eventId }, context) { + const factory = getEventsFactory(context, projectId); + + const result = await factory.removeEvent(eventId); + + return !!result.acknowledged; + }, + /** * Mutations namespace * diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index c200de96..a182061b 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -504,6 +504,21 @@ extend type Mutation { mark: EventMark! ): Boolean! + """ + Remove event and all related data (repetitions, daily events) + """ + removeEvent( + """ + ID of project event is related to + """ + projectId: ID! + + """ + ID of the event to remove + """ + eventId: ID! + ): Boolean! @requireUserInWorkspace + """ Namespace that contains only mutations related to the events """ From bd7cbe520ed0750253e41050bf5c929e6c78d31f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:14:59 +0000 Subject: [PATCH 2/5] Bump version up to 1.4.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ab0a13c..8d8b9bca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.4.7", + "version": "1.4.8", "main": "index.ts", "license": "BUSL-1.1", "scripts": { From 3cea89bd4e65c4714a89c97caf0eb5d23aed3b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D1=82=D1=83=D0=B0=D0=BD?= Date: Tue, 10 Mar 2026 16:43:19 +0300 Subject: [PATCH 3/5] address review comments --- src/typeDefs/event.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/typeDefs/event.ts b/src/typeDefs/event.ts index a182061b..fb510c1e 100644 --- a/src/typeDefs/event.ts +++ b/src/typeDefs/event.ts @@ -517,7 +517,7 @@ extend type Mutation { ID of the event to remove """ eventId: ID! - ): Boolean! @requireUserInWorkspace + ): Boolean! @requireAdmin """ Namespace that contains only mutations related to the events From 81d65ead28431b3b4af644d5698e254af91e133d Mon Sep 17 00:00:00 2001 From: quangtuanitmo18 Date: Sat, 25 Apr 2026 12:59:13 +0300 Subject: [PATCH 4/5] chore: hide Mongo-specific delete result behind boolean --- src/models/eventsFactory.js | 4 ++-- src/resolvers/event.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/models/eventsFactory.js b/src/models/eventsFactory.js index c9c5fb13..1436a3ab 100644 --- a/src/models/eventsFactory.js +++ b/src/models/eventsFactory.js @@ -879,7 +879,7 @@ class EventsFactory extends Factory { * Remove a single event and all related data (repetitions, daily events) * * @param {string|ObjectId} eventId - id of the original event to remove - * @return {Promise} + * @return {Promise} */ async removeEvent(eventId) { const eventsCollection = this.getCollection(this.TYPES.EVENTS); @@ -905,7 +905,7 @@ class EventsFactory extends Factory { await this.getCollection(this.TYPES.DAILY_EVENTS).deleteMany({ groupHash }); } - return result; + return result.acknowledged && result.deletedCount > 0; } /** diff --git a/src/resolvers/event.js b/src/resolvers/event.js index 06f1f33b..c90bf9a2 100644 --- a/src/resolvers/event.js +++ b/src/resolvers/event.js @@ -166,7 +166,7 @@ module.exports = { const result = await factory.removeEvent(eventId); - return !!result.acknowledged; + return result; }, /** From 7bbde99d4a390c0883761b7649843ac2fda8783c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 25 Apr 2026 10:01:43 +0000 Subject: [PATCH 5/5] Bump version up to 1.4.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6db19b0b..8a2c557b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hawk.api", - "version": "1.4.12", + "version": "1.4.13", "main": "index.ts", "license": "BUSL-1.1", "scripts": {