Refactor code
This commit is contained in:
@ -2,6 +2,7 @@
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
// Deletes a custom commission card by id.
|
||||
export async function deleteCommissionCustomCard(id: string) {
|
||||
await prisma.commissionCustomCard.delete({
|
||||
where: { id },
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
"use server";
|
||||
|
||||
import { s3 } from "@/lib/s3";
|
||||
import type { CommissionCustomCardImageItem } from "@/types/commissions";
|
||||
import {
|
||||
DeleteObjectCommand,
|
||||
ListObjectsV2Command,
|
||||
@ -9,13 +10,6 @@ import {
|
||||
|
||||
const PREFIX = "commissions/custom-cards/";
|
||||
|
||||
export type CommissionCustomCardImageItem = {
|
||||
key: string;
|
||||
url: string;
|
||||
size: number | null;
|
||||
lastModified: string | null;
|
||||
};
|
||||
|
||||
function buildImageUrl(key: string) {
|
||||
return `/api/image/${encodeURI(key)}`;
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@ import {
|
||||
type CommissionCustomCardValues,
|
||||
} from "@/schemas/commissionCustomCard";
|
||||
|
||||
// Creates a new custom commission card with options/extras.
|
||||
export async function createCommissionCustomCard(
|
||||
formData: CommissionCustomCardValues
|
||||
) {
|
||||
|
||||
@ -6,6 +6,7 @@ import {
|
||||
type CommissionCustomCardValues,
|
||||
} from "@/schemas/commissionCustomCard";
|
||||
|
||||
// Updates a custom commission card and resets related options/extras.
|
||||
export async function updateCommissionCustomCard(
|
||||
id: string,
|
||||
rawData: CommissionCustomCardValues
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
// Updates sort order for custom commission cards.
|
||||
export async function updateCommissionCustomCardSortOrder(
|
||||
items: { id: string; sortIndex: number }[]
|
||||
) {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
"use server";
|
||||
|
||||
import { s3 } from "@/lib/s3";
|
||||
import type { CommissionExampleItem } from "@/types/commissions";
|
||||
import {
|
||||
DeleteObjectCommand,
|
||||
ListObjectsV2Command,
|
||||
@ -9,13 +10,6 @@ import {
|
||||
|
||||
const PREFIX = "commissions/examples/";
|
||||
|
||||
export type CommissionExampleItem = {
|
||||
key: string;
|
||||
url: string;
|
||||
size: number | null;
|
||||
lastModified: string | null;
|
||||
};
|
||||
|
||||
function buildImageUrl(key: string) {
|
||||
return `/api/image/${encodeURI(key)}`;
|
||||
}
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
'use server';
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
// Returns the latest active commission guidelines (markdown + example image).
|
||||
export async function getActiveGuidelines(): Promise<{
|
||||
markdown: string | null;
|
||||
exampleImageUrl: string | null;
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
'use server';
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
// Deactivates existing guidelines and creates a new active version.
|
||||
export async function saveGuidelines(markdown: string, exampleImageUrl: string | null) {
|
||||
await prisma.commissionGuidelines.updateMany({
|
||||
where: { isActive: true },
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { z } from "zod";
|
||||
import { z } from "zod/v4";
|
||||
|
||||
// Deletes a commission request by id.
|
||||
export async function deleteCommissionRequest(id: string) {
|
||||
const parsed = z.string().min(1).parse(id);
|
||||
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { calculatePriceRange, PriceSource } from "@/utils/commissionPricing";
|
||||
import { calculatePriceRange, type PriceSource } from "@/utils/commissionPricing";
|
||||
|
||||
// Loads a commission request with related data and computed price estimate.
|
||||
export async function getCommissionRequestById(id: string) {
|
||||
const req = await prisma.commissionRequest.findUnique({
|
||||
where: { id },
|
||||
|
||||
@ -1,39 +1,24 @@
|
||||
"use server";
|
||||
|
||||
import type { Prisma } from "@/generated/prisma/client";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import {
|
||||
commissionRequestTableRowSchema,
|
||||
commissionStatusSchema,
|
||||
} from "@/schemas/commissions/requests";
|
||||
import { z } from "zod";
|
||||
|
||||
export type CursorPagination = { pageIndex: number; pageSize: number };
|
||||
export type SortDir = "asc" | "desc";
|
||||
|
||||
const triStateSchema = z.enum(["any", "true", "false"]);
|
||||
|
||||
const sortingSchema = z.array(
|
||||
z.object({
|
||||
id: z.string(),
|
||||
desc: z.boolean(),
|
||||
})
|
||||
);
|
||||
|
||||
const filtersSchema = z.object({
|
||||
q: z.string().optional(),
|
||||
email: z.string().optional(),
|
||||
status: z.union([z.literal("any"), commissionStatusSchema]).default("any"),
|
||||
hasFiles: triStateSchema.default("any"),
|
||||
});
|
||||
import { commissionRequestTableRowSchema } from "@/schemas/commissions/requests";
|
||||
import type {
|
||||
CommissionRequestsTableFilters,
|
||||
CommissionRequestsTableSorting,
|
||||
} from "@/schemas/commissions/requestsTable";
|
||||
import type { CursorPagination } from "@/types/pagination";
|
||||
import { z } from "zod/v4";
|
||||
|
||||
// Builds a paginated, filtered, and sorted commission-requests table payload for the admin UI.
|
||||
export async function getCommissionRequestsTablePage(input: {
|
||||
pagination: CursorPagination;
|
||||
sorting: z.infer<typeof sortingSchema>;
|
||||
filters: z.infer<typeof filtersSchema>;
|
||||
sorting: CommissionRequestsTableSorting;
|
||||
filters: CommissionRequestsTableFilters;
|
||||
}) {
|
||||
const { pagination, sorting, filters } = input;
|
||||
|
||||
const where: any = {};
|
||||
const where: Prisma.CommissionRequestWhereInput = {};
|
||||
|
||||
if (filters.q) {
|
||||
const q = filters.q.trim();
|
||||
@ -60,7 +45,7 @@ export async function getCommissionRequestsTablePage(input: {
|
||||
|
||||
// sorting
|
||||
const sort = sorting?.[0] ?? { id: "createdAt", desc: true };
|
||||
const orderBy: any =
|
||||
const orderBy: Prisma.CommissionRequestOrderByWithRelationInput =
|
||||
sort.id === "createdAt"
|
||||
? { createdAt: sort.desc ? "desc" : "asc" }
|
||||
: sort.id === "status"
|
||||
@ -94,7 +79,7 @@ export async function getCommissionRequestsTablePage(input: {
|
||||
customerName: r.customerName,
|
||||
customerEmail: r.customerEmail,
|
||||
customerSocials: r.customerSocials ?? null,
|
||||
status: r.status as any,
|
||||
status: r.status,
|
||||
fileCount: r._count.files,
|
||||
}));
|
||||
|
||||
|
||||
@ -2,8 +2,9 @@
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { commissionStatusSchema } from "@/schemas/commissions/requests";
|
||||
import { z } from "zod";
|
||||
import { z } from "zod/v4";
|
||||
|
||||
// Sets a commission request status (admin action).
|
||||
export async function setCommissionRequestStatus(input: {
|
||||
id: string;
|
||||
status: z.infer<typeof commissionStatusSchema>;
|
||||
|
||||
@ -1,20 +1,14 @@
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { commissionStatusSchema } from "@/schemas/commissions/requests";
|
||||
import { z } from "zod/v4";
|
||||
import {
|
||||
updateCommissionRequestSchema,
|
||||
} from "@/schemas/commissions/updateRequest";
|
||||
import type { UpdateCommissionRequestInput } from "@/schemas/commissions/updateRequest";
|
||||
|
||||
const updateSchema = z.object({
|
||||
id: z.string().min(1),
|
||||
status: commissionStatusSchema,
|
||||
customerName: z.string().min(1).max(200),
|
||||
customerEmail: z.string().email().max(320),
|
||||
customerSocials: z.string().max(2000).optional().nullable(),
|
||||
message: z.string().min(1).max(20_000),
|
||||
});
|
||||
|
||||
export async function updateCommissionRequest(input: z.infer<typeof updateSchema>) {
|
||||
const data = updateSchema.parse(input);
|
||||
// Updates editable fields on a commission request.
|
||||
export async function updateCommissionRequest(input: UpdateCommissionRequestInput) {
|
||||
const data = updateCommissionRequestSchema.parse(input);
|
||||
|
||||
await prisma.commissionRequest.update({
|
||||
where: { id: data.id },
|
||||
|
||||
@ -1,21 +1,18 @@
|
||||
"use server";
|
||||
|
||||
import { revalidatePath } from "next/cache";
|
||||
import { z } from "zod";
|
||||
|
||||
import { COMMISSION_STATUSES } from "@/lib/commissions/kanban";
|
||||
import { prisma } from "@/lib/prisma"; // adjust to your prisma import
|
||||
// import { requireAdmin } from "@/lib/auth/requireAdmin"; // recommended if you have it
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import {
|
||||
updateCommissionRequestStatusSchema,
|
||||
} from "@/schemas/commissions/updateRequestStatus";
|
||||
import type { UpdateCommissionRequestStatusInput } from "@/schemas/commissions/updateRequestStatus";
|
||||
|
||||
const schema = z.object({
|
||||
id: z.string().min(1),
|
||||
status: z.enum(COMMISSION_STATUSES),
|
||||
});
|
||||
|
||||
export async function updateCommissionRequestStatus(input: z.infer<typeof schema>) {
|
||||
// await requireAdmin(); // enforce auth/role check here
|
||||
|
||||
const { id, status } = schema.parse(input);
|
||||
// Updates a commission request status and revalidates the kanban page.
|
||||
export async function updateCommissionRequestStatus(
|
||||
input: UpdateCommissionRequestStatusInput
|
||||
) {
|
||||
const { id, status } = updateCommissionRequestStatusSchema.parse(input);
|
||||
|
||||
await prisma.commissionRequest.update({
|
||||
where: { id },
|
||||
@ -23,5 +20,5 @@ export async function updateCommissionRequestStatus(input: z.infer<typeof schema
|
||||
});
|
||||
|
||||
// revalidate the board page so a refresh always reflects server truth
|
||||
revalidatePath("/commissions/board");
|
||||
revalidatePath("/commissions/kanban");
|
||||
}
|
||||
|
||||
@ -1,19 +1,18 @@
|
||||
"use server"
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma"
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
// Deletes a commission type and its link records.
|
||||
export async function deleteCommissionType(typeId: string) {
|
||||
|
||||
await prisma.commissionTypeOption.deleteMany({
|
||||
where: { typeId },
|
||||
})
|
||||
});
|
||||
|
||||
await prisma.commissionTypeExtra.deleteMany({
|
||||
where: { typeId },
|
||||
})
|
||||
});
|
||||
|
||||
await prisma.commissionType.delete({
|
||||
where: { id: typeId },
|
||||
})
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -4,8 +4,9 @@ import { prisma } from "@/lib/prisma";
|
||||
import { commissionExtraSchema } from "@/schemas/commissionType";
|
||||
import { revalidatePath } from "next/cache";
|
||||
|
||||
const LIST_PATH = "/commissions/extras";
|
||||
const LIST_PATH = "/commissions/types/extras";
|
||||
|
||||
// CRUD helpers for commission extras (admin-only pages).
|
||||
export async function createCommissionExtra(input: unknown) {
|
||||
const data = commissionExtraSchema.parse(input);
|
||||
const created = await prisma.commissionExtra.create({ data });
|
||||
@ -24,7 +25,6 @@ export async function deleteCommissionExtra(id: string) {
|
||||
// Optional safety:
|
||||
// const used = await prisma.commissionTypeExtra.count({ where: { extraId: id } });
|
||||
// if (used > 0) throw new Error("Extra is linked to types.");
|
||||
console.log("TBD");
|
||||
// await prisma.commissionExtra.delete({ where: { id } });
|
||||
// revalidatePath(LIST_PATH);
|
||||
await prisma.commissionExtra.delete({ where: { id } });
|
||||
revalidatePath(LIST_PATH);
|
||||
}
|
||||
|
||||
@ -2,9 +2,11 @@
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
import { commissionTypeSchema } from "@/schemas/commissionType";
|
||||
import type * as z from "zod/v4";
|
||||
|
||||
// Creates a commission option entry.
|
||||
export async function createCommissionOption(data: { name: string }) {
|
||||
return await prisma.commissionOption.create({
|
||||
return prisma.commissionOption.create({
|
||||
data: {
|
||||
name: data.name,
|
||||
description: "",
|
||||
@ -12,8 +14,9 @@ export async function createCommissionOption(data: { name: string }) {
|
||||
});
|
||||
}
|
||||
|
||||
// Creates a commission extra entry.
|
||||
export async function createCommissionExtra(data: { name: string }) {
|
||||
return await prisma.commissionExtra.create({
|
||||
return prisma.commissionExtra.create({
|
||||
data: {
|
||||
name: data.name,
|
||||
description: "",
|
||||
@ -21,11 +24,12 @@ export async function createCommissionExtra(data: { name: string }) {
|
||||
});
|
||||
}
|
||||
|
||||
// Creates a commission custom input entry.
|
||||
export async function createCommissionCustomInput(data: {
|
||||
name: string;
|
||||
fieldId: string;
|
||||
}) {
|
||||
return await prisma.commissionCustomInput.create({
|
||||
return prisma.commissionCustomInput.create({
|
||||
data: {
|
||||
name: data.name,
|
||||
fieldId: data.fieldId,
|
||||
@ -33,7 +37,10 @@ export async function createCommissionCustomInput(data: {
|
||||
});
|
||||
}
|
||||
|
||||
export async function createCommissionType(formData: commissionTypeSchema) {
|
||||
// Creates a commission type with nested options/extras/custom inputs.
|
||||
export async function createCommissionType(
|
||||
formData: z.infer<typeof commissionTypeSchema>
|
||||
) {
|
||||
const parsed = commissionTypeSchema.safeParse(formData);
|
||||
|
||||
if (!parsed.success) {
|
||||
|
||||
@ -4,13 +4,9 @@ import { prisma } from "@/lib/prisma";
|
||||
import { commissionOptionSchema } from "@/schemas/commissionType";
|
||||
import { revalidatePath } from "next/cache";
|
||||
|
||||
const LIST_PATH = "/commissions/options";
|
||||
|
||||
function toInt(v: string) {
|
||||
const n = Number.parseInt(v, 10);
|
||||
return Number.isFinite(n) ? n : 0;
|
||||
}
|
||||
const LIST_PATH = "/commissions/types/options";
|
||||
|
||||
// CRUD helpers for commission options (admin-only pages).
|
||||
export async function createCommissionOption(input: unknown) {
|
||||
const data = commissionOptionSchema.parse(input);
|
||||
const created = await prisma.commissionOption.create({
|
||||
@ -37,7 +33,6 @@ export async function updateCommissionOption(id: string, input: unknown) {
|
||||
}
|
||||
|
||||
export async function deleteCommissionOption(id: string) {
|
||||
console.log("TBD");
|
||||
// await prisma.commissionOption.delete({ where: { id } });
|
||||
// revalidatePath(LIST_PATH);
|
||||
await prisma.commissionOption.delete({ where: { id } });
|
||||
revalidatePath(LIST_PATH);
|
||||
}
|
||||
|
||||
@ -1,7 +1,8 @@
|
||||
"use server"
|
||||
"use server";
|
||||
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
// Updates sort order for commission types.
|
||||
export async function updateCommissionTypeSortOrder(
|
||||
ordered: { id: string; sortIndex: number }[]
|
||||
) {
|
||||
@ -10,7 +11,7 @@ export async function updateCommissionTypeSortOrder(
|
||||
where: { id },
|
||||
data: { sortIndex },
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
await Promise.all(updates)
|
||||
}
|
||||
await Promise.all(updates);
|
||||
}
|
||||
|
||||
@ -4,9 +4,10 @@ import { prisma } from "@/lib/prisma";
|
||||
import { commissionTypeSchema } from "@/schemas/commissionType";
|
||||
import type * as z from "zod/v4";
|
||||
|
||||
// Updates a commission type and resets related nested records.
|
||||
export async function updateCommissionType(
|
||||
id: string,
|
||||
rawData: z.infer<typeof commissionTypeSchema>,
|
||||
rawData: z.infer<typeof commissionTypeSchema>
|
||||
) {
|
||||
const data = commissionTypeSchema.parse(rawData);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user