Skip to content

Commit

Permalink
refactor: rename "Subscription" to "EntitySubscription"
Browse files Browse the repository at this point in the history
  • Loading branch information
rahul-rocket committed Feb 27, 2025
1 parent 590cf1c commit 34cd9f4
Show file tree
Hide file tree
Showing 47 changed files with 372 additions and 336 deletions.
2 changes: 1 addition & 1 deletion packages/contracts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ export * from './lib/shared-types';
export * from './lib/skill-entity.model';
export * from './lib/sms.model';
export * from './lib/social-account.model';
export * from './lib/subscription.model';
export * from './lib/entity-subscription.model';
export * from './lib/tag.model';
export * from './lib/task-estimation.model';
export * from './lib/task-linked-issue.model';
Expand Down
18 changes: 18 additions & 0 deletions packages/contracts/src/lib/entity-subscription.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { IBasePerEntityType, OmitFields } from './base-entity.model';
import { IEmployeeEntityInput } from './employee.model';

export interface IEntitySubscription extends IBasePerEntityType, IEmployeeEntityInput {
type: EntitySubscriptionTypeEnum;
}

export enum EntitySubscriptionTypeEnum {
MANUAL = 'manual',
MENTION = 'mention',
ASSIGNMENT = 'assignment',
COMMENT = 'comment',
CREATED_ENTITY = 'created-entity'
}

export interface IEntitySubscriptionCreateInput extends OmitFields<IEntitySubscription> {}

export interface IEntitySubscriptionFindInput extends Partial<IEntitySubscription> {}
22 changes: 0 additions & 22 deletions packages/contracts/src/lib/subscription.model.ts

This file was deleted.

4 changes: 2 additions & 2 deletions packages/core/src/lib/app/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ import { ApiCallLogModule } from '../api-call-log/api-call-log.module'; // Globa
import { TaskViewModule } from '../tasks/views/view.module';
import { ResourceLinkModule } from '../resource-link/resource-link.module';
import { MentionModule } from '../mention/mention.module';
import { SubscriptionModule } from '../subscription/subscription.module';
import { EntitySubscriptionModule } from '../entity-subscription/entity-subscription.module';
import { DashboardModule } from '../dashboard/dashboard.module';
import { DashboardWidgetModule } from '../dashboard/dashboard-widget/dashboard-widget.module';
import { TenantApiKeyModule } from '../tenant-api-key/tenant-api-key.module';
Expand Down Expand Up @@ -469,7 +469,7 @@ if (environment.THROTTLE_ENABLED) {
TaskViewModule,
ResourceLinkModule,
MentionModule,
SubscriptionModule,
EntitySubscriptionModule,
DashboardModule,
DashboardWidgetModule,
EmployeeNotificationModule,
Expand Down
11 changes: 6 additions & 5 deletions packages/core/src/lib/comment/comment.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ import { BadRequestException, Injectable, NotFoundException } from '@nestjs/comm
import { UpdateResult } from 'typeorm';
import {
BaseEntityEnum,
EntitySubscriptionTypeEnum,
IComment,
ICommentCreateInput,
ICommentUpdateInput,
ID,
SubscriptionTypeEnum
ID
} from '@gauzy/contracts';
import { TenantAwareCrudService } from './../core/crud';
import { RequestContext } from '../core/context';
import { CreateSubscriptionEvent } from '../subscription/events';
import { CreateEntitySubscriptionEvent } from '../entity-subscription/events';
import { EmployeeService } from '../employee/employee.service';
import { MentionService } from '../mention/mention.service';
import { Comment } from './comment.entity';
Expand Down Expand Up @@ -83,10 +83,11 @@ export class CommentService extends TenantAwareCrudService<Comment> {

// Subscribe the comment creator to the entity.
this._eventBus.publish(
new CreateSubscriptionEvent({
new CreateEntitySubscriptionEvent({
entity: input.entity,
entityId: input.entityId,
type: SubscriptionTypeEnum.COMMENT,
employeeId,
type: EntitySubscriptionTypeEnum.COMMENT,
organizationId: comment.organizationId,
tenantId: comment.tenantId
})
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/lib/core/entities/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ import {
Screenshot,
Skill,
SocialAccount,
Subscription,
EntitySubscription,
Tag,
TagType,
Task,
Expand Down Expand Up @@ -292,7 +292,7 @@ export const coreEntities = [
Screenshot,
Skill,
SocialAccount,
Subscription,
EntitySubscription,
Tag,
TagType,
Task,
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/lib/core/entities/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ export * from '../../resource-link/resource-link.entity';
export * from '../../role-permission/role-permission.entity';
export * from '../../role/role.entity';
export * from '../../skills/skill.entity';
export * from '../../subscription/subscription.entity';
export * from '../../entity-subscription/entity-subscription.entity';
export * from '../../tags/tag.entity';
export * from '../../tag-type/tag-type.entity';
export * from '../../tasks/daily-plan/daily-plan.entity';
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/lib/core/seeds/seeder.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { LanguagesEnum } from '@gauzy/contracts';
import { DatabaseModule } from './../../database/database.module';
import { ActivityLogModule } from '../../activity-log/activity-log.module';
import { MentionModule } from '../../mention/mention.module';
import { SubscriptionModule } from '../../subscription/subscription.module';
import { EntitySubscriptionModule } from '../../entity-subscription/entity-subscription.module';
import { SeedDataService } from './seed-data.service';

/**
Expand Down Expand Up @@ -42,7 +42,7 @@ export class SeederModule {
DatabaseModule,
ActivityLogModule,
MentionModule,
SubscriptionModule,
EntitySubscriptionModule,
...getDynamicPluginsModules()
]
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { IEntitySubscriptionCreateInput } from '@gauzy/contracts';
import { ICommand } from '@nestjs/cqrs';

export class SubscriptionCreateCommand implements ICommand {
export class EntitySubscriptionCreateCommand implements ICommand {
static readonly type = '[Subscription] Create';

constructor(public readonly input: IEntitySubscriptionCreateInput) {}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { IEntitySubscription } from '@gauzy/contracts';
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
import { EntitySubscriptionCreateCommand } from '../entity-subscription.create.command';
import { EntitySubscriptionService } from '../../entity-subscription.service';

@CommandHandler(EntitySubscriptionCreateCommand)
export class EntitySubscriptionCreateHandler implements ICommandHandler<EntitySubscriptionCreateCommand> {
constructor(private readonly subscriptionService: EntitySubscriptionService) {}

public async execute(command: EntitySubscriptionCreateCommand): Promise<IEntitySubscription> {
const { input } = command;

return await this.subscriptionService.create(input);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { EntitySubscriptionCreateHandler } from './entity-subscription.create.handler';

export const CommandHandlers = [EntitySubscriptionCreateHandler];
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './entity-subscription.create.command';
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import {
BaseEntityEnum,
EntitySubscriptionTypeEnum,
IEmployee,
IEntitySubscriptionCreateInput
} from '@gauzy/contracts';
import { TenantOrganizationBaseDTO } from '../../core';

/**
* Create entity subscription data validation request DTO.
*/
export class CreateEntitySubscriptionDTO extends TenantOrganizationBaseDTO implements IEntitySubscriptionCreateInput {
type: EntitySubscriptionTypeEnum;
entityId: string;
entity: BaseEntityEnum;
isActive?: boolean;
isArchived?: boolean;
archivedAt?: Date;
deletedAt?: Date;
employeeId?: string;
employee?: IEmployee;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { PartialType } from '@nestjs/swagger';
import { IEntitySubscriptionFindInput } from '@gauzy/contracts';
import { EntitySubscription } from '../entity-subscription.entity';

export class EntitySubscriptionFindInputDTO
extends PartialType(EntitySubscription)
implements IEntitySubscriptionFindInput {}
2 changes: 2 additions & 0 deletions packages/core/src/lib/entity-subscription/dto/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './create-entity-subscription.dto';
export * from './entity-subscription-find-input.dto';
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,20 @@ import { ID, IPagination, IEntitySubscription } from '@gauzy/contracts';
import { UseValidationPipe, UUIDValidationPipe } from './../shared/pipes';
import { PermissionGuard, TenantPermissionGuard } from '../shared/guards';
import { CrudController, OptionParams, PaginationParams } from './../core/crud';
import { Subscription } from './subscription.entity';
import { SubscriptionService } from './subscription.service';
import { SubscriptionCreateCommand } from './commands';
import { CreateSubscriptionDTO, SubscriptionFindInputDTO } from './dto';
import { EntitySubscription } from './entity-subscription.entity';
import { EntitySubscriptionService } from './entity-subscription.service';
import { EntitySubscriptionCreateCommand } from './commands/entity-subscription.create.command';
import { CreateEntitySubscriptionDTO, EntitySubscriptionFindInputDTO } from './dto';

@ApiTags('Subscriptions')
@ApiTags('EntitySubscriptions')
@UseGuards(TenantPermissionGuard, PermissionGuard)
@Controller('/subscription')
export class SubscriptionController extends CrudController<Subscription> {
constructor(private readonly subscriptionService: SubscriptionService, private readonly commandBus: CommandBus) {
super(subscriptionService);
@Controller('/entity-subscription')
export class EntitySubscriptionController extends CrudController<EntitySubscription> {
constructor(
private readonly entitySubscriptionService: EntitySubscriptionService,
private readonly commandBus: CommandBus
) {
super(entitySubscriptionService);
}

@ApiOperation({
Expand All @@ -25,16 +28,16 @@ export class SubscriptionController extends CrudController<Subscription> {
@ApiResponse({
status: HttpStatus.OK,
description: 'Found subscriptions',
type: Subscription
type: EntitySubscription
})
@ApiResponse({
status: HttpStatus.NOT_FOUND,
description: 'Record not found'
})
@Get()
@UseValidationPipe()
async findAll(@Query() params: PaginationParams<Subscription>): Promise<IPagination<IEntitySubscription>> {
return await this.subscriptionService.findAll(params);
async findAll(@Query() params: PaginationParams<EntitySubscription>): Promise<IPagination<IEntitySubscription>> {
return await this.entitySubscriptionService.findAll(params);
}

@ApiOperation({ summary: 'Find by id' })
Expand All @@ -50,9 +53,9 @@ export class SubscriptionController extends CrudController<Subscription> {
@UseValidationPipe()
async findById(
@Param('id', UUIDValidationPipe) id: ID,
@Query() params: OptionParams<Subscription>
): Promise<Subscription> {
return this.subscriptionService.findOneByIdString(id, params);
@Query() params: OptionParams<EntitySubscription>
): Promise<EntitySubscription> {
return this.entitySubscriptionService.findOneByIdString(id, params);
}

@ApiOperation({ summary: 'Subscribe to an entity' })
Expand All @@ -67,8 +70,8 @@ export class SubscriptionController extends CrudController<Subscription> {
@HttpCode(HttpStatus.CREATED)
@Post()
@UseValidationPipe({ whitelist: true })
async create(@Body() entity: CreateSubscriptionDTO): Promise<IEntitySubscription> {
return await this.commandBus.execute(new SubscriptionCreateCommand(entity));
async create(@Body() entity: CreateEntitySubscriptionDTO): Promise<IEntitySubscription> {
return await this.commandBus.execute(new EntitySubscriptionCreateCommand(entity));
}

@ApiOperation({ summary: 'Unsubscribe from entity' })
Expand All @@ -85,8 +88,8 @@ export class SubscriptionController extends CrudController<Subscription> {
@UseValidationPipe({ whitelist: true })
async delete(
@Param('id', UUIDValidationPipe) id: ID,
@Query() options: SubscriptionFindInputDTO
@Query() options: EntitySubscriptionFindInputDTO
): Promise<DeleteResult> {
return await this.subscriptionService.unsubscribe(id, options);
return await this.entitySubscriptionService.unsubscribe(id, options);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { EntityRepositoryType } from '@mikro-orm/core';
import { JoinColumn, RelationId } from 'typeorm';
import { IsEnum, IsNotEmpty, IsOptional, IsUUID } from 'class-validator';
import { ActorTypeEnum, ID, IEmployee, IEntitySubscription, EntitySubscriptionTypeEnum } from '@gauzy/contracts';
import { BasePerEntityType, Employee } from '../core/entities/internal';
import { ColumnIndex, MultiORMColumn, MultiORMEntity, MultiORMManyToOne } from '../core/decorators/entity';
import { ActorTypeTransformer } from '../shared/pipes';
import { MikroOrmEntitySubscriptionRepository } from './repository/mikro-orm-entity-subscription.repository';

@MultiORMEntity('entity_subscription', { mikroOrmRepository: () => MikroOrmEntitySubscriptionRepository })
export class EntitySubscription extends BasePerEntityType implements IEntitySubscription {
[EntityRepositoryType]?: MikroOrmEntitySubscriptionRepository;

// Indicate the actor type
@ApiPropertyOptional({ enum: ActorTypeEnum })
@IsOptional()
@IsEnum(ActorTypeEnum)
@ColumnIndex()
@MultiORMColumn({ type: 'int', nullable: true, transformer: new ActorTypeTransformer() })
actorType?: ActorTypeEnum; // Will be stored as 0 or 1 in DB

/**
* The type of subscription.
*/
@ApiProperty({ type: () => String, enum: EntitySubscriptionTypeEnum })
@IsNotEmpty()
@IsEnum(EntitySubscriptionTypeEnum)
@ColumnIndex()
@MultiORMColumn()
type: EntitySubscriptionTypeEnum;

/*
|--------------------------------------------------------------------------
| @ManyToOne
|--------------------------------------------------------------------------
*/
/**
* The employee who subscribed to the entity.
*/
@MultiORMManyToOne(() => Employee, {
onDelete: 'CASCADE' // Database cascade action on delete.
})
@JoinColumn()
employee?: IEmployee;

/**
* The employee id who subscribed to the entity.
*/
@ApiProperty({ type: () => String })
@IsNotEmpty()
@IsUUID()
@RelationId((it: EntitySubscription) => it.employee)
@ColumnIndex()
@MultiORMColumn({ relationId: true })
employeeId?: ID;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { CqrsModule } from '@nestjs/cqrs';
import { Global, Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { MikroOrmModule } from '@mikro-orm/nestjs';
import { RolePermissionModule } from '../role-permission/role-permission.module';
import { CommandHandlers } from './commands/handlers';
import { EventHandlers } from './events/handlers';
import { EntitySubscriptionService } from './entity-subscription.service';
import { EntitySubscriptionController } from './entity-subscription.controller';
import { EntitySubscription } from './entity-subscription.entity';
import { TypeOrmEntitySubscriptionRepository } from './repository/type-orm-entity-subscription.repository';

@Global()
@Module({
imports: [
TypeOrmModule.forFeature([EntitySubscription]),
MikroOrmModule.forFeature([EntitySubscription]),
RolePermissionModule,
CqrsModule
],
controllers: [EntitySubscriptionController],
providers: [EntitySubscriptionService, TypeOrmEntitySubscriptionRepository, ...CommandHandlers, ...EventHandlers],
exports: [EntitySubscriptionService, TypeOrmEntitySubscriptionRepository]
})
export class EntitySubscriptionModule {}
Loading

0 comments on commit 34cd9f4

Please sign in to comment.