fix: update admin endpoints from /admin/clubs to /admin/facilities (Build 363+)
continuous-integration/drone/push Build is passing Details

Complete migration of all admin API endpoints from clubs to facilities nomenclature:

**Admin Endpoint Changes:**
- GET /admin/clubs → GET /admin/facilities
- GET /admin/clubs/{id} → GET /admin/facilities/{id}
- All 30+ admin routes migrated from /clubs/ to /facilities/

**API Client Files Updated:**
- admin-clubs.ts: List and detail endpoints (2 endpoints)
- materialisation.ts: Materialization status and trigger (2 endpoints)
- slot-definitions.ts: All CRUD operations (6 endpoints)
- courts.ts: Court management and profile (7 endpoints)
- admin-api.ts: TypeScript documentation comments (7 updates)

**Total Changes:**
- 28 endpoint path replacements across 5 files
- All /admin/clubs references removed
- Comments and documentation updated

**Verification:**
- TypeScript compilation: ✓ No errors
- All admin endpoints now use /admin/facilities
- Fixes 404 errors on admin panel endpoints

BREAKING CHANGES: Requires backend Build 363+ with /admin/facilities endpoints
master
Guillermo Pages 1 month ago
parent d0b6c1bb35
commit 4d9aeb9045

@ -98,7 +98,7 @@ export async function getAdminClubs(cookieHeader?: string): Promise<AdminApiResu
headers['Cookie'] = cookieHeader;
}
const response = await fetch(`${API_BASE_URL}/admin/clubs`, {
const response = await fetch(`${API_BASE_URL}/admin/facilities`, {
method: 'GET',
headers,
credentials: cookieHeader ? 'omit' : 'include', // Use 'omit' when manually setting Cookie header
@ -113,7 +113,7 @@ export async function getAdminClubs(cookieHeader?: string): Promise<AdminApiResu
title: 'Network Error',
status: 0,
detail: error instanceof Error ? error.message : 'Failed to connect to API',
instance: `${API_BASE_URL}/admin/clubs`,
instance: `${API_BASE_URL}/admin/facilities`,
code: 'NETWORK_ERROR',
},
};
@ -121,12 +121,12 @@ export async function getAdminClubs(cookieHeader?: string): Promise<AdminApiResu
}
/**
* GET /admin/clubs/{club_id}
* Gets detailed information about a specific club
* GET /admin/facilities/{facility_id}
* Gets detailed information about a specific facility
*
* @param clubId - The club ID to fetch
* @param clubId - The facility ID to fetch
* @param cookieHeader - Optional cookie header to forward (for SSR)
* @returns Club details or error
* @returns Facility details or error
*/
export async function getAdminClubDetail(
clubId: number,
@ -143,7 +143,7 @@ export async function getAdminClubDetail(
headers['Cookie'] = cookieHeader;
}
const response = await fetch(`${API_BASE_URL}/admin/clubs/${clubId}`, {
const response = await fetch(`${API_BASE_URL}/admin/facilities/${clubId}`, {
method: 'GET',
headers,
credentials: cookieHeader ? 'omit' : 'include', // Use 'omit' when manually setting Cookie header
@ -158,7 +158,7 @@ export async function getAdminClubDetail(
title: 'Network Error',
status: 0,
detail: error instanceof Error ? error.message : 'Failed to connect to API',
instance: `${API_BASE_URL}/admin/clubs/${clubId}`,
instance: `${API_BASE_URL}/admin/facilities/${clubId}`,
code: 'NETWORK_ERROR',
},
};

@ -24,7 +24,7 @@ type ApiResult<T> =
*/
export async function getClubProfile(clubId: number): Promise<ApiResult<ClubProfile>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}`, {
const response = await apiFetch(`/admin/facilities/${clubId}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@ -63,7 +63,7 @@ export async function updateClubProfile(
request: ClubProfileUpdateRequest
): Promise<ApiResult<ClubProfile>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}`, {
const response = await apiFetch(`/admin/facilities/${clubId}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
@ -97,7 +97,7 @@ export async function updateClubProfile(
*/
export async function getCourts(clubId: number): Promise<ApiResult<Court[]>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/courts`, {
const response = await apiFetch(`/admin/facilities/${clubId}/courts`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@ -133,7 +133,7 @@ export async function createCourt(
request: CourtRequest
): Promise<ApiResult<Court>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/courts`, {
const response = await apiFetch(`/admin/facilities/${clubId}/courts`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@ -171,7 +171,7 @@ export async function updateCourt(
request: CourtRequest
): Promise<ApiResult<Court>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/courts/${courtId}`, {
const response = await apiFetch(`/admin/facilities/${clubId}/courts/${courtId}`, {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
@ -208,7 +208,7 @@ export async function getCourtDependencies(
courtId: number
): Promise<ApiResult<CourtDependencies>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/courts/${courtId}/dependencies`, {
const response = await apiFetch(`/admin/facilities/${clubId}/courts/${courtId}/dependencies`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@ -244,7 +244,7 @@ export async function deleteCourt(
courtId: number
): Promise<ApiResult<void>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/courts/${courtId}`, {
const response = await apiFetch(`/admin/facilities/${clubId}/courts/${courtId}`, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',

@ -23,7 +23,7 @@ export async function getMaterialisationStatus(
clubId: number
): Promise<ApiResult<MaterialisationStatus>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/materialisation-status`, {
const response = await apiFetch(`/admin/facilities/${clubId}/materialisation-status`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@ -59,7 +59,7 @@ export async function triggerMaterialisation(
request: MaterialisationTriggerRequest
): Promise<ApiResult<MaterialisationTriggerResponse>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/slot-materialize`, {
const response = await apiFetch(`/admin/facilities/${clubId}/slot-materialize`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',

@ -14,7 +14,7 @@ type ApiResult<T> =
| { success: true; data: T }
| { success: false; error: SlotDefinitionError };
// GET /admin/clubs/{club_id}/slot-definitions
// GET /admin/facilities/{club_id}/slot-definitions
export async function getSlotDefinitions(
clubId: number,
filters?: { court_id?: number; active_on?: string }
@ -25,7 +25,7 @@ export async function getSlotDefinitions(
if (filters?.active_on) params.append('active_on', filters.active_on);
const queryString = params.toString();
const endpoint = `/admin/clubs/${clubId}/slot-definitions${queryString ? `?${queryString}` : ''}`;
const endpoint = `/admin/facilities/${clubId}/slot-definitions${queryString ? `?${queryString}` : ''}`;
const response = await apiFetch(endpoint, {
method: 'GET',
@ -55,13 +55,13 @@ export async function getSlotDefinitions(
}
}
// POST /admin/clubs/{club_id}/slot-definitions
// POST /admin/facilities/{club_id}/slot-definitions
export async function createSlotDefinition(
clubId: number,
request: SlotDefinitionRequest
): Promise<ApiResult<SlotDefinition>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/slot-definitions`, {
const response = await apiFetch(`/admin/facilities/${clubId}/slot-definitions`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@ -90,7 +90,7 @@ export async function createSlotDefinition(
}
}
// PATCH /admin/clubs/{club_id}/slot-definitions/{slot_definition_id}
// PATCH /admin/facilities/{club_id}/slot-definitions/{slot_definition_id}
export async function updateSlotDefinition(
clubId: number,
slotDefinitionId: number,
@ -98,7 +98,7 @@ export async function updateSlotDefinition(
): Promise<ApiResult<SlotDefinition>> {
try {
const response = await apiFetch(
`/admin/clubs/${clubId}/slot-definitions/${slotDefinitionId}`,
`/admin/facilities/${clubId}/slot-definitions/${slotDefinitionId}`,
{
method: 'PATCH',
headers: {
@ -129,14 +129,14 @@ export async function updateSlotDefinition(
}
}
// DELETE /admin/clubs/{club_id}/slot-definitions/{slot_definition_id}
// DELETE /admin/facilities/{club_id}/slot-definitions/{slot_definition_id}
export async function deleteSlotDefinition(
clubId: number,
slotDefinitionId: number
): Promise<ApiResult<void>> {
try {
const response = await apiFetch(
`/admin/clubs/${clubId}/slot-definitions/${slotDefinitionId}`,
`/admin/facilities/${clubId}/slot-definitions/${slotDefinitionId}`,
{
method: 'DELETE',
}
@ -190,13 +190,13 @@ export async function getSlotDefinitionPresets(): Promise<ApiResult<GetPresetsRe
}
}
// POST /admin/clubs/{club_id}/slot-definitions/generate
// POST /admin/facilities/{club_id}/slot-definitions/generate
export async function generateSlotDefinitions(
clubId: number,
request: GenerateSlotDefinitionsRequest
): Promise<ApiResult<GenerateSlotDefinitionsResponse>> {
try {
const response = await apiFetch(`/admin/clubs/${clubId}/slot-definitions/generate`, {
const response = await apiFetch(`/admin/facilities/${clubId}/slot-definitions/generate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@ -225,7 +225,7 @@ export async function generateSlotDefinitions(
}
}
// POST /admin/clubs/{club_id}/slot-definitions/{slot_definition_id}/clone
// POST /admin/facilities/{club_id}/slot-definitions/{slot_definition_id}/clone
export async function cloneSlotDefinition(
clubId: number,
slotDefinitionId: number,
@ -233,7 +233,7 @@ export async function cloneSlotDefinition(
): Promise<ApiResult<CloneSlotDefinitionResponse>> {
try {
const response = await apiFetch(
`/admin/clubs/${clubId}/slot-definitions/${slotDefinitionId}/clone`,
`/admin/facilities/${clubId}/slot-definitions/${slotDefinitionId}/clone`,
{
method: 'POST',
headers: {

@ -11,9 +11,9 @@
// ============================================================================
/**
* GET /admin/clubs - List clubs the caller can manage
* GET /admin/facilities - List facilities the caller can manage
* Based on VENUE_ADMIN_DESIGN.md and Access Avery correction 2025-11-05 12:14 UTC
* Returns: unwrapped array of clubs
* Returns: unwrapped array of facilities
*/
export interface AdminClub {
facility_id: number;
@ -25,7 +25,7 @@ export interface AdminClub {
export type AdminClubsResponse = AdminClub[];
/**
* GET /admin/clubs/{club_id} - Detailed club view
* GET /admin/facilities/{club_id} - Detailed facility view
* Based on VENUE_ADMIN_DESIGN.md and Access Avery correction 2025-11-05 12:14 UTC
*/
export interface AdminClubDetail {
@ -125,9 +125,9 @@ export type AdminApiResult<T> =
// ============================================================================
// TODO: Add when Phase 1 begins
// - POST /admin/clubs/{club_id}/slot-definitions
// - PATCH /admin/clubs/{club_id}/slot-definitions/{id}
// - DELETE /admin/clubs/{club_id}/slot-definitions/{id}
// - POST /admin/facilities/{club_id}/slot-definitions
// - PATCH /admin/facilities/{club_id}/slot-definitions/{id}
// - DELETE /admin/facilities/{club_id}/slot-definitions/{id}
// ============================================================================
// Materialisation Jobs (Phase 1)
@ -152,7 +152,7 @@ export interface MaterialisationJobStatus {
}
/**
* POST /admin/clubs/{club_id}/slot-materialize
* POST /admin/facilities/{club_id}/slot-materialize
* Manually trigger slot materialisation
*
* Retry behavior (Cron Carter 2025-11-05 16:15 UTC):
@ -172,7 +172,7 @@ export interface MaterialisationTriggerResponse {
}
/**
* GET /admin/clubs/{club_id}/materialisation-status
* GET /admin/facilities/{club_id}/materialisation-status
* Get last successful materialisation run timestamp
* Based on Access Avery correction 2025-11-05 12:14 UTC
*/

Loading…
Cancel
Save