import { buildPaginatedResult, DEFAULT_PAGE_SIZE, ok, type PaginationInput, type ReadonlyDB, } from "@tailor-platform/erp-kit/core"; import type { DB } from "../generated/kysely-tailordb"; type LeaveRequestOrderByField = "createdAt"; export interface ListLeaveRequestsByWorkerInput extends PaginationInput { workerId: string; } /** * Function: listLeaveRequestsByWorker * Description: Lists a worker's own leave requests across all statuses, so the * worker can see their filing history — pending, approved, rejected, * withdrawn, or mid-cancellation. Ordered most-recent first, paginated. */ export async function run(db: ReadonlyDB, input: ListLeaveRequestsByWorkerInput) { // Cross-module FK: workerId refers to the workforce module's Worker. No injected // getWorker query is wired up for this module yet, so — following createWorker.ts's // precedent (modules/workforce/command/createWorker.ts) — we do not invent a fictitious // existence check here and simply filter by the given id. const limit = input.limit ?? DEFAULT_PAGE_SIZE; const offset = input.offset ?? 0; const orderBy = input.orderBy ?? "createdAt"; const orderDirection = input.orderDirection ?? "desc"; const leaveRequests = await db .selectFrom("LeaveRequest") .selectAll() .where("workerId", "=", input.workerId) .orderBy(orderBy, orderDirection) .limit(limit + 1) .offset(offset) .execute(); return ok(buildPaginatedResult(leaveRequests, limit)); }