Restructured db model

This commit is contained in:
2024-06-28 20:13:16 -05:00
parent b86c2cff9c
commit b88b95105e
5 changed files with 84 additions and 182 deletions

41
db.2.md Normal file
View File

@@ -0,0 +1,41 @@
# Resume Factory Database Model
```mermaid
classDiagram
user "1" <-- "1" cv
cv "1" <-- "n" resume
cv "1" <-- "n" field
resume "1" <-- "n" field
field "1" <-- "1" field_state
resume "1" <-- "n" field_state
class user {
id
}
class cv {
id
user_id
}
class resume {
id
cv_id
}
class field {
id
cv_id
resume_id?
field ([cv|resume].[id].[field-name]+(.[index].[fieldname]))
string value
order?
}
class field_state {
id
resume_id
field_id
active
}
```

View File

@@ -0,0 +1,42 @@
import { createTable } from "~/server/db/schema/create-table";
import {
boolean,
integer,
serial,
text,
timestamp,
varchar,
} from "drizzle-orm/pg-core";
export const cv = createTable("cv", {
id: serial("id").primaryKey(),
userId: varchar("user_id", { length: 255 }).notNull().unique(), // "Foreign key" from Clerk
lastUpdated: timestamp("last_updated"),
});
export const resume = createTable("resume", {
id: serial("id").primaryKey(),
cvId: integer("cv_id").references(() => cv.id, { onDelete: "cascade" }),
lastUpdated: timestamp("last_updated"),
});
export const field = createTable("field", {
id: serial("id").primaryKey(),
cvId: integer("cv_id").references(() => cv.id, { onDelete: "cascade" }),
resumeId: integer("resume_id").references(() => resume.id, {
onDelete: "cascade",
}), // Optional
field: varchar("field", { length: 255 }).unique(),
value: text("value"),
});
export const fieldState = createTable("field_state", {
id: serial("id").primaryKey(),
resumeId: integer("resume_id").references(() => resume.id, {
onDelete: "cascade",
}),
fieldId: integer("field_id").references(() => field.id, {
onDelete: "cascade",
}),
active: boolean("active"),
});

View File

@@ -1,61 +0,0 @@
import { createTable } from "~/server/db/schema/create-table";
import { date, text, varchar } from "drizzle-orm/pg-core";
export const cv = createTable("cv", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
userId: varchar("user_id", { length: 255 }).notNull().unique(), // "Foreign key" from Clerk
name: varchar("name", { length: 128 }),
email: varchar("email", { length: 128 }),
phone: varchar("phone", { length: 32 }),
});
export const cvDetail = createTable("cv_detail", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
cvId: varchar("cv_id", { length: 255 }).references(() => cv.id),
detailType: varchar("detail_type", {
length: 32,
enum: ["languages", "urls", "awards", "certificates", "skills"],
}),
value: text("value"),
});
export const education = createTable("education", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
cvId: varchar("cv_id", { length: 255 }).references(() => cv.id),
school: varchar("school", { length: 128 }),
degree: varchar("degree", { length: 128 }),
gpa: varchar("gpa", { length: 32 }),
start_date: date("start_date"),
end_date: date("end_date"),
});
export const experience = createTable("experience", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
cvId: varchar("cv_id", { length: 255 }).references(() => cv.id),
role: varchar("role", { length: 128 }),
employer: varchar("employer", { length: 128 }),
start_date: date("start_date"),
end_date: date("end_date"),
});
export const experienceDescription = createTable("experience_description", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
experienceId: varchar("experience_id", { length: 255 }).references(
() => experience.id,
),
value: text("value"),
});
export const project = createTable("project", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
cvId: varchar("cv_id", { length: 255 }).references(() => cv.id),
title: varchar("title", { length: 128 }),
});
export const projectDescription = createTable("project_description", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
projectId: varchar("project_id", { length: 255 }).references(
() => project.id,
),
value: text("value"),
});

View File

@@ -1,2 +1 @@
export * from "./cv";
export * from "./resume";
export * from "./core";

View File

@@ -1,119 +0,0 @@
import { createTable } from "~/server/db/schema/create-table";
import { boolean, primaryKey, varchar } from "drizzle-orm/pg-core";
import {
cv,
cvDetail,
education,
experience,
experienceDescription,
project,
projectDescription,
} from "~/server/db/schema/cv";
export const resume = createTable("resume", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
cvId: varchar("cv_id", { length: 255 }).references(() => cv.id),
name: varchar("name", { length: 255 }),
fileName: varchar("file_name", { length: 255 }),
role: varchar("role", { length: 255 }),
});
export const resumeState = createTable("resume_state", {
resumeId: varchar("resume_id", { length: 255 })
.references(() => resume.id)
.primaryKey(),
role: boolean("role"),
email: boolean("email"),
phone: boolean("phone"),
});
export const cvDetailState = createTable(
"cv_detail_state",
{
resumeId: varchar("resume_id", { length: 255 }).references(() => resume.id),
cvDetailId: varchar("cv_detail_id", { length: 255 }).references(
() => cvDetail.id,
),
active: boolean("active"),
},
(table) => ({
pk: primaryKey({ columns: [table.resumeId, table.cvDetailId] }),
}),
);
export const educationState = createTable(
"education_state",
{
resumeId: varchar("resume_id", { length: 255 }).references(() => resume.id),
educationId: varchar("education_id", { length: 255 }).references(
() => education.id,
),
active: boolean("active"),
gpa: boolean("gpa"),
dates: boolean("dates"),
},
(table) => ({
pk: primaryKey({ columns: [table.resumeId, table.educationId] }),
}),
);
export const experienceState = createTable(
"experience_state",
{
resumeId: varchar("resume_id", { length: 255 }).references(() => resume.id),
experienceId: varchar("experience_id", { length: 255 }).references(
() => experience.id,
),
active: boolean("active"),
role: boolean("role"),
employer: boolean("employer"),
dates: boolean("dates"),
},
(table) => ({
pk: primaryKey({ columns: [table.resumeId, table.experienceId] }),
}),
);
export const experienceDescriptionState = createTable(
"experience_description_state",
{
resumeId: varchar("resume_id", { length: 255 }).references(() => resume.id),
experienceDescriptionId: varchar("experience_description_id", {
length: 255,
}).references(() => experienceDescription.id),
active: boolean("active"),
},
(table) => ({
pk: primaryKey({
columns: [table.resumeId, table.experienceDescriptionId],
}),
}),
);
export const projectState = createTable(
"project_state",
{
resumeId: varchar("resume_id", { length: 255 }).references(() => resume.id),
projectId: varchar("project_id", { length: 255 }).references(
() => project.id,
),
active: boolean("active"),
},
(table) => ({
pk: primaryKey({ columns: [table.resumeId, table.projectId] }),
}),
);
export const projectDescriptionState = createTable(
"project_description_state",
{
resumeId: varchar("resume_id", { length: 255 }).references(() => resume.id),
projectDescriptionId: varchar("project_description_id", {
length: 255,
}).references(() => projectDescription.id),
active: boolean("active"),
},
(table) => ({
pk: primaryKey({ columns: [table.resumeId, table.projectDescriptionId] }),
}),
);