Files
MyClub/frontend/src/services/sweepstakes.ts
T
Tomas Dvorak 8762bde4bf dev day #89
2025-11-11 10:29:30 +01:00

164 lines
5.1 KiB
TypeScript

import api from './api';
export type Sweepstake = {
id: number;
title: string;
description?: string;
image_url?: string;
rules_url?: string;
start_at: string;
end_at: string;
status: string;
picker_style?: 'wheel' | 'cycler' | string;
total_prizes?: number;
prize_summary?: string;
entry_cost_points?: number;
entry_fee_czk?: number;
max_entries_per_user?: number;
winners_selected_at?: string | null;
visibility_until?: string | null;
};
export type SweepstakePrize = {
id: number;
sweepstake_id: number;
name: string;
description?: string;
image_url?: string;
value?: string;
quantity: number;
display_order: number;
kind?: 'physical' | 'points' | 'xp' | 'points_xp';
points?: number;
xp?: number;
};
export type SweepstakeWinner = {
id: number;
sweepstake_id: number;
entry_id: number;
user_id: number;
prize_id?: number | null;
prize_name?: string;
claim_status: string;
announced_at?: string | null;
};
export type CurrentSweepstakeResponse = {
sweepstake: Sweepstake | null;
prizes?: SweepstakePrize[];
winners?: SweepstakeWinner[];
state?: 'upcoming' | 'active' | 'finalized';
has_entered?: boolean;
visual_played_at?: string | null;
};
export async function getCurrentSweepstake(): Promise<CurrentSweepstakeResponse> {
const res = await api.get('/sweepstakes/current');
return res.data;
}
export async function enterSweepstake(id: number): Promise<void> {
await api.post(`/sweepstakes/${id}/enter`, {});
}
export async function markSweepstakeVisualPlayed(id: number): Promise<void> {
await api.post(`/sweepstakes/${id}/played`, {});
}
export async function getMyWinnings(): Promise<{ items: SweepstakeWinner[] }> {
const res = await api.get('/sweepstakes/my-winnings');
return res.data;
}
// Admin
export async function adminListSweepstakes(params?: { status?: string }) {
const res = await api.get('/admin/sweepstakes', { params });
return res.data?.items || [];
}
export async function adminCreateSweepstake(data: Partial<Sweepstake> & { start_at: string; end_at: string }) {
const res = await api.post('/admin/sweepstakes', data);
return res.data;
}
export async function adminUpdateSweepstake(id: number, data: Partial<Sweepstake>) {
const res = await api.put(`/admin/sweepstakes/${id}`, data);
return res.data;
}
export async function adminDeleteSweepstake(id: number) {
const res = await api.delete(`/admin/sweepstakes/${id}`);
return res.data;
}
export async function adminListEntries(id: number) {
const res = await api.get(`/admin/sweepstakes/${id}/entries`);
return res.data?.items || [];
}
export async function adminListWinners(id: number) {
const res = await api.get(`/admin/sweepstakes/${id}/winners`);
return res.data?.items || [];
}
export async function adminFinalizeSweepstake(id: number, seed?: string) {
const res = await api.post(`/admin/sweepstakes/${id}/finalize`, seed ? { seed } : {});
return res.data;
}
// Visualizer data
export type VisualEntry = { user_id: number; display_name: string; avatar_url?: string };
export type VisualWinner = { id?: number; user_id: number; prize_name?: string; claim_status?: string };
export type VisualData = { sweepstake: Sweepstake; entries: VisualEntry[]; winners: VisualWinner[] };
export async function adminGetVisualData(id: number): Promise<VisualData> {
const res = await api.get(`/admin/sweepstakes/${id}/visual`);
return res.data;
}
export async function getPublicVisualData(id: number): Promise<VisualData> {
const res = await api.get(`/sweepstakes/${id}/visual`);
return res.data;
}
// Prizes CRUD
export type SweepstakePrizeInput = Partial<SweepstakePrize> & {
name?: string;
quantity?: number;
display_order?: number;
kind?: 'physical' | 'points' | 'xp' | 'points_xp';
points?: number;
xp?: number;
};
export async function adminListPrizes(id: number): Promise<SweepstakePrize[]> {
const res = await api.get(`/admin/sweepstakes/${id}/prizes`);
return res.data?.items || [];
}
export async function adminCreatePrize(id: number, data: SweepstakePrizeInput) {
const res = await api.post(`/admin/sweepstakes/${id}/prizes`, data);
return res.data;
}
export async function adminUpdatePrize(id: number, prizeId: number, data: SweepstakePrizeInput) {
const res = await api.put(`/admin/sweepstakes/${id}/prizes/${prizeId}`, data);
return res.data;
}
export async function adminDeletePrize(id: number, prizeId: number) {
const res = await api.delete(`/admin/sweepstakes/${id}/prizes/${prizeId}`);
return res.data;
}
export async function adminReorderPrizes(id: number, order: number[]) {
const res = await api.post(`/admin/sweepstakes/${id}/prizes/reorder`, { order });
return res.data;
}
// Winners management
export async function adminUpdateWinner(id: number, winnerId: number, data: { claim_status?: 'pending'|'claimed'|'delivered'; claim_note?: string }) {
const res = await api.patch(`/admin/sweepstakes/${id}/winners/${winnerId}`, data);
return res.data;
}
export async function adminSetWinnerPrize(id: number, winnerId: number, prizeId: number) {
const res = await api.patch(`/admin/sweepstakes/${id}/winners/${winnerId}/prize`, { prize_id: prizeId });
return res.data;
}