app todoApp { wasp: { version: "^0.8.0" }, title: "ToDo App", // head: [], dependencies: [ ("@tailwindcss/forms", "^0.5.3"), ("@tailwindcss/typography", "^0.5.7") ], auth: { userEntity: User, // externalAuthEntity: SocialLogin, methods: { usernameAndPassword: {}, // google: { // configFn: import { config } from "@server/auth/google.js", // getUserFieldsFn: import { getUserFields } from "@server/auth/google.js" // }, // gitHub: { // configFn: import { config } from "@server/auth/github.js", // getUserFieldsFn: import { getUserFields } from "@server/auth/github.js" // } }, onAuthFailedRedirectTo: "/login", onAuthSucceededRedirectTo: "/profile" }, server: { setupFn: import setup from "@server/serverSetup.js" }, client: { setupFn: import setup from "@client/clientSetup" }, db: { system: PostgreSQL } } entity User {=psl id Int @id @default(autoincrement()) username String @unique password String tasks Task[] externalAuthAssociations SocialLogin[] psl=} entity SocialLogin {=psl id Int @id @default(autoincrement()) 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 Task {=psl id Int @id @default(autoincrement()) description String isDone Boolean @default(false) user User @relation(fields: [userId], references: [id]) userId Int psl=} route SignupRoute { path: "/signup", to: SignupPage } page SignupPage { component: import Signup from "@client/pages/auth/Signup" } route LoginRoute { path: "/login", to: LoginPage } page LoginPage { component: import Login from "@client/pages/auth/Login" } route HomeRoute { path: "/", to: MainPage } page MainPage { authRequired: true, component: import Main from "@client/pages/Main" } route AboutRoute { path: "/about", to: AboutPage } page AboutPage { component: import About from "@client/pages/About" } route ProfileRoute { path: "/profile", to: ProfilePage } page ProfilePage { authRequired: true, component: import { ProfilePage } from "@client/pages/ProfilePage" } // Page for viewing a specific task // route TaskRoute { path: "/task/:id", to: TaskPage } page TaskPage { authRequired: true, component: import Task from "@client/pages/Task" } // --------- Queries --------- // query getTasks { fn: import { getTasks } from "@server/queries.js", entities: [Task] } query getNumTasks { fn: import { getNumTasks } from "@server/queries.js", entities: [Task], auth: false } query getTask { fn: import { getTask } from "@server/queries.js", entities: [Task] } // --------- Actions --------- // action createTask { fn: import { createTask } from "@server/actions.js", entities: [Task] } action updateTaskIsDone { fn: import { updateTaskIsDone } from "@server/actions.js", entities: [Task] } action deleteCompletedTasks { fn: import { deleteCompletedTasks } from "@server/actions.js", entities: [Task] } action toggleAllTasks { fn: import { toggleAllTasks } from "@server/actions.js", entities: [Task] } job mySpecialJob { executor: PgBoss, perform: { fn: import { foo } from "@server/jobs/bar.js", executorOptions: { pgBoss: {=json { "retryLimit": 1 } json=} } }, entities: [Task] } job mySpecialScheduledJob { executor: PgBoss, perform: { fn: import { foo } from "@server/jobs/bar.js" }, schedule: { cron: "0 * * * *", args: {=json { "foo": "bar" } json=}, executorOptions: { pgBoss: {=json { "retryLimit": 2 } json=} } } }