created list schema

This commit is contained in:
2024-11-23 09:05:24 -06:00
parent 8393ec9f49
commit 66662220e7
5 changed files with 66 additions and 21 deletions

View File

@@ -16,7 +16,7 @@ import { api } from "~/trpc/react";
const newName = "test new name"; const newName = "test new name";
export const ListButton = ({ id, name }: { id: number; name: string }) => { export const ListButton = ({ id, title }: { id: number; title: string }) => {
const dialogConfirmation = useDialogConfirmation(); const dialogConfirmation = useDialogConfirmation();
const { mutate: updateMutation } = api.list.update.useMutation({ const { mutate: updateMutation } = api.list.update.useMutation({
@@ -30,7 +30,7 @@ export const ListButton = ({ id, name }: { id: number; name: string }) => {
}, },
}); });
const handleRename = () => updateMutation({ listId: id, name: newName }); const handleRename = () => updateMutation({ listId: id, title: newName });
const handleDelete = async () => { const handleDelete = async () => {
const didConfirm = await dialogConfirmation({}); const didConfirm = await dialogConfirmation({});
@@ -51,7 +51,7 @@ export const ListButton = ({ id, name }: { id: number; name: string }) => {
href={`/list/${id}`} href={`/list/${id}`}
className="w-full text-left underline-offset-4 hover:underline" className="w-full text-left underline-offset-4 hover:underline"
> >
{name} {title}
</Link> </Link>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>

View File

@@ -28,8 +28,8 @@ export default async function Home() {
</div> </div>
<div className="space-y-1"> <div className="space-y-1">
{allLists.map(({ id, name }) => ( {allLists.map(({ id, title }) => (
<ListButton key={id} id={id} name={name} /> <ListButton key={id} id={id} title={title} />
))} ))}
</div> </div>
</div> </div>

View File

@@ -1,29 +1,35 @@
import { and, eq } from "drizzle-orm";
import { z } from "zod"; import { z } from "zod";
import { import {
listCreationFormSchema, listCreationFormSchema,
listNameSchema, listTitleSchema,
} from "~/lib/schemas/list-creation-form"; } from "~/lib/schemas/list-creation-form";
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc"; import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
import { lists } from "~/server/db/schema";
export const listRouter = createTRPCRouter({ export const listRouter = createTRPCRouter({
create: protectedProcedure create: protectedProcedure
.input(listCreationFormSchema) .input(listCreationFormSchema)
.mutation(async ({ ctx, input }) => { .mutation(({ ctx, input }) =>
return []; ctx.db.insert(lists).values({
userId: ctx.session.user.id,
title: input.title,
variant: input.variant,
labels: input.labels.join(","),
showId: input.id,
idPrefix: input.idPrefix,
}), }),
),
getAll: protectedProcedure.query(async ({ ctx }) => { getAll: protectedProcedure.query(async ({ ctx }) => {
return [ const allLists = await ctx.db.query.lists.findMany({
{ id: 0, name: "Groceries" }, where: and(eq(lists.userId, ctx.session.user.id)),
{ id: 1, name: "Christmas" }, });
{ id: 2, name: "Salt Seeker" }, const formattedLists = allLists.map((list) => ({
{ id: 3, name: "Maize Walker" }, ...list,
{ id: 4, name: "Sympathy for the Machine" }, labels: list.labels?.split(",") ?? [],
{ }));
id: 5, return formattedLists;
name: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor elit incididunt ut labore et dolore magna aliqua.",
},
];
}), }),
get: protectedProcedure get: protectedProcedure
.input(z.object({ listId: z.coerce.number() })) .input(z.object({ listId: z.coerce.number() }))
@@ -31,7 +37,7 @@ export const listRouter = createTRPCRouter({
return { name: "Groceries", tasks: [] }; return { name: "Groceries", tasks: [] };
}), }),
update: protectedProcedure update: protectedProcedure
.input(z.object({ listId: z.number(), name: listNameSchema })) .input(z.object({ listId: z.number(), title: listTitleSchema }))
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {
return []; return [];
}), }),

View File

@@ -0,0 +1,38 @@
import { relations } from "drizzle-orm";
import { boolean, integer, serial, text, varchar } from "drizzle-orm/pg-core";
import { VARIANTS } from "~/lib/data/list-variants";
import { LABELS } from "~/lib/data/task-labels";
import { PRIORITIES } from "~/lib/data/task-priority";
import { STATUSES } from "~/lib/data/task-status";
import { users } from "~/server/db/schema/auth";
import { createTable } from "~/server/db/schema/create-table";
export const lists = createTable("list", {
id: serial("id").primaryKey(),
userId: varchar("userId", { length: 255 }).notNull(),
title: varchar("title", { length: 128 }).notNull(),
variant: varchar("variant", { enum: VARIANTS }).notNull(),
labels: text("labels"),
showId: boolean("showId").default(false).notNull(),
idPrefix: varchar("idPrefix", { length: 8 }),
lastTaskId: integer("lastTaskId").default(0).notNull(),
});
export const listRelations = relations(lists, ({ one }) => ({
user: one(users, { fields: [lists.userId], references: [users.id] }),
}));
export const tasks = createTable("task", {
id: serial("id").primaryKey(),
listId: serial("listId").notNull(),
title: varchar("title", { length: 128 }).notNull(),
isChecked: boolean("isChecked").default(false).notNull(),
visibleId: varchar("visibleId", { length: 16 }),
label: varchar("label", { enum: LABELS }),
status: varchar("status", { enum: STATUSES }),
priority: varchar("priority", { enum: PRIORITIES }),
});
export const taskRelations = relations(tasks, ({ one }) => ({
list: one(lists, { fields: [tasks.listId], references: [lists.id] }),
}));

View File

@@ -1 +1,2 @@
export * from "./auth"; export * from "./auth";
export * from "./app";