Implemented the rest of the db schema

This commit is contained in:
2024-06-15 23:44:13 -05:00
parent 9c2c272755
commit cb978cb736
7 changed files with 286 additions and 8 deletions

161
db.md Normal file
View File

@@ -0,0 +1,161 @@
# Resume Factory Database Model
```mermaid
classDiagram
user "1" <-- "1" cv
class user {
id
}
cv "1" <-- "n" cv_detail
cv "1" <-- "n" education
cv "1" <-- "n" experience
experience "1" <-- "n" experience_description
cv "1" <-- "n" project
project "1" <-- "n" project_description
cv "1" <-- "n" resume
resume "1" <-- "n" resume_state
resume "1" <-- "n" cv_detail_state
resume "1" <-- "n" education_state
resume "1" <-- "n" experience_state
resume "1" <-- "n" experience_description_state
resume "1" <-- "n" project_state
resume "1" <-- "n" project_description_state
cv_detail "1" <-- "1" cv_detail_state
education "1" <-- "1" education_state
experience "1" <-- "1" experience_state
experience_description "1" <-- "1" experience_description_state
project "1" <-- "1" project_state
project_description "1" <-- "1" project_description_state
namespace CV {
class cv {
id
user_id
name
email
phone
}
class cv_detail {
id
cv_id
DetailType detail_type
value
}
class DetailType {
<<enumeration>>
LANGUAGES
URLS
AWARDS
CERTIFICATES
SKILLS
}
class education {
id
cv_id
school
degree
gpa
start_date
end_date
}
class experience {
id
cv_id
role
employer
start_date
end_date
}
class experience_description {
id
experience_id
value
}
class project {
id
cv_id
title
}
class project_description {
id
project_id
value
}
}
namespace Resume {
class resume {
id
cv_id
name
file_name
role
}
class resume_state {
resume_id
bool role
bool email
bool phone
}
class cv_detail_state {
resume_id
cv_detail_id
bool active
}
class education_state {
resume_id
education_id
bool active
bool gpa
bool dates
}
class experience_state {
resume_id
experience_id
bool active
%% At least one of 'role' and 'employer' must be active
bool role
bool employer
bool dates
}
class experience_description_state {
resume_id
experience_description_id
active
}
class project_state {
resume_id
project_id
bool active
}
class project_description_state {
resume_id
project_description_id
active
}
}
```
---
```mermaid
graph TD;
A[User] -->|1:1| B[CV];
B -->|1:n| C[Resume];
C -->|1:1| D[ResumeState];
```

View File

@@ -3,7 +3,7 @@ import { type Config } from "drizzle-kit";
import { env } from "~/env";
export default {
schema: "./src/server/db/schema.ts",
schema: "./src/server/db/schema/index.ts",
driver: "pg",
dbCredentials: {
connectionString: env.POSTGRES_URL,

View File

@@ -4,9 +4,9 @@ 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: 255 }),
email: varchar("email", { length: 255 }),
phone: varchar("phone", { length: 255 }),
name: varchar("name", { length: 128 }),
email: varchar("email", { length: 128 }),
phone: varchar("phone", { length: 32 }),
});
export const cvDetail = createTable("cv_detail", {
@@ -38,7 +38,7 @@ export const experience = createTable("experience", {
end_date: date("end_date"),
});
export const experience_description = createTable("experience_description", {
export const experienceDescription = createTable("experience_description", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
experienceId: varchar("experience_id", { length: 255 }).references(
() => experience.id,
@@ -52,7 +52,7 @@ export const project = createTable("project", {
title: varchar("title", { length: 128 }),
});
export const project_description = createTable("project_description", {
export const projectDescription = createTable("project_description", {
id: varchar("id", { length: 255 }).notNull().primaryKey(),
projectId: varchar("project_id", { length: 255 }).references(
() => project.id,

View File

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

View File

@@ -0,0 +1,119 @@
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] }),
}),
);