-
+
);
}
diff --git a/todo-app/src/server/app.ts b/todo-app/src/server/app.ts
index d2a5478..aae5c1c 100644
--- a/todo-app/src/server/app.ts
+++ b/todo-app/src/server/app.ts
@@ -1,16 +1,10 @@
import { startApp } from 'modelence/server';
import { nextServer } from '@modelence/next';
-import todosModule from './todos';
-import { createInitialData } from './todos/initialData';
+//import { ErrorComponent } from './auth/ErrorComponent';
startApp({
- modules: [todosModule],
server: nextServer,
- migrations: [{
- version: 1,
- description: 'Initial data',
- async handler() {
- await createInitialData();
- },
- }],
+ // auth: {
+ // errorComponent: ErrorComponent,
+ // },
});
diff --git a/todo-app/src/server/auth/ErrorComponent.tsx b/todo-app/src/server/auth/ErrorComponent.tsx
new file mode 100644
index 0000000..f669139
--- /dev/null
+++ b/todo-app/src/server/auth/ErrorComponent.tsx
@@ -0,0 +1,70 @@
+import React from 'react';
+import { renderToStaticMarkup } from 'react-dom/server';
+
+interface OAuthErrorInfo {
+ error: string;
+ statusCode: number;
+}
+
+function ErrorPage({ error, statusCode }: OAuthErrorInfo) {
+ return (
+
+
+
+
+
Authentication Error
+
+
+
+
+
+
+ );
+}
+
+export function ErrorComponent(props: OAuthErrorInfo): string {
+ return `${renderToStaticMarkup(
)}`;
+}
diff --git a/todo-app/src/server/migrations/0001-initial-data.ts b/todo-app/src/server/migrations/0001-initial-data.ts
new file mode 100644
index 0000000..bc55e5d
--- /dev/null
+++ b/todo-app/src/server/migrations/0001-initial-data.ts
@@ -0,0 +1,15 @@
+import type { MigrationScript } from 'modelence/server';
+import dbTodos from '../modules/todos/stores/dbTodos';
+
+export default {
+ version: 1,
+ description: 'Initial data',
+ handler: async () => {
+ console.log('Creating initial data for todos');
+ await dbTodos.insertMany([
+ { title: 'Learn Modelence', completed: false },
+ { title: 'Build a Todo App', completed: false },
+ { title: 'Deploy to Modelence Cloud', completed: false },
+ ]);
+ },
+} satisfies MigrationScript;
diff --git a/todo-app/src/server/modules/todos/index.ts b/todo-app/src/server/modules/todos/index.ts
new file mode 100644
index 0000000..5daf888
--- /dev/null
+++ b/todo-app/src/server/modules/todos/index.ts
@@ -0,0 +1,13 @@
+import { Module } from "modelence/server";
+
+const todosModule = new Module('todos', {
+ configSchema: {
+ dbUrl: {
+ type: 'string',
+ default: 'mongodb://localhost:27017/todos',
+ isPublic: true,
+ },
+ }
+});
+
+export default todosModule;
diff --git a/todo-app/src/server/modules/todos/mutations/create.ts b/todo-app/src/server/modules/todos/mutations/create.ts
new file mode 100644
index 0000000..78dff0d
--- /dev/null
+++ b/todo-app/src/server/modules/todos/mutations/create.ts
@@ -0,0 +1,14 @@
+import { z } from 'zod';
+import dbTodos from '../stores/dbTodos';
+
+export default async function create(args: unknown) {
+ const { title } = z.object({
+ title: z.string().min(1),
+ }).parse(args);
+
+ await dbTodos.insertOne({
+ title,
+ completed: false,
+ luckyNumber: Math.floor(Math.random() * 100) + 1,
+ });
+}
diff --git a/todo-app/src/server/modules/todos/mutations/delete.ts b/todo-app/src/server/modules/todos/mutations/delete.ts
new file mode 100644
index 0000000..35b86d2
--- /dev/null
+++ b/todo-app/src/server/modules/todos/mutations/delete.ts
@@ -0,0 +1,11 @@
+import { z } from 'zod';
+import { ObjectId } from 'modelence/server';
+import dbTodos from '../stores/dbTodos';
+
+export default async function deleteTodo(args: unknown) {
+ const { id } = z.object({
+ id: z.string(),
+ }).parse(args);
+
+ await dbTodos.deleteMany({ _id: new ObjectId(id) });
+}
diff --git a/todo-app/src/server/modules/todos/mutations/setCompleted.ts b/todo-app/src/server/modules/todos/mutations/setCompleted.ts
new file mode 100644
index 0000000..c920abd
--- /dev/null
+++ b/todo-app/src/server/modules/todos/mutations/setCompleted.ts
@@ -0,0 +1,15 @@
+import { z } from 'zod';
+import dbTodos from '../stores/dbTodos';
+
+export default async function setCompleted(args: unknown) {
+ const { id, completed } = z.object({
+ id: z.string(),
+ completed: z.boolean(),
+ }).parse(args);
+
+ await dbTodos.updateOne(id, {
+ $set: {
+ completed,
+ },
+ });
+}
diff --git a/todo-app/src/server/modules/todos/mutations/update.ts b/todo-app/src/server/modules/todos/mutations/update.ts
new file mode 100644
index 0000000..443fdc0
--- /dev/null
+++ b/todo-app/src/server/modules/todos/mutations/update.ts
@@ -0,0 +1,15 @@
+import { z } from 'zod';
+import dbTodos from '../stores/dbTodos';
+
+export default async function update(args: unknown) {
+ const { id, title } = z.object({
+ id: z.string(),
+ title: z.string().min(1),
+ }).parse(args);
+
+ await dbTodos.updateOne(id, {
+ $set: {
+ title,
+ },
+ });
+}
diff --git a/todo-app/src/server/modules/todos/queries/getAll.ts b/todo-app/src/server/modules/todos/queries/getAll.ts
new file mode 100644
index 0000000..fa64a19
--- /dev/null
+++ b/todo-app/src/server/modules/todos/queries/getAll.ts
@@ -0,0 +1,5 @@
+import dbTodos from '../stores/dbTodos';
+
+export default async function getAll() {
+ return await dbTodos.fetch({});
+}
diff --git a/todo-app/src/server/modules/todos/stores/dbTodos.ts b/todo-app/src/server/modules/todos/stores/dbTodos.ts
new file mode 100644
index 0000000..e484b7b
--- /dev/null
+++ b/todo-app/src/server/modules/todos/stores/dbTodos.ts
@@ -0,0 +1,12 @@
+import { Store, schema } from 'modelence/server';
+
+export default new Store('todos', {
+ schema: {
+ title: schema.string(),
+ completed: schema.boolean(),
+ luckyNumber: schema.number(),
+ },
+ indexes: [
+ { key: { luckyNumber: 1 }, sparse: true },
+ ],
+});
diff --git a/todo-app/src/server/todos/db.ts b/todo-app/src/server/todos/db.ts
deleted file mode 100644
index 1ba2e25..0000000
--- a/todo-app/src/server/todos/db.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { Store, schema } from 'modelence/server';
-
-export const dbTodos = new Store('todos', {
- schema: {
- title: schema.string(),
- completed: schema.boolean(),
- },
- indexes: []
-});
diff --git a/todo-app/src/server/todos/index.ts b/todo-app/src/server/todos/index.ts
deleted file mode 100644
index a233aaf..0000000
--- a/todo-app/src/server/todos/index.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { z } from 'zod';
-import { Module, ObjectId } from 'modelence/server';
-import { dbTodos } from './db';
-
-export default new Module('todos', {
- stores: [dbTodos],
- queries: {
- async getAll() {
- return await dbTodos.fetch({});
- },
- },
- mutations: {
- async setCompleted(args) {
- const { id, completed } = z.object({
- id: z.string(),
- completed: z.boolean(),
- }).parse(args);
-
- await dbTodos.updateOne(id, {
- $set: {
- completed,
- },
- });
- },
- async create(args) {
- const { title } = z.object({
- title: z.string().min(1),
- }).parse(args);
-
- await dbTodos.insertOne({
- title,
- completed: false,
- });
- },
- async update(args) {
- const { id, title } = z.object({
- id: z.string(),
- title: z.string().min(1),
- }).parse(args);
-
- await dbTodos.updateOne(id, {
- $set: {
- title,
- },
- });
- },
- async delete(args) {
- const { id } = z.object({
- id: z.string(),
- }).parse(args);
-
- await dbTodos.deleteMany({ _id: new ObjectId(id) });
- },
- },
-});
diff --git a/todo-app/src/server/todos/initialData.ts b/todo-app/src/server/todos/initialData.ts
deleted file mode 100644
index d1e7b73..0000000
--- a/todo-app/src/server/todos/initialData.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { dbTodos } from './db';
-
-export async function createInitialData() {
- console.log('Creating initial data for todos');
- await dbTodos.insertMany([
- { title: 'Learn Modelence', completed: false },
- { title: 'Build a Todo App', completed: false },
- { title: 'Deploy to Modelence Cloud', completed: false },
- ]);
-}
diff --git a/todo-app/tsconfig.json b/todo-app/tsconfig.json
index c133409..4c695c6 100644
--- a/todo-app/tsconfig.json
+++ b/todo-app/tsconfig.json
@@ -19,7 +19,8 @@
}
],
"paths": {
- "@/*": ["./src/*"]
+ "@/*": ["./src/*"],
+ "@modelence/modules": ["./.modelence/generated/clientModules"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],