task-managment / src / database / schema / task.ts
task.ts
Raw
import { relations } from 'drizzle-orm';
import {  pgTable,serial,char,pgEnum, primaryKey,integer,index,uniqueIndex,timestamp,unique, varchar, date, uuid } from 'drizzle-orm/pg-core';
import { project } from './project';
import { floor } from './floor';
import { areas } from './areas';
import { user } from './user';
import { z } from 'zod';
import { priorityType, taskStatus } from '@/server/task/domain/models';

export const status=pgEnum("status", taskStatus) 
export const statusEnumSchema=z.enum(status.enumValues)

export const priority=pgEnum("priority", priorityType) 
export const priorityEnumSchema=z.enum(priority.enumValues,{message:'Escoja una prioridad'})

export const task = pgTable("task", {
	id: uuid("id").primaryKey().notNull(),
	comments:varchar('comments',{length:255}).notNull(),
	status:status('status').notNull().default('no iniciada'),
    userId:varchar('user_id',{length:255}).references(()=>user.id,{onDelete:'cascade',onUpdate:'cascade'}),
	startDate:date('start_date').notNull(),
	expireDate:date('expire_date'),
	startedTime:timestamp('started_time'),
	endedTime:timestamp('ended_time'),
    projectId:uuid('project_id').notNull().references(()=>project.id,{onDelete:'cascade',onUpdate:'cascade'}),
	areaId:uuid('area_id').notNull().references(()=>areas.id,{onDelete:'cascade',onUpdate:'cascade'}),
    areaName:varchar('area_name',{length:255}),
    floorName:varchar('floor_name',{length:255}),
	projectName:varchar('project_name',{length:255}),
	priority:priority('priority').notNull(),
	createdAT:timestamp('created_At').defaultNow(),
	updatedAt:timestamp('updated_At').defaultNow().$onUpdate(()=>new Date())
},(t)=>{
	return {
		task_project:index('task_project').on(t.projectId),
		task_area:index('task_area').on(t.areaId),
		task_startDate:index('task_startDate').on(t.startDate),
		task_expireDate:index('task_endDate').on(t.expireDate),
		task_status:index('task_status').on(t.status),
		task_user:index('task_user').on(t.userId),
	}
});

export type TaskSelect = typeof task.$inferSelect;
export type TaskInsert = typeof task.$inferInsert;


export const taskRelations=relations(task,({one,many})=>({
	project:one(project,{
		fields:[task.projectId],
		references:[project.id]
	}),
	user:one(user,{
		fields:[task.userId],
		references:[user.id]
	}),
	area:one(areas,{
		fields:[task.areaId],
		references:[areas.id]
	})
}))