forked from vincanger/coverlettergpt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.wasp
163 lines (143 loc) · 4.18 KB
/
main.wasp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
app applyai {
wasp: {
version: "^0.9.0"
},
title: "CoverLetterGPT",
// Auth out of the box! https://wasp-lang.dev/docs/language/features#authentication--authorization
auth: {
userEntity: User,
externalAuthEntity: SocialLogin,
methods: {
google: {},
},
onAuthFailedRedirectTo: "/",
},
db: {
system: PostgreSQL
},
client: {
rootComponent: import App from "@client/App",
},
server: {
// this imports a custom server endpoint for the location-based Stripe link
setupFn: import getLocation from "@server/getLocation.js"
},
dependencies: [
("node-fetch", "3.3.0"),
("@chakra-ui/react", "1.8.8"),
("react-icons", "4.8.0"),
("@emotion/react", "11.10.6"),
("@emotion/styled", "11.10.6"),
("framer-motion", "6.5.1"),
("react-hook-form", "7.43.1"),
("pdfjs-dist", "3.3.122"),
("@types/pdfjs-dist", "2.10.378"),
("react-query", "^3.39.2"),
("axios", "^0.27.2")
],
}
/* 💽 Wasp defines DB entities via Prisma Database Models:
* https://wasp-lang.dev/docs/language/features#entity
*/
entity User {=psl
id Int @id @default(autoincrement())
username String @unique
password String
letters CoverLetter[]
jobs Job[]
externalAuthAssociations SocialLogin[]
psl=}
entity SocialLogin {=psl
id String @id @default(uuid())
provider String
providerId String
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
userId Int
createdAt DateTime @default(now())
@@unique([provider, providerId, userId])
psl=}
entity CoverLetter {=psl
id String @id @default(uuid())
title String
content String
tokenUsage Int
job Job @relation(fields: [jobId], references: [id])
jobId String
user User? @relation(fields: [userId], references: [id])
userId Int?
createdAt DateTime @default(now())
updatedAt DateTime? @updatedAt
psl=}
entity Job {=psl
id String @id @default(uuid())
title String
company String
location String
description String
coverLetter CoverLetter[]
user User? @relation(fields: [userId], references: [id])
userId Int?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
isCompleted Boolean @default(false)
psl=}
/* 📡 These are the Wasp Routes (You can protect them easily w/ 'authRequired: true');
* https://wasp-lang.dev/docs/language/features#route
*/
route RootRoute { path: "/", to: MainPage }
page MainPage {
component: import Main from "@client/MainPage"
}
route CoverLetterPage { path: "/cover-letter/:id", to: CoverLetterPage }
page CoverLetterPage {
component: import { CoverLetter } from "@client/CoverLetter"
}
route LoginRoute { path: "/login", to: LoginPage }
page LoginPage {
component: import Login from "@client/LoginPage"
}
route JobsRoute { path: "/jobs", to: JobsPage }
page JobsPage {
authRequired: true,
component: import Jobs from "@client/JobsPage"
}
route ProfileRoute { path: "/profile", to: ProfilePage }
page ProfilePage {
authRequired: true,
component: import Profile from "@client/ProfilePage"
}
/* ⛑ These are the Wasp Operations, which allow the client and server to interact:
* https://wasp-lang.dev/docs/language/features#queries-and-actions-aka-operations
*/
action generateCoverLetter {
fn: import { generateCoverLetter } from "@server/actions.js",
entities: [CoverLetter]
}
action createJob {
fn: import { createJob } from "@server/actions.js",
entities: [Job]
}
action updateJob {
fn: import { updateJob } from "@server/actions.js",
entities: [Job]
}
action updateCoverLetter {
fn: import { updateCoverLetter } from "@server/actions.js",
entities: [Job, CoverLetter]
}
query getJobs {
fn: import { getJobs } from "@server/queries.js",
entities: [Job]
}
query getJob {
fn: import { getJob } from "@server/queries.js",
entities: [Job]
}
query getCoverLetter {
fn: import { getCoverLetter } from "@server/queries.js",
entities: [CoverLetter]
}
query getCoverLetters {
fn: import { getCoverLetters } from "@server/queries.js",
entities: [CoverLetter]
}