mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-03 18:22:57 +00:00
164 lines
5.1 KiB
TypeScript
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;
|
|
}
|