Restructured db model
This commit is contained in:
41
db.2.md
Normal file
41
db.2.md
Normal 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
|
||||
}
|
||||
```
|
||||
42
src/server/db/schema/core.ts
Normal file
42
src/server/db/schema/core.ts
Normal 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"),
|
||||
});
|
||||
@@ -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"),
|
||||
});
|
||||
@@ -1,2 +1 @@
|
||||
export * from "./cv";
|
||||
export * from "./resume";
|
||||
export * from "./core";
|
||||
|
||||
@@ -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] }),
|
||||
}),
|
||||
);
|
||||
Reference in New Issue
Block a user