mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-05 03:02:56 +00:00
dev day #80
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
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;
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user