FEAT-1: add typed gerbils/lookups API + useApi/useMutation hooks
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -62,5 +62,7 @@ export const api = {
|
||||
export const resources = {
|
||||
gerbils: '/gerbils',
|
||||
litters: '/litters',
|
||||
breeders: '/breeders',
|
||||
contacts: '/contacts',
|
||||
enclosures: '/enclosures',
|
||||
colorVarieties: '/color-varieties',
|
||||
} as const
|
||||
|
||||
24
gerbil-manager-web/src/api/gerbils.ts
Normal file
24
gerbil-manager-web/src/api/gerbils.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/** Typed API functions for the Tiere (Rennmäuse) resource. */
|
||||
import { api, resources } from './client'
|
||||
import { toQueryString, type GridifyQuery } from './gridify'
|
||||
import type { CreateGerbil, Gerbil, Paged, UpdateGerbil } from './types'
|
||||
|
||||
export function listGerbils(query: GridifyQuery): Promise<Paged<Gerbil>> {
|
||||
return api.get<Paged<Gerbil>>(`${resources.gerbils}${toQueryString(query)}`)
|
||||
}
|
||||
|
||||
export function getGerbil(id: string): Promise<Gerbil> {
|
||||
return api.get<Gerbil>(`${resources.gerbils}/${id}`)
|
||||
}
|
||||
|
||||
export function createGerbil(body: CreateGerbil): Promise<Gerbil> {
|
||||
return api.post<Gerbil>(resources.gerbils, body)
|
||||
}
|
||||
|
||||
export function updateGerbil(id: string, body: UpdateGerbil): Promise<Gerbil> {
|
||||
return api.put<Gerbil>(`${resources.gerbils}/${id}`, body)
|
||||
}
|
||||
|
||||
export function deleteGerbil(id: string): Promise<void> {
|
||||
return api.delete(`${resources.gerbils}/${id}`)
|
||||
}
|
||||
34
gerbil-manager-web/src/api/lookups.ts
Normal file
34
gerbil-manager-web/src/api/lookups.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Lookup resources used to populate form dropdowns (Farbschlag, Becken,
|
||||
* Kontakte, Würfe). These endpoints are Gridify-paged like the rest; for
|
||||
* dropdowns we request a large page and read `.items`.
|
||||
*/
|
||||
import { api, resources } from './client'
|
||||
import { toQueryString } from './gridify'
|
||||
import type { ColorVariety, Contact, Enclosure, Litter, Paged } from './types'
|
||||
|
||||
const ALL = toQueryString({ page: 1, pageSize: 1000, orderBy: 'name' })
|
||||
|
||||
export async function listColorVarieties(): Promise<ColorVariety[]> {
|
||||
const paged = await api.get<Paged<ColorVariety>>(
|
||||
`${resources.colorVarieties}${toQueryString({ page: 1, pageSize: 1000, orderBy: 'sortOrder' })}`,
|
||||
)
|
||||
return paged.items
|
||||
}
|
||||
|
||||
export async function listEnclosures(): Promise<Enclosure[]> {
|
||||
const paged = await api.get<Paged<Enclosure>>(`${resources.enclosures}${ALL}`)
|
||||
return paged.items
|
||||
}
|
||||
|
||||
export async function listContacts(): Promise<Contact[]> {
|
||||
const paged = await api.get<Paged<Contact>>(`${resources.contacts}${ALL}`)
|
||||
return paged.items
|
||||
}
|
||||
|
||||
export async function listLitters(): Promise<Litter[]> {
|
||||
const paged = await api.get<Paged<Litter>>(
|
||||
`${resources.litters}${toQueryString({ page: 1, pageSize: 1000, orderBy: 'date desc' })}`,
|
||||
)
|
||||
return paged.items
|
||||
}
|
||||
Reference in New Issue
Block a user