diff --git a/packages/db/src/schema/companyRequest.ts b/packages/db/src/schema/companyRequest.ts new file mode 100644 index 0000000..68fa032 --- /dev/null +++ b/packages/db/src/schema/companyRequest.ts @@ -0,0 +1,46 @@ +import { relations } from "drizzle-orm"; +import { pgTable, text, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; +import { createInsertSchema } from "drizzle-zod"; +import { z } from "zod"; + +import { Industry, RequestStatus } from "./misc"; +import { Profile } from "./profiles"; + +export const CompanyRequest = pgTable("company_request", { + id: uuid("id").notNull().primaryKey().defaultRandom(), + companyName: varchar("name").notNull(), + companyDescription: text("description"), + industry: varchar("industry").notNull(), + location: varchar("location").notNull(), + roleTitle: varchar("title").notNull(), + roleDescription: text("description"), + createdAt: timestamp("createdAt").defaultNow().notNull(), + status: varchar("status", { + enum: ["PENDING", "APPROVED", "REJECTED"], // Explicitly list the enum values + }) + .notNull() + .default("PENDING"), +}); + +export type CompanyRequestType = typeof CompanyRequest.$inferSelect; + +export const RequestRelations = relations(CompanyRequest, ({ one }) => ({ + profile: one(Profile, { + fields: [CompanyRequest.id], + references: [Profile.userId], + }), +})); + +// Zod validation schema for creating a company request +export const CreateCompanyRequestSchema = createInsertSchema(CompanyRequest, { + companyName: z.string(), + companyDescription: z.string().optional(), + industry: z.nativeEnum(Industry), + location: z.string(), + roleTitle: z.string(), + roleDescription: z.string(), + status: z.nativeEnum(RequestStatus), +}).omit({ + id: true, + createdAt: true, +}); diff --git a/packages/db/src/schema/misc.ts b/packages/db/src/schema/misc.ts index c74be81..c140677 100644 --- a/packages/db/src/schema/misc.ts +++ b/packages/db/src/schema/misc.ts @@ -54,3 +54,12 @@ export const WorkTerm = { } as const; export type WorkTermType = (typeof WorkTerm)[keyof typeof WorkTerm]; + +export const RequestStatus = { + PENDING: "PENDING", + APPROVED: "APPROVED", + REJECTED: "REJECTED", +} as const; + +export type RequestStatusType = + (typeof RequestStatus)[keyof typeof RequestStatus]; diff --git a/packages/db/src/schema/roleRequest.ts b/packages/db/src/schema/roleRequest.ts new file mode 100644 index 0000000..a87e490 --- /dev/null +++ b/packages/db/src/schema/roleRequest.ts @@ -0,0 +1,44 @@ +import { relations } from "drizzle-orm"; +import { pgTable, text, timestamp, uuid, varchar } from "drizzle-orm/pg-core"; +import { createInsertSchema } from "drizzle-zod"; +import { z } from "zod"; + +import { Company } from "./companies"; +import { RequestStatus } from "./misc"; +import { Profile } from "./profiles"; + +export const RoleRequest = pgTable("role_request", { + id: uuid("id").notNull().primaryKey().defaultRandom(), + roleTitle: varchar("title").notNull(), + roleDescription: text("description"), + companyId: varchar("companyId").notNull(), + createdAt: timestamp("createdAt").defaultNow().notNull(), + status: varchar("status", { + enum: ["PENDING", "APPROVED", "REJECTED"], // Explicitly list the enum values (?) + }) + .notNull() + .default("PENDING"), +}); + +export type CompanyRequestType = typeof RoleRequest.$inferSelect; + +export const RoleRequestRelations = relations(RoleRequest, ({ one }) => ({ + company: one(Company, { + fields: [RoleRequest.companyId], + references: [Company.id], + }), + profile: one(Profile, { + fields: [RoleRequest.id], + references: [Profile.userId], + }), +})); + +// Zod validation schema for creating a role request +export const CreateCompanyRequestSchema = createInsertSchema(RoleRequest, { + roleTitle: z.string(), + roleDescription: z.string(), + status: z.nativeEnum(RequestStatus), +}).omit({ + id: true, + createdAt: true, +});