Implemented the rest of the db schema
This commit is contained in:
161
db.md
Normal file
161
db.md
Normal 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];
|
||||
```
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -1,4 +1,2 @@
|
||||
export * from "./cv";
|
||||
export * from "./cv-relations";
|
||||
export * from "./resume";
|
||||
export * from "./resume-relations";
|
||||
|
||||
@@ -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] }),
|
||||
}),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user