| | | 1 | | import type { components } from "~/api/types"; |
| | | 2 | | import { del, get, post, put } from "~/api/typed"; |
| | | 3 | | import { isApiProblem } from "~/api/problem"; |
| | | 4 | | |
| | 2 | 5 | | async function nullOn404<T>(promise: Promise<T>): Promise<T | null> { |
| | 2 | 6 | | try { |
| | 2 | 7 | | return await promise; |
| | | 8 | | } catch (error) { |
| | | 9 | | // The wrapper throws Response so problem details survive RR7's SSR |
| | | 10 | | // serialization; ApiProblemError is the legacy/test path. |
| | 1 | 11 | | if (error instanceof Response && error.status === 404) return null; |
| | 0 | 12 | | if (isApiProblem(error) && error.status === 404) return null; |
| | 0 | 13 | | throw error; |
| | | 14 | | } |
| | | 15 | | } |
| | | 16 | | |
| | | 17 | | /* Locations */ |
| | | 18 | | export type LocationResponse = |
| | | 19 | | components["schemas"]["ClutterStock.Contracts.Locations.LocationResponse"]; |
| | | 20 | | export type AddLocationRequest = |
| | | 21 | | components["schemas"]["ClutterStock.Contracts.Locations.AddLocationRequest"]; |
| | | 22 | | export type UpdateLocationRequest = |
| | | 23 | | components["schemas"]["ClutterStock.Contracts.Locations.UpdateLocationRequest"]; |
| | | 24 | | |
| | 2 | 25 | | export const getLocations = (request?: Request): Promise<LocationResponse[]> => |
| | | 26 | | get("/api/v1/locations", { ssrRequest: request }); |
| | | 27 | | |
| | 1 | 28 | | export const getLocation = (id: number, request?: Request): Promise<LocationResponse | null> => |
| | 2 | 29 | | nullOn404(get("/api/v1/locations/{id}", { params: { id }, ssrRequest: request })); |
| | | 30 | | |
| | 1 | 31 | | export const createLocation = ( |
| | | 32 | | body: AddLocationRequest, |
| | 0 | 33 | | request?: Request, |
| | | 34 | | ): Promise<LocationResponse> => post("/api/v1/locations", { body, ssrRequest: request }); |
| | | 35 | | |
| | 1 | 36 | | export const updateLocation = ( |
| | | 37 | | id: number, |
| | | 38 | | body: UpdateLocationRequest, |
| | 0 | 39 | | request?: Request, |
| | | 40 | | ): Promise<LocationResponse> => |
| | | 41 | | put("/api/v1/locations/{id}", { params: { id }, body, ssrRequest: request }); |
| | | 42 | | |
| | 1 | 43 | | export const deleteLocation = (id: number, request?: Request): Promise<void> => |
| | | 44 | | del("/api/v1/locations/{id}", { params: { id }, ssrRequest: request }); |
| | | 45 | | |
| | | 46 | | /* Rooms */ |
| | | 47 | | export type RoomResponse = |
| | | 48 | | components["schemas"]["ClutterStock.Contracts.Rooms.RoomResponse"]; |
| | | 49 | | export type AddRoomRequest = |
| | | 50 | | components["schemas"]["ClutterStock.Contracts.Rooms.AddRoomRequest"]; |
| | | 51 | | export type UpdateRoomRequest = |
| | | 52 | | components["schemas"]["ClutterStock.Contracts.Rooms.UpdateRoomRequest"]; |
| | | 53 | | |
| | 1 | 54 | | export const getRooms = (request?: Request): Promise<RoomResponse[]> => |
| | | 55 | | get("/api/v1/rooms", { ssrRequest: request }); |
| | | 56 | | |
| | 1 | 57 | | export const getRoom = (id: number, request?: Request): Promise<RoomResponse | null> => |
| | 0 | 58 | | nullOn404(get("/api/v1/rooms/{id}", { params: { id }, ssrRequest: request })); |
| | | 59 | | |
| | 1 | 60 | | export const createRoom = ( |
| | | 61 | | body: AddRoomRequest, |
| | 0 | 62 | | request?: Request, |
| | | 63 | | ): Promise<RoomResponse> => post("/api/v1/rooms", { body, ssrRequest: request }); |
| | | 64 | | |
| | 1 | 65 | | export const updateRoom = ( |
| | | 66 | | id: number, |
| | | 67 | | body: UpdateRoomRequest, |
| | 0 | 68 | | request?: Request, |
| | | 69 | | ): Promise<RoomResponse> => |
| | | 70 | | put("/api/v1/rooms/{id}", { params: { id }, body, ssrRequest: request }); |
| | | 71 | | |
| | 1 | 72 | | export const deleteRoom = (id: number, request?: Request): Promise<void> => |
| | | 73 | | del("/api/v1/rooms/{id}", { params: { id }, ssrRequest: request }); |
| | | 74 | | |
| | | 75 | | /* Items */ |
| | | 76 | | export type ItemResponse = |
| | | 77 | | components["schemas"]["ClutterStock.Contracts.Items.ItemResponse"]; |
| | | 78 | | export type AddItemRequest = |
| | | 79 | | components["schemas"]["ClutterStock.Contracts.Items.AddItemRequest"]; |
| | | 80 | | export type UpdateItemRequest = |
| | | 81 | | components["schemas"]["ClutterStock.Contracts.Items.UpdateItemRequest"]; |
| | | 82 | | |
| | 1 | 83 | | export const getItems = (request?: Request): Promise<ItemResponse[]> => |
| | | 84 | | get("/api/v1/items", { ssrRequest: request }); |
| | | 85 | | |
| | 1 | 86 | | export const getItem = (id: number, request?: Request): Promise<ItemResponse | null> => |
| | 0 | 87 | | nullOn404(get("/api/v1/items/{id}", { params: { id }, ssrRequest: request })); |
| | | 88 | | |
| | 1 | 89 | | export const createItem = ( |
| | | 90 | | body: AddItemRequest, |
| | 0 | 91 | | request?: Request, |
| | | 92 | | ): Promise<ItemResponse> => post("/api/v1/items", { body, ssrRequest: request }); |
| | | 93 | | |
| | 1 | 94 | | export const updateItem = ( |
| | | 95 | | id: number, |
| | | 96 | | body: UpdateItemRequest, |
| | 0 | 97 | | request?: Request, |
| | | 98 | | ): Promise<ItemResponse> => |
| | | 99 | | put("/api/v1/items/{id}", { params: { id }, body, ssrRequest: request }); |
| | | 100 | | |
| | 1 | 101 | | export const deleteItem = (id: number, request?: Request): Promise<void> => |
| | | 102 | | del("/api/v1/items/{id}", { params: { id }, ssrRequest: request }); |