import { client } from "./client"; import { components } from "../generated/api"; type AdminUserResponse = components["schemas"]["AdminUserResponse"]; type PaginatedInvites = components["schemas"]["PaginatedResponse_InviteResponse_"]; type AdminExchangeResponse = components["schemas"]["AdminExchangeResponse"]; type AvailabilityResponse = components["schemas"]["AvailabilityResponse"]; type PriceHistoryRecord = components["schemas"]["PriceHistoryResponse"]; type PricingConfigResponse = components["schemas"]["PricingConfigResponse"]; type PricingConfigUpdate = components["schemas"]["PricingConfigUpdate"]; interface CreateInviteRequest { godfather_id: number; } interface UpdateAvailabilityRequest { date: string; slots: Array<{ start_time: string; end_time: string }>; } interface CopyAvailabilityRequest { source_date: string; target_dates: string[]; } interface GetPastTradesParams { status?: string; user_search?: string; } /** * Admin API endpoints */ export const adminApi = { /** * Get all users (for dropdowns, etc.) */ getUsers(): Promise { return client.get("/api/admin/users"); }, /** * Get paginated invites */ getInvites(page: number, perPage: number = 10, status?: string): Promise { const params = new URLSearchParams(); params.append("page", page.toString()); params.append("per_page", perPage.toString()); if (status) { params.append("status", status); } return client.get(`/api/admin/invites?${params.toString()}`); }, /** * Create a new invite */ createInvite(request: CreateInviteRequest): Promise { return client.post("/api/admin/invites", request); }, /** * Revoke an invite */ revokeInvite(inviteId: number): Promise { return client.post(`/api/admin/invites/${inviteId}/revoke`); }, /** * Get upcoming trades */ getUpcomingTrades(): Promise { return client.get("/api/admin/trades/upcoming"); }, /** * Get past trades with optional filters */ getPastTrades(params?: GetPastTradesParams): Promise { const searchParams = new URLSearchParams(); if (params?.status) { searchParams.append("status", params.status); } if (params?.user_search) { searchParams.append("user_search", params.user_search); } const queryString = searchParams.toString(); const url = queryString ? `/api/admin/trades/past?${queryString}` : "/api/admin/trades/past"; return client.get(url); }, /** * Complete a trade */ completeTrade(publicId: string): Promise { return client.post( `/api/admin/trades/${encodeURIComponent(publicId)}/complete`, {} ); }, /** * Mark a trade as no-show */ noShowTrade(publicId: string): Promise { return client.post( `/api/admin/trades/${encodeURIComponent(publicId)}/no-show`, {} ); }, /** * Cancel a trade (admin) */ cancelTrade(publicId: string): Promise { return client.post( `/api/admin/trades/${encodeURIComponent(publicId)}/cancel`, {} ); }, /** * Get availability for a date range */ getAvailability(fromDate: string, toDate: string): Promise { return client.get( `/api/admin/availability?from=${encodeURIComponent(fromDate)}&to=${encodeURIComponent(toDate)}` ); }, /** * Update availability for a specific date */ updateAvailability(request: UpdateAvailabilityRequest): Promise { return client.put("/api/admin/availability", request); }, /** * Copy availability from one date to multiple dates */ copyAvailability(request: CopyAvailabilityRequest): Promise { return client.post("/api/admin/availability/copy", request); }, /** * Get price history records */ getPriceHistory(): Promise { return client.get("/api/audit/price-history"); }, /** * Trigger a price fetch */ fetchPrice(): Promise { return client.post("/api/audit/price-history/fetch", {}); }, /** * Get current pricing configuration */ getPricingConfig(): Promise { return client.get("/api/admin/pricing"); }, /** * Update pricing configuration */ updatePricingConfig(request: PricingConfigUpdate): Promise { return client.put("/api/admin/pricing", request); }, };