feat(backend): migrate freelancer and portal runtimes
This commit is contained in:
@@ -1,93 +1,37 @@
|
||||
import {
|
||||
TasksClient,
|
||||
type TaskListItem,
|
||||
type TaskRelationOption,
|
||||
} from "@/app/(dashboard)/tasks/tasks-client";
|
||||
import { createClient } from "@/lib/supabase/server";
|
||||
|
||||
type TaskRow = {
|
||||
id: string;
|
||||
title: string;
|
||||
description: string | null;
|
||||
status: "todo" | "in_progress" | "done";
|
||||
priority: "low" | "medium" | "high" | "urgent";
|
||||
due_at: string | null;
|
||||
estimated_minutes: number | null;
|
||||
actual_minutes: number | null;
|
||||
client_id: string | null;
|
||||
project_id: string | null;
|
||||
created_at: string;
|
||||
clients: { name: string } | { name: string }[] | null;
|
||||
projects: { name: string } | { name: string }[] | null;
|
||||
};
|
||||
import { TasksClient, type TaskListItem, type TaskRelationOption } from "@/app/(dashboard)/tasks/tasks-client";
|
||||
import { requireFreelancerBackend } from "@/server/web/freelancer";
|
||||
|
||||
export default async function TasksPage() {
|
||||
const supabase = await createClient();
|
||||
const {
|
||||
data: { user },
|
||||
} = await supabase.auth.getUser();
|
||||
const { actor, service } = await requireFreelancerBackend();
|
||||
const taskRows = service.listTasks(actor);
|
||||
const clientRows = service.listClients(actor);
|
||||
const projectRows = service.listProjects(actor);
|
||||
const clientNames = new Map(clientRows.map((item) => [item.id, item.name]));
|
||||
const projectNames = new Map(projectRows.map((item) => [item.id, item.name]));
|
||||
|
||||
if (!user) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const [{ data: taskRows }, { data: clientRows }, { data: projectRows }] =
|
||||
await Promise.all([
|
||||
supabase
|
||||
.from("tasks")
|
||||
.select(
|
||||
"id, title, description, status, priority, due_at, estimated_minutes, actual_minutes, client_id, project_id, created_at, clients(name), projects(name)",
|
||||
)
|
||||
.eq("user_id", user.id)
|
||||
.order("created_at", { ascending: false }),
|
||||
supabase
|
||||
.from("clients")
|
||||
.select("id, name")
|
||||
.eq("user_id", user.id)
|
||||
.neq("status", "archived")
|
||||
.order("name", { ascending: true }),
|
||||
supabase
|
||||
.from("projects")
|
||||
.select("id, name, client_id")
|
||||
.eq("user_id", user.id)
|
||||
.neq("status", "cancelled")
|
||||
.order("name", { ascending: true }),
|
||||
]);
|
||||
|
||||
const clients = (clientRows || []) as TaskRelationOption[];
|
||||
const projects = (projectRows || []) as TaskRelationOption[];
|
||||
const tasks: TaskListItem[] = ((taskRows || []) as unknown as TaskRow[]).map((task) => ({
|
||||
id: task.id,
|
||||
title: task.title,
|
||||
description: task.description,
|
||||
status: normalizeStatus(task.status),
|
||||
priority: normalizePriority(task.priority),
|
||||
due_at: task.due_at,
|
||||
estimated_minutes: task.estimated_minutes,
|
||||
actual_minutes: task.actual_minutes,
|
||||
client_id: task.client_id,
|
||||
clientName: getRelationName(task.clients),
|
||||
project_id: task.project_id,
|
||||
projectName: getRelationName(task.projects),
|
||||
created_at: task.created_at,
|
||||
}));
|
||||
const tasks: TaskListItem[] = taskRows
|
||||
.filter((task) => task.status !== "cancelled")
|
||||
.map((task) => ({
|
||||
id: task.id,
|
||||
title: task.title,
|
||||
description: task.description,
|
||||
status: task.status as TaskListItem["status"],
|
||||
priority: task.priority,
|
||||
due_at: task.dueAt?.toISOString() ?? null,
|
||||
estimated_minutes: task.estimatedMinutes,
|
||||
actual_minutes: task.actualMinutes,
|
||||
client_id: task.clientId,
|
||||
clientName: task.clientId ? clientNames.get(task.clientId) ?? null : null,
|
||||
project_id: task.projectId,
|
||||
projectName: task.projectId ? projectNames.get(task.projectId) ?? null : null,
|
||||
created_at: task.createdAt.toISOString(),
|
||||
}));
|
||||
const clients: TaskRelationOption[] = clientRows
|
||||
.filter((client) => client.status !== "archived")
|
||||
.map(({ id, name }) => ({ id, name }));
|
||||
const projects: TaskRelationOption[] = projectRows
|
||||
.filter((project) => project.status !== "cancelled")
|
||||
.map(({ id, name, clientId }) => ({ id, name, client_id: clientId }));
|
||||
|
||||
return <TasksClient tasks={tasks} clients={clients} projects={projects} />;
|
||||
}
|
||||
|
||||
function getRelationName(relation: TaskRow["clients"] | TaskRow["projects"]) {
|
||||
if (!relation) return null;
|
||||
return Array.isArray(relation) ? relation[0]?.name || null : relation.name;
|
||||
}
|
||||
|
||||
function normalizeStatus(status: string): TaskListItem["status"] {
|
||||
return status === "in_progress" || status === "done" ? status : "todo";
|
||||
}
|
||||
|
||||
function normalizePriority(priority: string): TaskListItem["priority"] {
|
||||
if (priority === "low" || priority === "high" || priority === "urgent") {
|
||||
return priority;
|
||||
}
|
||||
|
||||
return "medium";
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user