Skip to content

Commit

Permalink
Merge pull request #8238 from ever-co/fix/project-module-entity-and-dto
Browse files Browse the repository at this point in the history
[Fix] Project Modules Entity using validators
  • Loading branch information
rahul-rocket authored Sep 26, 2024
2 parents 689bc01 + 263d31e commit a9c6af2
Show file tree
Hide file tree
Showing 8 changed files with 560 additions and 50 deletions.
12 changes: 10 additions & 2 deletions packages/contracts/src/organization-project-module.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { IEmployee } from './employee.model';
import { IRelationalOrganizationProject } from './organization-projects.model';
import { IOrganizationSprint } from './organization-sprint.model';
import { IOrganizationTeam } from './organization-team.model';
import { TaskStatusEnum } from './task-status.model';
import { ITask } from './task.model';
import { IUser } from './user.model';

Expand All @@ -17,7 +16,7 @@ export interface IOrganizationProjectModule
IRelationalOrganizationProject {
name: string;
description?: string;
status?: TaskStatusEnum;
status?: ProjectModuleStatusEnum;
startDate?: Date;
endDate?: Date;
isFavorite?: boolean;
Expand All @@ -42,6 +41,15 @@ export interface IOrganizationProjectModuleFindInput
organizationSprintId?: ID;
}

export enum ProjectModuleStatusEnum {
BACKLOG = 'backlog',
PLANNED = 'planned',
IN_PROGRESS = 'in-progress',
PAUSED = 'paused',
COMPLETED = 'completed',
CANCELLED = 'cancelled'
}

export interface IOrganizationProjectModuleCreateInput extends Omit<IOrganizationProjectModule, 'id'> {}

export interface IOrganizationProjectModuleUpdateInput extends Partial<IOrganizationProjectModule> {}
8 changes: 3 additions & 5 deletions packages/contracts/src/task.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@ import { IUser } from './user.model';
import { ITaskStatus, TaskStatusEnum } from './task-status.model';
import { ITaskPriority, TaskPriorityEnum } from './task-priority.model';
import { ITaskSize, TaskSizeEnum } from './task-size.model';
import { IRelationalOrganizationProjectModule } from './organization-project-module.model';
import { IOrganizationProjectModule } from './organization-project-module.model';

export interface ITask
extends IBasePerTenantAndOrganizationEntityModel,
IRelationalOrganizationProject,
IRelationalOrganizationProjectModule {
export interface ITask extends IBasePerTenantAndOrganizationEntityModel, IRelationalOrganizationProject {
title: string;
number?: number;
public?: boolean;
Expand All @@ -29,6 +26,7 @@ export interface ITask
members?: IEmployee[];
invoiceItems?: IInvoiceItem[];
teams?: IOrganizationTeam[];
modules?: IOrganizationProjectModule[];
organizationSprint?: IOrganizationSprint;
organizationSprintId?: ID;
creator?: IUser;
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ import { EntityRepositoryType } from '@mikro-orm/core';
import {
IsArray,
IsBoolean,
IsDate,
IsDateString,
IsEnum,
IsNotEmpty,
IsObject,
IsOptional,
IsString,
IsUUID
} from 'class-validator';
import { Type } from 'class-transformer';
import {
ID,
IEmployee,
Expand All @@ -22,7 +21,7 @@ import {
IOrganizationTeam,
ITask,
IUser,
TaskStatusEnum
ProjectModuleStatusEnum
} from '@gauzy/contracts';
import {
Employee,
Expand Down Expand Up @@ -63,22 +62,20 @@ export class OrganizationProjectModule extends TenantOrganizationBaseEntity impl

@ApiPropertyOptional({ type: () => String })
@IsOptional()
@IsEnum(TaskStatusEnum)
@IsEnum(ProjectModuleStatusEnum)
@ColumnIndex()
@MultiORMColumn({ nullable: true })
status?: TaskStatusEnum;
status?: ProjectModuleStatusEnum;

@ApiPropertyOptional({ type: () => Date })
@Type(() => Date)
@IsOptional()
@IsDate()
@IsDateString()
@MultiORMColumn({ nullable: true })
startDate?: Date;

@ApiPropertyOptional({ type: () => Date })
@Type(() => Date)
@IsOptional()
@IsDate()
@IsDateString()
@MultiORMColumn({ nullable: true })
endDate?: Date;

Expand Down Expand Up @@ -157,13 +154,19 @@ export class OrganizationProjectModule extends TenantOrganizationBaseEntity impl
/**
* Module manager
*/
@ApiPropertyOptional({ type: () => Object })
@IsOptional()
@IsObject()
@MultiORMManyToOne(() => User, {
nullable: true,
onDelete: 'CASCADE'
})
@JoinColumn()
manager?: IUser;

@ApiPropertyOptional({ type: () => String })
@IsOptional()
@IsUUID()
@RelationId((it: OrganizationProjectModule) => it.manager)
@ColumnIndex()
@MultiORMColumn({ nullable: true, relationId: true })
Expand All @@ -181,18 +184,24 @@ export class OrganizationProjectModule extends TenantOrganizationBaseEntity impl
@MultiORMOneToMany(() => OrganizationProjectModule, (module) => module.parent)
children?: OrganizationProjectModule[];

/**
* Organization Tasks Relationship
*/
@MultiORMOneToMany(() => Task, (it) => it.projectModule)
tasks?: ITask[];

/*
|--------------------------------------------------------------------------
| @ManyToMany
|--------------------------------------------------------------------------
*/

/**
* Task
*/
@MultiORMManyToMany(() => Task, (it) => it.modules, {
/** Defines the database action to perform on update. */
onUpdate: 'CASCADE',
/** Defines the database cascade action on delete. */
onDelete: 'CASCADE'
})
@JoinTable({ name: 'project_module_task' })
tasks?: ITask[];

/**
* Organization Sprint
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { BadRequestException, HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { Brackets, FindManyOptions, SelectQueryBuilder, WhereExpressionBuilder } from 'typeorm';
import {
ID,
IOrganizationProjectModule,
IOrganizationProjectModuleCreateInput,
IOrganizationProjectModuleFindInput,
IPagination,
PermissionsEnum,
TaskStatusEnum
ProjectModuleStatusEnum
} from '@gauzy/contracts';
import { isEmpty, isNotEmpty } from '@gauzy/common';
import { isPostgres } from '@gauzy/config';
Expand All @@ -26,6 +27,18 @@ export class OrganizationProjectModuleService extends TenantAwareCrudService<Org
super(typeOrmProjectModuleRepository, mikroOrmProjectModuleRepository);
}

async create(entity: IOrganizationProjectModuleCreateInput): Promise<IOrganizationProjectModule> {
try {
const creatorId = RequestContext.currentUserId();
return super.create({
...entity,
creatorId
});
} catch (error) {
throw new BadRequestException(error);
}
}

/**
* @description Find employee project modules
* @param options - Options finders and relations
Expand Down Expand Up @@ -82,7 +95,7 @@ export class OrganizationProjectModuleService extends TenantAwareCrudService<Org
new Brackets((qb: WhereExpressionBuilder) => {
// Apply optional filters
const filters: IOrganizationProjectModuleFindInput = {
status: status as TaskStatusEnum,
status: status as ProjectModuleStatusEnum,
projectId: projectId as ID,
name: name as string
};
Expand Down Expand Up @@ -176,7 +189,7 @@ export class OrganizationProjectModuleService extends TenantAwareCrudService<Org

// Apply optional filters
const filters: IOrganizationProjectModuleFindInput = {
status: status as TaskStatusEnum,
status: status as ProjectModuleStatusEnum,
name: name as string
};

Expand All @@ -185,7 +198,7 @@ export class OrganizationProjectModuleService extends TenantAwareCrudService<Org
})
);

console.log('Get Employees modules', query.getSql()); // Query logs for debugging
console.log('Get Team modules', query.getSql()); // Query logs for debugging

// Execute the query with pagination
return await this.executePaginationQuery<OrganizationProjectModule>(query);
Expand Down
23 changes: 23 additions & 0 deletions packages/core/src/tasks/task.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,29 @@ export class TaskController extends CrudController<Task> {
return await this.taskService.findTeamTasks(params);
}

/**
* GET module tasks
*
* @param params
* @returns
*/
@ApiOperation({ summary: 'Find module tasks.' })
@ApiResponse({
status: HttpStatus.OK,
description: 'Found tasks',
type: Task
})
@ApiResponse({
status: HttpStatus.NOT_FOUND,
description: 'Records not found'
})
@Permissions(PermissionsEnum.ALL_ORG_VIEW, PermissionsEnum.ORG_TASK_VIEW)
@Get('module')
@UseValidationPipe({ transform: true })
async findModuleTasks(@Query() params: PaginationParams<Task>): Promise<IPagination<ITask>> {
return await this.taskService.findModuleTasks(params);
}

@ApiOperation({ summary: 'Find by id' })
@ApiResponse({
status: HttpStatus.OK,
Expand Down
42 changes: 19 additions & 23 deletions packages/core/src/tasks/task.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -208,29 +208,6 @@ export class Task extends TenantOrganizationBaseEntity implements ITask {
@MultiORMColumn({ nullable: true, relationId: true })
projectId?: ID;

/**
* Organization Project Module
*/
@ApiPropertyOptional({ type: () => Object })
@IsOptional()
@IsObject()
@MultiORMManyToOne(() => OrganizationProjectModule, (it) => it.tasks, {
/** Indicates if the relation column value can be nullable or not. */
nullable: true,

/** Defines the database cascade action on delete. */
onDelete: 'CASCADE'
})
projectModule?: IOrganizationProjectModule;

@ApiPropertyOptional({ type: () => String })
@IsOptional()
@IsUUID()
@RelationId((it: Task) => it.projectModule)
@ColumnIndex()
@MultiORMColumn({ nullable: true, relationId: true })
projectModuleId?: ID;

/**
* Creator
*/
Expand Down Expand Up @@ -446,4 +423,23 @@ export class Task extends TenantOrganizationBaseEntity implements ITask {
name: 'task_team'
})
teams?: IOrganizationTeam[];

/**
* Project Module
*/
@ApiPropertyOptional({ type: () => Array, isArray: true })
@IsOptional()
@IsArray()
@MultiORMManyToMany(() => OrganizationProjectModule, (module) => module.tasks, {
/** Defines the database action to perform on update. */
onUpdate: 'CASCADE',
/** Defines the database cascade action on delete. */
onDelete: 'CASCADE',
owner: true,
pivotTable: 'project_module_task',
joinColumn: 'taskId',
inverseJoinColumn: 'organizationProjectModuleId'
})
@JoinTable({ name: 'project_module_task' })
modules?: IOrganizationProjectModule[];
}
Loading

0 comments on commit a9c6af2

Please sign in to comment.