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

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

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

@ -14,7 +14,7 @@ type ApiResult<T> =
| { success: true; data: T } | { success: true; data: T }
| { success: false; error: SlotDefinitionError }; | { success: false; error: SlotDefinitionError };
// GET /admin/clubs/{club_id}/slot-definitions // GET /admin/facilities/{club_id}/slot-definitions
export async function getSlotDefinitions( export async function getSlotDefinitions(
clubId: number, clubId: number,
filters?: { court_id?: number; active_on?: string } 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); if (filters?.active_on) params.append('active_on', filters.active_on);
const queryString = params.toString(); 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, { const response = await apiFetch(endpoint, {
method: 'GET', 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( export async function createSlotDefinition(
clubId: number, clubId: number,
request: SlotDefinitionRequest request: SlotDefinitionRequest
): Promise<ApiResult<SlotDefinition>> { ): Promise<ApiResult<SlotDefinition>> {
try { try {
const response = await apiFetch(`/admin/clubs/${clubId}/slot-definitions`, { const response = await apiFetch(`/admin/facilities/${clubId}/slot-definitions`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', '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( export async function updateSlotDefinition(
clubId: number, clubId: number,
slotDefinitionId: number, slotDefinitionId: number,
@ -98,7 +98,7 @@ export async function updateSlotDefinition(
): Promise<ApiResult<SlotDefinition>> { ): Promise<ApiResult<SlotDefinition>> {
try { try {
const response = await apiFetch( const response = await apiFetch(
`/admin/clubs/${clubId}/slot-definitions/${slotDefinitionId}`, `/admin/facilities/${clubId}/slot-definitions/${slotDefinitionId}`,
{ {
method: 'PATCH', method: 'PATCH',
headers: { 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( export async function deleteSlotDefinition(
clubId: number, clubId: number,
slotDefinitionId: number slotDefinitionId: number
): Promise<ApiResult<void>> { ): Promise<ApiResult<void>> {
try { try {
const response = await apiFetch( const response = await apiFetch(
`/admin/clubs/${clubId}/slot-definitions/${slotDefinitionId}`, `/admin/facilities/${clubId}/slot-definitions/${slotDefinitionId}`,
{ {
method: 'DELETE', 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( export async function generateSlotDefinitions(
clubId: number, clubId: number,
request: GenerateSlotDefinitionsRequest request: GenerateSlotDefinitionsRequest
): Promise<ApiResult<GenerateSlotDefinitionsResponse>> { ): Promise<ApiResult<GenerateSlotDefinitionsResponse>> {
try { try {
const response = await apiFetch(`/admin/clubs/${clubId}/slot-definitions/generate`, { const response = await apiFetch(`/admin/facilities/${clubId}/slot-definitions/generate`, {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', '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( export async function cloneSlotDefinition(
clubId: number, clubId: number,
slotDefinitionId: number, slotDefinitionId: number,
@ -233,7 +233,7 @@ export async function cloneSlotDefinition(
): Promise<ApiResult<CloneSlotDefinitionResponse>> { ): Promise<ApiResult<CloneSlotDefinitionResponse>> {
try { try {
const response = await apiFetch( const response = await apiFetch(
`/admin/clubs/${clubId}/slot-definitions/${slotDefinitionId}/clone`, `/admin/facilities/${clubId}/slot-definitions/${slotDefinitionId}/clone`,
{ {
method: 'POST', method: 'POST',
headers: { 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 * 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 { export interface AdminClub {
facility_id: number; facility_id: number;
@ -25,7 +25,7 @@ export interface AdminClub {
export type AdminClubsResponse = 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 * Based on VENUE_ADMIN_DESIGN.md and Access Avery correction 2025-11-05 12:14 UTC
*/ */
export interface AdminClubDetail { export interface AdminClubDetail {
@ -125,9 +125,9 @@ export type AdminApiResult<T> =
// ============================================================================ // ============================================================================
// TODO: Add when Phase 1 begins // TODO: Add when Phase 1 begins
// - POST /admin/clubs/{club_id}/slot-definitions // - POST /admin/facilities/{club_id}/slot-definitions
// - PATCH /admin/clubs/{club_id}/slot-definitions/{id} // - PATCH /admin/facilities/{club_id}/slot-definitions/{id}
// - DELETE /admin/clubs/{club_id}/slot-definitions/{id} // - DELETE /admin/facilities/{club_id}/slot-definitions/{id}
// ============================================================================ // ============================================================================
// Materialisation Jobs (Phase 1) // 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 * Manually trigger slot materialisation
* *
* Retry behavior (Cron Carter 2025-11-05 16:15 UTC): * 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 * Get last successful materialisation run timestamp
* Based on Access Avery correction 2025-11-05 12:14 UTC * Based on Access Avery correction 2025-11-05 12:14 UTC
*/ */

Loading…
Cancel
Save