refactor(categories): move mutations into use cases

This commit is contained in:
2026-06-04 22:12:06 +02:00
parent 0af25417ab
commit f48ccb8c50
7 changed files with 183 additions and 80 deletions
-152
View File
@@ -1,152 +0,0 @@
"use server"
import { revalidatePath } from "next/cache"
import {
type CreateCategoryFormType,
createCategorySchema,
type UpdateCategoryFormType,
updateCategorySchema,
} from "@/lib/schemas/category.schemas"
import { CategoryService } from "@/services/category.service"
export async function createCategoryAction(formData: CreateCategoryFormType) {
const validatedFields = createCategorySchema.safeParse(formData)
if (!validatedFields.success) {
return {
success: false,
errors: validatedFields.error.flatten().fieldErrors,
}
}
try {
const existingCategory = await CategoryService.findByName(
validatedFields.data.name,
)
if (existingCategory) {
return {
success: false,
errors: {
name: ["Category already exists"],
},
}
}
await CategoryService.create(validatedFields.data)
revalidatePath("/inventory/categories")
return {
success: true,
message: "Category created successfully",
}
} catch (error) {
console.error("Database error:", error)
return {
success: false,
message: "Failed to create category",
errors: {
name: ["Category already exists"],
},
}
}
}
export async function updateCategoryAction(formData: UpdateCategoryFormType) {
const validatedFields = updateCategorySchema.safeParse(formData)
if (!validatedFields.success) {
return {
success: false,
errors: validatedFields.error.flatten().fieldErrors,
}
}
const { id, name } = validatedFields.data
try {
const existingCategory = await CategoryService.findById(id)
if (!existingCategory) {
return {
success: false,
errors: { id: ["Category not found"] },
}
}
if (existingCategory.name === name) {
return {
success: false,
errors: { name: ["Category name is the same as the old one"] },
}
}
if (await CategoryService.findByName(name)) {
return {
success: false,
errors: { name: ["Category already exists"] },
}
}
await CategoryService.update(id, {
name,
})
revalidatePath("/inventory/categories")
return {
success: true,
message: "Category updated successfully",
}
} catch (error) {
console.error("Database error:", error)
return {
success: false,
message: "Failed to update category",
}
}
}
export async function deleteCategoryAction(formData: FormData) {
const { id } = Object.fromEntries(formData) as { id: string }
try {
const existingCategory = await CategoryService.findAllWithItemsCount()
const category = existingCategory.find((category) => category.id === id)
if (!category) {
return {
success: false,
errors: {
id: ["Category not found"],
},
}
}
if (category._count.items && category._count.items > 0) {
return {
success: false,
errors: {
id: ["Category has items"],
},
}
}
await CategoryService.delete(id)
revalidatePath("/inventory/categories")
return {
success: true,
message: "Category deleted successfully",
}
} catch (error) {
console.error("Database error:", error)
return {
success: false,
message: "Failed to delete category",
}
}
}
-18
View File
@@ -1,18 +0,0 @@
import { z } from "zod"
export const createCategorySchema = z.object({
name: z
.string()
.min(3, {
error: "Name is required and must be at least 3 characters long"
})
.nonempty("Name is required and must be at least 3 characters long"),
})
export type CreateCategoryFormType = z.infer<typeof createCategorySchema>
export const updateCategorySchema = createCategorySchema.extend({
id: z.string().nonempty("ID is required"),
})
export type UpdateCategoryFormType = z.infer<typeof updateCategorySchema>