Skip to content

Commit

Permalink
feat: add daily plan tasks entity and migration
Browse files Browse the repository at this point in the history
  • Loading branch information
GloireMutaliko21 committed Apr 26, 2024
1 parent 6d95192 commit 9106d45
Show file tree
Hide file tree
Showing 9 changed files with 238 additions and 43 deletions.
7 changes: 4 additions & 3 deletions packages/contracts/src/daily-plan-task.model.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { IDailyPlan } from 'daily-plan.model';
import { ITask } from 'task.model';
import { IBasePerTenantAndOrganizationEntityModel } from './base-entity.model';
import { IDailyPlan } from './daily-plan.model';
import { ITask } from './task.model';

export interface IDailyPlanTask {
export interface IDailyPlanTask extends IBasePerTenantAndOrganizationEntityModel {
dailyPlan: IDailyPlan;
dailyPlanId: IDailyPlan['id'];
task: ITask;
Expand Down
5 changes: 3 additions & 2 deletions packages/contracts/src/daily-plan.model.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { IEmployee } from 'employee.model';
import { IBasePerTenantAndOrganizationEntityModel } from './base-entity.model';
import { IEmployee } from './employee.model';

export interface IDailyPlan extends IEmployee {
export interface IDailyPlan extends IBasePerTenantAndOrganizationEntityModel {
date: Date;
workTimePlanned: Date;
status: DailyPlanStatusEnum;
Expand Down
1 change: 1 addition & 0 deletions packages/contracts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ export * from './task-status.model';
export * from './task-version.model';
export * from './task.model';
export * from './daily-plan.model';
export * from './daily-plan-task.model';
export * from './tenant.model';
export * from './time-off.model';
export * from './timesheet-statistics.model';
Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/core/entities/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
Currency,
CustomSmtp,
DailyPlan,
DailyPlanTask,
Deal,
EmailHistory,
EmailReset,
Expand Down Expand Up @@ -134,7 +135,7 @@ import {
UserOrganization,
Warehouse,
WarehouseProduct,
WarehouseProductVariant,
WarehouseProductVariant
} from './internal';

export const coreEntities = [
Expand All @@ -160,6 +161,7 @@ export const coreEntities = [
Currency,
CustomSmtp,
DailyPlan,
DailyPlanTask,
Deal,
EmailHistory,
EmailReset,
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/core/entities/internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,8 @@ export * from '../../tasks/related-issue-type/related-issue-type.subscriber';
export * from '../../tasks/sizes/size.subscriber';
export * from '../../tasks/statuses/status.subscriber';
export * from '../../tasks/task.subscriber';
export * from '../../tasks/daily-plan/daily-plan.entity'
export * from '../../tasks/daily-plan-task/daily-plan-task.entity';
export * from '../../tasks/daily-plan/daily-plan.entity';
export * from '../../tasks/versions/version.subscriber';
export * from '../../tenant/tenant.subscriber';
export * from '../../time-off-request/time-off-request.subscriber';
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@

import { MigrationInterface, QueryRunner } from "typeorm";
import { yellow } from "chalk";
import { DatabaseTypeEnum } from "@gauzy/config";

export class CreateDailyPlanTasksEntity1714098437821 implements MigrationInterface {

name = 'CreateDailyPlanTasksEntity1714098437821';

/**
* Up Migration
*
* @param queryRunner
*/
public async up(queryRunner: QueryRunner): Promise<void> {
console.log(yellow(this.name + ' start running!'));

switch (queryRunner.connection.options.type) {
case DatabaseTypeEnum.sqlite:
case DatabaseTypeEnum.betterSqlite3:
await this.sqliteUpQueryRunner(queryRunner);
break;
case DatabaseTypeEnum.postgres:
await this.postgresUpQueryRunner(queryRunner);
break;
case DatabaseTypeEnum.mysql:
await this.mysqlUpQueryRunner(queryRunner);
break;
default:
throw Error(`Unsupported database: ${queryRunner.connection.options.type}`);
}
}

/**
* Down Migration
*
* @param queryRunner
*/
public async down(queryRunner: QueryRunner): Promise<void> {
switch (queryRunner.connection.options.type) {
case DatabaseTypeEnum.sqlite:
case DatabaseTypeEnum.betterSqlite3:
await this.sqliteDownQueryRunner(queryRunner);
break;
case DatabaseTypeEnum.postgres:
await this.postgresDownQueryRunner(queryRunner);
break;
case DatabaseTypeEnum.mysql:
await this.mysqlDownQueryRunner(queryRunner);
break;
default:
throw Error(`Unsupported database: ${queryRunner.connection.options.type}`);
}
}

/**
* PostgresDB Up Migration
*
* @param queryRunner
*/
public async postgresUpQueryRunner(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`CREATE TABLE "daily_plan_task" ("deletedAt" TIMESTAMP, "id" uuid NOT NULL DEFAULT gen_random_uuid(), "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "isActive" boolean DEFAULT true, "isArchived" boolean DEFAULT false, "tenantId" uuid, "organizationId" uuid, "dailyPlanId" uuid, "taskId" uuid, CONSTRAINT "PK_d6f27a2c1e08d7b0ea5ab00a5b9" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_fbe6399dd99e8b4bc1ed9a4fc1" ON "daily_plan_task" ("isActive") `);
await queryRunner.query(`CREATE INDEX "IDX_1a541bae1d230b11bbdd256e09" ON "daily_plan_task" ("isArchived") `);
await queryRunner.query(`CREATE INDEX "IDX_559a1e1055d1ef1bd83e33f9ff" ON "daily_plan_task" ("tenantId") `);
await queryRunner.query(`CREATE INDEX "IDX_b0a8166ba2272bc6868b7042e6" ON "daily_plan_task" ("organizationId") `);
await queryRunner.query(`CREATE INDEX "IDX_44d86eb47db0ffbf7e79bf7ff0" ON "daily_plan_task" ("dailyPlanId") `);
await queryRunner.query(`CREATE INDEX "IDX_791067c0a03b37ab50578e60d4" ON "daily_plan_task" ("taskId") `);
await queryRunner.query(`ALTER TABLE "daily_plan_task" ADD CONSTRAINT "FK_559a1e1055d1ef1bd83e33f9ffc" FOREIGN KEY ("tenantId") REFERENCES "tenant"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "daily_plan_task" ADD CONSTRAINT "FK_b0a8166ba2272bc6868b7042e6d" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE CASCADE ON UPDATE CASCADE`);
await queryRunner.query(`ALTER TABLE "daily_plan_task" ADD CONSTRAINT "FK_44d86eb47db0ffbf7e79bf7ff0d" FOREIGN KEY ("dailyPlanId") REFERENCES "daily_plan"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "daily_plan_task" ADD CONSTRAINT "FK_791067c0a03b37ab50578e60d4d" FOREIGN KEY ("taskId") REFERENCES "task"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}

/**
* PostgresDB Down Migration
*
* @param queryRunner
*/
public async postgresDownQueryRunner(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE "daily_plan_task" DROP CONSTRAINT "FK_791067c0a03b37ab50578e60d4d"`);
await queryRunner.query(`ALTER TABLE "daily_plan_task" DROP CONSTRAINT "FK_44d86eb47db0ffbf7e79bf7ff0d"`);
await queryRunner.query(`ALTER TABLE "daily_plan_task" DROP CONSTRAINT "FK_b0a8166ba2272bc6868b7042e6d"`);
await queryRunner.query(`ALTER TABLE "daily_plan_task" DROP CONSTRAINT "FK_559a1e1055d1ef1bd83e33f9ffc"`);
await queryRunner.query(`DROP INDEX "public"."IDX_791067c0a03b37ab50578e60d4"`);
await queryRunner.query(`DROP INDEX "public"."IDX_44d86eb47db0ffbf7e79bf7ff0"`);
await queryRunner.query(`DROP INDEX "public"."IDX_b0a8166ba2272bc6868b7042e6"`);
await queryRunner.query(`DROP INDEX "public"."IDX_559a1e1055d1ef1bd83e33f9ff"`);
await queryRunner.query(`DROP INDEX "public"."IDX_1a541bae1d230b11bbdd256e09"`);
await queryRunner.query(`DROP INDEX "public"."IDX_fbe6399dd99e8b4bc1ed9a4fc1"`);
await queryRunner.query(`DROP TABLE "daily_plan_task"`);
}

/**
* SqliteDB and BetterSQlite3DB Up Migration
*
* @param queryRunner
*/
public async sqliteUpQueryRunner(queryRunner: QueryRunner): Promise<any> {

}

/**
* SqliteDB and BetterSQlite3DB Down Migration
*
* @param queryRunner
*/
public async sqliteDownQueryRunner(queryRunner: QueryRunner): Promise<any> {

}

/**
* MySQL Up Migration
*
* @param queryRunner
*/
public async mysqlUpQueryRunner(queryRunner: QueryRunner): Promise<any> {

}

/**
* MySQL Down Migration
*
* @param queryRunner
*/
public async mysqlDownQueryRunner(queryRunner: QueryRunner): Promise<any> {

}
}
45 changes: 45 additions & 0 deletions packages/core/src/tasks/daily-plan-task/daily-plan-task.entity.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { JoinColumn, RelationId } from 'typeorm';
import { EntityRepositoryType } from '@mikro-orm/knex';
import { IsNotEmpty, IsUUID } from 'class-validator';
import { DailyPlan, Task, TenantOrganizationBaseEntity } from '../../core/entities/internal';
import { ColumnIndex, MultiORMColumn, MultiORMEntity, MultiORMManyToOne } from '../../core/decorators/entity';
import { MikroOrmDailyPlanTaskRepository } from './repository/mikro-orm-daily-plan-task';
import { IDailyPlan, IDailyPlanTask, ITask } from '@gauzy/contracts';

@MultiORMEntity('daily_plan_task', { mikroOrmRepository: () => MikroOrmDailyPlanTaskRepository })
export class DailyPlanTask extends TenantOrganizationBaseEntity implements IDailyPlanTask {
[EntityRepositoryType]?: MikroOrmDailyPlanTaskRepository;

@ApiProperty({ type: () => DailyPlan })
@MultiORMManyToOne(() => DailyPlan, {
nullable: true,
onDelete: 'CASCADE'
})
@JoinColumn()
dailyPlan: IDailyPlan;

@ApiPropertyOptional({ type: () => String })
@IsNotEmpty()
@IsUUID()
@RelationId((it: DailyPlanTask) => it.dailyPlan)
@ColumnIndex()
@MultiORMColumn({ nullable: true, relationId: true })
dailyPlanId: IDailyPlan['id'];

@ApiProperty({ type: () => Task })
@MultiORMManyToOne(() => Task, {
nullable: true,
onDelete: 'CASCADE'
})
@JoinColumn()
task: ITask;

@ApiPropertyOptional({ type: () => String })
@IsNotEmpty()
@IsUUID()
@RelationId((it: DailyPlanTask) => it.task)
@ColumnIndex()
@MultiORMColumn({ nullable: true, relationId: true })
taskId: ITask['id'];
}
18 changes: 15 additions & 3 deletions packages/core/src/tasks/daily-plan/daily-plan.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,15 @@ import { JoinColumn, RelationId } from 'typeorm';
import { EntityRepositoryType } from '@mikro-orm/knex';
import { IsDate, IsNotEmpty, IsOptional, IsString, IsUUID } from 'class-validator';
import { Type } from 'class-transformer';
import { DailyPlanStatusEnum, IDailyPlan, IEmployee } from '@gauzy/contracts';
import { ColumnIndex, MultiORMColumn, MultiORMEntity, MultiORMManyToOne } from '../../core/decorators/entity';
import { Employee, TenantOrganizationBaseEntity } from '../../core/entities/internal';
import { DailyPlanStatusEnum, IDailyPlan, IDailyPlanTask, IEmployee } from '@gauzy/contracts';
import {
ColumnIndex,
MultiORMColumn,
MultiORMEntity,
MultiORMManyToOne,
MultiORMOneToMany
} from '../../core/decorators/entity';
import { DailyPlanTask, Employee, TenantOrganizationBaseEntity } from '../../core/entities/internal';
import { MikroOrmDailyPlanRepository } from './repository';

@MultiORMEntity('daily_plan', { mikroOrmRepository: () => MikroOrmDailyPlanRepository })
Expand Down Expand Up @@ -47,4 +53,10 @@ export class DailyPlan extends TenantOrganizationBaseEntity implements IDailyPla
@ColumnIndex()
@MultiORMColumn({ nullable: true, relationId: true })
employeeId?: IEmployee['id'];

@ApiPropertyOptional({ type: () => DailyPlanTask, isArray: true })
@MultiORMOneToMany(() => DailyPlanTask, (dailyPlan) => dailyPlan.dailyPlan, {
onDelete: 'SET NULL'
})
dailyPlanTasks?: IDailyPlanTask[];
}

0 comments on commit 9106d45

Please sign in to comment.