diff --git a/.github/workflows/dev-deploy-api.yml b/.github/workflows/dev-deploy-api.yml index 1b78da2eb7f..dfaa343d841 100644 --- a/.github/workflows/dev-deploy-api.yml +++ b/.github/workflows/dev-deploy-api.yml @@ -22,10 +22,11 @@ jobs: test_api: strategy: matrix: - name: ['novu/api-ee', 'novu/api'] + name: ['novu/api-ee', 'novu/api', 'novu/api-ee-clerk'] uses: ./.github/workflows/reusable-api-e2e.yml with: ee: ${{ contains (matrix.name,'-ee') }} + ee-clerk: ${{ contains (matrix.name,'-ee-clerk') }} job-name: ${{ matrix.name }} secrets: inherit diff --git a/apps/api/src/app/inbox/dtos/button-type-request.dto.ts b/apps/api/src/app/inbox/dtos/button-type-request.dto.ts deleted file mode 100644 index cf5d4df77e5..00000000000 --- a/apps/api/src/app/inbox/dtos/button-type-request.dto.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { IsDefined, IsEnum } from 'class-validator'; -import { ButtonTypeEnum } from '@novu/shared'; - -export class ButtonTypeRequestDto { - @IsEnum(ButtonTypeEnum) - @IsDefined() - readonly buttonType: ButtonTypeEnum; -} diff --git a/apps/api/src/app/inbox/dtos/get-preferences-response.dto.ts b/apps/api/src/app/inbox/dtos/get-preferences-response.dto.ts new file mode 100644 index 00000000000..3bea68ba613 --- /dev/null +++ b/apps/api/src/app/inbox/dtos/get-preferences-response.dto.ts @@ -0,0 +1,16 @@ +import { IPreferenceChannels, IPreferenceOverride, ITemplateConfiguration, PreferenceLevelEnum } from '@novu/shared'; +import { IsDefined, IsEnum, IsOptional } from 'class-validator'; + +export class GetPreferencesResponseDto { + @IsDefined() + @IsEnum({ + enum: PreferenceLevelEnum, + }) + level: PreferenceLevelEnum; + + @IsOptional() + workflow?: ITemplateConfiguration; + + @IsDefined() + preferences: { enabled: boolean; channels: IPreferenceChannels; overrides?: IPreferenceOverride[] }; +} diff --git a/apps/api/src/app/inbox/e2e/get-preferences.e2e.ts b/apps/api/src/app/inbox/e2e/get-preferences.e2e.ts new file mode 100644 index 00000000000..5ceb92e99d2 --- /dev/null +++ b/apps/api/src/app/inbox/e2e/get-preferences.e2e.ts @@ -0,0 +1,55 @@ +import { SubscriberRepository } from '@novu/dal'; +import { UserSession } from '@novu/testing'; +import { expect } from 'chai'; + +describe('Get all preferences - /inbox/preferences (GET)', function () { + let session: UserSession; + let subscriberRepository: SubscriberRepository; + + beforeEach(async () => { + session = new UserSession(); + subscriberRepository = new SubscriberRepository(); + await session.initialize(); + }); + + it('should always get the global preferences even if workflow preferences are not present', async function () { + const response = await session.testAgent + .get('/v1/inbox/preferences') + .set('Authorization', `Bearer ${session.subscriberToken}`); + + const globalPreference = response.body.data[0]; + + expect(globalPreference.preferences.channels.email).to.equal(true); + expect(globalPreference.preferences.channels.in_app).to.equal(true); + expect(globalPreference.level).to.equal('global'); + expect(response.body.data.length).to.equal(1); + }); + + it('should get both global and workflow preferences if workflow is present', async function () { + await session.createTemplate({ + noFeedId: true, + }); + + const response = await session.testAgent + .get('/v1/inbox/preferences') + .set('Authorization', `Bearer ${session.subscriberToken}`); + + const globalPreference = response.body.data[0]; + + expect(globalPreference.preferences.channels.email).to.equal(true); + expect(globalPreference.preferences.channels.in_app).to.equal(true); + expect(globalPreference.level).to.equal('global'); + + const workflowPreference = response.body.data[1]; + + expect(workflowPreference.preferences.channels.email).to.equal(true); + expect(workflowPreference.preferences.channels.in_app).to.equal(true); + expect(workflowPreference.level).to.equal('template'); + }); + + it('should throw error when made unauthorized call', async function () { + const response = await session.testAgent.get(`/v1/inbox/preferences`).set('Authorization', `Bearer InvalidToken`); + + expect(response.status).to.equal(401); + }); +}); diff --git a/apps/api/src/app/inbox/inbox.controller.ts b/apps/api/src/app/inbox/inbox.controller.ts index 517db93b336..42836734dba 100644 --- a/apps/api/src/app/inbox/inbox.controller.ts +++ b/apps/api/src/app/inbox/inbox.controller.ts @@ -27,6 +27,9 @@ import { UpdateNotificationActionCommand } from './usecases/update-notification- import { UpdateAllNotificationsRequestDto } from './dtos/update-all-notifications-request.dto'; import { UpdateAllNotificationsCommand } from './usecases/update-all-notifications/update-all-notifications.command'; import { UpdateAllNotifications } from './usecases/update-all-notifications/update-all-notifications.usecase'; +import { GetPreferences } from './usecases/get-preferences/get-preferences.usecase'; +import { GetPreferencesCommand } from './usecases/get-preferences/get-preferences.command'; +import { GetPreferencesResponseDto } from './dtos/get-preferences-response.dto'; @ApiCommonResponses() @Controller('/inbox') @@ -38,7 +41,8 @@ export class InboxController { private notificationsCountUsecase: NotificationsCount, private markNotificationAsUsecase: MarkNotificationAs, private updateNotificationActionUsecase: UpdateNotificationAction, - private updateAllNotifications: UpdateAllNotifications + private updateAllNotifications: UpdateAllNotifications, + private getPreferencesUsecase: GetPreferences ) {} @Post('/session') @@ -94,6 +98,20 @@ export class InboxController { return res; } + @UseGuards(AuthGuard('subscriberJwt')) + @Get('/preferences') + async getAllPreferences( + @SubscriberSession() subscriberSession: SubscriberEntity + ): Promise { + return await this.getPreferencesUsecase.execute( + GetPreferencesCommand.create({ + organizationId: subscriberSession._organizationId, + subscriberId: subscriberSession.subscriberId, + environmentId: subscriberSession._environmentId, + }) + ); + } + @UseGuards(AuthGuard('subscriberJwt')) @Patch('/notifications/:id/read') async markNotificationAsRead( diff --git a/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.command.ts b/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.command.ts new file mode 100644 index 00000000000..a87056938bc --- /dev/null +++ b/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.command.ts @@ -0,0 +1,3 @@ +import { EnvironmentWithSubscriber } from '../../../shared/commands/project.command'; + +export class GetPreferencesCommand extends EnvironmentWithSubscriber {} diff --git a/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.spec.ts b/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.spec.ts new file mode 100644 index 00000000000..f2f3ebdd5f5 --- /dev/null +++ b/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.spec.ts @@ -0,0 +1,155 @@ +import { + AnalyticsService, + GetSubscriberGlobalPreference, + GetSubscriberTemplatePreference, +} from '@novu/application-generic'; +import { NotificationTemplateRepository, SubscriberRepository } from '@novu/dal'; +import { PreferenceLevelEnum } from '@novu/shared'; +import { expect } from 'chai'; +import { sub } from 'date-fns'; +import sinon from 'sinon'; +import { AnalyticsEventsEnum } from '../../utils'; +import { GetPreferences } from './get-preferences.usecase'; + +const mockedSubscriber: any = { _id: '123', subscriberId: 'test-mockSubscriber', firstName: 'test', lastName: 'test' }; +const mockedWorkflowPreference: any = { + template: {}, + preference: { + enabled: true, + channels: { + email: true, + in_app: true, + sms: false, + push: false, + chat: true, + }, + overrides: { + email: false, + in_app: false, + sms: true, + push: true, + chat: false, + }, + }, +}; + +const mockedGlobalPreferences: any = { + preference: { + enabled: true, + channels: { + email: true, + in_app: true, + sms: false, + push: false, + chat: true, + }, + }, +}; +const mockedPreferencesResponse: any = [ + { level: PreferenceLevelEnum.GLOBAL, preferences: mockedGlobalPreferences.preference }, + { + level: PreferenceLevelEnum.TEMPLATE, + preferences: mockedWorkflowPreference.preference, + workflow: mockedWorkflowPreference.template, + }, +]; + +const mockedWorkflow: any = [{}]; + +describe('GetPreferences', () => { + let getPreferences: GetPreferences; + let subscriberRepositoryMock: sinon.SinonStubbedInstance; + let getSubscriberWorkflowMock: sinon.SinonStubbedInstance; + let analyticsServiceMock: sinon.SinonStubbedInstance; + let getSubscriberGlobalPreferenceMock: sinon.SinonStubbedInstance; + let notificationTemplateRepositoryMock: sinon.SinonStubbedInstance; + + beforeEach(() => { + subscriberRepositoryMock = sinon.createStubInstance(SubscriberRepository); + getSubscriberWorkflowMock = sinon.createStubInstance(GetSubscriberTemplatePreference); + analyticsServiceMock = sinon.createStubInstance(AnalyticsService); + getSubscriberGlobalPreferenceMock = sinon.createStubInstance(GetSubscriberGlobalPreference); + notificationTemplateRepositoryMock = sinon.createStubInstance(NotificationTemplateRepository); + + getPreferences = new GetPreferences( + subscriberRepositoryMock as any, + notificationTemplateRepositoryMock as any, + getSubscriberWorkflowMock as any, + getSubscriberGlobalPreferenceMock as any, + analyticsServiceMock as any + ); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('it should throw exception when subscriber is not found', async () => { + const command = { + environmentId: 'env-1', + organizationId: 'org-1', + subscriberId: 'not-found', + }; + + subscriberRepositoryMock.findOne.resolves(undefined); + + try { + await getPreferences.execute(command); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error.message).to.equal(`Subscriber with id: ${command.subscriberId} not found`); + } + }); + + it('it should return subscriber preferences', async () => { + const command = { + environmentId: 'env-1', + organizationId: 'org-1', + subscriberId: 'test-mockSubscriber', + }; + + subscriberRepositoryMock.findBySubscriberId.resolves(mockedSubscriber); + getSubscriberGlobalPreferenceMock.execute.resolves(mockedGlobalPreferences); + notificationTemplateRepositoryMock.getActiveList.resolves(mockedWorkflow); + getSubscriberWorkflowMock.execute.resolves(mockedWorkflowPreference); + + const result = await getPreferences.execute(command); + + expect(subscriberRepositoryMock.findBySubscriberId.calledOnce).to.be.true; + expect(subscriberRepositoryMock.findBySubscriberId.firstCall.args).to.deep.equal([ + command.environmentId, + command.subscriberId, + ]); + expect(getSubscriberGlobalPreferenceMock.execute.calledOnce).to.be.true; + expect(getSubscriberGlobalPreferenceMock.execute.firstCall.args).to.deep.equal([command]); + expect(notificationTemplateRepositoryMock.getActiveList.calledOnce).to.be.true; + expect(notificationTemplateRepositoryMock.getActiveList.firstCall.args).to.deep.equal([ + command.organizationId, + command.environmentId, + true, + ]); + expect(getSubscriberWorkflowMock.execute.calledOnce).to.be.true; + expect(getSubscriberWorkflowMock.execute.firstCall.args).to.deep.equal([ + { + organizationId: command.organizationId, + subscriberId: command.subscriberId, + environmentId: command.environmentId, + template: mockedWorkflow[0], + subscriber: mockedSubscriber, + }, + ]); + + expect(analyticsServiceMock.mixpanelTrack.calledOnce).to.be.true; + expect(analyticsServiceMock.mixpanelTrack.firstCall.args).to.deep.equal([ + AnalyticsEventsEnum.FETCH_PREFERENCES, + '', + { + _organization: command.organizationId, + subscriberId: command.subscriberId, + workflowSize: 1, + }, + ]); + + expect(result).to.deep.equal(mockedPreferencesResponse); + }); +}); diff --git a/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.usecase.ts b/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.usecase.ts new file mode 100644 index 00000000000..36a98b744c8 --- /dev/null +++ b/apps/api/src/app/inbox/usecases/get-preferences/get-preferences.usecase.ts @@ -0,0 +1,76 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { + AnalyticsService, + GetSubscriberGlobalPreference, + GetSubscriberGlobalPreferenceCommand, + GetSubscriberTemplatePreference, + GetSubscriberTemplatePreferenceCommand, +} from '@novu/application-generic'; +import { NotificationTemplateRepository, SubscriberRepository } from '@novu/dal'; +import { ISubscriberPreferences, PreferenceLevelEnum } from '@novu/shared'; +import { AnalyticsEventsEnum } from '../../utils'; +import { GetPreferencesCommand } from './get-preferences.command'; + +@Injectable() +export class GetPreferences { + constructor( + private subscriberRepository: SubscriberRepository, + private notificationTemplateRepository: NotificationTemplateRepository, + private getSubscriberTemplatePreferenceUsecase: GetSubscriberTemplatePreference, + private getSubscriberGlobalPreference: GetSubscriberGlobalPreference, + private analyticsService: AnalyticsService + ) {} + + async execute(command: GetPreferencesCommand): Promise { + const subscriber = await this.subscriberRepository.findBySubscriberId(command.environmentId, command.subscriberId); + + if (!subscriber) { + throw new NotFoundException(`Subscriber with id: ${command.subscriberId} not found`); + } + + const globalPreference = await this.getSubscriberGlobalPreference.execute( + GetSubscriberGlobalPreferenceCommand.create({ + organizationId: command.organizationId, + environmentId: command.environmentId, + subscriberId: command.subscriberId, + }) + ); + + const updatedGlobalPreference = { + level: PreferenceLevelEnum.GLOBAL, + preferences: globalPreference.preference, + }; + + const workflowList = + (await this.notificationTemplateRepository.getActiveList(command.organizationId, command.environmentId, true)) || + []; + + this.analyticsService.mixpanelTrack(AnalyticsEventsEnum.FETCH_PREFERENCES, '', { + _organization: command.organizationId, + subscriberId: command.subscriberId, + workflowSize: workflowList.length, + }); + + const workflowPreferences = await Promise.all( + workflowList.map(async (workflow) => { + const workflowPreference = await this.getSubscriberTemplatePreferenceUsecase.execute( + GetSubscriberTemplatePreferenceCommand.create({ + organizationId: command.organizationId, + subscriberId: command.subscriberId, + environmentId: command.environmentId, + template: workflow, + subscriber, + }) + ); + + return { + level: PreferenceLevelEnum.TEMPLATE, + preferences: workflowPreference.preference, + workflow: workflowPreference.template, + }; + }) + ); + + return [updatedGlobalPreference, ...workflowPreferences]; + } +} diff --git a/apps/api/src/app/inbox/usecases/index.ts b/apps/api/src/app/inbox/usecases/index.ts index 10c878bcafc..7a64d165336 100644 --- a/apps/api/src/app/inbox/usecases/index.ts +++ b/apps/api/src/app/inbox/usecases/index.ts @@ -1,10 +1,12 @@ -import { Session } from './session/session.usecase'; -import { NotificationsCount } from './notifications-count/notifications-count.usecase'; +import { GetSubscriberGlobalPreference, GetSubscriberTemplatePreference } from '@novu/application-generic'; import { GetNotifications } from './get-notifications/get-notifications.usecase'; +import { GetPreferences } from './get-preferences/get-preferences.usecase'; import { MarkManyNotificationsAs } from './mark-many-notifications-as/mark-many-notifications-as.usecase'; import { MarkNotificationAs } from './mark-notification-as/mark-notification-as.usecase'; -import { UpdateNotificationAction } from './update-notification-action/update-notification-action.usecase'; +import { NotificationsCount } from './notifications-count/notifications-count.usecase'; +import { Session } from './session/session.usecase'; import { UpdateAllNotifications } from './update-all-notifications/update-all-notifications.usecase'; +import { UpdateNotificationAction } from './update-notification-action/update-notification-action.usecase'; export const USE_CASES = [ Session, @@ -14,4 +16,7 @@ export const USE_CASES = [ MarkNotificationAs, UpdateNotificationAction, UpdateAllNotifications, + GetPreferences, + GetSubscriberGlobalPreference, + GetSubscriberTemplatePreference, ]; diff --git a/apps/api/src/app/inbox/utils/analytics.ts b/apps/api/src/app/inbox/utils/analytics.ts index 79f6423ab99..814e420b613 100644 --- a/apps/api/src/app/inbox/utils/analytics.ts +++ b/apps/api/src/app/inbox/utils/analytics.ts @@ -4,4 +4,5 @@ export enum AnalyticsEventsEnum { MARK_NOTIFICATION_AS = 'Mark Notification As - [Inbox]', UPDATE_NOTIFICATION_ACTION = 'Update Notification Action - [Inbox]', UPDATE_ALL_NOTIFICATIONS = 'Update All Notifications - [Inbox]', + FETCH_PREFERENCES = 'Fetch Preferences - [Inbox]', } diff --git a/apps/api/src/app/inbox/utils/notification-mapper.ts b/apps/api/src/app/inbox/utils/notification-mapper.ts index 5f50f3aac24..44bc8723792 100644 --- a/apps/api/src/app/inbox/utils/notification-mapper.ts +++ b/apps/api/src/app/inbox/utils/notification-mapper.ts @@ -13,8 +13,8 @@ const mapSingleItem = ({ archivedAt, channel, subscriber, - actorSubscriber, - actor, + subject, + avatar, cta, tags, }: MessageEntity): InboxNotification => { @@ -32,7 +32,7 @@ const mapSingleItem = ({ return { id: _id, - // subject: subject, + subject, body: content as string, to, isRead: read, @@ -40,16 +40,7 @@ const mapSingleItem = ({ createdAt, readAt: lastReadDate, archivedAt, - actor: actorSubscriber - ? { - id: actorSubscriber._id, - firstName: actorSubscriber.firstName, - lastName: actorSubscriber.lastName, - avatar: actorSubscriber.avatar, - subscriberId: actorSubscriber.subscriberId, - } - : undefined, - avatar: actor, + avatar, primaryAction: primaryCta && { label: primaryCta.content, url: cta?.data.url, diff --git a/apps/api/src/app/inbox/utils/types.ts b/apps/api/src/app/inbox/utils/types.ts index e67546cb832..dc9c0629564 100644 --- a/apps/api/src/app/inbox/utils/types.ts +++ b/apps/api/src/app/inbox/utils/types.ts @@ -1,9 +1,4 @@ -import { ActorTypeEnum, ChannelTypeEnum } from '@novu/shared'; - -type Avatar = { - type: ActorTypeEnum; - data: string | null; -}; +import type { ChannelTypeEnum } from '@novu/shared'; export type Subscriber = { id: string; @@ -29,8 +24,7 @@ export type InboxNotification = { createdAt: string; readAt?: string | null; archivedAt?: string | null; - actor?: Subscriber; - avatar?: Avatar; + avatar?: string; primaryAction?: Action; secondaryAction?: Action; channelType: ChannelTypeEnum; diff --git a/apps/api/src/metadata.ts b/apps/api/src/metadata.ts index f241854acf9..e3ec154685c 100644 --- a/apps/api/src/metadata.ts +++ b/apps/api/src/metadata.ts @@ -42,6 +42,7 @@ export default async () => { ["../../../libs/shared/dist/cjs/dto/workflows/workflow.dto"]: await import("../../../libs/shared/dist/cjs/dto/workflows/workflow.dto"), ["./app/workflow-overrides/dto/shared"]: await import("./app/workflow-overrides/dto/shared"), ["../../../libs/shared/dist/cjs/entities/messages/action.enum"]: await import("../../../libs/shared/dist/cjs/entities/messages/action.enum"), + ["../../../libs/shared/dist/cjs/entities/subscriber-preference/subscriber-preference.interface"]: await import("../../../libs/shared/dist/cjs/entities/subscriber-preference/subscriber-preference.interface"), ["./app/environments/dtos/environment-response.dto"]: await import("./app/environments/dtos/environment-response.dto"), ["./app/shared/dtos/api-key"]: await import("./app/shared/dtos/api-key"), ["./app/notification-groups/dtos/notification-group-response.dto"]: await import("./app/notification-groups/dtos/notification-group-response.dto"), @@ -88,7 +89,8 @@ export default async () => { ["./app/workflow-overrides/dto/get-workflow-overrides-response.dto"]: await import("./app/workflow-overrides/dto/get-workflow-overrides-response.dto"), ["./app/inbox/dtos/subscriber-session-response.dto"]: await import("./app/inbox/dtos/subscriber-session-response.dto"), ["./app/inbox/dtos/get-notifications-response.dto"]: await import("./app/inbox/dtos/get-notifications-response.dto"), - ["./app/inbox/dtos/get-notifications-count-response.dto"]: await import("./app/inbox/dtos/get-notifications-count-response.dto") + ["./app/inbox/dtos/get-notifications-count-response.dto"]: await import("./app/inbox/dtos/get-notifications-count-response.dto"), + ["./app/inbox/dtos/get-preferences-response.dto"]: await import("./app/inbox/dtos/get-preferences-response.dto") }; - return { "@nestjs/swagger": { "models": [[import("./app/user/usecases/get-my-profile/get-my-profile.dto"), { "GetMyProfileCommand": {} }], [import("./app/user/dtos/user-response.dto"), { "ServicesHashesDto": { intercom: { required: false, type: () => String } }, "UserResponseDto": { _id: { required: true, type: () => String }, resetToken: { required: false, type: () => String }, resetTokenDate: { required: false, type: () => String }, firstName: { required: false, type: () => String, nullable: true }, lastName: { required: false, type: () => String, nullable: true }, email: { required: false, type: () => String, nullable: true }, profilePicture: { required: false, type: () => String, nullable: true }, createdAt: { required: true, type: () => String }, showOnBoarding: { required: false, type: () => Boolean }, servicesHashes: { required: false, type: () => t["./app/user/dtos/user-response.dto"].ServicesHashesDto }, jobTitle: { required: false, enum: t["../../../libs/shared/dist/cjs/types/organization/index"].JobTitleEnum }, hasPassword: { required: true, type: () => Boolean } } }], [import("./app/user/dtos/user-onboarding-request.dto"), { "UserOnboardingRequestDto": { showOnBoarding: { required: true, type: () => Boolean } } }], [import("./app/user/dtos/change-profile-email.dto"), { "ChangeProfileEmailDto": { email: { required: true, type: () => String } } }], [import("./app/user/dtos/user-onboarding-tour-request.dto"), { "UserOnboardingTourRequestDto": { showOnBoardingTour: { required: true, type: () => Number } } }], [import("./app/user/dtos/update-profile-request.dto"), { "UpdateProfileRequestDto": { firstName: { required: true, type: () => String }, lastName: { required: true, type: () => String }, profilePicture: { required: false, type: () => String } } }], [import("./app/auth/dtos/user-registration.dto"), { "UserRegistrationBodyDto": { email: { required: true, type: () => String }, firstName: { required: true, type: () => String }, lastName: { required: false, type: () => String }, organizationName: { required: false, type: () => String }, origin: { required: false, enum: t["../../../libs/shared/dist/cjs/types/analytics/index"].SignUpOriginEnum }, jobTitle: { required: false, enum: t["../../../libs/shared/dist/cjs/types/organization/index"].JobTitleEnum }, domain: { required: false, type: () => String }, productUseCases: { required: false, type: () => Object } } }], [import("./app/layouts/dtos/layout.dto"), { "LayoutDto": { _id: { required: false, type: () => String }, _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _creatorId: { required: true, type: () => String }, name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, description: { required: false, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, content: { required: true, type: () => String }, contentType: { required: true, type: () => String }, variables: { required: false, type: () => [Object] }, isDefault: { required: true, type: () => Boolean }, isDeleted: { required: true, type: () => Boolean }, createdAt: { required: false, type: () => String }, updatedAt: { required: false, type: () => String }, _parentId: { required: false, type: () => String } } }], [import("./app/layouts/dtos/create-layout.dto"), { "CreateLayoutResponseDto": { _id: { required: true, type: () => String } }, "CreateLayoutRequestDto": { name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, description: { required: true, type: () => String }, content: { required: true, type: () => String }, variables: { required: false, type: () => [Object] }, isDefault: { required: false, type: () => Boolean } } }], [import("./app/layouts/dtos/filter-layouts.dto"), { "FilterLayoutsRequestDto": { page: { required: false, type: () => Number, minimum: 0 }, pageSize: { required: false, type: () => Number, minimum: 0 }, sortBy: { required: false, type: () => String }, orderBy: { required: false, type: () => Object } }, "FilterLayoutsResponseDto": { data: { required: true, type: () => [t["./app/layouts/dtos/layout.dto"].LayoutDto] }, page: { required: true, type: () => Number }, pageSize: { required: true, type: () => Number }, totalCount: { required: true, type: () => Number } } }], [import("./app/layouts/dtos/get-layout.dto"), { "GetLayoutResponseDto": {} }], [import("./app/layouts/dtos/update-layout.dto"), { "UpdateLayoutResponseDto": {}, "UpdateLayoutRequestDto": { name: { required: false, type: () => String }, identifier: { required: true, type: () => String }, description: { required: false, type: () => String }, content: { required: false, type: () => String }, variables: { required: false, type: () => [Object] }, isDefault: { required: false, type: () => Boolean } } }], [import("./app/auth/dtos/login.dto"), { "LoginBodyDto": { email: { required: true, type: () => String }, password: { required: true, type: () => String } } }], [import("./app/auth/dtos/password-reset.dto"), { "PasswordResetBodyDto": { token: { required: true, type: () => String } }, "PasswordResetRequestBodyDto": { email: { required: true, type: () => String } } }], [import("./app/auth/dtos/update-password.dto"), { "UpdatePasswordBodyDto": { confirmPassword: { required: true, type: () => String }, currentPassword: { required: true, type: () => String } } }], [import("./app/environments/dtos/environment-response.dto"), { "EnvironmentResponseDto": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, identifier: { required: true, type: () => String }, apiKeys: { required: false, type: () => [Object] }, _parentId: { required: true, type: () => String } } }], [import("./app/inbound-parse/dtos/get-mx-record.dto"), { "GetMxRecordResponseDto": { mxRecordConfigured: { required: true, type: () => Boolean } } }], [import("./app/environments/dtos/create-environment-request.dto"), { "CreateEnvironmentRequestDto": { name: { required: true, type: () => String }, parentId: { required: false, type: () => String } } }], [import("./app/environments/dtos/update-environment-request.dto"), { "InBoundParseDomainDto": { inboundParseDomain: { required: false, type: () => String } }, "BridgeConfigurationDto": { url: { required: false, type: () => String } }, "UpdateEnvironmentRequestDto": { name: { required: false, type: () => String }, identifier: { required: false, type: () => String }, parentId: { required: false, type: () => String }, dns: { required: false, type: () => t["./app/environments/dtos/update-environment-request.dto"].InBoundParseDomainDto }, bridge: { required: false, type: () => t["./app/environments/dtos/update-environment-request.dto"].BridgeConfigurationDto } } }], [import("./app/notification-groups/dtos/create-notification-group-request.dto"), { "CreateNotificationGroupRequestDto": { name: { required: true, type: () => String } } }], [import("./app/notification-groups/dtos/notification-group-response.dto"), { "NotificationGroupResponseDto": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _parentId: { required: false, type: () => String } } }], [import("./app/notification-groups/dtos/delete-notification-group-response.dto"), { "DeleteNotificationGroupResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, type: () => String } } }], [import("./app/change/dtos/change-response.dto"), { "ChangeResponseDto": { _id: { required: false, type: () => String }, _creatorId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _entityId: { required: true, type: () => String }, enabled: { required: true, type: () => Boolean }, type: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/change/change.interface"].ChangeEntityTypeEnum }, change: { required: true, type: () => Object }, createdAt: { required: true, type: () => String }, _parentId: { required: false, type: () => String } }, "ChangesResponseDto": { totalCount: { required: true, type: () => Number }, data: { required: true, type: () => [t["./app/change/dtos/change-response.dto"].ChangeResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/change/dtos/change-request.dto"), { "ChangesRequestDto": { promoted: { required: true, type: () => String } } }], [import("./app/change/dtos/bulk-apply-change.dto"), { "BulkApplyChangeDto": { changeIds: { required: true, type: () => [String] } } }], [import("./app/integrations/dtos/credentials.dto"), { "CredentialsDto": { apiKey: { required: false, type: () => String }, user: { required: false, type: () => String }, secretKey: { required: false, type: () => String }, domain: { required: false, type: () => String }, password: { required: false, type: () => String }, host: { required: false, type: () => String }, port: { required: false, type: () => String }, secure: { required: false, type: () => Boolean }, region: { required: false, type: () => String }, accountSid: { required: false, type: () => String }, messageProfileId: { required: false, type: () => String }, token: { required: false, type: () => String }, from: { required: false, type: () => String }, senderName: { required: false, type: () => String }, projectName: { required: false, type: () => String }, applicationId: { required: false, type: () => String }, clientId: { required: false, type: () => String }, requireTls: { required: false, type: () => Boolean }, ignoreTls: { required: false, type: () => Boolean }, tlsOptions: { required: false, type: () => Object }, baseUrl: { required: false, type: () => String }, webhookUrl: { required: false, type: () => String }, redirectUrl: { required: false, type: () => String }, hmac: { required: false, type: () => Boolean }, serviceAccount: { required: false, type: () => String }, ipPoolName: { required: false, type: () => String }, apiKeyRequestHeader: { required: false, type: () => String }, secretKeyRequestHeader: { required: false, type: () => String }, idPath: { required: false, type: () => String }, datePath: { required: false, type: () => String }, apiToken: { required: false, type: () => String }, authenticateByToken: { required: false, type: () => Boolean }, authenticationTokenKey: { required: false, type: () => String }, instanceId: { required: false, type: () => String }, alertUid: { required: false, type: () => String }, title: { required: false, type: () => String }, imageUrl: { required: false, type: () => String }, state: { required: false, type: () => String }, externalLink: { required: false, type: () => String }, channelId: { required: false, type: () => String }, phoneNumberIdentification: { required: false, type: () => String } } }], [import("./app/integrations/dtos/integration-response.dto"), { "IntegrationResponseDto": { _id: { required: false, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, providerId: { required: true, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, credentials: { required: true, type: () => t["./app/integrations/dtos/credentials.dto"].CredentialsDto }, active: { required: true, type: () => Boolean }, deleted: { required: true, type: () => Boolean }, deletedAt: { required: true, type: () => String }, deletedBy: { required: true, type: () => String }, primary: { required: true, type: () => Boolean }, conditions: { required: false, type: () => [t["./app/shared/dtos/step-filter"].StepFilter] } } }], [import("./app/integrations/dtos/create-integration-request.dto"), { "CreateIntegrationRequestDto": { name: { required: false, type: () => String }, identifier: { required: false, type: () => String }, _environmentId: { required: false, type: () => String }, providerId: { required: true, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, credentials: { required: false, type: () => t["./app/integrations/dtos/credentials.dto"].CredentialsDto }, active: { required: false, type: () => Boolean }, check: { required: false, type: () => Boolean }, conditions: { required: false, type: () => [t["./app/shared/dtos/step-filter"].StepFilter] } } }], [import("./app/integrations/dtos/update-integration.dto"), { "UpdateIntegrationRequestDto": { name: { required: false, type: () => String }, identifier: { required: false, type: () => String }, _environmentId: { required: false, type: () => String }, active: { required: false, type: () => Boolean }, credentials: { required: false, type: () => t["./app/integrations/dtos/credentials.dto"].CredentialsDto }, check: { required: false, type: () => Boolean }, conditions: { required: false, type: () => [t["./app/shared/dtos/step-filter"].StepFilter] } } }], [import("./app/organization/dtos/create-organization.dto"), { "CreateOrganizationDto": { name: { required: true, type: () => String }, logo: { required: false, type: () => String }, jobTitle: { required: false, enum: t["../../../libs/shared/dist/cjs/types/organization/index"].JobTitleEnum }, domain: { required: false, type: () => String }, language: { required: false, type: () => [String] } } }], [import("./app/organization/dtos/rename-organization.dto"), { "RenameOrganizationDto": { name: { required: true, type: () => String } } }], [import("./app/organization/dtos/update-branding-details.dto"), { "UpdateBrandingDetailsDto": { logo: { required: true, type: () => String }, color: { required: true, type: () => String }, fontColor: { required: true, type: () => String }, contentBackground: { required: true, type: () => String }, fontFamily: { required: false, type: () => String } } }], [import("./app/organization/dtos/update-member-roles.dto"), { "UpdateMemberRolesDto": { role: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/organization/member.enum"].MemberRoleEnum.ADMIN } } }], [import("./app/organization/dtos/organization-response.dto"), { "IPartnerConfigurationResponseDto": { projectIds: { required: false, type: () => [String] }, accessToken: { required: true, type: () => String }, configurationId: { required: true, type: () => String }, teamId: { required: true, type: () => String }, partnerType: { required: true, type: () => String, enum: t["../../../libs/dal/dist/repositories/organization/organization.entity"].PartnerTypeEnum } }, "OrganizationBrandingResponseDto": { direction: { required: false, enum: t["../../../libs/dal/dist/repositories/organization/organization.entity"].DirectionEnum } }, "OrganizationResponseDto": { name: { required: true, type: () => String }, logo: { required: false, type: () => String }, branding: { required: true, type: () => t["./app/organization/dtos/organization-response.dto"].OrganizationBrandingResponseDto }, partnerConfigurations: { required: true, type: () => [t["./app/organization/dtos/organization-response.dto"].IPartnerConfigurationResponseDto] } } }], [import("./app/organization/dtos/member-response.dto"), { "MemberUserDto": { _id: { required: true, type: () => String }, firstName: { required: true, type: () => String }, lastName: { required: true, type: () => String }, email: { required: true, type: () => String } }, "MemberInviteDTO": { email: { required: true, type: () => String }, token: { required: true, type: () => String }, invitationDate: { required: true, type: () => Date }, answerDate: { required: false, type: () => Date }, _inviterId: { required: true, type: () => String } }, "MemberResponseDto": { _id: { required: true, type: () => String }, _userId: { required: true, type: () => String }, user: { required: false, type: () => t["./app/organization/dtos/member-response.dto"].MemberUserDto }, roles: { required: false, enum: t["../../../libs/shared/dist/cjs/entities/organization/member.enum"].MemberRoleEnum }, invite: { required: false, type: () => t["./app/organization/dtos/member-response.dto"].MemberInviteDTO }, memberStatus: { required: false, enum: t["../../../libs/shared/dist/cjs/entities/organization/member.interface"].MemberStatusEnum }, _organizationId: { required: true, type: () => String } } }], [import("./app/testing/dtos/seed-data.dto"), { "SeedDataBodyDto": {} }], [import("./app/testing/dtos/idempotency.dto"), { "IdempotencyBodyDto": { data: { required: true, type: () => Number } } }], [import("./app/execution-details/dtos/execution-details-request.dto"), { "ExecutionDetailsRequestDto": { notificationId: { required: true, type: () => String }, subscriberId: { required: true, type: () => String } } }], [import("./app/workflows/dto/workflow-response.dto"), { "NotificationGroup": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _parentId: { required: false, type: () => String } }, "NotificationTriggerVariable": { name: { required: true, type: () => String } }, "NotificationTrigger": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerTypeEnum }, identifier: { required: true, type: () => String }, variables: { required: true, type: () => [t["./app/workflows/dto/workflow-response.dto"].NotificationTriggerVariable] }, subscriberVariables: { required: false, type: () => [t["./app/workflows/dto/workflow-response.dto"].NotificationTriggerVariable] } }, "WorkflowResponse": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, description: { required: true, type: () => String }, active: { required: true, type: () => Boolean }, draft: { required: true, type: () => Boolean }, preferenceSettings: { required: true, type: () => t["./app/shared/dtos/preference-channels"].PreferenceChannels }, critical: { required: true, type: () => Boolean }, tags: { required: true, type: () => [String] }, steps: { required: true, type: () => [t["./app/shared/dtos/notification-step"].NotificationStep] }, _organizationId: { required: true, type: () => String }, _creatorId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, triggers: { required: true, type: () => [t["./app/workflows/dto/workflow-response.dto"].NotificationTrigger] }, _notificationGroupId: { required: true, type: () => String }, _parentId: { required: false, type: () => String }, deleted: { required: true, type: () => Boolean }, deletedAt: { required: true, type: () => String }, deletedBy: { required: true, type: () => String }, notificationGroup: { required: false, type: () => t["./app/workflows/dto/workflow-response.dto"].NotificationGroup }, data: { required: false, type: () => Object }, workflowIntegrationStatus: { required: false, type: () => Object } } }], [import("./app/workflows/dto/workflows.response.dto"), { "WorkflowsResponseDto": { totalCount: { required: true, type: () => Number }, data: { required: true, type: () => [t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/workflows/dto/change-workflow-status-request.dto"), { "ChangeWorkflowStatusRequestDto": { active: { required: true, type: () => Boolean } } }], [import("./app/workflows/dto/create-workflow.request.dto"), { "CreateWorkflowRequestDto": { name: { required: true, type: () => String }, notificationGroupId: { required: true, type: () => String }, notificationGroup: { required: false, type: () => Object }, tags: { required: true, type: () => [String] }, description: { required: true, type: () => String, maxLength: 1000 }, steps: { required: true, type: () => [t["./app/shared/dtos/notification-step"].NotificationStep] }, active: { required: false, type: () => Boolean }, draft: { required: false, type: () => Boolean }, critical: { required: false, type: () => Boolean }, blueprintId: { required: false, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/workflows/dto/update-workflow-request.dto"), { "UpdateWorkflowRequestDto": { name: { required: true, type: () => String }, tags: { required: true, type: () => [String] }, description: { required: true, type: () => String, maxLength: 300 }, identifier: { required: false, type: () => String }, steps: { required: true, type: () => [t["./app/shared/dtos/notification-step"].NotificationStep] }, notificationGroupId: { required: true, type: () => String }, critical: { required: false, type: () => Boolean }, data: { required: false, type: () => Object } } }], [import("./app/workflows/dto/variables.response.dto"), { "VariablesResponseDto": { translations: { required: true, type: () => Object }, system: { required: true, type: () => Object } } }], [import("./app/workflows/dto/workflows-request.dto"), { "WorkflowsRequestDto": {} }], [import("./app/events/dtos/test-email-request.dto"), { "TestSendEmailRequestDto": { contentType: { required: true, type: () => Object }, payload: { required: true, type: () => Object }, subject: { required: true, type: () => String }, preheader: { required: false, type: () => String }, content: { required: true, type: () => Object }, to: { required: true, type: () => Object }, layoutId: { required: false, type: () => String, nullable: true }, bridge: { required: false, type: () => Boolean, default: false }, stepId: { required: false, type: () => String, nullable: true }, workflowId: { required: false, type: () => String, nullable: true }, inputs: { required: true, type: () => Object }, controls: { required: true, type: () => Object } } }], [import("./app/events/dtos/trigger-event-response.dto"), { "TriggerEventResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, enum: t["../../../libs/shared/dist/cjs/types/events/index"].TriggerEventStatusEnum }, error: { required: false, type: () => [String] }, transactionId: { required: false, type: () => String } } }], [import("./app/subscribers/dtos/create-subscriber-request.dto"), { "CreateSubscriberRequestDto": { subscriberId: { required: true, type: () => String }, email: { required: false, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, phone: { required: false, type: () => String }, avatar: { required: false, type: () => String }, locale: { required: false, type: () => String }, data: { required: false, type: () => Object }, channels: { required: false, type: () => [t["./app/subscribers/dtos/create-subscriber-request.dto"].SubscriberChannelDto] } }, "SubscriberChannelDto": { providerId: { required: true, type: () => Object }, integrationIdentifier: { required: false, type: () => String }, credentials: { required: true, type: () => t["./app/subscribers/dtos/create-subscriber-request.dto"].ChannelCredentialsDto } }, "ChannelCredentialsDto": { webhookUrl: { required: false, type: () => String }, deviceTokens: { required: false, type: () => [String] } }, "BulkSubscriberCreateDto": { subscribers: { required: true, type: () => [t["./app/subscribers/dtos/create-subscriber-request.dto"].CreateSubscriberRequestDto] } } }], [import("./app/subscribers/dtos/delete-subscriber-response.dto"), { "DeleteSubscriberResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, type: () => String } } }], [import("./app/subscribers/dtos/update-subscriber-channel-request.dto"), { "UpdateSubscriberChannelRequestDto": { providerId: { required: true, type: () => Object }, integrationIdentifier: { required: false, type: () => String }, credentials: { required: true, type: () => t["./app/shared/dtos/subscriber-channel"].ChannelCredentials } } }], [import("./app/subscribers/dtos/subscriber-response.dto"), { "ChannelSettings": { _integrationId: { required: true, type: () => String } }, "SubscriberResponseDto": { _id: { required: false, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, email: { required: false, type: () => String }, phone: { required: false, type: () => String }, avatar: { required: false, type: () => String }, locale: { required: false, type: () => String }, subscriberId: { required: true, type: () => String }, channels: { required: false, type: () => [t["./app/subscribers/dtos/subscriber-response.dto"].ChannelSettings] }, isOnline: { required: false, type: () => Boolean }, lastOnlineAt: { required: false, type: () => String }, _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, deleted: { required: true, type: () => Boolean }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String }, __v: { required: false, type: () => Number } } }], [import("./app/subscribers/dtos/subscribers-response.dto"), { "SubscribersResponseDto": {} }], [import("./app/subscribers/dtos/update-subscriber-request.dto"), { "UpdateSubscriberRequestDto": { email: { required: false, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, phone: { required: false, type: () => String }, avatar: { required: false, type: () => String }, locale: { required: false, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/subscribers/dtos/get-subscriber-preferences-response.dto"), { "GetSubscriberPreferencesResponseDto": {} }], [import("./app/subscribers/dtos/update-subscriber-global-preferences-request.dto"), { "UpdateSubscriberGlobalPreferencesRequestDto": { enabled: { required: false, type: () => Boolean }, preferences: { required: false, type: () => [t["./app/shared/dtos/channel-preference"].ChannelPreference] } } }], [import("./app/tenant/dtos/create-tenant-request.dto"), { "CreateTenantRequestDto": { identifier: { required: true, type: () => String }, name: { required: true, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/tenant/dtos/create-tenant-response.dto"), { "CreateTenantResponseDto": { _id: { required: true, type: () => String }, identifier: { required: true, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object }, _environmentId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String } } }], [import("./app/tenant/dtos/get-tenant-response.dto"), { "GetTenantResponseDto": { _id: { required: true, type: () => String }, identifier: { required: true, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object }, _environmentId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String } } }], [import("./app/tenant/dtos/get-tenants-request.dto"), { "GetTenantsRequestDto": {} }], [import("./app/tenant/dtos/update-tenant-request.dto"), { "UpdateTenantRequestDto": { identifier: { required: false, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/tenant/dtos/update-tenant-response.dto"), { "UpdateTenantResponseDto": { _id: { required: true, type: () => String }, identifier: { required: true, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object }, _environmentId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String } } }], [import("./app/events/dtos/trigger-event-request.dto"), { "SubscriberPayloadDto": {}, "TenantPayloadDto": {}, "TopicPayloadDto": { topicKey: { required: true, type: () => String }, type: { required: true, enum: t["../../../libs/shared/dist/cjs/types/events/index"].TriggerRecipientsTypeEnum } }, "TriggerEventRequestDto": { name: { required: true, type: () => String }, payload: { required: false, type: () => Object }, bridgeUrl: { required: false, type: () => String }, overrides: { required: false, type: () => Object }, to: { required: true, type: () => [Object] }, transactionId: { required: false, type: () => String }, actor: { required: false, type: () => Object }, tenant: { required: false, type: () => Object }, controls: { required: false, type: () => Object } }, "BulkTriggerEventDto": { events: { required: true, type: () => [t["./app/events/dtos/trigger-event-request.dto"].TriggerEventRequestDto] } } }], [import("./app/events/dtos/trigger-event-to-all-request.dto"), { "TriggerEventToAllRequestDto": { name: { required: true, type: () => String }, payload: { required: true, type: () => Object }, overrides: { required: false, type: () => Object }, transactionId: { required: false, type: () => String }, actor: { required: false, type: () => Object }, tenant: { required: false, type: () => Object } } }], [import("./app/widgets/dtos/organization-response.dto"), { "OrganizationResponseDto": { _id: { required: true, type: () => String }, name: { required: true, type: () => String } } }], [import("./app/widgets/dtos/message-response.dto"), { "EmailBlock": { type: { required: true, enum: t["../../../libs/shared/dist/cjs/types/message-template/index"].EmailBlockTypeEnum }, content: { required: true, type: () => String }, url: { required: false, type: () => String } }, "MessageCTA": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelCTATypeEnum } }, "MessageResponseDto": { _id: { required: true, type: () => String }, _templateId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _messageTemplateId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _notificationId: { required: true, type: () => String }, _subscriberId: { required: true, type: () => String }, subscriber: { required: false, type: () => t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, template: { required: false, type: () => t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, templateIdentifier: { required: false, type: () => String }, createdAt: { required: true, type: () => String }, lastSeenDate: { required: false, type: () => String }, lastReadDate: { required: false, type: () => String }, content: { required: true, type: () => Object }, transactionId: { required: true, type: () => String }, subject: { required: false, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, read: { required: true, type: () => Boolean }, seen: { required: true, type: () => Boolean }, email: { required: false, type: () => String }, phone: { required: false, type: () => String }, directWebhookUrl: { required: false, type: () => String }, providerId: { required: false, type: () => String }, deviceTokens: { required: false, type: () => [String] }, title: { required: false, type: () => String }, cta: { required: true, type: () => t["./app/widgets/dtos/message-response.dto"].MessageCTA }, _feedId: { required: false, type: () => String, nullable: true }, status: { required: true, type: () => Object }, errorId: { required: true, type: () => String }, errorText: { required: true, type: () => String }, payload: { required: true, type: () => Object }, overrides: { required: true, type: () => Object } }, "MessagesResponseDto": { totalCount: { required: false, type: () => Number }, hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/widgets/dtos/message-response.dto"].MessageResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/widgets/dtos/feeds-response.dto"), { "NotificationDto": { _id: { required: true, type: () => String }, _templateId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _messageTemplateId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _notificationId: { required: true, type: () => String }, _subscriberId: { required: true, type: () => String }, _feedId: { required: true, type: () => String }, _jobId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String }, expireAt: { required: true, type: () => String }, subscriber: { required: false, type: () => t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, transactionId: { required: true, type: () => String }, templateIdentifier: { required: true, type: () => String }, providerId: { required: true, type: () => String }, content: { required: true, type: () => String }, subject: { required: false, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, read: { required: true, type: () => Boolean }, seen: { required: true, type: () => Boolean }, deleted: { required: true, type: () => Boolean }, deviceTokens: { required: false, type: () => [String] }, cta: { required: true, type: () => t["./app/widgets/dtos/message-response.dto"].MessageCTA }, status: { required: true, type: () => Object }, payload: { required: true, type: () => Object }, overrides: { required: true, type: () => Object } }, "FeedResponseDto": { totalCount: { required: false, type: () => Number }, hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/widgets/dtos/feeds-response.dto"].NotificationDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/widgets/dtos/session-initialize-response.dto"), { "SessionInitializeResponseDto": { token: { required: true, type: () => String } } }], [import("./app/widgets/dtos/log-usage-request.dto"), { "LogUsageRequestDto": { name: { required: true, type: () => String }, payload: { required: true, type: () => Object } } }], [import("./app/widgets/dtos/log-usage-response.dto"), { "LogUsageResponseDto": { success: { required: true, type: () => Boolean } } }], [import("./app/widgets/dtos/session-initialize-request.dto"), { "SessionInitializeRequestDto": { subscriberId: { required: true, type: () => String }, applicationIdentifier: { required: true, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, email: { required: false, type: () => String }, phone: { required: false, type: () => String }, hmacHash: { required: false, type: () => String } } }], [import("./app/widgets/dtos/unseen-count-response.dto"), { "UnseenCountResponse": { count: { required: true, type: () => Number } } }], [import("./app/widgets/dtos/update-subscriber-preference-response.dto"), { "NotificationTriggerVariableResponse": { name: { required: true, type: () => String }, value: { required: false, type: () => Object }, type: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].TemplateVariableTypeEnum } }, "TriggerReservedVariableResponse": { type: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerContextTypeEnum }, variables: { required: true, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].NotificationTriggerVariableResponse] } }, "NotificationTriggerResponse": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerTypeEnum }, identifier: { required: true, type: () => String }, variables: { required: true, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].NotificationTriggerVariableResponse] }, subscriberVariables: { required: false, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].NotificationTriggerVariableResponse] }, reservedVariables: { required: false, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].TriggerReservedVariableResponse] } }, "UpdateSubscriberPreferenceResponseDto": {} }], [import("./app/widgets/dtos/update-subscriber-preference-request.dto"), { "UpdateSubscriberPreferenceRequestDto": { channel: { required: false, type: () => t["./app/shared/dtos/channel-preference"].ChannelPreference }, enabled: { required: false, type: () => Boolean } } }], [import("./app/subscribers/dtos/get-in-app-notification-feed-for-subscriber.dto"), { "GetInAppNotificationsFeedForSubscriberDto": { feedIdentifier: { required: true, type: () => Object }, read: { required: true, type: () => Boolean }, seen: { required: true, type: () => Boolean }, payload: { required: false, type: () => String } } }], [import("./app/widgets/dtos/get-notifications-feed-request.dto"), { "GetNotificationsFeedDto": {} }], [import("./app/widgets/dtos/remove-all-messages.dto"), { "RemoveAllMessagesDto": { feedId: { required: true, type: () => String } } }], [import("./app/widgets/dtos/remove-messages-bulk-request.dto"), { "RemoveMessagesBulkRequestDto": { messageIds: { required: true, type: () => [String] } } }], [import("./app/widgets/dtos/mark-as-request.dto"), { "MessageMarkAsRequestDto": { messageId: { required: true, type: () => Object }, markAs: { required: true, enum: t["../../../libs/shared/dist/cjs/types/messages/index"].MessagesStatusEnum } } }], [import("./app/subscribers/dtos/update-subscriber-online-flag-request.dto"), { "UpdateSubscriberOnlineFlagRequestDto": { isOnline: { required: true, type: () => Boolean } } }], [import("./app/widgets/dtos/mark-message-as-request.dto"), { "MarkMessageAsRequestDto": { messageId: { required: true, type: () => Object } } }], [import("./app/widgets/dtos/mark-message-action-as-seen.dto"), { "MarkMessageActionAsSeenDto": { status: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/messages/messages.interface"].MessageActionStatusEnum }, payload: { required: true, type: () => Object } } }], [import("./app/subscribers/dtos/get-subscribers.dto"), { "GetSubscribersDto": {} }], [import("./app/subscribers/dtos/chat-oauth-request.dto"), { "ChatOauthRequestDto": { hmacHash: { required: true, type: () => String }, environmentId: { required: true, type: () => String }, integrationIdentifier: { required: false, type: () => String } }, "ChatOauthCallbackRequestDto": { code: { required: true, type: () => String } } }], [import("./app/subscribers/dtos/mark-all-messages-as-request.dto"), { "MarkAllMessageAsRequestDto": { feedIdentifier: { required: false, type: () => Object }, markAs: { required: true, enum: t["../../../libs/shared/dist/cjs/types/messages/index"].MessagesStatusEnum } } }], [import("./app/topics/dtos/topic.dto"), { "TopicDto": { _id: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, key: { required: true, type: () => String }, name: { required: true, type: () => String }, subscribers: { required: true, type: () => [String] } } }], [import("./app/topics/dtos/add-subscribers.dto"), { "AddSubscribersRequestDto": { subscribers: { required: true, type: () => [String] } } }], [import("./app/topics/dtos/create-topic.dto"), { "CreateTopicResponseDto": {}, "CreateTopicRequestDto": { key: { required: true, type: () => String }, name: { required: true, type: () => String } } }], [import("./app/topics/dtos/filter-topics.dto"), { "FilterTopicsRequestDto": { page: { required: false, type: () => Number, default: 0, minimum: 0 }, pageSize: { required: false, type: () => Number, default: 10, minimum: 0 }, key: { required: false, type: () => String } }, "FilterTopicsResponseDto": { data: { required: true, type: () => [t["./app/topics/dtos/topic.dto"].TopicDto] }, page: { required: true, type: () => Number }, pageSize: { required: true, type: () => Number }, totalCount: { required: true, type: () => Number } } }], [import("./app/topics/dtos/get-topic.dto"), { "GetTopicResponseDto": {} }], [import("./app/topics/dtos/remove-subscribers.dto"), { "RemoveSubscribersRequestDto": { subscribers: { required: true, type: () => [String] } } }], [import("./app/topics/dtos/rename-topic.dto"), { "RenameTopicResponseDto": {}, "RenameTopicRequestDto": { name: { required: true, type: () => String } } }], [import("./app/topics/dtos/topic-subscriber.dto"), { "TopicSubscriberDto": { _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _subscriberId: { required: true, type: () => String }, _topicId: { required: true, type: () => String }, topicKey: { required: true, type: () => String }, externalSubscriberId: { required: true, type: () => String } } }], [import("./app/bridge/dtos/create-bridge-response.dto"), { "CreateBridgeResponseDto": {} }], [import("./app/bridge/dtos/validate-bridge-url-request.dto"), { "ValidateBridgeUrlRequestDto": { bridgeUrl: { required: true, type: () => String } } }], [import("./app/bridge/dtos/validate-bridge-url-response.dto"), { "ValidateBridgeUrlResponseDto": { isValid: { required: true, type: () => Boolean } } }], [import("./app/bridge/dtos/create-bridge-request.dto"), { "CreateBridgeRequestDto": { workflows: { required: true, type: () => [Object] }, bridgeUrl: { required: true, type: () => String } } }], [import("./app/notifications/dtos/activity-stats-response.dto"), { "ActivityStatsResponseDto": { weeklySent: { required: true, type: () => Number }, monthlySent: { required: true, type: () => Number } } }], [import("./app/notifications/dtos/activities-response.dto"), { "ActivityNotificationStepResponseDto": { _id: { required: true, type: () => String }, active: { required: true, type: () => Boolean }, filters: { required: true, type: () => t["../../../libs/dal/dist/repositories/notification-template/notification-template.entity"].StepFilter }, template: { required: false, type: () => t["../../../libs/shared/dist/cjs/dto/message-template/message-template.dto"].MessageTemplateDto } }, "ActivityNotificationExecutionDetailResponseDto": { _id: { required: true, type: () => String }, _jobId: { required: true, type: () => String }, status: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/execution-details/execution-details.interface"].ExecutionDetailsStatusEnum }, detail: { required: true, type: () => String }, isRetry: { required: true, type: () => Boolean }, isTest: { required: true, type: () => Boolean }, providerId: { required: true, type: () => Object }, raw: { required: false, type: () => String }, source: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/execution-details/execution-details.interface"].ExecutionDetailsSourceEnum } }, "ActivityNotificationJobResponseDto": { _id: { required: true, type: () => String }, type: { required: true, type: () => String }, digest: { required: false, type: () => Object }, executionDetails: { required: true, type: () => [t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationExecutionDetailResponseDto] }, step: { required: true, type: () => t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationStepResponseDto }, payload: { required: false, type: () => Object }, providerId: { required: true, type: () => Object }, status: { required: true, type: () => String } }, "ActivityNotificationSubscriberResponseDto": { firstName: { required: false, type: () => String }, _id: { required: true, type: () => String }, lastName: { required: false, type: () => String }, email: { required: false, type: () => String }, phone: { required: false, type: () => String } }, "NotificationTriggerVariable": { name: { required: true, type: () => String } }, "NotificationTrigger": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerTypeEnum }, identifier: { required: true, type: () => String }, variables: { required: true, type: () => [t["./app/notifications/dtos/activities-response.dto"].NotificationTriggerVariable] }, subscriberVariables: { required: false, type: () => [t["./app/notifications/dtos/activities-response.dto"].NotificationTriggerVariable] } }, "ActivityNotificationResponseDto": { _id: { required: false, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, transactionId: { required: true, type: () => String }, createdAt: { required: false, type: () => String }, channels: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].StepTypeEnum, isArray: true }, subscriber: { required: false, type: () => t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationSubscriberResponseDto }, jobs: { required: false, type: () => [t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationJobResponseDto] } }, "ActivitiesResponseDto": { hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/notifications/dtos/activity-graph-states-response.dto"), { "ActivityGraphStatesResponse": { _id: { required: true, type: () => String }, count: { required: true, type: () => Number }, templates: { required: true, type: () => [String] }, channels: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum, isArray: true } } }], [import("./app/notifications/dtos/activities-request.dto"), { "ActivitiesRequestDto": { channels: { required: true, type: () => Object }, templates: { required: true, type: () => Object }, emails: { required: true, type: () => Object }, search: { required: true, type: () => String }, subscriberIds: { required: true, type: () => Object }, page: { required: false, type: () => Number, default: 0 }, transactionId: { required: true, type: () => String } } }], [import("./app/storage/dtos/upload-url-response.dto"), { "UploadUrlResponse": { signedUrl: { required: true, type: () => String }, path: { required: true, type: () => String } } }], [import("./app/invites/dtos/invite-member.dto"), { "InviteMemberDto": { email: { required: true, type: () => String } }, "InviteWebhookDto": { subscriber: { required: true, type: () => t["../../../libs/dal/dist/repositories/subscriber/subscriber.entity"].SubscriberEntity }, payload: { required: true, type: () => ({ organizationId: { required: true, type: () => String } }) } } }], [import("./app/invites/dtos/bulk-invite-members.dto"), { "EmailInvitee": { email: { required: true, type: () => String } }, "BulkInviteMembersDto": { invitees: { required: true, type: () => [t["./app/invites/dtos/bulk-invite-members.dto"].EmailInvitee] } } }], [import("./app/invites/dtos/resend-invite.dto"), { "ResendInviteDto": { memberId: { required: true, type: () => String } } }], [import("./app/feeds/dto/create-feed-request.dto"), { "CreateFeedRequestDto": { name: { required: true, type: () => String } } }], [import("./app/feeds/dto/feed-response.dto"), { "FeedResponseDto": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String } } }], [import("./app/messages/dtos/delete-message-response.dto"), { "DeleteMessageResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, type: () => String } } }], [import("./app/messages/dtos/get-messages-requests.dto"), { "GetMessagesRequestDto": { channel: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, subscriberId: { required: false, type: () => String }, transactionId: { required: false, type: () => Object }, page: { required: false, type: () => Number, default: 0 }, limit: { required: false, type: () => Number, default: 10 } } }], [import("./app/messages/dtos/remove-messages-by-transactionId-request.dto"), { "DeleteMessageByTransactionIdRequestDto": { channel: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum } } }], [import("./app/partner-integrations/dtos/setup-vercel-integration-response.dto"), { "SetupVercelConfigurationResponseDto": { success: { required: true, type: () => Boolean } } }], [import("./app/partner-integrations/dtos/complete-and-update-vercel-integration-request.dto"), { "CompleteAndUpdateVercelIntegrationRequestDto": { data: { required: true, type: () => Object }, configurationId: { required: true, type: () => String } } }], [import("./app/partner-integrations/dtos/setup-vercel-integration-request.dto"), { "SetVercelConfigurationRequestDto": { vercelIntegrationCode: { required: true, type: () => String }, configurationId: { required: true, type: () => String } } }], [import("./app/blueprint/dto/get-blueprint.response.dto"), { "GetBlueprintResponse": { _id: { required: true, type: () => String }, name: { required: true, type: () => String }, description: { required: true, type: () => String }, active: { required: true, type: () => Boolean }, draft: { required: true, type: () => Boolean }, critical: { required: true, type: () => Boolean }, tags: { required: true, type: () => [String] }, steps: { required: true, type: () => [t["../../../libs/shared/dist/cjs/dto/workflows/workflow.dto"].NotificationStepDto] }, _organizationId: { required: true, type: () => String }, _creatorId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, triggers: { required: true, type: () => [Object] }, _notificationGroupId: { required: true, type: () => String }, _parentId: { required: false, type: () => String }, deleted: { required: true, type: () => Boolean }, deletedAt: { required: true, type: () => String }, deletedBy: { required: true, type: () => String }, createdAt: { required: false, type: () => String }, updatedAt: { required: false, type: () => String }, notificationGroup: { required: false, type: () => Object }, isBlueprint: { required: true, type: () => Boolean }, blueprintId: { required: false, type: () => String } } }], [import("./app/blueprint/dto/grouped-blueprint.response.dto"), { "GroupedBlueprintResponse": { general: { required: true, type: () => [t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].IGroupedBlueprint] }, popular: { required: true, type: () => t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].IGroupedBlueprint } } }], [import("./app/workflow-overrides/dto/create-workflow-override-response.dto"), { "CreateWorkflowOverrideResponseDto": {} }], [import("./app/workflow-overrides/dto/create-workflow-override-request.dto"), { "CreateWorkflowOverrideRequestDto": { workflowId: { required: true, type: () => String }, tenantId: { required: true, type: () => String }, active: { required: false, type: () => Boolean }, preferenceSettings: { required: false, type: () => t["./app/shared/dtos/preference-channels"].PreferenceChannels } } }], [import("./app/workflow-overrides/dto/get-workflow-override-response.dto"), { "GetWorkflowOverrideResponseDto": {} }], [import("./app/workflow-overrides/dto/get-workflow-overrides-request.dto"), { "GetWorkflowOverridesRequestDto": {} }], [import("./app/workflow-overrides/dto/get-workflow-overrides-response.dto"), { "GetWorkflowOverridesResponseDto": { hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/workflow-overrides/dto/shared"].OverrideResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/workflow-overrides/dto/update-workflow-override-request.dto"), { "UpdateWorkflowOverrideRequestDto": { active: { required: false, type: () => Boolean }, preferenceSettings: { required: false, type: () => t["./app/shared/dtos/preference-channels"].PreferenceChannels } } }], [import("./app/workflow-overrides/dto/update-workflow-override-response.dto"), { "UpdateWorkflowOverrideResponseDto": {} }], [import("./app/inbox/dtos/subscriber-session-response.dto"), { "SubscriberSessionResponseDto": { token: { required: true, type: () => String }, totalUnreadCount: { required: true, type: () => Number } } }], [import("./app/inbox/dtos/get-notifications-response.dto"), { "GetNotificationsResponseDto": { data: { required: true, type: () => [Object] }, hasMore: { required: true, type: () => Boolean }, filter: { required: true, type: () => Object } } }], [import("./app/inbox/dtos/subscriber-session-request.dto"), { "SubscriberSessionRequestDto": { applicationIdentifier: { required: true, type: () => String }, subscriberId: { required: true, type: () => String }, subscriberHash: { required: false, type: () => String } } }], [import("./app/inbox/dtos/get-notifications-request.dto"), { "GetNotificationsRequestDto": { tags: { required: false, type: () => [String] }, read: { required: false, type: () => Boolean }, archived: { required: false, type: () => Boolean } } }], [import("./app/inbox/dtos/get-notifications-count-request.dto"), { "GetNotificationsCountRequestDto": { tags: { required: false, type: () => [String] }, read: { required: false, type: () => Boolean }, archived: { required: false, type: () => Boolean } } }], [import("./app/inbox/dtos/get-notifications-count-response.dto"), { "GetNotificationsCountResponseDto": { data: { required: true, type: () => ({ count: { required: true, type: () => Number } }) }, filter: { required: true, type: () => Object } } }], [import("./app/inbox/dtos/action-type-request.dto"), { "ActionTypeRequestDto": { actionType: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/messages/action.enum"].ButtonTypeEnum } } }], [import("./app/inbox/dtos/update-all-notifications-request.dto"), { "UpdateAllNotificationsRequestDto": { tags: { required: false, type: () => [String] } } }], [import("./app/partner-integrations/dtos/get-vercel-projects-request.dto"), { "SetVercelConfigurationRequestDto": { configurationId: { required: true, type: () => String } } }], [import("./app/inbox/dtos/button-type-request.dto"), { "ButtonTypeRequestDto": { buttonType: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/messages/action.enum"].ButtonTypeEnum } } }]], "controllers": [[import("./app/user/user.controller"), { "UsersController": { "getMyProfile": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateProfileEmail": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateOnBoarding": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateOnBoardingTour": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateProfile": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto } } }], [import("./app/auth/auth.controller"), { "AuthController": { "githubAuth": {}, "githubCallback": { type: Object }, "refreshToken": { type: String }, "userRegistration": {}, "forgotPasswordRequest": {}, "passwordReset": {}, "userLogin": {}, "organizationSwitch": { type: String }, "projectSwitch": {}, "updatePassword": {}, "authenticateTest": { type: String } } }], [import("./app/environments/environments.controller"), { "EnvironmentsController": { "getCurrentEnvironment": { type: t["./app/environments/dtos/environment-response.dto"].EnvironmentResponseDto }, "createEnvironment": { type: t["./app/environments/dtos/environment-response.dto"].EnvironmentResponseDto }, "listMyEnvironments": { type: [t["./app/environments/dtos/environment-response.dto"].EnvironmentResponseDto] }, "updateMyEnvironment": {}, "listOrganizationApiKeys": { type: [t["./app/shared/dtos/api-key"].ApiKey] }, "regenerateOrganizationApiKeys": { type: [t["./app/shared/dtos/api-key"].ApiKey] } } }], [import("./app/notification-groups/notification-groups.controller"), { "NotificationGroupsController": { "createNotificationGroup": { type: t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto }, "listNotificationGroups": { type: [t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto] }, "getNotificationGroup": { type: t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto }, "updateNotificationGroup": { type: t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto }, "deleteNotificationGroup": { type: t["./app/notification-groups/dtos/delete-notification-group-response.dto"].DeleteNotificationGroupResponseDto } } }], [import("./app/change/changes.controller"), { "ChangesController": { "getChanges": { type: t["./app/change/dtos/change-response.dto"].ChangesResponseDto }, "getChangesCount": { type: Number }, "bulkApplyDiff": { type: [[t["./app/change/dtos/change-response.dto"].ChangeResponseDto]] }, "applyDiff": { type: [t["./app/change/dtos/change-response.dto"].ChangeResponseDto] } } }], [import("./app/layouts/layouts.controller"), { "LayoutsController": { "createLayout": { type: t["./app/layouts/dtos/create-layout.dto"].CreateLayoutResponseDto }, "listLayouts": { type: t["./app/layouts/dtos/filter-layouts.dto"].FilterLayoutsResponseDto }, "getLayout": { type: t["./app/layouts/dtos/get-layout.dto"].GetLayoutResponseDto }, "deleteLayout": {}, "updateLayout": { type: t["./app/layouts/dtos/update-layout.dto"].UpdateLayoutResponseDto }, "setDefaultLayout": {} } }], [import("./app/integrations/integrations.controller"), { "IntegrationsController": { "listIntegrations": { type: [t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto] }, "getActiveIntegrations": { type: [t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto] }, "getWebhookSupportStatus": { type: Boolean }, "createIntegration": { type: t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto }, "updateIntegrationById": { type: t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto }, "setIntegrationAsPrimary": { type: t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto }, "removeIntegration": { type: [t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto] }, "getProviderLimit": { type: t["./app/integrations/dtos/get-channel-type-limit.sto"].ChannelTypeLimitDto }, "getInAppActivated": {} } }], [import("./app/organization/organization.controller"), { "OrganizationController": { "createOrganization": { type: t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity }, "listOrganizations": { type: [t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity] }, "getSelfOrganizationData": { type: t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity }, "remove": { type: Object }, "updateMemberRoles": { type: Object }, "listOrganizationMembers": { type: [Object] }, "updateBrandingDetails": {}, "rename": {} } }], [import("./app/organization/ee.organization.controller"), { "EEOrganizationController": { "getMyOrganization": { type: t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity }, "updateBrandingDetails": {}, "renameOrganization": {} } }], [import("./app/testing/testing.controller"), { "TestingController": { "clearDB": {}, "getSession": { description: "Used for seeding data for client e2e tests,\nCurrently just creates a new user session and returns signed JWT", type: Object }, "idempotency": {}, "idempotencyGet": {}, "productFeatureGet": {}, "resourceLimitingDefaultGet": {}, "resourceLimitingEventsGet": {} } }], [import("./app/testing/rate-limiting.controller"), { "TestApiRateLimitController": { "noCategoryNoCost": { type: Boolean }, "noCategorySingleCost": { type: Boolean }, "globalCategoryNoCost": { type: Boolean }, "globalCategorySingleCost": { type: Boolean }, "global": { type: Boolean }, "triggerCategoryNoCost": { type: Boolean }, "triggerCategorySingleCost": { type: Boolean }, "triggerCategoryBulkCost": { type: Boolean } }, "TestApiRateLimitBulkController": { "noCategoryNoCostOverride": { type: Boolean }, "noCategorySingleCostOverride": { type: Boolean }, "globalCategoryNoCostOverride": { type: Boolean } } }], [import("./app/testing/auth.controller"), { "TestApiAuthController": { "userRoute": { type: Boolean }, "userInaccessibleRoute": { type: Boolean } } }], [import("./app/health/health.controller"), { "HealthController": { "healthCheck": { type: Object } } }], [import("./app/execution-details/execution-details.controller"), { "ExecutionDetailsController": { "getExecutionDetailsForNotification": { type: [t["../../../libs/application-generic/build/main/usecases/create-execution-details/dtos/execution-details-response.dto"].ExecutionDetailsResponseDto] } } }], [import("./app/workflows/notification-template.controller"), { "NotificationTemplateController": { "getNotificationTemplates": { type: t["./app/workflows/dto/workflows.response.dto"].WorkflowsResponseDto }, "updateTemplateById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "deleteTemplateById": { type: Boolean }, "getNotificationTemplateById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "create": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "changeActiveStatus": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse } } }], [import("./app/workflows/workflow.controller"), { "WorkflowController": { "listWorkflows": { type: t["./app/workflows/dto/workflows.response.dto"].WorkflowsResponseDto }, "updateWorkflowById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "deleteWorkflowById": { type: Boolean }, "getWorkflowVariables": { type: t["./app/workflows/dto/variables.response.dto"].VariablesResponseDto }, "getWorkflowById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "create": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "updateActiveStatus": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse } } }], [import("./app/events/events.controller"), { "EventsController": { "trigger": { type: t["./app/events/dtos/trigger-event-response.dto"].TriggerEventResponseDto }, "triggerBulk": { type: [t["./app/events/dtos/trigger-event-response.dto"].TriggerEventResponseDto] }, "broadcastEventToAll": { type: t["./app/events/dtos/trigger-event-response.dto"].TriggerEventResponseDto }, "testEmailMessage": {}, "cancel": { type: Boolean } } }], [import("./app/widgets/widgets.controller"), { "WidgetsController": { "sessionInitialize": { type: t["./app/widgets/dtos/session-initialize-response.dto"].SessionInitializeResponseDto }, "getNotificationsFeed": { type: t["./app/widgets/dtos/feeds-response.dto"].FeedResponseDto }, "getUnseenCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "getUnreadCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "getCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "markMessageAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "markMessagesAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "removeMessage": { type: t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity }, "removeAllMessages": {}, "removeMessagesBulk": {}, "markAllUnreadAsRead": { type: Number }, "markAllUnseenAsSeen": { type: Number }, "markActionAsSeen": { type: t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity }, "getOrganizationData": { type: t["./app/widgets/dtos/organization-response.dto"].OrganizationResponseDto }, "getSubscriberPreference": { type: [Object] }, "getSubscriberPreferenceByLevel": {}, "updateSubscriberPreference": { type: t["./app/widgets/dtos/update-subscriber-preference-response.dto"].UpdateSubscriberPreferenceResponseDto }, "updateSubscriberGlobalPreference": {}, "logUsage": { type: t["./app/widgets/dtos/log-usage-response.dto"].LogUsageResponseDto } } }], [import("./app/subscribers/subscribers.controller"), { "SubscribersController": { "listSubscribers": {}, "getSubscriber": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "createSubscriber": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "bulkCreateSubscribers": {}, "updateSubscriber": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "updateSubscriberChannel": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "modifySubscriberChannel": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "deleteSubscriberCredentials": {}, "updateSubscriberOnlineFlag": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "removeSubscriber": { type: t["./app/subscribers/dtos/delete-subscriber-response.dto"].DeleteSubscriberResponseDto }, "listSubscriberPreferences": { type: [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].UpdateSubscriberPreferenceResponseDto] }, "getSubscriberPreferenceByLevel": { type: [t["./app/subscribers/dtos/get-subscriber-preferences-response.dto"].GetSubscriberPreferencesResponseDto] }, "updateSubscriberPreference": { type: t["./app/widgets/dtos/update-subscriber-preference-response.dto"].UpdateSubscriberPreferenceResponseDto }, "updateSubscriberGlobalPreferences": {}, "getNotificationsFeed": { type: t["./app/widgets/dtos/feeds-response.dto"].FeedResponseDto }, "getUnseenCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "markMessageAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "markMessagesAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "markAllUnreadAsRead": { type: Number }, "markActionAsSeen": { type: t["./app/widgets/dtos/message-response.dto"].MessageResponseDto }, "chatOauthCallback": { type: Object }, "chatAccessOauth": {} } }], [import("./app/content-templates/content-templates.controller"), { "ContentTemplatesController": { "previewEmail": {}, "previewInApp": {}, "previewSms": {}, "previewChat": {}, "previewPush": {} } }], [import("./app/topics/topics.controller"), { "TopicsController": { "createTopic": { type: t["./app/topics/dtos/create-topic.dto"].CreateTopicResponseDto }, "addSubscribers": {}, "getTopicSubscriber": { type: t["./app/topics/dtos/topic-subscriber.dto"].TopicSubscriberDto }, "removeSubscribers": {}, "listTopics": { type: t["./app/topics/dtos/filter-topics.dto"].FilterTopicsResponseDto }, "deleteTopic": {}, "getTopic": { type: t["./app/topics/dtos/get-topic.dto"].GetTopicResponseDto }, "renameTopic": { type: t["./app/topics/dtos/rename-topic.dto"].RenameTopicResponseDto } } }], [import("./app/tenant/tenant.controller"), { "TenantController": { "listTenants": {}, "getTenantById": { type: t["./app/tenant/dtos/get-tenant-response.dto"].GetTenantResponseDto }, "createTenant": { type: t["./app/tenant/dtos/create-tenant-response.dto"].CreateTenantResponseDto }, "updateTenant": { type: t["./app/tenant/dtos/update-tenant-response.dto"].UpdateTenantResponseDto }, "removeTenant": {} } }], [import("./app/bridge/bridge.controller"), { "BridgeController": { "health": { type: Object }, "preview": { type: Object }, "createBridgesByDiscovery": { type: t["./app/bridge/dtos/create-bridge-response.dto"].CreateBridgeResponseDto }, "createDiscoverySoft": { type: t["./app/bridge/dtos/create-bridge-response.dto"].CreateBridgeResponseDto }, "getControls": { type: Object }, "createControls": { type: Object }, "validateBridgeUrl": { type: t["./app/bridge/dtos/validate-bridge-url-response.dto"].ValidateBridgeUrlResponseDto } } }], [import("./app/notifications/notification.controller"), { "NotificationsController": { "listNotifications": { type: t["./app/notifications/dtos/activities-response.dto"].ActivitiesResponseDto }, "getActivityStats": { type: t["./app/notifications/dtos/activity-stats-response.dto"].ActivityStatsResponseDto }, "getActivityGraphStats": { type: [t["./app/notifications/dtos/activity-graph-states-response.dto"].ActivityGraphStatesResponse] }, "getNotification": { type: t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationResponseDto } } }], [import("./app/storage/storage.controller"), { "StorageController": { "signedUrl": { type: t["./app/storage/dtos/upload-url-response.dto"].UploadUrlResponse } } }], [import("./app/invites/invites.controller"), { "InvitesController": { "getInviteData": { type: Object }, "acceptInviteToken": { type: String }, "inviteMember": {}, "resendInviteMember": {}, "bulkInviteMembers": { type: [Object] }, "inviteCheckWebhook": {} } }], [import("./app/feeds/feeds.controller"), { "FeedsController": { "createFeed": { type: t["./app/feeds/dto/feed-response.dto"].FeedResponseDto }, "getFeeds": { type: [t["./app/feeds/dto/feed-response.dto"].FeedResponseDto] }, "deleteFeedById": { type: [t["./app/feeds/dto/feed-response.dto"].FeedResponseDto] } } }], [import("./app/messages/messages.controller"), { "MessagesController": { "getMessages": { type: t["./app/widgets/dtos/message-response.dto"].MessagesResponseDto }, "deleteMessage": { type: t["./app/messages/dtos/delete-message-response.dto"].DeleteMessageResponseDto }, "deleteMessagesByTransactionId": {} } }], [import("./app/partner-integrations/partner-integrations.controller"), { "PartnerIntegrationsController": { "setupVercelIntegration": { type: t["./app/partner-integrations/dtos/setup-vercel-integration-response.dto"].SetupVercelConfigurationResponseDto }, "webhook": { type: Boolean }, "getVercelProjects": {}, "completeVercelIntegration": {}, "getVercelConfigurationDetails": {}, "updateVercelConfiguration": {} } }], [import("./app/inbound-parse/inbound-parse.controller"), { "InboundParseController": { "getMxRecordStatus": { type: t["./app/inbound-parse/dtos/get-mx-record.dto"].GetMxRecordResponseDto } } }], [import("./app/blueprint/blueprint.controller"), { "BlueprintController": { "getGroupedBlueprints": { type: t["./app/blueprint/dto/grouped-blueprint.response.dto"].GroupedBlueprintResponse }, "getBlueprintById": { type: t["./app/blueprint/dto/get-blueprint.response.dto"].GetBlueprintResponse } } }], [import("./app/workflow-overrides/workflow-overrides.controller"), { "WorkflowOverridesController": { "create": { type: t["./app/workflow-overrides/dto/create-workflow-override-response.dto"].CreateWorkflowOverrideResponseDto }, "updateWorkflowOverrideById": { type: t["./app/workflow-overrides/dto/update-workflow-override-response.dto"].UpdateWorkflowOverrideResponseDto }, "updateWorkflowOverride": { type: t["./app/workflow-overrides/dto/update-workflow-override-response.dto"].UpdateWorkflowOverrideResponseDto }, "getWorkflowOverrideById": { type: t["./app/workflow-overrides/dto/get-workflow-override-response.dto"].GetWorkflowOverrideResponseDto }, "getWorkflowOverride": { type: t["./app/workflow-overrides/dto/get-workflow-override-response.dto"].GetWorkflowOverrideResponseDto }, "deleteWorkflowOverride": { type: Boolean }, "getWorkflowOverrides": { type: t["./app/workflow-overrides/dto/get-workflow-overrides-response.dto"].GetWorkflowOverridesResponseDto } } }], [import("./app/analytics/analytics.controller"), { "AnalyticsController": { "trackEvent": { type: Object } } }], [import("./app/inbox/inbox.controller"), { "InboxController": { "sessionInitialize": { type: t["./app/inbox/dtos/subscriber-session-response.dto"].SubscriberSessionResponseDto }, "getNotifications": { type: t["./app/inbox/dtos/get-notifications-response.dto"].GetNotificationsResponseDto }, "getNotificationsCount": { type: t["./app/inbox/dtos/get-notifications-count-response.dto"].GetNotificationsCountResponseDto }, "markNotificationAsRead": { type: Object }, "markNotificationAsUnread": { type: Object }, "markNotificationAsArchived": { type: Object }, "markNotificationAsUnarchived": { type: Object }, "completeAction": { type: Object }, "revertAction": { type: Object }, "markAllAsRead": {}, "markAllAsArchived": {}, "markAllAsReadArchived": {} } }], [import("./app/auth/legacy-ee-auth/auth.controller"), { "AuthController": { "googleAuth": {}, "googleCallback": { type: Object } } }]] } }; + return { "@nestjs/swagger": { "models": [[import("./app/user/usecases/get-my-profile/get-my-profile.dto"), { "GetMyProfileCommand": {} }], [import("./app/user/dtos/user-response.dto"), { "ServicesHashesDto": { intercom: { required: false, type: () => String } }, "UserResponseDto": { _id: { required: true, type: () => String }, resetToken: { required: false, type: () => String }, resetTokenDate: { required: false, type: () => String }, firstName: { required: false, type: () => String, nullable: true }, lastName: { required: false, type: () => String, nullable: true }, email: { required: false, type: () => String, nullable: true }, profilePicture: { required: false, type: () => String, nullable: true }, createdAt: { required: true, type: () => String }, showOnBoarding: { required: false, type: () => Boolean }, servicesHashes: { required: false, type: () => t["./app/user/dtos/user-response.dto"].ServicesHashesDto }, jobTitle: { required: false, enum: t["../../../libs/shared/dist/cjs/types/organization/index"].JobTitleEnum }, hasPassword: { required: true, type: () => Boolean } } }], [import("./app/user/dtos/user-onboarding-request.dto"), { "UserOnboardingRequestDto": { showOnBoarding: { required: true, type: () => Boolean } } }], [import("./app/user/dtos/change-profile-email.dto"), { "ChangeProfileEmailDto": { email: { required: true, type: () => String } } }], [import("./app/user/dtos/user-onboarding-tour-request.dto"), { "UserOnboardingTourRequestDto": { showOnBoardingTour: { required: true, type: () => Number } } }], [import("./app/user/dtos/update-profile-request.dto"), { "UpdateProfileRequestDto": { firstName: { required: true, type: () => String }, lastName: { required: true, type: () => String }, profilePicture: { required: false, type: () => String } } }], [import("./app/auth/dtos/user-registration.dto"), { "UserRegistrationBodyDto": { email: { required: true, type: () => String }, firstName: { required: true, type: () => String }, lastName: { required: false, type: () => String }, organizationName: { required: false, type: () => String }, origin: { required: false, enum: t["../../../libs/shared/dist/cjs/types/analytics/index"].SignUpOriginEnum }, jobTitle: { required: false, enum: t["../../../libs/shared/dist/cjs/types/organization/index"].JobTitleEnum }, domain: { required: false, type: () => String }, productUseCases: { required: false, type: () => Object } } }], [import("./app/layouts/dtos/layout.dto"), { "LayoutDto": { _id: { required: false, type: () => String }, _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _creatorId: { required: true, type: () => String }, name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, description: { required: false, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, content: { required: true, type: () => String }, contentType: { required: true, type: () => String }, variables: { required: false, type: () => [Object] }, isDefault: { required: true, type: () => Boolean }, isDeleted: { required: true, type: () => Boolean }, createdAt: { required: false, type: () => String }, updatedAt: { required: false, type: () => String }, _parentId: { required: false, type: () => String } } }], [import("./app/layouts/dtos/create-layout.dto"), { "CreateLayoutResponseDto": { _id: { required: true, type: () => String } }, "CreateLayoutRequestDto": { name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, description: { required: true, type: () => String }, content: { required: true, type: () => String }, variables: { required: false, type: () => [Object] }, isDefault: { required: false, type: () => Boolean } } }], [import("./app/layouts/dtos/filter-layouts.dto"), { "FilterLayoutsRequestDto": { page: { required: false, type: () => Number, minimum: 0 }, pageSize: { required: false, type: () => Number, minimum: 0 }, sortBy: { required: false, type: () => String }, orderBy: { required: false, type: () => Object } }, "FilterLayoutsResponseDto": { data: { required: true, type: () => [t["./app/layouts/dtos/layout.dto"].LayoutDto] }, page: { required: true, type: () => Number }, pageSize: { required: true, type: () => Number }, totalCount: { required: true, type: () => Number } } }], [import("./app/layouts/dtos/get-layout.dto"), { "GetLayoutResponseDto": {} }], [import("./app/layouts/dtos/update-layout.dto"), { "UpdateLayoutResponseDto": {}, "UpdateLayoutRequestDto": { name: { required: false, type: () => String }, identifier: { required: true, type: () => String }, description: { required: false, type: () => String }, content: { required: false, type: () => String }, variables: { required: false, type: () => [Object] }, isDefault: { required: false, type: () => Boolean } } }], [import("./app/auth/dtos/login.dto"), { "LoginBodyDto": { email: { required: true, type: () => String }, password: { required: true, type: () => String } } }], [import("./app/auth/dtos/password-reset.dto"), { "PasswordResetBodyDto": { token: { required: true, type: () => String } }, "PasswordResetRequestBodyDto": { email: { required: true, type: () => String } } }], [import("./app/auth/dtos/update-password.dto"), { "UpdatePasswordBodyDto": { confirmPassword: { required: true, type: () => String }, currentPassword: { required: true, type: () => String } } }], [import("./app/environments/dtos/environment-response.dto"), { "EnvironmentResponseDto": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, identifier: { required: true, type: () => String }, apiKeys: { required: false, type: () => [Object] }, _parentId: { required: true, type: () => String } } }], [import("./app/inbound-parse/dtos/get-mx-record.dto"), { "GetMxRecordResponseDto": { mxRecordConfigured: { required: true, type: () => Boolean } } }], [import("./app/environments/dtos/create-environment-request.dto"), { "CreateEnvironmentRequestDto": { name: { required: true, type: () => String }, parentId: { required: false, type: () => String } } }], [import("./app/environments/dtos/update-environment-request.dto"), { "InBoundParseDomainDto": { inboundParseDomain: { required: false, type: () => String } }, "BridgeConfigurationDto": { url: { required: false, type: () => String } }, "UpdateEnvironmentRequestDto": { name: { required: false, type: () => String }, identifier: { required: false, type: () => String }, parentId: { required: false, type: () => String }, dns: { required: false, type: () => t["./app/environments/dtos/update-environment-request.dto"].InBoundParseDomainDto }, bridge: { required: false, type: () => t["./app/environments/dtos/update-environment-request.dto"].BridgeConfigurationDto } } }], [import("./app/notification-groups/dtos/create-notification-group-request.dto"), { "CreateNotificationGroupRequestDto": { name: { required: true, type: () => String } } }], [import("./app/notification-groups/dtos/notification-group-response.dto"), { "NotificationGroupResponseDto": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _parentId: { required: false, type: () => String } } }], [import("./app/notification-groups/dtos/delete-notification-group-response.dto"), { "DeleteNotificationGroupResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, type: () => String } } }], [import("./app/change/dtos/change-response.dto"), { "ChangeResponseDto": { _id: { required: false, type: () => String }, _creatorId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _entityId: { required: true, type: () => String }, enabled: { required: true, type: () => Boolean }, type: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/change/change.interface"].ChangeEntityTypeEnum }, change: { required: true, type: () => Object }, createdAt: { required: true, type: () => String }, _parentId: { required: false, type: () => String } }, "ChangesResponseDto": { totalCount: { required: true, type: () => Number }, data: { required: true, type: () => [t["./app/change/dtos/change-response.dto"].ChangeResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/change/dtos/change-request.dto"), { "ChangesRequestDto": { promoted: { required: true, type: () => String } } }], [import("./app/change/dtos/bulk-apply-change.dto"), { "BulkApplyChangeDto": { changeIds: { required: true, type: () => [String] } } }], [import("./app/integrations/dtos/credentials.dto"), { "CredentialsDto": { apiKey: { required: false, type: () => String }, user: { required: false, type: () => String }, secretKey: { required: false, type: () => String }, domain: { required: false, type: () => String }, password: { required: false, type: () => String }, host: { required: false, type: () => String }, port: { required: false, type: () => String }, secure: { required: false, type: () => Boolean }, region: { required: false, type: () => String }, accountSid: { required: false, type: () => String }, messageProfileId: { required: false, type: () => String }, token: { required: false, type: () => String }, from: { required: false, type: () => String }, senderName: { required: false, type: () => String }, projectName: { required: false, type: () => String }, applicationId: { required: false, type: () => String }, clientId: { required: false, type: () => String }, requireTls: { required: false, type: () => Boolean }, ignoreTls: { required: false, type: () => Boolean }, tlsOptions: { required: false, type: () => Object }, baseUrl: { required: false, type: () => String }, webhookUrl: { required: false, type: () => String }, redirectUrl: { required: false, type: () => String }, hmac: { required: false, type: () => Boolean }, serviceAccount: { required: false, type: () => String }, ipPoolName: { required: false, type: () => String }, apiKeyRequestHeader: { required: false, type: () => String }, secretKeyRequestHeader: { required: false, type: () => String }, idPath: { required: false, type: () => String }, datePath: { required: false, type: () => String }, apiToken: { required: false, type: () => String }, authenticateByToken: { required: false, type: () => Boolean }, authenticationTokenKey: { required: false, type: () => String }, instanceId: { required: false, type: () => String }, alertUid: { required: false, type: () => String }, title: { required: false, type: () => String }, imageUrl: { required: false, type: () => String }, state: { required: false, type: () => String }, externalLink: { required: false, type: () => String }, channelId: { required: false, type: () => String }, phoneNumberIdentification: { required: false, type: () => String } } }], [import("./app/integrations/dtos/integration-response.dto"), { "IntegrationResponseDto": { _id: { required: false, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, providerId: { required: true, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, credentials: { required: true, type: () => t["./app/integrations/dtos/credentials.dto"].CredentialsDto }, active: { required: true, type: () => Boolean }, deleted: { required: true, type: () => Boolean }, deletedAt: { required: true, type: () => String }, deletedBy: { required: true, type: () => String }, primary: { required: true, type: () => Boolean }, conditions: { required: false, type: () => [t["./app/shared/dtos/step-filter"].StepFilter] } } }], [import("./app/integrations/dtos/create-integration-request.dto"), { "CreateIntegrationRequestDto": { name: { required: false, type: () => String }, identifier: { required: false, type: () => String }, _environmentId: { required: false, type: () => String }, providerId: { required: true, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, credentials: { required: false, type: () => t["./app/integrations/dtos/credentials.dto"].CredentialsDto }, active: { required: false, type: () => Boolean }, check: { required: false, type: () => Boolean }, conditions: { required: false, type: () => [t["./app/shared/dtos/step-filter"].StepFilter] } } }], [import("./app/integrations/dtos/update-integration.dto"), { "UpdateIntegrationRequestDto": { name: { required: false, type: () => String }, identifier: { required: false, type: () => String }, _environmentId: { required: false, type: () => String }, active: { required: false, type: () => Boolean }, credentials: { required: false, type: () => t["./app/integrations/dtos/credentials.dto"].CredentialsDto }, check: { required: false, type: () => Boolean }, conditions: { required: false, type: () => [t["./app/shared/dtos/step-filter"].StepFilter] } } }], [import("./app/organization/dtos/create-organization.dto"), { "CreateOrganizationDto": { name: { required: true, type: () => String }, logo: { required: false, type: () => String }, jobTitle: { required: false, enum: t["../../../libs/shared/dist/cjs/types/organization/index"].JobTitleEnum }, domain: { required: false, type: () => String }, language: { required: false, type: () => [String] } } }], [import("./app/organization/dtos/rename-organization.dto"), { "RenameOrganizationDto": { name: { required: true, type: () => String } } }], [import("./app/organization/dtos/update-branding-details.dto"), { "UpdateBrandingDetailsDto": { logo: { required: true, type: () => String }, color: { required: true, type: () => String }, fontColor: { required: true, type: () => String }, contentBackground: { required: true, type: () => String }, fontFamily: { required: false, type: () => String } } }], [import("./app/organization/dtos/update-member-roles.dto"), { "UpdateMemberRolesDto": { role: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/organization/member.enum"].MemberRoleEnum.ADMIN } } }], [import("./app/organization/dtos/organization-response.dto"), { "IPartnerConfigurationResponseDto": { projectIds: { required: false, type: () => [String] }, accessToken: { required: true, type: () => String }, configurationId: { required: true, type: () => String }, teamId: { required: true, type: () => String }, partnerType: { required: true, type: () => String, enum: t["../../../libs/dal/dist/repositories/organization/organization.entity"].PartnerTypeEnum } }, "OrganizationBrandingResponseDto": { direction: { required: false, enum: t["../../../libs/dal/dist/repositories/organization/organization.entity"].DirectionEnum } }, "OrganizationResponseDto": { name: { required: true, type: () => String }, logo: { required: false, type: () => String }, branding: { required: true, type: () => t["./app/organization/dtos/organization-response.dto"].OrganizationBrandingResponseDto }, partnerConfigurations: { required: true, type: () => [t["./app/organization/dtos/organization-response.dto"].IPartnerConfigurationResponseDto] } } }], [import("./app/organization/dtos/member-response.dto"), { "MemberUserDto": { _id: { required: true, type: () => String }, firstName: { required: true, type: () => String }, lastName: { required: true, type: () => String }, email: { required: true, type: () => String } }, "MemberInviteDTO": { email: { required: true, type: () => String }, token: { required: true, type: () => String }, invitationDate: { required: true, type: () => Date }, answerDate: { required: false, type: () => Date }, _inviterId: { required: true, type: () => String } }, "MemberResponseDto": { _id: { required: true, type: () => String }, _userId: { required: true, type: () => String }, user: { required: false, type: () => t["./app/organization/dtos/member-response.dto"].MemberUserDto }, roles: { required: false, enum: t["../../../libs/shared/dist/cjs/entities/organization/member.enum"].MemberRoleEnum }, invite: { required: false, type: () => t["./app/organization/dtos/member-response.dto"].MemberInviteDTO }, memberStatus: { required: false, enum: t["../../../libs/shared/dist/cjs/entities/organization/member.interface"].MemberStatusEnum }, _organizationId: { required: true, type: () => String } } }], [import("./app/testing/dtos/seed-data.dto"), { "SeedDataBodyDto": {} }], [import("./app/testing/dtos/idempotency.dto"), { "IdempotencyBodyDto": { data: { required: true, type: () => Number } } }], [import("./app/execution-details/dtos/execution-details-request.dto"), { "ExecutionDetailsRequestDto": { notificationId: { required: true, type: () => String }, subscriberId: { required: true, type: () => String } } }], [import("./app/workflows/dto/workflow-response.dto"), { "NotificationGroup": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _parentId: { required: false, type: () => String } }, "NotificationTriggerVariable": { name: { required: true, type: () => String } }, "NotificationTrigger": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerTypeEnum }, identifier: { required: true, type: () => String }, variables: { required: true, type: () => [t["./app/workflows/dto/workflow-response.dto"].NotificationTriggerVariable] }, subscriberVariables: { required: false, type: () => [t["./app/workflows/dto/workflow-response.dto"].NotificationTriggerVariable] } }, "WorkflowResponse": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, description: { required: true, type: () => String }, active: { required: true, type: () => Boolean }, draft: { required: true, type: () => Boolean }, preferenceSettings: { required: true, type: () => t["./app/shared/dtos/preference-channels"].PreferenceChannels }, critical: { required: true, type: () => Boolean }, tags: { required: true, type: () => [String] }, steps: { required: true, type: () => [t["./app/shared/dtos/notification-step"].NotificationStep] }, _organizationId: { required: true, type: () => String }, _creatorId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, triggers: { required: true, type: () => [t["./app/workflows/dto/workflow-response.dto"].NotificationTrigger] }, _notificationGroupId: { required: true, type: () => String }, _parentId: { required: false, type: () => String }, deleted: { required: true, type: () => Boolean }, deletedAt: { required: true, type: () => String }, deletedBy: { required: true, type: () => String }, notificationGroup: { required: false, type: () => t["./app/workflows/dto/workflow-response.dto"].NotificationGroup }, data: { required: false, type: () => Object }, workflowIntegrationStatus: { required: false, type: () => Object } } }], [import("./app/workflows/dto/workflows.response.dto"), { "WorkflowsResponseDto": { totalCount: { required: true, type: () => Number }, data: { required: true, type: () => [t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/workflows/dto/change-workflow-status-request.dto"), { "ChangeWorkflowStatusRequestDto": { active: { required: true, type: () => Boolean } } }], [import("./app/workflows/dto/create-workflow.request.dto"), { "CreateWorkflowRequestDto": { name: { required: true, type: () => String }, notificationGroupId: { required: true, type: () => String }, notificationGroup: { required: false, type: () => Object }, tags: { required: true, type: () => [String] }, description: { required: true, type: () => String, maxLength: 1000 }, steps: { required: true, type: () => [t["./app/shared/dtos/notification-step"].NotificationStep] }, active: { required: false, type: () => Boolean }, draft: { required: false, type: () => Boolean }, critical: { required: false, type: () => Boolean }, blueprintId: { required: false, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/workflows/dto/update-workflow-request.dto"), { "UpdateWorkflowRequestDto": { name: { required: true, type: () => String }, tags: { required: true, type: () => [String] }, description: { required: true, type: () => String, maxLength: 300 }, identifier: { required: false, type: () => String }, steps: { required: true, type: () => [t["./app/shared/dtos/notification-step"].NotificationStep] }, notificationGroupId: { required: true, type: () => String }, critical: { required: false, type: () => Boolean }, data: { required: false, type: () => Object } } }], [import("./app/workflows/dto/variables.response.dto"), { "VariablesResponseDto": { translations: { required: true, type: () => Object }, system: { required: true, type: () => Object } } }], [import("./app/workflows/dto/workflows-request.dto"), { "WorkflowsRequestDto": {} }], [import("./app/events/dtos/test-email-request.dto"), { "TestSendEmailRequestDto": { contentType: { required: true, type: () => Object }, payload: { required: true, type: () => Object }, subject: { required: true, type: () => String }, preheader: { required: false, type: () => String }, content: { required: true, type: () => Object }, to: { required: true, type: () => Object }, layoutId: { required: false, type: () => String, nullable: true }, bridge: { required: false, type: () => Boolean, default: false }, stepId: { required: false, type: () => String, nullable: true }, workflowId: { required: false, type: () => String, nullable: true }, inputs: { required: true, type: () => Object }, controls: { required: true, type: () => Object } } }], [import("./app/events/dtos/trigger-event-response.dto"), { "TriggerEventResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, enum: t["../../../libs/shared/dist/cjs/types/events/index"].TriggerEventStatusEnum }, error: { required: false, type: () => [String] }, transactionId: { required: false, type: () => String } } }], [import("./app/subscribers/dtos/create-subscriber-request.dto"), { "CreateSubscriberRequestDto": { subscriberId: { required: true, type: () => String }, email: { required: false, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, phone: { required: false, type: () => String }, avatar: { required: false, type: () => String }, locale: { required: false, type: () => String }, data: { required: false, type: () => Object }, channels: { required: false, type: () => [t["./app/subscribers/dtos/create-subscriber-request.dto"].SubscriberChannelDto] } }, "SubscriberChannelDto": { providerId: { required: true, type: () => Object }, integrationIdentifier: { required: false, type: () => String }, credentials: { required: true, type: () => t["./app/subscribers/dtos/create-subscriber-request.dto"].ChannelCredentialsDto } }, "ChannelCredentialsDto": { webhookUrl: { required: false, type: () => String }, deviceTokens: { required: false, type: () => [String] } }, "BulkSubscriberCreateDto": { subscribers: { required: true, type: () => [t["./app/subscribers/dtos/create-subscriber-request.dto"].CreateSubscriberRequestDto] } } }], [import("./app/subscribers/dtos/delete-subscriber-response.dto"), { "DeleteSubscriberResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, type: () => String } } }], [import("./app/subscribers/dtos/update-subscriber-channel-request.dto"), { "UpdateSubscriberChannelRequestDto": { providerId: { required: true, type: () => Object }, integrationIdentifier: { required: false, type: () => String }, credentials: { required: true, type: () => t["./app/shared/dtos/subscriber-channel"].ChannelCredentials } } }], [import("./app/subscribers/dtos/subscriber-response.dto"), { "ChannelSettings": { _integrationId: { required: true, type: () => String } }, "SubscriberResponseDto": { _id: { required: false, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, email: { required: false, type: () => String }, phone: { required: false, type: () => String }, avatar: { required: false, type: () => String }, locale: { required: false, type: () => String }, subscriberId: { required: true, type: () => String }, channels: { required: false, type: () => [t["./app/subscribers/dtos/subscriber-response.dto"].ChannelSettings] }, isOnline: { required: false, type: () => Boolean }, lastOnlineAt: { required: false, type: () => String }, _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, deleted: { required: true, type: () => Boolean }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String }, __v: { required: false, type: () => Number } } }], [import("./app/subscribers/dtos/subscribers-response.dto"), { "SubscribersResponseDto": {} }], [import("./app/subscribers/dtos/update-subscriber-request.dto"), { "UpdateSubscriberRequestDto": { email: { required: false, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, phone: { required: false, type: () => String }, avatar: { required: false, type: () => String }, locale: { required: false, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/subscribers/dtos/get-subscriber-preferences-response.dto"), { "GetSubscriberPreferencesResponseDto": {} }], [import("./app/subscribers/dtos/update-subscriber-global-preferences-request.dto"), { "UpdateSubscriberGlobalPreferencesRequestDto": { enabled: { required: false, type: () => Boolean }, preferences: { required: false, type: () => [t["./app/shared/dtos/channel-preference"].ChannelPreference] } } }], [import("./app/tenant/dtos/create-tenant-request.dto"), { "CreateTenantRequestDto": { identifier: { required: true, type: () => String }, name: { required: true, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/tenant/dtos/create-tenant-response.dto"), { "CreateTenantResponseDto": { _id: { required: true, type: () => String }, identifier: { required: true, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object }, _environmentId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String } } }], [import("./app/tenant/dtos/get-tenant-response.dto"), { "GetTenantResponseDto": { _id: { required: true, type: () => String }, identifier: { required: true, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object }, _environmentId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String } } }], [import("./app/tenant/dtos/get-tenants-request.dto"), { "GetTenantsRequestDto": {} }], [import("./app/tenant/dtos/update-tenant-request.dto"), { "UpdateTenantRequestDto": { identifier: { required: false, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object } } }], [import("./app/tenant/dtos/update-tenant-response.dto"), { "UpdateTenantResponseDto": { _id: { required: true, type: () => String }, identifier: { required: true, type: () => String }, name: { required: false, type: () => String }, data: { required: false, type: () => Object }, _environmentId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String } } }], [import("./app/events/dtos/trigger-event-request.dto"), { "SubscriberPayloadDto": {}, "TenantPayloadDto": {}, "TopicPayloadDto": { topicKey: { required: true, type: () => String }, type: { required: true, enum: t["../../../libs/shared/dist/cjs/types/events/index"].TriggerRecipientsTypeEnum } }, "TriggerEventRequestDto": { name: { required: true, type: () => String }, payload: { required: false, type: () => Object }, bridgeUrl: { required: false, type: () => String }, overrides: { required: false, type: () => Object }, to: { required: true, type: () => [Object] }, transactionId: { required: false, type: () => String }, actor: { required: false, type: () => Object }, tenant: { required: false, type: () => Object }, controls: { required: false, type: () => Object } }, "BulkTriggerEventDto": { events: { required: true, type: () => [t["./app/events/dtos/trigger-event-request.dto"].TriggerEventRequestDto] } } }], [import("./app/events/dtos/trigger-event-to-all-request.dto"), { "TriggerEventToAllRequestDto": { name: { required: true, type: () => String }, payload: { required: true, type: () => Object }, overrides: { required: false, type: () => Object }, transactionId: { required: false, type: () => String }, actor: { required: false, type: () => Object }, tenant: { required: false, type: () => Object } } }], [import("./app/widgets/dtos/organization-response.dto"), { "OrganizationResponseDto": { _id: { required: true, type: () => String }, name: { required: true, type: () => String } } }], [import("./app/widgets/dtos/message-response.dto"), { "EmailBlock": { type: { required: true, enum: t["../../../libs/shared/dist/cjs/types/message-template/index"].EmailBlockTypeEnum }, content: { required: true, type: () => String }, url: { required: false, type: () => String } }, "MessageCTA": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelCTATypeEnum } }, "MessageResponseDto": { _id: { required: true, type: () => String }, _templateId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _messageTemplateId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _notificationId: { required: true, type: () => String }, _subscriberId: { required: true, type: () => String }, subscriber: { required: false, type: () => t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, template: { required: false, type: () => t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, templateIdentifier: { required: false, type: () => String }, createdAt: { required: true, type: () => String }, lastSeenDate: { required: false, type: () => String }, lastReadDate: { required: false, type: () => String }, content: { required: true, type: () => Object }, transactionId: { required: true, type: () => String }, subject: { required: false, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, read: { required: true, type: () => Boolean }, seen: { required: true, type: () => Boolean }, email: { required: false, type: () => String }, phone: { required: false, type: () => String }, directWebhookUrl: { required: false, type: () => String }, providerId: { required: false, type: () => String }, deviceTokens: { required: false, type: () => [String] }, title: { required: false, type: () => String }, cta: { required: true, type: () => t["./app/widgets/dtos/message-response.dto"].MessageCTA }, _feedId: { required: false, type: () => String, nullable: true }, status: { required: true, type: () => Object }, errorId: { required: true, type: () => String }, errorText: { required: true, type: () => String }, payload: { required: true, type: () => Object }, overrides: { required: true, type: () => Object } }, "MessagesResponseDto": { totalCount: { required: false, type: () => Number }, hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/widgets/dtos/message-response.dto"].MessageResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/widgets/dtos/feeds-response.dto"), { "NotificationDto": { _id: { required: true, type: () => String }, _templateId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _messageTemplateId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _notificationId: { required: true, type: () => String }, _subscriberId: { required: true, type: () => String }, _feedId: { required: true, type: () => String }, _jobId: { required: true, type: () => String }, createdAt: { required: true, type: () => String }, updatedAt: { required: true, type: () => String }, expireAt: { required: true, type: () => String }, subscriber: { required: false, type: () => t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, transactionId: { required: true, type: () => String }, templateIdentifier: { required: true, type: () => String }, providerId: { required: true, type: () => String }, content: { required: true, type: () => String }, subject: { required: false, type: () => String }, channel: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, read: { required: true, type: () => Boolean }, seen: { required: true, type: () => Boolean }, deleted: { required: true, type: () => Boolean }, deviceTokens: { required: false, type: () => [String] }, cta: { required: true, type: () => t["./app/widgets/dtos/message-response.dto"].MessageCTA }, status: { required: true, type: () => Object }, payload: { required: true, type: () => Object }, overrides: { required: true, type: () => Object } }, "FeedResponseDto": { totalCount: { required: false, type: () => Number }, hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/widgets/dtos/feeds-response.dto"].NotificationDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/widgets/dtos/session-initialize-response.dto"), { "SessionInitializeResponseDto": { token: { required: true, type: () => String } } }], [import("./app/widgets/dtos/log-usage-request.dto"), { "LogUsageRequestDto": { name: { required: true, type: () => String }, payload: { required: true, type: () => Object } } }], [import("./app/widgets/dtos/log-usage-response.dto"), { "LogUsageResponseDto": { success: { required: true, type: () => Boolean } } }], [import("./app/widgets/dtos/session-initialize-request.dto"), { "SessionInitializeRequestDto": { subscriberId: { required: true, type: () => String }, applicationIdentifier: { required: true, type: () => String }, firstName: { required: false, type: () => String }, lastName: { required: false, type: () => String }, email: { required: false, type: () => String }, phone: { required: false, type: () => String }, hmacHash: { required: false, type: () => String } } }], [import("./app/widgets/dtos/unseen-count-response.dto"), { "UnseenCountResponse": { count: { required: true, type: () => Number } } }], [import("./app/widgets/dtos/update-subscriber-preference-response.dto"), { "NotificationTriggerVariableResponse": { name: { required: true, type: () => String }, value: { required: false, type: () => Object }, type: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].TemplateVariableTypeEnum } }, "TriggerReservedVariableResponse": { type: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerContextTypeEnum }, variables: { required: true, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].NotificationTriggerVariableResponse] } }, "NotificationTriggerResponse": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerTypeEnum }, identifier: { required: true, type: () => String }, variables: { required: true, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].NotificationTriggerVariableResponse] }, subscriberVariables: { required: false, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].NotificationTriggerVariableResponse] }, reservedVariables: { required: false, type: () => [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].TriggerReservedVariableResponse] } }, "UpdateSubscriberPreferenceResponseDto": {} }], [import("./app/widgets/dtos/update-subscriber-preference-request.dto"), { "UpdateSubscriberPreferenceRequestDto": { channel: { required: false, type: () => t["./app/shared/dtos/channel-preference"].ChannelPreference }, enabled: { required: false, type: () => Boolean } } }], [import("./app/subscribers/dtos/get-in-app-notification-feed-for-subscriber.dto"), { "GetInAppNotificationsFeedForSubscriberDto": { feedIdentifier: { required: true, type: () => Object }, read: { required: true, type: () => Boolean }, seen: { required: true, type: () => Boolean }, payload: { required: false, type: () => String } } }], [import("./app/widgets/dtos/get-notifications-feed-request.dto"), { "GetNotificationsFeedDto": {} }], [import("./app/widgets/dtos/remove-all-messages.dto"), { "RemoveAllMessagesDto": { feedId: { required: true, type: () => String } } }], [import("./app/widgets/dtos/remove-messages-bulk-request.dto"), { "RemoveMessagesBulkRequestDto": { messageIds: { required: true, type: () => [String] } } }], [import("./app/widgets/dtos/mark-as-request.dto"), { "MessageMarkAsRequestDto": { messageId: { required: true, type: () => Object }, markAs: { required: true, enum: t["../../../libs/shared/dist/cjs/types/messages/index"].MessagesStatusEnum } } }], [import("./app/subscribers/dtos/update-subscriber-online-flag-request.dto"), { "UpdateSubscriberOnlineFlagRequestDto": { isOnline: { required: true, type: () => Boolean } } }], [import("./app/widgets/dtos/mark-message-as-request.dto"), { "MarkMessageAsRequestDto": { messageId: { required: true, type: () => Object } } }], [import("./app/widgets/dtos/mark-message-action-as-seen.dto"), { "MarkMessageActionAsSeenDto": { status: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/messages/messages.interface"].MessageActionStatusEnum }, payload: { required: true, type: () => Object } } }], [import("./app/subscribers/dtos/get-subscribers.dto"), { "GetSubscribersDto": {} }], [import("./app/subscribers/dtos/chat-oauth-request.dto"), { "ChatOauthRequestDto": { hmacHash: { required: true, type: () => String }, environmentId: { required: true, type: () => String }, integrationIdentifier: { required: false, type: () => String } }, "ChatOauthCallbackRequestDto": { code: { required: true, type: () => String } } }], [import("./app/subscribers/dtos/mark-all-messages-as-request.dto"), { "MarkAllMessageAsRequestDto": { feedIdentifier: { required: false, type: () => Object }, markAs: { required: true, enum: t["../../../libs/shared/dist/cjs/types/messages/index"].MessagesStatusEnum } } }], [import("./app/topics/dtos/topic.dto"), { "TopicDto": { _id: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, key: { required: true, type: () => String }, name: { required: true, type: () => String }, subscribers: { required: true, type: () => [String] } } }], [import("./app/topics/dtos/add-subscribers.dto"), { "AddSubscribersRequestDto": { subscribers: { required: true, type: () => [String] } } }], [import("./app/topics/dtos/create-topic.dto"), { "CreateTopicResponseDto": {}, "CreateTopicRequestDto": { key: { required: true, type: () => String }, name: { required: true, type: () => String } } }], [import("./app/topics/dtos/filter-topics.dto"), { "FilterTopicsRequestDto": { page: { required: false, type: () => Number, default: 0, minimum: 0 }, pageSize: { required: false, type: () => Number, default: 10, minimum: 0 }, key: { required: false, type: () => String } }, "FilterTopicsResponseDto": { data: { required: true, type: () => [t["./app/topics/dtos/topic.dto"].TopicDto] }, page: { required: true, type: () => Number }, pageSize: { required: true, type: () => Number }, totalCount: { required: true, type: () => Number } } }], [import("./app/topics/dtos/get-topic.dto"), { "GetTopicResponseDto": {} }], [import("./app/topics/dtos/remove-subscribers.dto"), { "RemoveSubscribersRequestDto": { subscribers: { required: true, type: () => [String] } } }], [import("./app/topics/dtos/rename-topic.dto"), { "RenameTopicResponseDto": {}, "RenameTopicRequestDto": { name: { required: true, type: () => String } } }], [import("./app/topics/dtos/topic-subscriber.dto"), { "TopicSubscriberDto": { _organizationId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _subscriberId: { required: true, type: () => String }, _topicId: { required: true, type: () => String }, topicKey: { required: true, type: () => String }, externalSubscriberId: { required: true, type: () => String } } }], [import("./app/bridge/dtos/create-bridge-response.dto"), { "CreateBridgeResponseDto": {} }], [import("./app/bridge/dtos/validate-bridge-url-request.dto"), { "ValidateBridgeUrlRequestDto": { bridgeUrl: { required: true, type: () => String } } }], [import("./app/bridge/dtos/validate-bridge-url-response.dto"), { "ValidateBridgeUrlResponseDto": { isValid: { required: true, type: () => Boolean } } }], [import("./app/bridge/dtos/create-bridge-request.dto"), { "CreateBridgeRequestDto": { workflows: { required: true, type: () => [Object] }, bridgeUrl: { required: true, type: () => String } } }], [import("./app/notifications/dtos/activity-stats-response.dto"), { "ActivityStatsResponseDto": { weeklySent: { required: true, type: () => Number }, monthlySent: { required: true, type: () => Number } } }], [import("./app/notifications/dtos/activities-response.dto"), { "ActivityNotificationStepResponseDto": { _id: { required: true, type: () => String }, active: { required: true, type: () => Boolean }, filters: { required: true, type: () => t["../../../libs/dal/dist/repositories/notification-template/notification-template.entity"].StepFilter }, template: { required: false, type: () => t["../../../libs/shared/dist/cjs/dto/message-template/message-template.dto"].MessageTemplateDto } }, "ActivityNotificationExecutionDetailResponseDto": { _id: { required: true, type: () => String }, _jobId: { required: true, type: () => String }, status: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/execution-details/execution-details.interface"].ExecutionDetailsStatusEnum }, detail: { required: true, type: () => String }, isRetry: { required: true, type: () => Boolean }, isTest: { required: true, type: () => Boolean }, providerId: { required: true, type: () => Object }, raw: { required: false, type: () => String }, source: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/execution-details/execution-details.interface"].ExecutionDetailsSourceEnum } }, "ActivityNotificationJobResponseDto": { _id: { required: true, type: () => String }, type: { required: true, type: () => String }, digest: { required: false, type: () => Object }, executionDetails: { required: true, type: () => [t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationExecutionDetailResponseDto] }, step: { required: true, type: () => t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationStepResponseDto }, payload: { required: false, type: () => Object }, providerId: { required: true, type: () => Object }, status: { required: true, type: () => String } }, "ActivityNotificationSubscriberResponseDto": { firstName: { required: false, type: () => String }, _id: { required: true, type: () => String }, lastName: { required: false, type: () => String }, email: { required: false, type: () => String }, phone: { required: false, type: () => String } }, "NotificationTriggerVariable": { name: { required: true, type: () => String } }, "NotificationTrigger": { type: { required: true, type: () => String, enum: t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].TriggerTypeEnum }, identifier: { required: true, type: () => String }, variables: { required: true, type: () => [t["./app/notifications/dtos/activities-response.dto"].NotificationTriggerVariable] }, subscriberVariables: { required: false, type: () => [t["./app/notifications/dtos/activities-response.dto"].NotificationTriggerVariable] } }, "ActivityNotificationResponseDto": { _id: { required: false, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String }, transactionId: { required: true, type: () => String }, createdAt: { required: false, type: () => String }, channels: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].StepTypeEnum, isArray: true }, subscriber: { required: false, type: () => t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationSubscriberResponseDto }, jobs: { required: false, type: () => [t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationJobResponseDto] } }, "ActivitiesResponseDto": { hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/notifications/dtos/activity-graph-states-response.dto"), { "ActivityGraphStatesResponse": { _id: { required: true, type: () => String }, count: { required: true, type: () => Number }, templates: { required: true, type: () => [String] }, channels: { required: true, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum, isArray: true } } }], [import("./app/notifications/dtos/activities-request.dto"), { "ActivitiesRequestDto": { channels: { required: true, type: () => Object }, templates: { required: true, type: () => Object }, emails: { required: true, type: () => Object }, search: { required: true, type: () => String }, subscriberIds: { required: true, type: () => Object }, page: { required: false, type: () => Number, default: 0 }, transactionId: { required: true, type: () => String } } }], [import("./app/storage/dtos/upload-url-response.dto"), { "UploadUrlResponse": { signedUrl: { required: true, type: () => String }, path: { required: true, type: () => String } } }], [import("./app/invites/dtos/invite-member.dto"), { "InviteMemberDto": { email: { required: true, type: () => String } }, "InviteWebhookDto": { subscriber: { required: true, type: () => t["../../../libs/dal/dist/repositories/subscriber/subscriber.entity"].SubscriberEntity }, payload: { required: true, type: () => ({ organizationId: { required: true, type: () => String } }) } } }], [import("./app/invites/dtos/bulk-invite-members.dto"), { "EmailInvitee": { email: { required: true, type: () => String } }, "BulkInviteMembersDto": { invitees: { required: true, type: () => [t["./app/invites/dtos/bulk-invite-members.dto"].EmailInvitee] } } }], [import("./app/invites/dtos/resend-invite.dto"), { "ResendInviteDto": { memberId: { required: true, type: () => String } } }], [import("./app/feeds/dto/create-feed-request.dto"), { "CreateFeedRequestDto": { name: { required: true, type: () => String } } }], [import("./app/feeds/dto/feed-response.dto"), { "FeedResponseDto": { _id: { required: false, type: () => String }, name: { required: true, type: () => String }, identifier: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, _organizationId: { required: true, type: () => String } } }], [import("./app/messages/dtos/delete-message-response.dto"), { "DeleteMessageResponseDto": { acknowledged: { required: true, type: () => Boolean }, status: { required: true, type: () => String } } }], [import("./app/messages/dtos/get-messages-requests.dto"), { "GetMessagesRequestDto": { channel: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum }, subscriberId: { required: false, type: () => String }, transactionId: { required: false, type: () => Object }, page: { required: false, type: () => Number, default: 0 }, limit: { required: false, type: () => Number, default: 10 } } }], [import("./app/messages/dtos/remove-messages-by-transactionId-request.dto"), { "DeleteMessageByTransactionIdRequestDto": { channel: { required: false, enum: t["../../../libs/shared/dist/cjs/types/channel/index"].ChannelTypeEnum } } }], [import("./app/partner-integrations/dtos/setup-vercel-integration-response.dto"), { "SetupVercelConfigurationResponseDto": { success: { required: true, type: () => Boolean } } }], [import("./app/partner-integrations/dtos/complete-and-update-vercel-integration-request.dto"), { "CompleteAndUpdateVercelIntegrationRequestDto": { data: { required: true, type: () => Object }, configurationId: { required: true, type: () => String } } }], [import("./app/partner-integrations/dtos/setup-vercel-integration-request.dto"), { "SetVercelConfigurationRequestDto": { vercelIntegrationCode: { required: true, type: () => String }, configurationId: { required: true, type: () => String } } }], [import("./app/blueprint/dto/get-blueprint.response.dto"), { "GetBlueprintResponse": { _id: { required: true, type: () => String }, name: { required: true, type: () => String }, description: { required: true, type: () => String }, active: { required: true, type: () => Boolean }, draft: { required: true, type: () => Boolean }, critical: { required: true, type: () => Boolean }, tags: { required: true, type: () => [String] }, steps: { required: true, type: () => [t["../../../libs/shared/dist/cjs/dto/workflows/workflow.dto"].NotificationStepDto] }, _organizationId: { required: true, type: () => String }, _creatorId: { required: true, type: () => String }, _environmentId: { required: true, type: () => String }, triggers: { required: true, type: () => [Object] }, _notificationGroupId: { required: true, type: () => String }, _parentId: { required: false, type: () => String }, deleted: { required: true, type: () => Boolean }, deletedAt: { required: true, type: () => String }, deletedBy: { required: true, type: () => String }, createdAt: { required: false, type: () => String }, updatedAt: { required: false, type: () => String }, notificationGroup: { required: false, type: () => Object }, isBlueprint: { required: true, type: () => Boolean }, blueprintId: { required: false, type: () => String } } }], [import("./app/blueprint/dto/grouped-blueprint.response.dto"), { "GroupedBlueprintResponse": { general: { required: true, type: () => [t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].IGroupedBlueprint] }, popular: { required: true, type: () => t["../../../libs/shared/dist/cjs/entities/notification-template/notification-template.interface"].IGroupedBlueprint } } }], [import("./app/workflow-overrides/dto/create-workflow-override-response.dto"), { "CreateWorkflowOverrideResponseDto": {} }], [import("./app/workflow-overrides/dto/create-workflow-override-request.dto"), { "CreateWorkflowOverrideRequestDto": { workflowId: { required: true, type: () => String }, tenantId: { required: true, type: () => String }, active: { required: false, type: () => Boolean }, preferenceSettings: { required: false, type: () => t["./app/shared/dtos/preference-channels"].PreferenceChannels } } }], [import("./app/workflow-overrides/dto/get-workflow-override-response.dto"), { "GetWorkflowOverrideResponseDto": {} }], [import("./app/workflow-overrides/dto/get-workflow-overrides-request.dto"), { "GetWorkflowOverridesRequestDto": {} }], [import("./app/workflow-overrides/dto/get-workflow-overrides-response.dto"), { "GetWorkflowOverridesResponseDto": { hasMore: { required: true, type: () => Boolean }, data: { required: true, type: () => [t["./app/workflow-overrides/dto/shared"].OverrideResponseDto] }, pageSize: { required: true, type: () => Number }, page: { required: true, type: () => Number } } }], [import("./app/workflow-overrides/dto/update-workflow-override-request.dto"), { "UpdateWorkflowOverrideRequestDto": { active: { required: false, type: () => Boolean }, preferenceSettings: { required: false, type: () => t["./app/shared/dtos/preference-channels"].PreferenceChannels } } }], [import("./app/workflow-overrides/dto/update-workflow-override-response.dto"), { "UpdateWorkflowOverrideResponseDto": {} }], [import("./app/inbox/dtos/get-notifications-response.dto"), { "GetNotificationsResponseDto": { data: { required: true, type: () => [Object] }, hasMore: { required: true, type: () => Boolean }, filter: { required: true, type: () => Object } } }], [import("./app/inbox/dtos/subscriber-session-response.dto"), { "SubscriberSessionResponseDto": { token: { required: true, type: () => String }, totalUnreadCount: { required: true, type: () => Number } } }], [import("./app/inbox/dtos/subscriber-session-request.dto"), { "SubscriberSessionRequestDto": { applicationIdentifier: { required: true, type: () => String }, subscriberId: { required: true, type: () => String }, subscriberHash: { required: false, type: () => String } } }], [import("./app/inbox/dtos/get-notifications-request.dto"), { "GetNotificationsRequestDto": { tags: { required: false, type: () => [String] }, read: { required: false, type: () => Boolean }, archived: { required: false, type: () => Boolean } } }], [import("./app/inbox/dtos/get-notifications-count-request.dto"), { "GetNotificationsCountRequestDto": { tags: { required: false, type: () => [String] }, read: { required: false, type: () => Boolean }, archived: { required: false, type: () => Boolean } } }], [import("./app/inbox/dtos/get-notifications-count-response.dto"), { "GetNotificationsCountResponseDto": { data: { required: true, type: () => ({ count: { required: true, type: () => Number } }) }, filter: { required: true, type: () => Object } } }], [import("./app/inbox/dtos/action-type-request.dto"), { "ActionTypeRequestDto": { actionType: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/messages/action.enum"].ButtonTypeEnum } } }], [import("./app/inbox/dtos/update-all-notifications-request.dto"), { "UpdateAllNotificationsRequestDto": { tags: { required: false, type: () => [String] } } }], [import("./app/inbox/dtos/get-preferences-response.dto"), { "GetPreferencesResponseDto": { level: { required: true, enum: t["../../../libs/shared/dist/cjs/entities/subscriber-preference/subscriber-preference.interface"].PreferenceLevelEnum } } }], [import("./app/partner-integrations/dtos/get-vercel-projects-request.dto"), { "SetVercelConfigurationRequestDto": { configurationId: { required: true, type: () => String } } }]], "controllers": [[import("./app/user/user.controller"), { "UsersController": { "getMyProfile": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateProfileEmail": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateOnBoarding": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateOnBoardingTour": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto }, "updateProfile": { type: t["./app/user/dtos/user-response.dto"].UserResponseDto } } }], [import("./app/auth/auth.controller"), { "AuthController": { "githubAuth": {}, "githubCallback": { type: Object }, "refreshToken": { type: String }, "userRegistration": {}, "forgotPasswordRequest": {}, "passwordReset": {}, "userLogin": {}, "organizationSwitch": { type: String }, "projectSwitch": {}, "updatePassword": {}, "authenticateTest": { type: String } } }], [import("./app/environments/environments.controller"), { "EnvironmentsController": { "getCurrentEnvironment": { type: t["./app/environments/dtos/environment-response.dto"].EnvironmentResponseDto }, "createEnvironment": { type: t["./app/environments/dtos/environment-response.dto"].EnvironmentResponseDto }, "listMyEnvironments": { type: [t["./app/environments/dtos/environment-response.dto"].EnvironmentResponseDto] }, "updateMyEnvironment": {}, "listOrganizationApiKeys": { type: [t["./app/shared/dtos/api-key"].ApiKey] }, "regenerateOrganizationApiKeys": { type: [t["./app/shared/dtos/api-key"].ApiKey] } } }], [import("./app/notification-groups/notification-groups.controller"), { "NotificationGroupsController": { "createNotificationGroup": { type: t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto }, "listNotificationGroups": { type: [t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto] }, "getNotificationGroup": { type: t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto }, "updateNotificationGroup": { type: t["./app/notification-groups/dtos/notification-group-response.dto"].NotificationGroupResponseDto }, "deleteNotificationGroup": { type: t["./app/notification-groups/dtos/delete-notification-group-response.dto"].DeleteNotificationGroupResponseDto } } }], [import("./app/change/changes.controller"), { "ChangesController": { "getChanges": { type: t["./app/change/dtos/change-response.dto"].ChangesResponseDto }, "getChangesCount": { type: Number }, "bulkApplyDiff": { type: [[t["./app/change/dtos/change-response.dto"].ChangeResponseDto]] }, "applyDiff": { type: [t["./app/change/dtos/change-response.dto"].ChangeResponseDto] } } }], [import("./app/layouts/layouts.controller"), { "LayoutsController": { "createLayout": { type: t["./app/layouts/dtos/create-layout.dto"].CreateLayoutResponseDto }, "listLayouts": { type: t["./app/layouts/dtos/filter-layouts.dto"].FilterLayoutsResponseDto }, "getLayout": { type: t["./app/layouts/dtos/get-layout.dto"].GetLayoutResponseDto }, "deleteLayout": {}, "updateLayout": { type: t["./app/layouts/dtos/update-layout.dto"].UpdateLayoutResponseDto }, "setDefaultLayout": {} } }], [import("./app/integrations/integrations.controller"), { "IntegrationsController": { "listIntegrations": { type: [t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto] }, "getActiveIntegrations": { type: [t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto] }, "getWebhookSupportStatus": { type: Boolean }, "createIntegration": { type: t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto }, "updateIntegrationById": { type: t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto }, "setIntegrationAsPrimary": { type: t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto }, "removeIntegration": { type: [t["./app/integrations/dtos/integration-response.dto"].IntegrationResponseDto] }, "getProviderLimit": { type: t["./app/integrations/dtos/get-channel-type-limit.sto"].ChannelTypeLimitDto }, "getInAppActivated": {} } }], [import("./app/organization/organization.controller"), { "OrganizationController": { "createOrganization": { type: t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity }, "listOrganizations": { type: [t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity] }, "getSelfOrganizationData": { type: t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity }, "remove": { type: Object }, "updateMemberRoles": { type: Object }, "listOrganizationMembers": { type: [Object] }, "updateBrandingDetails": {}, "rename": {} } }], [import("./app/organization/ee.organization.controller"), { "EEOrganizationController": { "getMyOrganization": { type: t["../../../libs/dal/dist/repositories/organization/organization.entity"].OrganizationEntity }, "updateBrandingDetails": {}, "renameOrganization": {} } }], [import("./app/testing/testing.controller"), { "TestingController": { "clearDB": {}, "getSession": { description: "Used for seeding data for client e2e tests,\nCurrently just creates a new user session and returns signed JWT", type: Object }, "idempotency": {}, "idempotencyGet": {}, "productFeatureGet": {}, "resourceLimitingDefaultGet": {}, "resourceLimitingEventsGet": {} } }], [import("./app/testing/rate-limiting.controller"), { "TestApiRateLimitController": { "noCategoryNoCost": { type: Boolean }, "noCategorySingleCost": { type: Boolean }, "globalCategoryNoCost": { type: Boolean }, "globalCategorySingleCost": { type: Boolean }, "global": { type: Boolean }, "triggerCategoryNoCost": { type: Boolean }, "triggerCategorySingleCost": { type: Boolean }, "triggerCategoryBulkCost": { type: Boolean } }, "TestApiRateLimitBulkController": { "noCategoryNoCostOverride": { type: Boolean }, "noCategorySingleCostOverride": { type: Boolean }, "globalCategoryNoCostOverride": { type: Boolean } } }], [import("./app/testing/auth.controller"), { "TestApiAuthController": { "userRoute": { type: Boolean }, "userInaccessibleRoute": { type: Boolean } } }], [import("./app/health/health.controller"), { "HealthController": { "healthCheck": { type: Object } } }], [import("./app/execution-details/execution-details.controller"), { "ExecutionDetailsController": { "getExecutionDetailsForNotification": { type: [t["../../../libs/application-generic/build/main/usecases/create-execution-details/dtos/execution-details-response.dto"].ExecutionDetailsResponseDto] } } }], [import("./app/workflows/notification-template.controller"), { "NotificationTemplateController": { "getNotificationTemplates": { type: t["./app/workflows/dto/workflows.response.dto"].WorkflowsResponseDto }, "updateTemplateById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "deleteTemplateById": { type: Boolean }, "getNotificationTemplateById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "create": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "changeActiveStatus": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse } } }], [import("./app/workflows/workflow.controller"), { "WorkflowController": { "listWorkflows": { type: t["./app/workflows/dto/workflows.response.dto"].WorkflowsResponseDto }, "updateWorkflowById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "deleteWorkflowById": { type: Boolean }, "getWorkflowVariables": { type: t["./app/workflows/dto/variables.response.dto"].VariablesResponseDto }, "getWorkflowById": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "create": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse }, "updateActiveStatus": { type: t["./app/workflows/dto/workflow-response.dto"].WorkflowResponse } } }], [import("./app/events/events.controller"), { "EventsController": { "trigger": { type: t["./app/events/dtos/trigger-event-response.dto"].TriggerEventResponseDto }, "triggerBulk": { type: [t["./app/events/dtos/trigger-event-response.dto"].TriggerEventResponseDto] }, "broadcastEventToAll": { type: t["./app/events/dtos/trigger-event-response.dto"].TriggerEventResponseDto }, "testEmailMessage": {}, "cancel": { type: Boolean } } }], [import("./app/widgets/widgets.controller"), { "WidgetsController": { "sessionInitialize": { type: t["./app/widgets/dtos/session-initialize-response.dto"].SessionInitializeResponseDto }, "getNotificationsFeed": { type: t["./app/widgets/dtos/feeds-response.dto"].FeedResponseDto }, "getUnseenCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "getUnreadCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "getCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "markMessageAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "markMessagesAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "removeMessage": { type: t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity }, "removeAllMessages": {}, "removeMessagesBulk": {}, "markAllUnreadAsRead": { type: Number }, "markAllUnseenAsSeen": { type: Number }, "markActionAsSeen": { type: t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity }, "getOrganizationData": { type: t["./app/widgets/dtos/organization-response.dto"].OrganizationResponseDto }, "getSubscriberPreference": { type: [Object] }, "getSubscriberPreferenceByLevel": {}, "updateSubscriberPreference": { type: t["./app/widgets/dtos/update-subscriber-preference-response.dto"].UpdateSubscriberPreferenceResponseDto }, "updateSubscriberGlobalPreference": {}, "logUsage": { type: t["./app/widgets/dtos/log-usage-response.dto"].LogUsageResponseDto } } }], [import("./app/subscribers/subscribers.controller"), { "SubscribersController": { "listSubscribers": {}, "getSubscriber": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "createSubscriber": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "bulkCreateSubscribers": {}, "updateSubscriber": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "updateSubscriberChannel": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "modifySubscriberChannel": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "deleteSubscriberCredentials": {}, "updateSubscriberOnlineFlag": { type: t["./app/subscribers/dtos/subscriber-response.dto"].SubscriberResponseDto }, "removeSubscriber": { type: t["./app/subscribers/dtos/delete-subscriber-response.dto"].DeleteSubscriberResponseDto }, "listSubscriberPreferences": { type: [t["./app/widgets/dtos/update-subscriber-preference-response.dto"].UpdateSubscriberPreferenceResponseDto] }, "getSubscriberPreferenceByLevel": { type: [t["./app/subscribers/dtos/get-subscriber-preferences-response.dto"].GetSubscriberPreferencesResponseDto] }, "updateSubscriberPreference": { type: t["./app/widgets/dtos/update-subscriber-preference-response.dto"].UpdateSubscriberPreferenceResponseDto }, "updateSubscriberGlobalPreferences": {}, "getNotificationsFeed": { type: t["./app/widgets/dtos/feeds-response.dto"].FeedResponseDto }, "getUnseenCount": { type: t["./app/widgets/dtos/unseen-count-response.dto"].UnseenCountResponse }, "markMessageAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "markMessagesAs": { type: [t["../../../libs/dal/dist/repositories/message/message.entity"].MessageEntity] }, "markAllUnreadAsRead": { type: Number }, "markActionAsSeen": { type: t["./app/widgets/dtos/message-response.dto"].MessageResponseDto }, "chatOauthCallback": { type: Object }, "chatAccessOauth": {} } }], [import("./app/content-templates/content-templates.controller"), { "ContentTemplatesController": { "previewEmail": {}, "previewInApp": {}, "previewSms": {}, "previewChat": {}, "previewPush": {} } }], [import("./app/topics/topics.controller"), { "TopicsController": { "createTopic": { type: t["./app/topics/dtos/create-topic.dto"].CreateTopicResponseDto }, "addSubscribers": {}, "getTopicSubscriber": { type: t["./app/topics/dtos/topic-subscriber.dto"].TopicSubscriberDto }, "removeSubscribers": {}, "listTopics": { type: t["./app/topics/dtos/filter-topics.dto"].FilterTopicsResponseDto }, "deleteTopic": {}, "getTopic": { type: t["./app/topics/dtos/get-topic.dto"].GetTopicResponseDto }, "renameTopic": { type: t["./app/topics/dtos/rename-topic.dto"].RenameTopicResponseDto } } }], [import("./app/tenant/tenant.controller"), { "TenantController": { "listTenants": {}, "getTenantById": { type: t["./app/tenant/dtos/get-tenant-response.dto"].GetTenantResponseDto }, "createTenant": { type: t["./app/tenant/dtos/create-tenant-response.dto"].CreateTenantResponseDto }, "updateTenant": { type: t["./app/tenant/dtos/update-tenant-response.dto"].UpdateTenantResponseDto }, "removeTenant": {} } }], [import("./app/bridge/bridge.controller"), { "BridgeController": { "health": { type: Object }, "preview": { type: Object }, "createBridgesByDiscovery": { type: t["./app/bridge/dtos/create-bridge-response.dto"].CreateBridgeResponseDto }, "createDiscoverySoft": { type: t["./app/bridge/dtos/create-bridge-response.dto"].CreateBridgeResponseDto }, "getControls": { type: Object }, "createControls": { type: Object }, "validateBridgeUrl": { type: t["./app/bridge/dtos/validate-bridge-url-response.dto"].ValidateBridgeUrlResponseDto } } }], [import("./app/notifications/notification.controller"), { "NotificationsController": { "listNotifications": { type: t["./app/notifications/dtos/activities-response.dto"].ActivitiesResponseDto }, "getActivityStats": { type: t["./app/notifications/dtos/activity-stats-response.dto"].ActivityStatsResponseDto }, "getActivityGraphStats": { type: [t["./app/notifications/dtos/activity-graph-states-response.dto"].ActivityGraphStatesResponse] }, "getNotification": { type: t["./app/notifications/dtos/activities-response.dto"].ActivityNotificationResponseDto } } }], [import("./app/storage/storage.controller"), { "StorageController": { "signedUrl": { type: t["./app/storage/dtos/upload-url-response.dto"].UploadUrlResponse } } }], [import("./app/invites/invites.controller"), { "InvitesController": { "getInviteData": { type: Object }, "acceptInviteToken": { type: String }, "inviteMember": {}, "resendInviteMember": {}, "bulkInviteMembers": { type: [Object] }, "inviteCheckWebhook": {} } }], [import("./app/feeds/feeds.controller"), { "FeedsController": { "createFeed": { type: t["./app/feeds/dto/feed-response.dto"].FeedResponseDto }, "getFeeds": { type: [t["./app/feeds/dto/feed-response.dto"].FeedResponseDto] }, "deleteFeedById": { type: [t["./app/feeds/dto/feed-response.dto"].FeedResponseDto] } } }], [import("./app/messages/messages.controller"), { "MessagesController": { "getMessages": { type: t["./app/widgets/dtos/message-response.dto"].MessagesResponseDto }, "deleteMessage": { type: t["./app/messages/dtos/delete-message-response.dto"].DeleteMessageResponseDto }, "deleteMessagesByTransactionId": {} } }], [import("./app/partner-integrations/partner-integrations.controller"), { "PartnerIntegrationsController": { "setupVercelIntegration": { type: t["./app/partner-integrations/dtos/setup-vercel-integration-response.dto"].SetupVercelConfigurationResponseDto }, "webhook": { type: Boolean }, "getVercelProjects": {}, "completeVercelIntegration": {}, "getVercelConfigurationDetails": {}, "updateVercelConfiguration": {} } }], [import("./app/inbound-parse/inbound-parse.controller"), { "InboundParseController": { "getMxRecordStatus": { type: t["./app/inbound-parse/dtos/get-mx-record.dto"].GetMxRecordResponseDto } } }], [import("./app/blueprint/blueprint.controller"), { "BlueprintController": { "getGroupedBlueprints": { type: t["./app/blueprint/dto/grouped-blueprint.response.dto"].GroupedBlueprintResponse }, "getBlueprintById": { type: t["./app/blueprint/dto/get-blueprint.response.dto"].GetBlueprintResponse } } }], [import("./app/workflow-overrides/workflow-overrides.controller"), { "WorkflowOverridesController": { "create": { type: t["./app/workflow-overrides/dto/create-workflow-override-response.dto"].CreateWorkflowOverrideResponseDto }, "updateWorkflowOverrideById": { type: t["./app/workflow-overrides/dto/update-workflow-override-response.dto"].UpdateWorkflowOverrideResponseDto }, "updateWorkflowOverride": { type: t["./app/workflow-overrides/dto/update-workflow-override-response.dto"].UpdateWorkflowOverrideResponseDto }, "getWorkflowOverrideById": { type: t["./app/workflow-overrides/dto/get-workflow-override-response.dto"].GetWorkflowOverrideResponseDto }, "getWorkflowOverride": { type: t["./app/workflow-overrides/dto/get-workflow-override-response.dto"].GetWorkflowOverrideResponseDto }, "deleteWorkflowOverride": { type: Boolean }, "getWorkflowOverrides": { type: t["./app/workflow-overrides/dto/get-workflow-overrides-response.dto"].GetWorkflowOverridesResponseDto } } }], [import("./app/analytics/analytics.controller"), { "AnalyticsController": { "trackEvent": { type: Object } } }], [import("./app/inbox/inbox.controller"), { "InboxController": { "sessionInitialize": { type: t["./app/inbox/dtos/subscriber-session-response.dto"].SubscriberSessionResponseDto }, "getNotifications": { type: t["./app/inbox/dtos/get-notifications-response.dto"].GetNotificationsResponseDto }, "getNotificationsCount": { type: t["./app/inbox/dtos/get-notifications-count-response.dto"].GetNotificationsCountResponseDto }, "getAllPreferences": { type: [t["./app/inbox/dtos/get-preferences-response.dto"].GetPreferencesResponseDto] }, "markNotificationAsRead": { type: Object }, "markNotificationAsUnread": { type: Object }, "markNotificationAsArchived": { type: Object }, "markNotificationAsUnarchived": { type: Object }, "completeAction": { type: Object }, "revertAction": { type: Object }, "markAllAsRead": {}, "markAllAsArchived": {}, "markAllAsReadArchived": {} } }], [import("./app/auth/legacy-ee-auth/auth.controller"), { "AuthController": { "googleAuth": {}, "googleCallback": { type: Object } } }]] } }; }; \ No newline at end of file diff --git a/apps/web/src/components/providers/EnvironmentProvider.tsx b/apps/web/src/components/providers/EnvironmentProvider.tsx index 0e2488bceb6..fd9f0494cde 100644 --- a/apps/web/src/components/providers/EnvironmentProvider.tsx +++ b/apps/web/src/components/providers/EnvironmentProvider.tsx @@ -4,7 +4,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; import { IEnvironment } from '@novu/shared'; import { QueryKeys } from '../../api/query.keys'; import { getEnvironments } from '../../api/environment'; -import { createContextAndHook } from './createContextandHook'; +import { createContextAndHook } from './createContextAndHook'; import { IS_DOCKER_HOSTED } from '../../config/index'; import { BaseEnvironmentEnum } from '../../constants/BaseEnvironmentEnum'; import { useAuth } from './AuthProvider'; @@ -69,15 +69,19 @@ function selectEnvironment(environments: IEnvironment[] | undefined | null, sele export function EnvironmentProvider({ children }: { children: React.ReactNode }) { const navigate = useNavigate(); const queryClient = useQueryClient(); - const { currentOrganization } = useAuth(); + const { currentOrganization, isLoading: isLoadingAuth } = useAuth(); + const [internalLoading, setInternalLoading] = useState(true); const { data: environments, - isLoading, + isLoading: isLoadingEnvironments, refetch: refetchEnvironments, } = useQuery([QueryKeys.myEnvironments, currentOrganization?._id], getEnvironments, { enabled: !!currentOrganization, retry: false, staleTime: Infinity, + onSettled: (data, error) => { + setInternalLoading(false); + }, }); const [currentEnvironment, setCurrentEnvironment] = useState( @@ -163,7 +167,7 @@ export function EnvironmentProvider({ children }: { children: React.ReactNode }) switchEnvironment, switchToDevelopmentEnvironment, switchToProductionEnvironment, - isLoading, + isLoading: isLoadingEnvironments || isLoadingAuth || internalLoading, readOnly: currentEnvironment?._parentId !== undefined, }; diff --git a/apps/web/src/components/providers/createContextandHook.ts b/apps/web/src/components/providers/createContextAndHook.ts similarity index 100% rename from apps/web/src/components/providers/createContextandHook.ts rename to apps/web/src/components/providers/createContextAndHook.ts diff --git a/apps/web/src/ee/clerk/providers/EnterpriseAuthProvider.tsx b/apps/web/src/ee/clerk/providers/EnterpriseAuthProvider.tsx index 1320b32d604..e3b8dd0afd4 100644 --- a/apps/web/src/ee/clerk/providers/EnterpriseAuthProvider.tsx +++ b/apps/web/src/ee/clerk/providers/EnterpriseAuthProvider.tsx @@ -157,7 +157,11 @@ export const EnterpriseAuthProvider = ({ children }: { children: React.ReactNode // refetch queries on organization switch useEffect(() => { - if (organization && organization._id !== clerkOrganization?.id) { + // if linked, externalOrgId = internal org ObjectID, which is required on backend + const isInternalOrgLinked = !!clerkOrganization?.publicMetadata.externalOrgId; + const isOrgChanged = organization && organization._id !== clerkOrganization?.id; + + if (isInternalOrgLinked && isOrgChanged) { switchOrgCallback(); } }, [organization, clerkOrganization, switchOrgCallback]); diff --git a/apps/web/tests/utils/browser.ts b/apps/web/tests/utils/browser.ts index f2fb63bc034..960c72862e9 100644 --- a/apps/web/tests/utils/browser.ts +++ b/apps/web/tests/utils/browser.ts @@ -57,13 +57,14 @@ export async function deleteIndexedDB(page: Page, dbName: string) { } export async function isDarkTheme(page: Page) { + // TODO: there should be a more idiomatic way to find out what theme is selected const backgroundColor = await page.evaluate(() => { const body = document.body; return window.getComputedStyle(body).backgroundColor; }); - return backgroundColor.toLowerCase() !== '#EDF0F2' && backgroundColor.toLowerCase() !== 'rgb(237, 240, 242)'; + return backgroundColor.toLowerCase() === 'rgb(30, 30, 38)'; } export async function getAttByTestId(page: Page, testId: string, att: string) { diff --git a/apps/worker/src/app/workflow/usecases/add-job/add-delay-job.usecase.ts b/apps/worker/src/app/workflow/usecases/add-job/add-delay-job.usecase.ts index 546bc216891..d05f6800ab4 100644 --- a/apps/worker/src/app/workflow/usecases/add-job/add-delay-job.usecase.ts +++ b/apps/worker/src/app/workflow/usecases/add-job/add-delay-job.usecase.ts @@ -39,7 +39,7 @@ export class AddDelayJob { try { delay = this.computeJobWaitDurationService.calculateDelay({ - stepMetadata: data.step.bridgeUrl ? data.digest : data.step.metadata, + stepMetadata: data.step.metadata, payload: data.payload, overrides: data.overrides, }); diff --git a/apps/worker/src/app/workflow/usecases/add-job/add-job.usecase.ts b/apps/worker/src/app/workflow/usecases/add-job/add-job.usecase.ts index 4235b478e46..0e79dc57e2f 100644 --- a/apps/worker/src/app/workflow/usecases/add-job/add-job.usecase.ts +++ b/apps/worker/src/app/workflow/usecases/add-job/add-job.usecase.ts @@ -143,7 +143,7 @@ export class AddJob { } if (job.type === StepTypeEnum.DELAY) { - delayAmount = await this.handleDelay(command, filterVariables, delayAmount); + delayAmount = await this.handleDelay(command, filterVariables); if (delayAmount === undefined) { Logger.warn(`Delay Amount does not exist on a delay job ${job._id}`, LOG_CONTEXT); @@ -170,13 +170,30 @@ export class AddJob { await this.queueJob(job, 0); } - private async handleDelay( - command: AddJobCommand, - filterVariables: IFilterVariables, - delayAmount: number | undefined - ) { - await this.fetchBridgeData(command, filterVariables); - delayAmount = await this.addDelayJob.execute(command); + private async handleDelay(command: AddJobCommand, filterVariables: IFilterVariables) { + const bridgeResponse = await this.fetchBridgeData(command, filterVariables); + + let metadata: IWorkflowStepMetadata; + if (bridgeResponse) { + // Assign V2 metadata from Bridge response + metadata = await this.updateMetadata(bridgeResponse, command); + } else { + // Assign V1 metadata from known values + metadata = command.job.step.metadata as IWorkflowStepMetadata; + } + + const delayAmount = await this.addDelayJob.execute( + AddJobCommand.create({ + ...command, + job: { + ...command.job, + step: { + ...command.job.step, + metadata, + }, + }, + }) + ); Logger.debug(`Delay step Amount is: ${delayAmount}`, LOG_CONTEXT); @@ -199,21 +216,16 @@ export class AddJob { return null; } - const job = await this.updateJob(response, command); - - // Update the job digest directly to avoid an extra database call - command.job.digest = { ...command.job.digest, ...job } as IWorkflowStepMetadata; - return response; } - private async updateJob(response: ExecuteOutput, command: AddJobCommand) { - let job = {} as IWorkflowStepMetadata; + private async updateMetadata(response: ExecuteOutput, command: AddJobCommand) { + let metadata = {} as IWorkflowStepMetadata; const outputs = response.outputs; const digestType = getDigestType(response.outputs); if (isTimedDigestOutput(outputs)) { - job = { + metadata = { type: DigestTypeEnum.TIMED, digestKey: outputs?.digestKey, timed: { cronExpression: outputs?.cron }, @@ -226,18 +238,18 @@ export class AddJob { }, { $set: { - 'digest.type': job.type, - 'digest.digestKey': job.digestKey, - 'digest.amount': job.amount, - 'digest.unit': job.unit, - 'digest.timed.cronExpression': job.timed?.cronExpression, + 'digest.type': metadata.type, + 'digest.digestKey': metadata.digestKey, + 'digest.amount': metadata.amount, + 'digest.unit': metadata.unit, + 'digest.timed.cronExpression': metadata.timed?.cronExpression, }, } ); } if (isLookBackDigestOutput(outputs)) { - job = { + metadata = { type: digestType, amount: outputs?.amount, digestKey: outputs?.digestKey, @@ -254,20 +266,20 @@ export class AddJob { }, { $set: { - 'digest.type': job.type, - 'digest.digestKey': job.digestKey, - 'digest.amount': job.amount, - 'digest.unit': job.unit, - 'digest.backoff': job.backoff, - 'digest.backoffAmount': job.backoffAmount, - 'digest.backoffUnit': job.backoffUnit, + 'digest.type': metadata.type, + 'digest.digestKey': metadata.digestKey, + 'digest.amount': metadata.amount, + 'digest.unit': metadata.unit, + 'digest.backoff': metadata.backoff, + 'digest.backoffAmount': metadata.backoffAmount, + 'digest.backoffUnit': metadata.backoffUnit, }, } ); } if (isRegularDigestOutput(outputs)) { - job = { + metadata = { type: digestType, amount: outputs?.amount, digestKey: outputs?.digestKey, @@ -281,16 +293,16 @@ export class AddJob { }, { $set: { - 'digest.type': job.type, - 'digest.digestKey': job.digestKey, - 'digest.amount': job.amount, - 'digest.unit': job.unit, + 'digest.type': metadata.type, + 'digest.digestKey': metadata.digestKey, + 'digest.amount': metadata.amount, + 'digest.unit': metadata.unit, }, } ); } - return job; + return metadata; } private async handleDigest( diff --git a/libs/dal/src/repositories/message/message.entity.ts b/libs/dal/src/repositories/message/message.entity.ts index 47f1302cb0d..494a2ad7c97 100644 --- a/libs/dal/src/repositories/message/message.entity.ts +++ b/libs/dal/src/repositories/message/message.entity.ts @@ -99,6 +99,8 @@ export class MessageEntity { _actorId?: string; tags?: string[]; + + avatar?: string; } export type MessageDBModel = ChangePropsValueType< diff --git a/libs/dal/src/repositories/message/message.schema.ts b/libs/dal/src/repositories/message/message.schema.ts index 399497a69b5..4f868918837 100644 --- a/libs/dal/src/repositories/message/message.schema.ts +++ b/libs/dal/src/repositories/message/message.schema.ts @@ -115,6 +115,7 @@ const messageSchema = new Schema( }, expireAt: Schema.Types.Date, tags: [Schema.Types.String], + avatar: Schema.Types.String, }, schemaOptions ); diff --git a/libs/shared/src/entities/subscriber-preference/subscriber-preference.interface.ts b/libs/shared/src/entities/subscriber-preference/subscriber-preference.interface.ts index f6cc26ffe77..60fc2a30426 100644 --- a/libs/shared/src/entities/subscriber-preference/subscriber-preference.interface.ts +++ b/libs/shared/src/entities/subscriber-preference/subscriber-preference.interface.ts @@ -19,6 +19,18 @@ export interface ISubscriberPreferenceResponse { preference: IPreferenceResponse; } +export interface ISubscriberWorkflowPreferenceResponse { + workflow: ITemplateConfiguration; + preferences: IPreferenceResponse; + level: PreferenceLevelEnum.TEMPLATE; +} + +export interface ISubscriberPreferences { + level: PreferenceLevelEnum; + workflow?: ITemplateConfiguration; + preferences: { enabled: boolean; channels: IPreferenceChannels; overrides?: IPreferenceOverride[] }; +} + export interface IPreferenceResponse { enabled: boolean; channels: IPreferenceChannels; diff --git a/libs/shared/src/types/http/headers.types.ts b/libs/shared/src/types/http/headers.types.ts index c41722ebafc..803888898c4 100644 --- a/libs/shared/src/types/http/headers.types.ts +++ b/libs/shared/src/types/http/headers.types.ts @@ -7,6 +7,7 @@ export enum HttpRequestHeaderKeysEnum { CONTENT_TYPE = 'Content-Type', SENTRY_TRACE = 'Sentry-Trace', NOVU_ENVIRONMENT_ID = 'Novu-Environment-Id', + NOVU_API_VERSION = 'Novu-API-Version', } testHttpHeaderEnumValidity(HttpRequestHeaderKeysEnum); diff --git a/packages/client/src/http-client/http-client.ts b/packages/client/src/http-client/http-client.ts index ef4acbfcf76..2bd0089aac2 100644 --- a/packages/client/src/http-client/http-client.ts +++ b/packages/client/src/http-client/http-client.ts @@ -4,7 +4,7 @@ import type { CustomDataType } from '@novu/shared'; const DEFAULT_API_VERSION = 'v1'; const DEFAULT_BACKEND_URL = 'https://api.novu.co'; const PACKAGE_NAME = '@novu/client'; -const PACKAGE_VERSION = '0.42.0'; +const PACKAGE_VERSION = '2.0.0-canary.0'; const DEFAULT_USER_AGENT = `${PACKAGE_NAME}-${PACKAGE_VERSION}`; export class HttpClient { @@ -33,6 +33,13 @@ export class HttpClient { delete this.headers.Authorization; } + updateHeaders(headers: Record) { + this.headers = { + ...this.headers, + ...headers, + }; + } + async getFullResponse(url: string, params?: CustomDataType) { const response = await this.doFetch(url + this.getQueryString(params)); diff --git a/packages/js/.eslintrc.cjs b/packages/js/.eslintrc.cjs index a38fff6da84..815a32547c0 100644 --- a/packages/js/.eslintrc.cjs +++ b/packages/js/.eslintrc.cjs @@ -13,6 +13,8 @@ module.exports = { }, ], 'local-rules/no-class-without-style': 'error', + 'id-length': 'off', + '@typescript-eslint/no-shadow': 'off', }, parserOptions: { project: './tsconfig.json', diff --git a/packages/js/eslint-local-rules.js b/packages/js/eslint-local-rules.js index a600c0c6de7..8d799755a05 100644 --- a/packages/js/eslint-local-rules.js +++ b/packages/js/eslint-local-rules.js @@ -1,5 +1,5 @@ -module.exports = { - 'no-class-without-style' : { +module.exports = { + 'no-class-without-style': { meta: { type: 'problem', docs: { @@ -14,6 +14,15 @@ module.exports = { return { JSXAttribute(node) { if (node.name && node.name.name === 'class') { + const parentElement = node.parent; + const hasAppearanceKey = parentElement.attributes.some( + (attr) => attr.name && attr.name.name === 'appearanceKey' + ); + + if (hasAppearanceKey) { + return; // Skip reporting if appearanceKey is present, as it is most likely forwarded. + } + const value = context.getSourceCode().getText(node.value); if (!value.includes('style(')) { context.report({ @@ -26,4 +35,4 @@ module.exports = { }; }, }, -} +}; diff --git a/packages/js/src/api/inbox-service.ts b/packages/js/src/api/inbox-service.ts index 7c93595ff9f..ac7213a8979 100644 --- a/packages/js/src/api/inbox-service.ts +++ b/packages/js/src/api/inbox-service.ts @@ -3,6 +3,7 @@ import type { ActionTypeEnum, InboxNotification, NotificationFilter, Session } f export type InboxServiceOptions = ApiOptions; +const NOVU_API_VERSION = '2024-06-26'; const INBOX_ROUTE = '/inbox'; const INBOX_NOTIFICATIONS_ROUTE = `${INBOX_ROUTE}/notifications`; @@ -11,6 +12,9 @@ export class InboxService { constructor(options: InboxServiceOptions = {}) { this.#httpClient = new HttpClient(options); + this.#httpClient.updateHeaders({ + 'Novu-API-Version': NOVU_API_VERSION, + }); } async initializeSession({ diff --git a/packages/js/src/feeds/notification.ts b/packages/js/src/feeds/notification.ts index 43466bb3f13..b7c60bbdb55 100644 --- a/packages/js/src/feeds/notification.ts +++ b/packages/js/src/feeds/notification.ts @@ -9,7 +9,7 @@ export class Notification implements Pick, Inbox #inboxService: InboxService; readonly id: InboxNotification['id']; - // readonly subject?: InboxNotification['subject']; + readonly subject?: InboxNotification['subject']; readonly body: InboxNotification['body']; readonly to: InboxNotification['to']; readonly isRead: InboxNotification['isRead']; @@ -17,7 +17,6 @@ export class Notification implements Pick, Inbox readonly createdAt: InboxNotification['createdAt']; readonly readAt?: InboxNotification['readAt']; readonly archivedAt?: InboxNotification['archivedAt']; - readonly actor?: InboxNotification['actor']; readonly avatar?: InboxNotification['avatar']; readonly primaryAction?: InboxNotification['primaryAction']; readonly secondaryAction?: InboxNotification['secondaryAction']; @@ -29,7 +28,7 @@ export class Notification implements Pick, Inbox this.#inboxService = InboxServiceSingleton.getInstance(); this.id = notification.id; - // this.subject = notification.subject; + this.subject = notification.subject; this.body = notification.body; this.to = notification.to; this.isRead = notification.isRead; @@ -37,7 +36,6 @@ export class Notification implements Pick, Inbox this.createdAt = notification.createdAt; this.readAt = notification.readAt; this.archivedAt = notification.archivedAt; - this.actor = notification.actor; this.avatar = notification.avatar; this.primaryAction = notification.primaryAction; this.secondaryAction = notification.secondaryAction; diff --git a/packages/js/src/types.ts b/packages/js/src/types.ts index f1ad10ae462..a55a01380e2 100644 --- a/packages/js/src/types.ts +++ b/packages/js/src/types.ts @@ -15,13 +15,6 @@ export enum NotificationActionStatus { DONE = 'done', } -export enum AvatarType { - NONE = 'none', - USER = 'user', - SYSTEM_ICON = 'system_icon', - SYSTEM_CUSTOM = 'system_custom', -} - export enum CtaType { REDIRECT = 'redirect', } @@ -61,11 +54,6 @@ export type Session = { unreadCount: number; }; -export type Avatar = { - type: AvatarType; - data: string | null; -}; - export type MessageButton = { type: NotificationButton; content: string; @@ -97,7 +85,7 @@ export type Action = { export type InboxNotification = { id: string; - // subject?: string; + subject?: string; body: string; to: Subscriber; isRead: boolean; @@ -105,8 +93,7 @@ export type InboxNotification = { createdAt: string; readAt?: string | null; archivedAt?: string | null; - actor?: Subscriber; - avatar?: Avatar; + avatar?: string; primaryAction?: Action; secondaryAction?: Action; channelType: ChannelType; diff --git a/packages/js/src/ui/api/hooks/index.ts b/packages/js/src/ui/api/hooks/index.ts index 2676db6db7a..0dfeb6c4e29 100644 --- a/packages/js/src/ui/api/hooks/index.ts +++ b/packages/js/src/ui/api/hooks/index.ts @@ -1,3 +1,3 @@ export * from './useFeed'; -export * from './useReadAll'; export * from './usePreferences'; +export * from './useReadAll'; diff --git a/packages/js/src/ui/api/hooks/useFeed.ts b/packages/js/src/ui/api/hooks/useFeed.ts index 1819e9f9638..1593232ff2f 100644 --- a/packages/js/src/ui/api/hooks/useFeed.ts +++ b/packages/js/src/ui/api/hooks/useFeed.ts @@ -1,6 +1,7 @@ import { createEffect, createSignal } from 'solid-js'; import { FetchFeedArgs, FetchFeedResponse, Notification } from '../../../feeds'; import { useNovu } from '../../context'; +import { createInfiniteScroll } from '../../helpers'; export const useFeed = (props: { options: FetchFeedArgs; @@ -33,3 +34,14 @@ export const useFeed = (props: { return { feed, fetchFeed, hasMore: hasMore }; }; + +type UseFeedInfiniteScrollProps = { + options?: Exclude; +}; +export const useFeedInfiniteScroll = (props?: UseFeedInfiniteScrollProps) => { + const novu = useNovu(); + + return createInfiniteScroll(async (offset) => { + return await novu.feeds.fetch({ ...(props?.options || {}), offset }); + }); +}; diff --git a/packages/js/src/ui/components/Inbox.tsx b/packages/js/src/ui/components/Inbox.tsx index e34735e48e1..7571d879320 100644 --- a/packages/js/src/ui/components/Inbox.tsx +++ b/packages/js/src/ui/components/Inbox.tsx @@ -1,18 +1,39 @@ import { createSignal, JSX, Match, Switch } from 'solid-js'; -import { useLocalization } from '../context'; import { useStyle } from '../helpers'; -import { Bell, Footer, Header, SettingsHeader } from './elements'; +import { Bell, Footer, Header, Settings, SettingsHeader } from './elements'; +import { NotificationList } from './Notification'; import { Button, Popover } from './primitives'; -import { Settings } from './Settings'; type InboxProps = { open?: boolean; renderBell?: ({ unreadCount }: { unreadCount: number }) => JSX.Element; }; +enum Screen { + Inbox = 'inbox', + Settings = 'settings', +} +const InboxContent = () => { + const [currentScreen, setCurrentScreen] = createSignal(Screen.Inbox); + + return ( + <> + + +
+ + + + setCurrentScreen(Screen.Inbox)} /> + + + +