Files
nextplacement/packages/db/schema.ts

281 lines
7.5 KiB
TypeScript

import { sql, relations } from 'drizzle-orm';
import {
pgTable,
serial,
text,
varchar,
boolean,
timestamp,
integer,
numeric,
primaryKey,
check,
} from 'drizzle-orm/pg-core';
export { createSelectSchema, createInsertSchema } from 'drizzle-zod';
export const students = pgTable('students', {
id: serial().primaryKey(),
email: text().notNull(),
rollNumber: varchar({ length: 12 }),
verified: boolean().notNull().default(false),
markedOut: boolean().notNull().default(false),
firstName: varchar({ length: 255 }),
middleName: varchar({ length: 255 }),
lastName: varchar({ length: 255 }),
mothersName: varchar({ length: 255 }),
mothersEmail: text(),
mothersPhone: varchar({ length: 10 }),
fathersName: varchar({ length: 255 }),
fathersEmail: text(),
fathersPhone: varchar({ length: 10 }),
gender: varchar({ length: 10 }),
dob: timestamp(),
personalGmail: text(),
phoneNumber: varchar({ length: 10 }),
address: text(),
profilePicture: text(),
degree: text(),
branch: text(),
year: text(),
skills: text()
.array()
.default(sql`ARRAY[]::text[]`),
linkedin: text(),
github: text(),
ssc: numeric({ precision: 4, scale: 2 }), // TODO: year, board
hsc: numeric({ precision: 4, scale: 2 }), // TODO: year, board
isDiploma: boolean(), // TODO: diploma branch
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});
export const internships = pgTable('internships', {
id: serial().primaryKey(),
studentId: integer()
.notNull()
.references(() => students.id),
title: text().notNull(),
company: text().notNull(),
description: text().notNull(),
location: text().notNull(),
startDate: timestamp().notNull(),
endDate: timestamp().notNull(),
// status: text().notNull(),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});
// export const projects = pgTable("projects", {
// id: serial().primaryKey(),
// studentId: integer("student_id")
// .notNull()
// .references(() => students.id),
// title: text().notNull(),
// description: text().notNull(),
// links: text()
// .array()
// .notNull()
// .default(sql`ARRAY[]::text[]`),
// createdAt: timestamp().notNull().defaultNow(),
// updatedAt: timestamp()
// .defaultNow()
// .$onUpdate(() => new Date())
// .notNull(),
// });
// export const certificates = pgTable("certificates", {
// id: serial().primaryKey(),
// studentId: integer("student_id")
// .notNull()
// .references(() => students.id),
// title: text().notNull(),
// description: text().notNull(),
// link: text().notNull(),
// createdAt: timestamp().notNull().defaultNow(),
// updatedAt: timestamp()
// .defaultNow()
// .$onUpdate(() => new Date())
// .notNull(),
// });
export const resumes = pgTable('resumes', {
id: serial().primaryKey(),
studentId: integer()
.notNull()
.references(() => students.id),
title: text().notNull(),
link: text().notNull(),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});
export const grades = pgTable(
'grades',
{
studentId: integer()
.notNull()
.references(() => students.id),
sem: integer().notNull(),
sgpi: numeric({ precision: 4, scale: 2 }).notNull(),
isKT: boolean().notNull(),
deadKT: boolean(),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
},
(table) => [
primaryKey({ columns: [table.studentId, table.sem] }),
check('sem_check1', sql`${table.sem} < 9`),
],
);
export const studentRelations = relations(students, ({ many }) => ({
internships: many(internships),
// projects: many(projects),
// certificates: many(certificates),
resumes: many(resumes),
grades: many(grades),
}));
export const internshipRelations = relations(internships, ({ one }) => ({
student: one(students, {
fields: [internships.studentId],
references: [students.id],
}),
}));
// export const projectRelations = relations(projects, ({ one }) => ({
// student: one(students, {
// fields: [projects.studentId],
// references: [students.id],
// }),
// }));
// export const certificateRelations = relations(certificates, ({ one }) => ({
// student: one(students, {
// fields: [certificates.studentId],
// references: [students.id],
// }),
// }));
export const resumeRelations = relations(resumes, ({ one, many }) => ({
student: one(students, {
fields: [resumes.studentId],
references: [students.id],
}),
applications: many(applications),
}));
export const gradeRelations = relations(grades, ({ one }) => ({
student: one(students, {
fields: [grades.studentId],
references: [students.id],
}),
}));
export const companies = pgTable('companies', {
id: serial().primaryKey(),
name: text().notNull(),
link: text(),
description: text(),
// passwordHash: text(),
imageURL: text().notNull(),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});
export const jobs = pgTable('jobs', {
id: serial().primaryKey(),
companyId: integer()
.notNull()
.references(() => companies.id),
title: text().notNull(),
link: text().notNull(),
description: text().notNull(),
location: text().notNull(),
imageURL: text().notNull(),
salary: text().notNull(),
applicationDeadline: timestamp().notNull(),
active: boolean().notNull().default(false),
minCGPA: numeric({ precision: 4, scale: 2 }).notNull().default('0'),
minSSC: numeric({ precision: 4, scale: 2 }).notNull().default('0'),
minHSC: numeric({ precision: 4, scale: 2 }).notNull().default('0'),
allowDeadKT: boolean().notNull().default(true),
allowLiveKT: boolean().notNull().default(true),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});
export const applications = pgTable('applications', {
id: serial().primaryKey(),
jobId: integer()
.notNull()
.references(() => jobs.id),
studentId: integer()
.notNull()
.references(() => students.id),
resumeId: integer()
.notNull()
.references(() => resumes.id),
status: text().notNull().default('pending'),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});
export const companyRelations = relations(companies, ({ many }) => ({
jobs: many(jobs),
}));
export const jobsRelations = relations(jobs, ({ one, many }) => ({
company: one(companies, {
fields: [jobs.companyId],
references: [companies.id],
}),
applications: many(applications),
}));
export const applicationsRelations = relations(applications, ({ one }) => ({
job: one(jobs, {
fields: [applications.jobId],
references: [jobs.id],
}),
student: one(students, {
fields: [applications.studentId],
references: [students.id],
}),
resume: one(resumes, {
fields: [applications.resumeId],
references: [resumes.id],
}),
}));
export const admins = pgTable('admins', {
id: serial().primaryKey(),
email: text().notNull().unique(),
createdAt: timestamp().notNull().defaultNow(),
updatedAt: timestamp()
.defaultNow()
.$onUpdate(() => new Date())
.notNull(),
});