Files
game-marathon/frontend/src/api/events.ts

91 lines
3.7 KiB
TypeScript
Raw Normal View History

2025-12-15 03:22:29 +07:00
import client from './client'
2025-12-15 23:03:59 +07:00
import type { ActiveEvent, MarathonEvent, EventCreate, DroppedAssignment, SwapCandidate, SwapRequestItem, MySwapRequests, CommonEnemyLeaderboardEntry, EventAssignment, CompleteResult } from '@/types'
2025-12-15 03:22:29 +07:00
export const eventsApi = {
getActive: async (marathonId: number): Promise<ActiveEvent> => {
const response = await client.get<ActiveEvent>(`/marathons/${marathonId}/event`)
return response.data
},
list: async (marathonId: number): Promise<MarathonEvent[]> => {
const response = await client.get<MarathonEvent[]>(`/marathons/${marathonId}/events`)
return response.data
},
start: async (marathonId: number, data: EventCreate): Promise<MarathonEvent> => {
const response = await client.post<MarathonEvent>(`/marathons/${marathonId}/events`, data)
return response.data
},
stop: async (marathonId: number): Promise<void> => {
await client.delete(`/marathons/${marathonId}/event`)
},
// Swap requests (two-sided confirmation)
createSwapRequest: async (marathonId: number, targetParticipantId: number): Promise<SwapRequestItem> => {
const response = await client.post<SwapRequestItem>(`/marathons/${marathonId}/swap-requests`, {
target_participant_id: targetParticipantId,
})
return response.data
},
getSwapRequests: async (marathonId: number): Promise<MySwapRequests> => {
const response = await client.get<MySwapRequests>(`/marathons/${marathonId}/swap-requests`)
return response.data
},
acceptSwapRequest: async (marathonId: number, requestId: number): Promise<void> => {
await client.post(`/marathons/${marathonId}/swap-requests/${requestId}/accept`)
},
declineSwapRequest: async (marathonId: number, requestId: number): Promise<void> => {
await client.post(`/marathons/${marathonId}/swap-requests/${requestId}/decline`)
},
cancelSwapRequest: async (marathonId: number, requestId: number): Promise<void> => {
await client.delete(`/marathons/${marathonId}/swap-requests/${requestId}`)
},
rematch: async (marathonId: number, assignmentId: number): Promise<void> => {
await client.post(`/marathons/${marathonId}/rematch/${assignmentId}`)
},
getDroppedAssignments: async (marathonId: number): Promise<DroppedAssignment[]> => {
const response = await client.get<DroppedAssignment[]>(`/marathons/${marathonId}/dropped-assignments`)
return response.data
},
getSwapCandidates: async (marathonId: number): Promise<SwapCandidate[]> => {
const response = await client.get<SwapCandidate[]>(`/marathons/${marathonId}/swap-candidates`)
return response.data
},
getCommonEnemyLeaderboard: async (marathonId: number): Promise<CommonEnemyLeaderboardEntry[]> => {
const response = await client.get<CommonEnemyLeaderboardEntry[]>(`/marathons/${marathonId}/common-enemy-leaderboard`)
return response.data
},
2025-12-15 23:03:59 +07:00
// Event Assignment (Common Enemy)
getEventAssignment: async (marathonId: number): Promise<EventAssignment> => {
const response = await client.get<EventAssignment>(`/marathons/${marathonId}/event-assignment`)
return response.data
},
completeEventAssignment: async (
assignmentId: number,
data: { proof_url?: string; comment?: string; proof_file?: File }
): Promise<CompleteResult> => {
const formData = new FormData()
if (data.proof_url) formData.append('proof_url', data.proof_url)
if (data.comment) formData.append('comment', data.comment)
if (data.proof_file) formData.append('proof_file', data.proof_file)
const response = await client.post<CompleteResult>(
`/event-assignments/${assignmentId}/complete`,
formData,
{ headers: { 'Content-Type': 'multipart/form-data' } }
)
return response.data
},
2025-12-15 03:22:29 +07:00
}