Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Refactor] Rename "Subscription" to "EntitySubscription" #8809

Merged
merged 6 commits into from
Feb 28, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading