import { pgTable, pgView, timestamp, integer, varchar, serial } from 'drizzle-orm/pg-core'; import { projects } from './projects'; import { eq, sql } from "drizzle-orm"; export const projectGtcFiles = pgTable('project_gtc_files', { id: serial("id").primaryKey(), projectId: integer('project_id').references(() => projects.id).notNull(), fileName: varchar("file_name", { length: 255 }).notNull(), filePath: varchar("file_path", { length: 1024 }).notNull(), originalFileName: varchar("original_file_name", { length: 255 }).notNull(), fileSize: integer('file_size'), mimeType: varchar("mime_type", { length: 100 }), createdAt: timestamp('created_at').defaultNow().notNull(), updatedAt: timestamp('updated_at').defaultNow().notNull(), }); // Project GTC 뷰 (프로젝트 정보와 파일 정보를 조인) export const projectGtcView = pgView('project_gtc_view').as((qb) => { return qb .select({ // 프로젝트 정보 id: sql`${projects.id}`.as('id'), code: sql`${projects.code}`.as('code'), name: sql`${projects.name}`.as('name'), type: sql`${projects.type}`.as('type'), projectCreatedAt: sql`${projects.createdAt}`.as('project_created_at'), projectUpdatedAt: sql`${projects.updatedAt}`.as('project_updated_at'), // GTC 파일 정보 gtcFileId: sql`${projectGtcFiles.id}`.as('gtc_file_id'), fileName: sql`${projectGtcFiles.fileName}`.as('fileName'), filePath: sql`${projectGtcFiles.filePath}`.as('filePath'), originalFileName: sql`${projectGtcFiles.originalFileName}`.as('originalFileName'), fileSize: sql`${projectGtcFiles.fileSize}`.as('fileSize'), mimeType: sql`${projectGtcFiles.mimeType}`.as('mimeType'), gtcCreatedAt: sql`${projectGtcFiles.createdAt}`.as('gtcCreatedAt'), gtcUpdatedAt: sql`${projectGtcFiles.updatedAt}`.as('gtcUpdatedAt'), }) .from(projects) .leftJoin(projectGtcFiles, eq(projects.id, projectGtcFiles.projectId)); }); // 타입 정의 export type ProjectGtcFile = typeof projectGtcFiles.$inferSelect; export type ProjectGtcView = typeof projectGtcView.$inferSelect;