Add todo example, remove yarn, change schema structure, update readme

This commit is contained in:
Aman Varshney
2025-03-24 00:04:53 +05:30
parent 5076bf4176
commit 4cc13bf382
42 changed files with 525 additions and 443 deletions

View File

@@ -2,30 +2,26 @@ import { Link } from "@tanstack/react-router";
import { ModeToggle } from "./mode-toggle";
export default function Header() {
const links = [
{ to: "/", label: "Home" },
];
return (
<div>
<div className="flex flex-row items-center justify-between px-2 py-1">
<div className="flex gap-4 text-lg">
<Link
to="/"
activeProps={{
className: "font-bold",
}}
activeOptions={{ exact: true }}
>
Home
</Link>
<Link
to="/todos"
activeProps={{
className: "font-bold",
}}
activeOptions={{ exact: true }}
>
Todos
</Link>
</div>
<div className="flex flex-row items-center gap-2">
<nav className="flex gap-4 text-lg">
{links.map(({ to, label }) => (
<Link
key={to}
to={to}
activeProps={{ className: "font-bold" }}
activeOptions={{ exact: true }}
>
{label}
</Link>
))}
</nav>
<div className="flex items-center gap-2">
<ModeToggle />
</div>
</div>

View File

@@ -29,7 +29,7 @@ app.use(
}),
);
app.get("/healthCheck", (c) => {
app.get("/", (c) => {
return c.text("OK");
});

View File

@@ -1,6 +1,6 @@
import { z } from "zod";
import { router, publicProcedure } from "../lib/trpc";
import { todo } from "../db/schema";
import { todo } from "../db/schema/todo";
import { eq } from "drizzle-orm";
import { db } from "../db";

View File

@@ -3,39 +3,27 @@ import { ModeToggle } from "./mode-toggle";
import UserMenu from "./user-menu";
export default function Header() {
const links = [
{ to: "/", label: "Home" },
{ to: "/dashboard", label: "Dashboard" },
];
return (
<div>
<div className="flex flex-row items-center justify-between px-2 py-1">
<div className="flex gap-4 text-lg">
<Link
to="/"
activeProps={{
className: "font-bold",
}}
activeOptions={{ exact: true }}
>
Home
</Link>
<Link
to="/todos"
activeProps={{
className: "font-bold",
}}
activeOptions={{ exact: true }}
>
Todos
</Link>
<Link
to="/dashboard"
activeProps={{
className: "font-bold",
}}
activeOptions={{ exact: true }}
>
Dashboard
</Link>
</div>
<div className="flex flex-row items-center gap-2">
<nav className="flex gap-4 text-lg">
{links.map(({ to, label }) => (
<Link
key={to}
to={to}
activeProps={{ className: "font-bold" }}
activeOptions={{ exact: true }}
>
{label}
</Link>
))}
</nav>
<div className="flex items-center gap-2">
<ModeToggle />
<UserMenu />
</div>

View File

@@ -34,7 +34,7 @@ app.use(
}),
);
app.get("/healthCheck", (c) => {
app.get("/", (c) => {
return c.text("OK");
});

View File

@@ -1,8 +1,8 @@
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/db/schema.ts",
out: "./migrations",
schema: "./src/db/schema",
out: "./src/db/migrations",
dialect: "postgresql",
dbCredentials: {
url: process.env.POSTGRES_URL || "",

View File

@@ -1,10 +1,4 @@
import { pgTable, text, integer, timestamp, boolean } from "drizzle-orm/pg-core";
export const todo = pgTable("todo", {
id: serial("id").primaryKey(),
text: text("text").notNull(),
completed: boolean("completed").default(false).notNull()
});
import { pgTable, text, timestamp, boolean, serial } from "drizzle-orm/pg-core";
export const user = pgTable("user", {
id: text("id").primaryKey(),

View File

@@ -1,4 +1,4 @@
import { pgTable, text, integer, timestamp, boolean } from "drizzle-orm/pg-core";
import { pgTable, text, boolean, serial } from "drizzle-orm/pg-core";
export const todo = pgTable("todo", {
id: serial("id").primaryKey(),

View File

@@ -1,7 +1,7 @@
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "../db";
import * as schema from "../db/schema";
import * as schema from "../db/schema/auth";
export const auth = betterAuth({
database: drizzleAdapter(db, {

View File

@@ -1,8 +1,8 @@
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/db/schema.ts",
out: "./migrations",
schema: "./src/db/schema",
out: "./src/db/migrations",
dialect: "turso",
dbCredentials: {
url: process.env.TURSO_CONNECTION_URL || "",

View File

@@ -1,7 +1,7 @@
import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "../db";
import * as schema from "../db/schema";
import * as schema from "../db/schema/auth";
export const auth = betterAuth({
database: drizzleAdapter(db, {

View File

@@ -1,20 +1,3 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:./local.db"
}
model Todo {
id Int @id @default(autoincrement())
text String
completed Boolean @default(false)
@@map("todo")
}
model User {
id String @id @map("_id")
name String

View File

@@ -0,0 +1,9 @@
generator client {
provider = "prisma-client-js"
previewFeatures = ["prismaSchemaFolder"]
}
datasource db {
provider = "postgres"
url = env("DATABASE_URL")
}

View File

@@ -1,12 +1,3 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:./local.db"
}
model Todo {
id Int @id @default(autoincrement())
text String

View File

@@ -1,20 +1,3 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgres"
url = env("DATABASE_URL")
}
model Todo {
id Int @id @default(autoincrement())
text String
completed Boolean @default(false)
@@map("todo")
}
model User {
id String @id @map("_id")
name String

View File

@@ -0,0 +1,8 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = "file:../local.db"
}

View File

@@ -1,12 +1,3 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgres"
url = env("DATABASE_URL")
}
model Todo {
id Int @id @default(autoincrement())
text String

View File

@@ -1,55 +0,0 @@
import { TRPCError } from "@trpc/server";
import { z } from "zod";
import prisma from "../../prisma";
import { publicProcedure, router } from "../lib/trpc";
export const todoRouter = router({
getAll: publicProcedure.query(async () => {
return await prisma.todo.findMany({
orderBy: {
id: "asc"
}
});
}),
create: publicProcedure
.input(z.object({ text: z.string().min(1) }))
.mutation(async ({ input }) => {
return await prisma.todo.create({
data: {
text: input.text,
},
});
}),
toggle: publicProcedure
.input(z.object({ id: z.number(), completed: z.boolean() }))
.mutation(async ({ input }) => {
try {
return await prisma.todo.update({
where: { id: input.id },
data: { completed: input.completed },
});
} catch (error) {
throw new TRPCError({
code: "NOT_FOUND",
message: "Todo not found",
});
}
}),
delete: publicProcedure
.input(z.object({ id: z.number() }))
.mutation(async ({ input }) => {
try {
return await prisma.todo.delete({
where: { id: input.id },
});
} catch (error) {
throw new TRPCError({
code: "NOT_FOUND",
message: "Todo not found",
});
}
}),
});