Files
Todo/lib/actions.ts
Paul Bailey dcb1ce929f feat: implement core server actions for enhanced task operations
- Add updateItem server action with support for all metadata fields (title, description, completed, priority, dueDate, tags, notes)
- Add deleteItem server action with proper revalidation
- Add deleteList server action with cascade behavior (handled by Prisma schema)
- Add updateList server action for renaming and color updates

Requirements: 1.2, 1.3, 2.4, 2.5
2025-12-01 19:00:21 +00:00

121 lines
2.4 KiB
TypeScript

'use server'
import { prisma } from './db'
import { revalidatePath } from 'next/cache'
export async function getLists() {
return await prisma.list.findMany({
include: {
items: true,
},
orderBy: {
updatedAt: 'desc',
},
})
}
export async function createList(title: string, color: string = '#3B82F6') {
const list = await prisma.list.create({
data: {
title,
color,
},
})
revalidatePath('/')
return list
}
export async function getListWithItems(listId: string) {
return await prisma.list.findUnique({
where: { id: listId },
include: {
items: {
orderBy: {
createdAt: 'desc',
},
},
},
})
}
export async function createItem(listId: string, title: string, description?: string) {
const item = await prisma.item.create({
data: {
title,
description,
listId,
},
})
revalidatePath(`/list/${listId}`)
return item
}
export async function toggleItem(itemId: string) {
const item = await prisma.item.findUnique({ where: { id: itemId } })
if (!item) return null
const updated = await prisma.item.update({
where: { id: itemId },
data: { completed: !item.completed },
})
revalidatePath(`/list/${item.listId}`)
return updated
}
export async function updateItem(
itemId: string,
data: {
title?: string
description?: string | null
completed?: boolean
priority?: 'low' | 'medium' | 'high'
dueDate?: Date | null
tags?: string[]
notes?: string | null
}
) {
const item = await prisma.item.findUnique({ where: { id: itemId } })
if (!item) return null
const updated = await prisma.item.update({
where: { id: itemId },
data,
})
revalidatePath(`/list/${item.listId}`)
return updated
}
export async function deleteItem(itemId: string) {
const item = await prisma.item.findUnique({ where: { id: itemId } })
if (!item) return null
await prisma.item.delete({
where: { id: itemId },
})
revalidatePath(`/list/${item.listId}`)
return { success: true }
}
export async function deleteList(listId: string) {
await prisma.list.delete({
where: { id: listId },
})
revalidatePath('/')
return { success: true }
}
export async function updateList(
listId: string,
data: {
title?: string
color?: string
}
) {
const updated = await prisma.list.update({
where: { id: listId },
data,
})
revalidatePath('/')
revalidatePath(`/list/${listId}`)
return updated
}