feat: bootstrap auto virtual tryon admin frontend
This commit is contained in:
37
app/api/reviews/[orderId]/confirm-revision/route.ts
Normal file
37
app/api/reviews/[orderId]/confirm-revision/route.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { adaptReviewSubmission } from "@/lib/adapters/reviews";
|
||||
import { backendRequest } from "@/lib/http/backend-client";
|
||||
import {
|
||||
jsonSuccess,
|
||||
parseJsonBody,
|
||||
parsePositiveIntegerParam,
|
||||
withErrorHandling,
|
||||
} from "@/lib/http/response";
|
||||
import type { ConfirmRevisionResponseDto } from "@/lib/types/backend";
|
||||
import { parseConfirmRevisionPayload } from "@/lib/validation/revision";
|
||||
|
||||
type RouteContext = {
|
||||
params: Promise<{
|
||||
orderId: string;
|
||||
}>;
|
||||
};
|
||||
|
||||
export async function POST(request: Request, context: RouteContext) {
|
||||
return withErrorHandling(async () => {
|
||||
const { orderId: rawOrderId } = await context.params;
|
||||
const orderId = parsePositiveIntegerParam(rawOrderId, "orderId");
|
||||
const rawPayload = await parseJsonBody(request);
|
||||
const payload = parseConfirmRevisionPayload(rawPayload);
|
||||
const response = await backendRequest<ConfirmRevisionResponseDto>(
|
||||
`/reviews/${orderId}/confirm-revision`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload),
|
||||
},
|
||||
);
|
||||
|
||||
return jsonSuccess(adaptReviewSubmission(response.data), {
|
||||
status: response.status,
|
||||
mode: "proxy",
|
||||
});
|
||||
});
|
||||
}
|
||||
36
app/api/reviews/[orderId]/submit/route.ts
Normal file
36
app/api/reviews/[orderId]/submit/route.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { adaptReviewSubmission } from "@/lib/adapters/reviews";
|
||||
import { backendRequest } from "@/lib/http/backend-client";
|
||||
import {
|
||||
jsonSuccess,
|
||||
parseJsonBody,
|
||||
parsePositiveIntegerParam,
|
||||
withErrorHandling,
|
||||
} from "@/lib/http/response";
|
||||
import type { SubmitReviewResponseDto } from "@/lib/types/backend";
|
||||
import { parseReviewActionPayload } from "@/lib/validation/review-action";
|
||||
|
||||
type RouteContext = {
|
||||
params: Promise<{
|
||||
orderId: string;
|
||||
}>;
|
||||
};
|
||||
|
||||
export async function POST(request: Request, context: RouteContext) {
|
||||
return withErrorHandling(async () => {
|
||||
const { orderId: rawOrderId } = await context.params;
|
||||
const orderId = parsePositiveIntegerParam(rawOrderId, "orderId");
|
||||
const rawPayload = await parseJsonBody(request);
|
||||
const payload = parseReviewActionPayload(rawPayload);
|
||||
const response = await backendRequest<SubmitReviewResponseDto>(
|
||||
`/reviews/${orderId}/submit`,
|
||||
{
|
||||
method: "POST",
|
||||
body: JSON.stringify(payload),
|
||||
},
|
||||
);
|
||||
|
||||
return jsonSuccess(adaptReviewSubmission(response.data), {
|
||||
mode: "proxy",
|
||||
});
|
||||
});
|
||||
}
|
||||
50
app/api/reviews/pending/route.ts
Normal file
50
app/api/reviews/pending/route.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import { adaptPendingReviews } from "@/lib/adapters/reviews";
|
||||
import { backendRequest } from "@/lib/http/backend-client";
|
||||
import { jsonSuccess, withErrorHandling } from "@/lib/http/response";
|
||||
import type {
|
||||
PendingReviewResponseDto,
|
||||
WorkflowStatusResponseDto,
|
||||
} from "@/lib/types/backend";
|
||||
import { adaptWorkflowDetail } from "@/lib/adapters/workflows";
|
||||
import type { ReviewQueueItemVM } from "@/lib/types/view-models";
|
||||
|
||||
async function enrichQueueItem(
|
||||
item: ReviewQueueItemVM,
|
||||
): Promise<ReviewQueueItemVM> {
|
||||
try {
|
||||
const workflowResponse = await backendRequest<WorkflowStatusResponseDto>(
|
||||
`/workflows/${item.orderId}`,
|
||||
);
|
||||
const workflow = adaptWorkflowDetail(workflowResponse.data);
|
||||
|
||||
return {
|
||||
...item,
|
||||
workflowType: workflow.workflowType,
|
||||
hasMockAssets: workflow.hasMockAssets,
|
||||
failureCount: workflow.failureCount,
|
||||
};
|
||||
} catch {
|
||||
return item;
|
||||
}
|
||||
}
|
||||
|
||||
export async function GET(request: Request) {
|
||||
return withErrorHandling(async () => {
|
||||
void request;
|
||||
const response = await backendRequest<PendingReviewResponseDto[]>(
|
||||
"/reviews/pending",
|
||||
);
|
||||
const queue = adaptPendingReviews(response.data);
|
||||
const items = await Promise.all(queue.items.map(enrichQueueItem));
|
||||
|
||||
return jsonSuccess(
|
||||
{
|
||||
...queue,
|
||||
items,
|
||||
},
|
||||
{
|
||||
mode: "proxy",
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user