diff --git a/apps/api/migrations/changes-migration.ts b/apps/api/migrations/changes-migration.ts index 781d6fa88de..b9ca7f67465 100644 --- a/apps/api/migrations/changes-migration.ts +++ b/apps/api/migrations/changes-migration.ts @@ -12,8 +12,8 @@ import { OrganizationRepository, } from '@novu/dal'; import { ChangeEntityTypeEnum, MemberRoleEnum } from '@novu/shared'; -import { CreateEnvironment } from '../src/app/environments/usecases/create-environment/create-environment.usecase'; -import { CreateEnvironmentCommand } from '../src/app/environments/usecases/create-environment/create-environment.command'; +import { CreateEnvironment } from '../src/app/environments-v1/usecases/create-environment/create-environment.usecase'; +import { CreateEnvironmentCommand } from '../src/app/environments-v1/usecases/create-environment/create-environment.command'; import { ApplyChange } from '../src/app/change/usecases/apply-change/apply-change.usecase'; import { ApplyChangeCommand } from '../src/app/change/usecases/apply-change/apply-change.command'; import { CreateChange, CreateChangeCommand } from '@novu/application-generic'; diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index 322e0eeda4e..081e9d2990a 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -12,7 +12,6 @@ import { AuthModule } from './app/auth/auth.module'; import { TestingModule } from './app/testing/testing.module'; import { HealthModule } from './app/health/health.module'; import { OrganizationModule } from './app/organization/organization.module'; -import { EnvironmentsModule } from './app/environments/environments.module'; import { ExecutionDetailsModule } from './app/execution-details/execution-details.module'; import { EventsModule } from './app/events/events.module'; import { WidgetsModule } from './app/widgets/widgets.module'; @@ -44,6 +43,8 @@ import { PreferencesModule } from './app/preferences'; import { StepSchemasModule } from './app/step-schemas/step-schemas.module'; import { WorkflowModule } from './app/workflows-v2/workflow.module'; import { WorkflowModuleV1 } from './app/workflows-v1/workflow-v1.module'; +import { EnvironmentsModuleV1 } from './app/environments-v1/environments-v1.module'; +import { EnvironmentsModule } from './app/environments-v2/environments.module'; const enterpriseImports = (): Array | ForwardReference> => { const modules: Array | ForwardReference> = []; @@ -76,7 +77,7 @@ const baseModules: Array | Forward InboundParseModule, SharedModule, HealthModule, - EnvironmentsModule, + EnvironmentsModuleV1, ExecutionDetailsModule, WorkflowModuleV1, EventsModule, @@ -106,6 +107,7 @@ const baseModules: Array | Forward BridgeModule, PreferencesModule, WorkflowModule, + EnvironmentsModule, ]; const enterpriseModules = enterpriseImports(); diff --git a/apps/api/src/app/auth/community.auth.module.config.ts b/apps/api/src/app/auth/community.auth.module.config.ts index 51b1390e44d..15156443a45 100644 --- a/apps/api/src/app/auth/community.auth.module.config.ts +++ b/apps/api/src/app/auth/community.auth.module.config.ts @@ -13,7 +13,7 @@ import { USE_CASES } from './usecases'; import { SharedModule } from '../shared/shared.module'; import { GitHubStrategy } from './services/passport/github.strategy'; import { OrganizationModule } from '../organization/organization.module'; -import { EnvironmentsModule } from '../environments/environments.module'; +import { EnvironmentsModuleV1 } from '../environments-v1/environments-v1.module'; import { JwtSubscriberStrategy } from './services/passport/subscriber-jwt.strategy'; import { RootEnvironmentGuard } from './framework/root-environment-guard.service'; import { ApiKeyStrategy } from './services/passport/apikey.strategy'; @@ -39,7 +39,7 @@ export function getCommunityAuthModuleConfig(): ModuleMetadata { expiresIn: 360000, }, }), - EnvironmentsModule, + EnvironmentsModuleV1, ], controllers: [AuthController], providers: [ diff --git a/apps/api/src/app/environments/dtos/create-environment-request.dto.ts b/apps/api/src/app/environments-v1/dtos/create-environment-request.dto.ts similarity index 100% rename from apps/api/src/app/environments/dtos/create-environment-request.dto.ts rename to apps/api/src/app/environments-v1/dtos/create-environment-request.dto.ts diff --git a/apps/api/src/app/environments/dtos/environment-response.dto.ts b/apps/api/src/app/environments-v1/dtos/environment-response.dto.ts similarity index 100% rename from apps/api/src/app/environments/dtos/environment-response.dto.ts rename to apps/api/src/app/environments-v1/dtos/environment-response.dto.ts diff --git a/apps/api/src/app/environments/dtos/update-environment-request.dto.ts b/apps/api/src/app/environments-v1/dtos/update-environment-request.dto.ts similarity index 100% rename from apps/api/src/app/environments/dtos/update-environment-request.dto.ts rename to apps/api/src/app/environments-v1/dtos/update-environment-request.dto.ts diff --git a/apps/api/src/app/environments/e2e/get-api-keys.e2e.ts b/apps/api/src/app/environments-v1/e2e/get-api-keys.e2e.ts similarity index 100% rename from apps/api/src/app/environments/e2e/get-api-keys.e2e.ts rename to apps/api/src/app/environments-v1/e2e/get-api-keys.e2e.ts diff --git a/apps/api/src/app/environments/e2e/guard-check.e2e.ts b/apps/api/src/app/environments-v1/e2e/guard-check.e2e.ts similarity index 100% rename from apps/api/src/app/environments/e2e/guard-check.e2e.ts rename to apps/api/src/app/environments-v1/e2e/guard-check.e2e.ts diff --git a/apps/api/src/app/environments/e2e/regenerate-api-keys.e2e.ts b/apps/api/src/app/environments-v1/e2e/regenerate-api-keys.e2e.ts similarity index 100% rename from apps/api/src/app/environments/e2e/regenerate-api-keys.e2e.ts rename to apps/api/src/app/environments-v1/e2e/regenerate-api-keys.e2e.ts diff --git a/apps/api/src/app/environments/environments.controller.ts b/apps/api/src/app/environments-v1/environments-v1.controller.ts similarity index 98% rename from apps/api/src/app/environments/environments.controller.ts rename to apps/api/src/app/environments-v1/environments-v1.controller.ts index 41bb9024a31..93fced76adf 100644 --- a/apps/api/src/app/environments/environments.controller.ts +++ b/apps/api/src/app/environments-v1/environments-v1.controller.ts @@ -32,12 +32,15 @@ import { ApiCommonResponses, ApiResponse } from '../shared/framework/response.de import { UserAuthentication } from '../shared/framework/swagger/api.key.security'; import { SdkGroupName } from '../shared/framework/swagger/sdk.decorators'; +/** + * @deprecated use EnvironmentsControllerV2 + */ @ApiCommonResponses() @Controller('/environments') @UseInterceptors(ClassSerializerInterceptor) @UserAuthentication() @ApiTags('Environments') -export class EnvironmentsController { +export class EnvironmentsControllerV1 { constructor( private createEnvironmentUsecase: CreateEnvironment, private updateEnvironmentUsecase: UpdateEnvironment, diff --git a/apps/api/src/app/environments/environments.module.ts b/apps/api/src/app/environments-v1/environments-v1.module.ts similarity index 80% rename from apps/api/src/app/environments/environments.module.ts rename to apps/api/src/app/environments-v1/environments-v1.module.ts index b3f228bcc77..436bd4a14a1 100644 --- a/apps/api/src/app/environments/environments.module.ts +++ b/apps/api/src/app/environments-v1/environments-v1.module.ts @@ -2,7 +2,7 @@ import { forwardRef, Module } from '@nestjs/common'; import { SharedModule } from '../shared/shared.module'; import { USE_CASES } from './usecases'; -import { EnvironmentsController } from './environments.controller'; +import { EnvironmentsControllerV1 } from './environments-v1.controller'; import { NotificationGroupsModule } from '../notification-groups/notification-groups.module'; import { AuthModule } from '../auth/auth.module'; import { LayoutsModule } from '../layouts/layouts.module'; @@ -16,8 +16,8 @@ import { NovuBridgeModule } from './novu-bridge.module'; forwardRef(() => LayoutsModule), NovuBridgeModule, ], - controllers: [EnvironmentsController], + controllers: [EnvironmentsControllerV1], providers: [...USE_CASES], exports: [...USE_CASES], }) -export class EnvironmentsModule {} +export class EnvironmentsModuleV1 {} diff --git a/apps/api/src/app/environments/novu-bridge-client.ts b/apps/api/src/app/environments-v1/novu-bridge-client.ts similarity index 100% rename from apps/api/src/app/environments/novu-bridge-client.ts rename to apps/api/src/app/environments-v1/novu-bridge-client.ts diff --git a/apps/api/src/app/environments/novu-bridge.controller.ts b/apps/api/src/app/environments-v1/novu-bridge.controller.ts similarity index 100% rename from apps/api/src/app/environments/novu-bridge.controller.ts rename to apps/api/src/app/environments-v1/novu-bridge.controller.ts diff --git a/apps/api/src/app/environments/novu-bridge.module.ts b/apps/api/src/app/environments-v1/novu-bridge.module.ts similarity index 100% rename from apps/api/src/app/environments/novu-bridge.module.ts rename to apps/api/src/app/environments-v1/novu-bridge.module.ts diff --git a/apps/api/src/app/environments/usecases/construct-framework-workflow/construct-framework-workflow.command.ts b/apps/api/src/app/environments-v1/usecases/construct-framework-workflow/construct-framework-workflow.command.ts similarity index 100% rename from apps/api/src/app/environments/usecases/construct-framework-workflow/construct-framework-workflow.command.ts rename to apps/api/src/app/environments-v1/usecases/construct-framework-workflow/construct-framework-workflow.command.ts diff --git a/apps/api/src/app/environments/usecases/construct-framework-workflow/construct-framework-workflow.usecase.ts b/apps/api/src/app/environments-v1/usecases/construct-framework-workflow/construct-framework-workflow.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/construct-framework-workflow/construct-framework-workflow.usecase.ts rename to apps/api/src/app/environments-v1/usecases/construct-framework-workflow/construct-framework-workflow.usecase.ts diff --git a/apps/api/src/app/environments/usecases/construct-framework-workflow/index.ts b/apps/api/src/app/environments-v1/usecases/construct-framework-workflow/index.ts similarity index 100% rename from apps/api/src/app/environments/usecases/construct-framework-workflow/index.ts rename to apps/api/src/app/environments-v1/usecases/construct-framework-workflow/index.ts diff --git a/apps/api/src/app/environments/usecases/create-environment/create-environment.command.ts b/apps/api/src/app/environments-v1/usecases/create-environment/create-environment.command.ts similarity index 100% rename from apps/api/src/app/environments/usecases/create-environment/create-environment.command.ts rename to apps/api/src/app/environments-v1/usecases/create-environment/create-environment.command.ts diff --git a/apps/api/src/app/environments/usecases/create-environment/create-environment.e2e.ts b/apps/api/src/app/environments-v1/usecases/create-environment/create-environment.e2e.ts similarity index 100% rename from apps/api/src/app/environments/usecases/create-environment/create-environment.e2e.ts rename to apps/api/src/app/environments-v1/usecases/create-environment/create-environment.e2e.ts diff --git a/apps/api/src/app/environments/usecases/create-environment/create-environment.usecase.ts b/apps/api/src/app/environments-v1/usecases/create-environment/create-environment.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/create-environment/create-environment.usecase.ts rename to apps/api/src/app/environments-v1/usecases/create-environment/create-environment.usecase.ts diff --git a/apps/api/src/app/environments/usecases/generate-unique-api-key/generate-unique-api-key.spec.ts b/apps/api/src/app/environments-v1/usecases/generate-unique-api-key/generate-unique-api-key.spec.ts similarity index 100% rename from apps/api/src/app/environments/usecases/generate-unique-api-key/generate-unique-api-key.spec.ts rename to apps/api/src/app/environments-v1/usecases/generate-unique-api-key/generate-unique-api-key.spec.ts diff --git a/apps/api/src/app/environments/usecases/generate-unique-api-key/generate-unique-api-key.usecase.ts b/apps/api/src/app/environments-v1/usecases/generate-unique-api-key/generate-unique-api-key.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/generate-unique-api-key/generate-unique-api-key.usecase.ts rename to apps/api/src/app/environments-v1/usecases/generate-unique-api-key/generate-unique-api-key.usecase.ts diff --git a/apps/api/src/app/environments/usecases/get-api-keys/get-api-keys.command.ts b/apps/api/src/app/environments-v1/usecases/get-api-keys/get-api-keys.command.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-api-keys/get-api-keys.command.ts rename to apps/api/src/app/environments-v1/usecases/get-api-keys/get-api-keys.command.ts diff --git a/apps/api/src/app/environments/usecases/get-api-keys/get-api-keys.usecase.ts b/apps/api/src/app/environments-v1/usecases/get-api-keys/get-api-keys.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-api-keys/get-api-keys.usecase.ts rename to apps/api/src/app/environments-v1/usecases/get-api-keys/get-api-keys.usecase.ts diff --git a/apps/api/src/app/environments/usecases/get-environment/get-environment.command.ts b/apps/api/src/app/environments-v1/usecases/get-environment/get-environment.command.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-environment/get-environment.command.ts rename to apps/api/src/app/environments-v1/usecases/get-environment/get-environment.command.ts diff --git a/apps/api/src/app/environments/usecases/get-environment/get-environment.e2e.ts b/apps/api/src/app/environments-v1/usecases/get-environment/get-environment.e2e.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-environment/get-environment.e2e.ts rename to apps/api/src/app/environments-v1/usecases/get-environment/get-environment.e2e.ts diff --git a/apps/api/src/app/environments/usecases/get-environment/get-environment.usecase.ts b/apps/api/src/app/environments-v1/usecases/get-environment/get-environment.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-environment/get-environment.usecase.ts rename to apps/api/src/app/environments-v1/usecases/get-environment/get-environment.usecase.ts diff --git a/apps/api/src/app/environments/usecases/get-environment/index.ts b/apps/api/src/app/environments-v1/usecases/get-environment/index.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-environment/index.ts rename to apps/api/src/app/environments-v1/usecases/get-environment/index.ts diff --git a/apps/api/src/app/environments/usecases/get-my-environments/get-my-environments.command.ts b/apps/api/src/app/environments-v1/usecases/get-my-environments/get-my-environments.command.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-my-environments/get-my-environments.command.ts rename to apps/api/src/app/environments-v1/usecases/get-my-environments/get-my-environments.command.ts diff --git a/apps/api/src/app/environments/usecases/get-my-environments/get-my-environments.e2e.ts b/apps/api/src/app/environments-v1/usecases/get-my-environments/get-my-environments.e2e.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-my-environments/get-my-environments.e2e.ts rename to apps/api/src/app/environments-v1/usecases/get-my-environments/get-my-environments.e2e.ts diff --git a/apps/api/src/app/environments/usecases/get-my-environments/get-my-environments.usecase.ts b/apps/api/src/app/environments-v1/usecases/get-my-environments/get-my-environments.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/get-my-environments/get-my-environments.usecase.ts rename to apps/api/src/app/environments-v1/usecases/get-my-environments/get-my-environments.usecase.ts diff --git a/apps/api/src/app/environments/usecases/index.ts b/apps/api/src/app/environments-v1/usecases/index.ts similarity index 100% rename from apps/api/src/app/environments/usecases/index.ts rename to apps/api/src/app/environments-v1/usecases/index.ts diff --git a/apps/api/src/app/environments/usecases/regenerate-api-keys/regenerate-api-keys.usecase.ts b/apps/api/src/app/environments-v1/usecases/regenerate-api-keys/regenerate-api-keys.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/regenerate-api-keys/regenerate-api-keys.usecase.ts rename to apps/api/src/app/environments-v1/usecases/regenerate-api-keys/regenerate-api-keys.usecase.ts diff --git a/apps/api/src/app/environments/usecases/update-environment/update-environment.command.ts b/apps/api/src/app/environments-v1/usecases/update-environment/update-environment.command.ts similarity index 100% rename from apps/api/src/app/environments/usecases/update-environment/update-environment.command.ts rename to apps/api/src/app/environments-v1/usecases/update-environment/update-environment.command.ts diff --git a/apps/api/src/app/environments/usecases/update-environment/update-environment.e2e-ee.ts b/apps/api/src/app/environments-v1/usecases/update-environment/update-environment.e2e-ee.ts similarity index 100% rename from apps/api/src/app/environments/usecases/update-environment/update-environment.e2e-ee.ts rename to apps/api/src/app/environments-v1/usecases/update-environment/update-environment.e2e-ee.ts diff --git a/apps/api/src/app/environments/usecases/update-environment/update-environment.e2e.ts b/apps/api/src/app/environments-v1/usecases/update-environment/update-environment.e2e.ts similarity index 100% rename from apps/api/src/app/environments/usecases/update-environment/update-environment.e2e.ts rename to apps/api/src/app/environments-v1/usecases/update-environment/update-environment.e2e.ts diff --git a/apps/api/src/app/environments/usecases/update-environment/update-environment.usecase.ts b/apps/api/src/app/environments-v1/usecases/update-environment/update-environment.usecase.ts similarity index 100% rename from apps/api/src/app/environments/usecases/update-environment/update-environment.usecase.ts rename to apps/api/src/app/environments-v1/usecases/update-environment/update-environment.usecase.ts diff --git a/apps/api/src/app/environments-v2/dtos/get-environment-tags.dto.ts b/apps/api/src/app/environments-v2/dtos/get-environment-tags.dto.ts new file mode 100644 index 00000000000..3998a59588f --- /dev/null +++ b/apps/api/src/app/environments-v2/dtos/get-environment-tags.dto.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsDefined, IsString } from 'class-validator'; + +export class GetEnvironmentTagsDto { + @ApiProperty() + @IsDefined() + @IsString() + name: string; +} diff --git a/apps/api/src/app/environments-v2/environments.controller.ts b/apps/api/src/app/environments-v2/environments.controller.ts new file mode 100644 index 00000000000..8ea8f4673d8 --- /dev/null +++ b/apps/api/src/app/environments-v2/environments.controller.ts @@ -0,0 +1,34 @@ +import { ClassSerializerInterceptor, Controller, Get, Param, UseInterceptors } from '@nestjs/common'; +import { UserSessionData } from '@novu/shared'; +import { ApiTags } from '@nestjs/swagger'; +import { UserSession } from '../shared/framework/user.decorator'; +import { GetEnvironmentTags, GetEnvironmentTagsCommand } from './usecases/get-environment-tags'; +import { ExternalApiAccessible } from '../auth/framework/external-api.decorator'; +import { ApiCommonResponses, ApiResponse } from '../shared/framework/response.decorator'; +import { UserAuthentication } from '../shared/framework/swagger/api.key.security'; +import { GetEnvironmentTagsDto } from './dtos/get-environment-tags.dto'; + +@ApiCommonResponses() +@Controller({ path: `/environments`, version: '2' }) +@UseInterceptors(ClassSerializerInterceptor) +@UserAuthentication() +@ApiTags('Environments') +export class EnvironmentsController { + constructor(private getEnvironmentTagsUsecase: GetEnvironmentTags) {} + + @Get('/:environmentId/tags') + @ApiResponse(GetEnvironmentTagsDto) + @ExternalApiAccessible() + async getEnvironmentTags( + @UserSession() user: UserSessionData, + @Param('environmentId') environmentId: string + ): Promise { + return await this.getEnvironmentTagsUsecase.execute( + GetEnvironmentTagsCommand.create({ + environmentId, + userId: user._id, + organizationId: user.organizationId, + }) + ); + } +} diff --git a/apps/api/src/app/environments-v2/environments.module.ts b/apps/api/src/app/environments-v2/environments.module.ts new file mode 100644 index 00000000000..3e31508bbeb --- /dev/null +++ b/apps/api/src/app/environments-v2/environments.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { EnvironmentsController } from './environments.controller'; +import { GetEnvironmentTags } from './usecases/get-environment-tags'; +import { SharedModule } from '../shared/shared.module'; + +@Module({ + imports: [SharedModule], + controllers: [EnvironmentsController], + providers: [GetEnvironmentTags], + exports: [], +}) +export class EnvironmentsModule {} diff --git a/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.command.ts b/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.command.ts new file mode 100644 index 00000000000..e3629364bd9 --- /dev/null +++ b/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.command.ts @@ -0,0 +1,3 @@ +import { EnvironmentWithUserCommand } from '../../../shared/commands/project.command'; + +export class GetEnvironmentTagsCommand extends EnvironmentWithUserCommand {} diff --git a/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.e2e.ts b/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.e2e.ts new file mode 100644 index 00000000000..0e92a305f1d --- /dev/null +++ b/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.e2e.ts @@ -0,0 +1,53 @@ +import { EnvironmentRepository, NotificationTemplateRepository } from '@novu/dal'; +import { UserSession } from '@novu/testing'; +import { expect } from 'chai'; + +describe('Get Environment Tags - /v2/environments/:environmentId/tags (GET)', async () => { + let session: UserSession; + const environmentRepository = new EnvironmentRepository(); + const notificationTemplateRepository = new NotificationTemplateRepository(); + + before(async () => { + session = new UserSession(); + await session.initialize(); + }); + + it('should return correct tags for the environment', async () => { + await notificationTemplateRepository.create({ + _environmentId: session.environment._id, + tags: ['tag1', 'tag2'], + }); + await notificationTemplateRepository.create({ + _environmentId: session.environment._id, + tags: ['tag2', 'tag3', null, '', undefined], + }); + + const { body } = await session.testAgent.get(`/v2/environments/${session.environment._id}/tags`); + + expect(body.data).to.be.an('array'); + expect(body.data).to.have.lengthOf(3); + expect(body.data).to.deep.include({ name: 'tag1' }); + expect(body.data).to.deep.include({ name: 'tag2' }); + expect(body.data).to.deep.include({ name: 'tag3' }); + }); + + it('should return an empty array when no tags exist', async () => { + const newEnvironment = await environmentRepository.create({ + name: 'Test Environment', + _organizationId: session.organization._id, + }); + + const { body } = await session.testAgent.get(`/v2/environments/${newEnvironment._id}/tags`); + + expect(body.data).to.be.an('array'); + expect(body.data).to.have.lengthOf(0); + }); + + it('should throw NotFoundException for non-existent environment', async () => { + const nonExistentId = '60a5f2f2f2f2f2f2f2f2f2f2'; + const { body } = await session.testAgent.get(`/v2/environments/${nonExistentId}/tags`); + + expect(body.statusCode).to.equal(404); + expect(body.message).to.equal(`Environment ${nonExistentId} not found`); + }); +}); diff --git a/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.usecase.ts b/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.usecase.ts new file mode 100644 index 00000000000..4bb3057861f --- /dev/null +++ b/apps/api/src/app/environments-v2/usecases/get-environment-tags/get-environment-tags.usecase.ts @@ -0,0 +1,38 @@ +import { Injectable, NotFoundException } from '@nestjs/common'; +import { EnvironmentEntity, EnvironmentRepository, NotificationTemplateRepository } from '@novu/dal'; +import { GetEnvironmentTagsCommand } from './get-environment-tags.command'; +import { GetEnvironmentTagsDto } from '../../dtos/get-environment-tags.dto'; + +@Injectable() +export class GetEnvironmentTags { + constructor( + private environmentRepository: EnvironmentRepository, + private notificationTemplateRepository: NotificationTemplateRepository + ) {} + + async execute(command: GetEnvironmentTagsCommand): Promise { + const environment: Omit | null = await this.environmentRepository.findOne( + { + _id: command.environmentId, + _organizationId: command.organizationId, + }, + '-apiKeys' + ); + + if (!environment) throw new NotFoundException(`Environment ${command.environmentId} not found`); + + const notificationTemplates = await this.notificationTemplateRepository.find({ + _environmentId: command.environmentId, + tags: { $exists: true, $type: 'array', $ne: [] }, + }); + + const tags = notificationTemplates.flatMap((template) => template.tags); + const uniqueTags = Array.from(new Set(tags)); + + return this.sanitizeTags(uniqueTags); + } + + private sanitizeTags(tags: string[]): GetEnvironmentTagsDto[] { + return tags.filter((tag) => tag != null && tag !== '').map((tag) => ({ name: tag })); + } +} diff --git a/apps/api/src/app/environments-v2/usecases/get-environment-tags/index.ts b/apps/api/src/app/environments-v2/usecases/get-environment-tags/index.ts new file mode 100644 index 00000000000..92bc33e058c --- /dev/null +++ b/apps/api/src/app/environments-v2/usecases/get-environment-tags/index.ts @@ -0,0 +1,2 @@ +export * from './get-environment-tags.command'; +export * from './get-environment-tags.usecase'; diff --git a/apps/api/src/app/organization/organization.module.ts b/apps/api/src/app/organization/organization.module.ts index 9d376f3a657..6e18b25844b 100644 --- a/apps/api/src/app/organization/organization.module.ts +++ b/apps/api/src/app/organization/organization.module.ts @@ -12,7 +12,7 @@ import { import { AuthGuard } from '@nestjs/passport'; import { Type } from '@nestjs/common/interfaces/type.interface'; import { isClerkEnabled } from '@novu/shared'; -import { EnvironmentsModule } from '../environments/environments.module'; +import { EnvironmentsModuleV1 } from '../environments-v1/environments-v1.module'; import { IntegrationModule } from '../integrations/integrations.module'; import { SharedModule } from '../shared/shared.module'; import { UserModule } from '../user/user.module'; @@ -48,7 +48,7 @@ function getControllers() { imports: [ SharedModule, UserModule, - EnvironmentsModule, + EnvironmentsModuleV1, IntegrationModule, forwardRef(() => AuthModule), ...enterpriseImports(), diff --git a/apps/api/src/app/organization/usecases/create-organization/create-organization.usecase.ts b/apps/api/src/app/organization/usecases/create-organization/create-organization.usecase.ts index 635bcda355d..2cfa20421b4 100644 --- a/apps/api/src/app/organization/usecases/create-organization/create-organization.usecase.ts +++ b/apps/api/src/app/organization/usecases/create-organization/create-organization.usecase.ts @@ -5,8 +5,8 @@ import { ApiServiceLevelEnum, JobTitleEnum, MemberRoleEnum } from '@novu/shared' import { AnalyticsService } from '@novu/application-generic'; import { ModuleRef } from '@nestjs/core'; -import { CreateEnvironmentCommand } from '../../../environments/usecases/create-environment/create-environment.command'; -import { CreateEnvironment } from '../../../environments/usecases/create-environment/create-environment.usecase'; +import { CreateEnvironmentCommand } from '../../../environments-v1/usecases/create-environment/create-environment.command'; +import { CreateEnvironment } from '../../../environments-v1/usecases/create-environment/create-environment.usecase'; import { GetOrganizationCommand } from '../get-organization/get-organization.command'; import { GetOrganization } from '../get-organization/get-organization.usecase'; import { AddMemberCommand } from '../membership/add-member/add-member.command'; diff --git a/apps/api/src/app/organization/usecases/create-organization/sync-external-organization/sync-external-organization.usecase.ts b/apps/api/src/app/organization/usecases/create-organization/sync-external-organization/sync-external-organization.usecase.ts index e973751e977..6f10aeb5569 100644 --- a/apps/api/src/app/organization/usecases/create-organization/sync-external-organization/sync-external-organization.usecase.ts +++ b/apps/api/src/app/organization/usecases/create-organization/sync-external-organization/sync-external-organization.usecase.ts @@ -4,8 +4,8 @@ import { OrganizationEntity, OrganizationRepository, UserRepository } from '@nov import { AnalyticsService } from '@novu/application-generic'; import { ModuleRef } from '@nestjs/core'; -import { CreateEnvironmentCommand } from '../../../../environments/usecases/create-environment/create-environment.command'; -import { CreateEnvironment } from '../../../../environments/usecases/create-environment/create-environment.usecase'; +import { CreateEnvironmentCommand } from '../../../../environments-v1/usecases/create-environment/create-environment.command'; +import { CreateEnvironment } from '../../../../environments-v1/usecases/create-environment/create-environment.usecase'; import { GetOrganizationCommand } from '../../get-organization/get-organization.command'; import { GetOrganization } from '../../get-organization/get-organization.usecase'; diff --git a/apps/api/src/app/partner-integrations/partner-integrations.module.ts b/apps/api/src/app/partner-integrations/partner-integrations.module.ts index f5fd1a87e54..6416a2b0051 100644 --- a/apps/api/src/app/partner-integrations/partner-integrations.module.ts +++ b/apps/api/src/app/partner-integrations/partner-integrations.module.ts @@ -4,11 +4,11 @@ import { CommunityUserRepository, CommunityOrganizationRepository } from '@novu/ import { USE_CASES } from './usecases'; import { PartnerIntegrationsController } from './partner-integrations.controller'; import { SharedModule } from '../shared/shared.module'; -import { EnvironmentsModule } from '../environments/environments.module'; +import { EnvironmentsModuleV1 } from '../environments-v1/environments-v1.module'; import { BridgeModule } from '../bridge'; @Module({ - imports: [SharedModule, HttpModule, EnvironmentsModule, BridgeModule], + imports: [SharedModule, HttpModule, EnvironmentsModuleV1, BridgeModule], providers: [...USE_CASES, CommunityUserRepository, CommunityOrganizationRepository], controllers: [PartnerIntegrationsController], })