Skip to content

Commit e65aa6e

Browse files
feat: add delete topic subscription functionality to inbox controller and use cases
1 parent b12c878 commit e65aa6e

File tree

4 files changed

+74
-1
lines changed

4 files changed

+74
-1
lines changed

apps/api/src/app/inbox/inbox.controller.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ import { DeleteAllNotificationsCommand } from './usecases/delete-all-notificatio
6969
import { DeleteAllNotifications } from './usecases/delete-all-notifications/delete-all-notifications.usecase';
7070
import { DeleteNotificationCommand } from './usecases/delete-notification/delete-notification.command';
7171
import { DeleteNotification } from './usecases/delete-notification/delete-notification.usecase';
72+
import { DeleteTopicSubscriptionCommand } from './usecases/delete-topic-subscription/delete-topic-subscription.command';
73+
import { DeleteTopicSubscription } from './usecases/delete-topic-subscription/delete-topic-subscription.usecase';
7274
import { GetInboxPreferencesCommand } from './usecases/get-inbox-preferences/get-inbox-preferences.command';
7375
import { GetInboxPreferences } from './usecases/get-inbox-preferences/get-inbox-preferences.usecase';
7476
import { GetNotificationsCommand } from './usecases/get-notifications/get-notifications.command';
@@ -122,7 +124,8 @@ export class InboxController {
122124
private getTopicSubscriptionsUsecase: GetTopicSubscriptions,
123125
private getTopicSubscriptionUsecase: GetTopicSubscription,
124126
private createTopicSubscriptionsUsecase: CreateTopicSubscriptionsUsecase,
125-
private updateTopicSubscriptionUsecase: UpdateTopicSubscriptionUsecase
127+
private updateTopicSubscriptionUsecase: UpdateTopicSubscriptionUsecase,
128+
private deleteTopicSubscriptionUsecase: DeleteTopicSubscription
126129
) {}
127130

128131
@KeylessAccessible()
@@ -648,6 +651,22 @@ export class InboxController {
648651
);
649652
}
650653

654+
@UseGuards(AuthGuard('subscriberJwt'))
655+
@Delete('/subscription/:subscriptionId')
656+
async deleteTopicSubscription(
657+
@SubscriberSession() subscriberSession: SubscriberSession,
658+
@Param('subscriptionId') subscriptionId: string
659+
): Promise<{ success: boolean }> {
660+
return await this.deleteTopicSubscriptionUsecase.execute(
661+
DeleteTopicSubscriptionCommand.create({
662+
environmentId: subscriberSession._environmentId,
663+
organizationId: subscriberSession._organizationId,
664+
subscriberId: subscriberSession.subscriberId,
665+
subscriptionId,
666+
})
667+
);
668+
}
669+
651670
private convertPreferencesToGroupFilters(
652671
preferences: Array<string | WorkflowPreferenceRequestDto | GroupPreferenceFilterDto>
653672
): Array<GroupPreferenceFilterDto> {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { IsDefined, IsString } from 'class-validator';
2+
import { EnvironmentWithSubscriber } from '../../../shared/commands/project.command';
3+
4+
export class DeleteTopicSubscriptionCommand extends EnvironmentWithSubscriber {
5+
@IsString()
6+
@IsDefined()
7+
subscriptionId: string;
8+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { Injectable, NotFoundException } from '@nestjs/common';
2+
import { InstrumentUsecase } from '@novu/application-generic';
3+
import { PreferencesRepository, TopicSubscribersRepository } from '@novu/dal';
4+
import { PreferencesTypeEnum } from '@novu/shared';
5+
import { DeleteTopicSubscriptionCommand } from './delete-topic-subscription.command';
6+
7+
@Injectable()
8+
export class DeleteTopicSubscription {
9+
constructor(
10+
private topicSubscribersRepository: TopicSubscribersRepository,
11+
private preferencesRepository: PreferencesRepository
12+
) {}
13+
14+
@InstrumentUsecase()
15+
async execute(command: DeleteTopicSubscriptionCommand): Promise<{ success: boolean }> {
16+
const subscription = await this.topicSubscribersRepository.findOne({
17+
_environmentId: command.environmentId,
18+
_organizationId: command.organizationId,
19+
_id: command.subscriptionId,
20+
});
21+
22+
if (!subscription) {
23+
throw new NotFoundException(`Subscription with ID ${command.subscriptionId} not found`);
24+
}
25+
26+
await this.topicSubscribersRepository.withTransaction(async () => {
27+
await this.preferencesRepository.delete({
28+
_environmentId: command.environmentId,
29+
_organizationId: command.organizationId,
30+
_topicSubscriptionId: subscription._id,
31+
_subscriberId: subscription._subscriberId,
32+
type: PreferencesTypeEnum.SUBSCRIPTION_SUBSCRIBER_WORKFLOW,
33+
});
34+
35+
await this.topicSubscribersRepository.delete({
36+
_environmentId: command.environmentId,
37+
_organizationId: command.organizationId,
38+
_id: command.subscriptionId,
39+
});
40+
});
41+
42+
return { success: true };
43+
}
44+
}

apps/api/src/app/inbox/usecases/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { BulkUpdatePreferences } from './bulk-update-preferences/bulk-update-pre
1616
import { DeleteAllNotifications } from './delete-all-notifications/delete-all-notifications.usecase';
1717
import { DeleteManyNotifications } from './delete-many-notifications/delete-many-notifications.usecase';
1818
import { DeleteNotification } from './delete-notification/delete-notification.usecase';
19+
import { DeleteTopicSubscription } from './delete-topic-subscription/delete-topic-subscription.usecase';
1920
import { GetInboxPreferences } from './get-inbox-preferences/get-inbox-preferences.usecase';
2021
import { GetNotifications } from './get-notifications/get-notifications.usecase';
2122
import { GetTopicSubscription } from './get-topic-subscription/get-topic-subscription.usecase';
@@ -51,6 +52,7 @@ export const USE_CASES = [
5152
DeleteNotification,
5253
DeleteManyNotifications,
5354
DeleteAllNotifications,
55+
DeleteTopicSubscription,
5456
GetTopicSubscription,
5557
GetTopicSubscriptions,
5658
GenerateUniqueApiKey,

0 commit comments

Comments
 (0)