feat(migration): frontend migration submissions -> opus-magnum

This commit is contained in:
Loïc Gremaud 2026-05-24 18:54:14 +02:00
parent b437210eb3
commit a5fe8aacaf
Signed by: Legrems
GPG Key ID: D4620E6DF3E0121D
11 changed files with 87 additions and 87 deletions

View File

@ -32,8 +32,8 @@ The Noita Submission API allows clients to upload the result of the log file of
# Add authentication for protected endpoints
# api.auth = django_auth # Uncomment if you want global auth
# Include the submissions router
api.add_router("/submissions/", submissions_router, tags=["submissions"])
# Include the opus_magnum router
api.add_router("/opus-magnum/", submissions_router, tags=["opus-magnum"])
api.add_router("/results/", results_router, tags=["results"])
api.add_router("/noita/", noita_router, tags=["noita"])
api.add_router("/games/", games_router, tags=["games"])

View File

@ -7,7 +7,7 @@ import Results from "@/components/Results.vue";
import Winners from "@/components/Winners.vue";
import PuzzleResults from "@/components/PuzzleResults.vue";
import TopUsersLeaderboard from "@/components/TopUsersLeaderboard.vue";
import { polylanSubmitterApiGetUserInfo, submissionsApiGetCollection } from "@/api";
import { polylanSubmitterApiGetUserInfo, opusMagnumApiGetCollection } from "@/api";
import { errorHelpers } from "@/services/apiService";
import { usePuzzlesStore } from "@/stores/puzzles";
import { useSubmissionsStore } from "@/stores/submissions";
@ -77,7 +77,7 @@ async function initialize() {
// Load collection data
console.log("Loading collection...");
const collectionResponse = await submissionsApiGetCollection();
const collectionResponse = await opusMagnumApiGetCollection();
if (collectionResponse.data) {
collection.value = collectionResponse.data as SteamCollection;
console.log("Collection loaded:", collectionResponse.data);

View File

@ -1,4 +1,4 @@
// This file is auto-generated by @hey-api/openapi-ts
export { animationsApiPuzzleResults, animationsApiResults, animationsApiTopSubmissions, gamesApiListGames, marketApiCloseMarket, marketApiCreateBet, marketApiListMarkets, marketApiListUserBets, marketApiResolveMarket, noitaApiGetLeaderboard, noitaApiGetResults, noitaApiSubmitLogFile, type Options, polylanSubmitterApiClearCache, polylanSubmitterApiGetUserInfo, polylanSubmitterApiHealthCheck, submissionsApiCreateSubmission, submissionsApiDeleteSubmission, submissionsApiGetCollection, submissionsApiGetStats, submissionsApiGetSubmission, submissionsApiListPuzzles, submissionsApiListResponsesNeedingValidation, submissionsApiListSubmissions, submissionsApiValidateAuto, submissionsApiValidateResponse, submissionsApiValidateSubmission } from './sdk.gen';
export type { AnimationsApiPuzzleResultsData, AnimationsApiPuzzleResultsResponse, AnimationsApiPuzzleResultsResponses, AnimationsApiResultsData, AnimationsApiResultsResponse, AnimationsApiResultsResponses, AnimationsApiTopSubmissionsData, AnimationsApiTopSubmissionsResponse, AnimationsApiTopSubmissionsResponses, ClientOptions, GameOut, GamesApiListGamesData, GamesApiListGamesResponse, GamesApiListGamesResponses, Input, LeaderboardEntryOut, LeaderboardOut, MarketApiCloseMarketData, MarketApiCloseMarketResponses, MarketApiCreateBetData, MarketApiCreateBetResponse, MarketApiCreateBetResponses, MarketApiListMarketsData, MarketApiListMarketsResponse, MarketApiListMarketsResponses, MarketApiListUserBetsData, MarketApiListUserBetsResponse, MarketApiListUserBetsResponses, MarketApiResolveMarketData, MarketApiResolveMarketResponse, MarketApiResolveMarketResponses, MarketListSchema, MarketOptionSchema, NoitaApiGetLeaderboardData, NoitaApiGetLeaderboardResponse, NoitaApiGetLeaderboardResponses, NoitaApiGetResultsData, NoitaApiGetResultsResponse, NoitaApiGetResultsResponses, NoitaApiSubmitLogFileData, NoitaApiSubmitLogFileError, NoitaApiSubmitLogFileErrors, NoitaApiSubmitLogFileResponse, NoitaApiSubmitLogFileResponses, NoitaSubmissionOut, ObjectivResultOut, PagedSubmissionOut, PolylanSubmitterApiClearCacheData, PolylanSubmitterApiClearCacheResponses, PolylanSubmitterApiGetUserInfoData, PolylanSubmitterApiGetUserInfoResponse, PolylanSubmitterApiGetUserInfoResponses, PolylanSubmitterApiHealthCheckData, PolylanSubmitterApiHealthCheckResponses, PuzzlePointsFactorOut, PuzzleResponseIn, PuzzleResponseOut, PuzzleResponseRankingOut, PuzzleResultsOut, PuzzleSubmissionsOut, PuzzleSubmissionWithRankOut, RankingSchema, ResolveMarketSchema, ResultsOut, SteamCollectionItemOut, SteamCollectionOut, SubmissionFileOut, SubmissionIn, SubmissionOut, SubmissionsApiCreateSubmissionData, SubmissionsApiCreateSubmissionResponse, SubmissionsApiCreateSubmissionResponses, SubmissionsApiDeleteSubmissionData, SubmissionsApiDeleteSubmissionResponses, SubmissionsApiGetCollectionData, SubmissionsApiGetCollectionResponse, SubmissionsApiGetCollectionResponses, SubmissionsApiGetStatsData, SubmissionsApiGetStatsResponses, SubmissionsApiGetSubmissionData, SubmissionsApiGetSubmissionResponse, SubmissionsApiGetSubmissionResponses, SubmissionsApiListPuzzlesData, SubmissionsApiListPuzzlesResponse, SubmissionsApiListPuzzlesResponses, SubmissionsApiListResponsesNeedingValidationData, SubmissionsApiListResponsesNeedingValidationResponse, SubmissionsApiListResponsesNeedingValidationResponses, SubmissionsApiListSubmissionsData, SubmissionsApiListSubmissionsResponse, SubmissionsApiListSubmissionsResponses, SubmissionsApiValidateAutoData, SubmissionsApiValidateAutoResponse, SubmissionsApiValidateAutoResponses, SubmissionsApiValidateResponseData, SubmissionsApiValidateResponseResponse, SubmissionsApiValidateResponseResponses, SubmissionsApiValidateSubmissionData, SubmissionsApiValidateSubmissionResponse, SubmissionsApiValidateSubmissionResponses, TournamentPuzzleResultsOut, TournamentSubmissionsOut, UserBetCreateSchema, UserBetSchema, UserDisplayOut, UserInfoOut, ValidationIn, WinnerFileOut, WinnerResponseOut } from './types.gen';
export { animationsApiPuzzleResults, animationsApiResults, animationsApiTopSubmissions, gamesApiListGames, marketApiCloseMarket, marketApiCreateBet, marketApiListMarkets, marketApiListUserBets, marketApiResolveMarket, noitaApiGetLeaderboard, noitaApiGetResults, noitaApiSubmitLogFile, type Options, opusMagnumApiCreateSubmission, opusMagnumApiDeleteSubmission, opusMagnumApiGetCollection, opusMagnumApiGetStats, opusMagnumApiGetSubmission, opusMagnumApiListPuzzles, opusMagnumApiListResponsesNeedingValidation, opusMagnumApiListSubmissions, opusMagnumApiValidateAuto, opusMagnumApiValidateResponse, opusMagnumApiValidateSubmission, polylanSubmitterApiClearCache, polylanSubmitterApiGetUserInfo, polylanSubmitterApiHealthCheck } from './sdk.gen';
export type { AnimationsApiPuzzleResultsData, AnimationsApiPuzzleResultsResponse, AnimationsApiPuzzleResultsResponses, AnimationsApiResultsData, AnimationsApiResultsResponse, AnimationsApiResultsResponses, AnimationsApiTopSubmissionsData, AnimationsApiTopSubmissionsResponse, AnimationsApiTopSubmissionsResponses, ClientOptions, GameOut, GamesApiListGamesData, GamesApiListGamesResponse, GamesApiListGamesResponses, Input, LeaderboardEntryOut, LeaderboardOut, MarketApiCloseMarketData, MarketApiCloseMarketResponses, MarketApiCreateBetData, MarketApiCreateBetResponse, MarketApiCreateBetResponses, MarketApiListMarketsData, MarketApiListMarketsResponse, MarketApiListMarketsResponses, MarketApiListUserBetsData, MarketApiListUserBetsResponse, MarketApiListUserBetsResponses, MarketApiResolveMarketData, MarketApiResolveMarketResponse, MarketApiResolveMarketResponses, MarketListSchema, MarketOptionSchema, NoitaApiGetLeaderboardData, NoitaApiGetLeaderboardResponse, NoitaApiGetLeaderboardResponses, NoitaApiGetResultsData, NoitaApiGetResultsResponse, NoitaApiGetResultsResponses, NoitaApiSubmitLogFileData, NoitaApiSubmitLogFileError, NoitaApiSubmitLogFileErrors, NoitaApiSubmitLogFileResponse, NoitaApiSubmitLogFileResponses, NoitaSubmissionOut, ObjectivResultOut, OpusMagnumApiCreateSubmissionData, OpusMagnumApiCreateSubmissionResponse, OpusMagnumApiCreateSubmissionResponses, OpusMagnumApiDeleteSubmissionData, OpusMagnumApiDeleteSubmissionResponses, OpusMagnumApiGetCollectionData, OpusMagnumApiGetCollectionResponse, OpusMagnumApiGetCollectionResponses, OpusMagnumApiGetStatsData, OpusMagnumApiGetStatsResponses, OpusMagnumApiGetSubmissionData, OpusMagnumApiGetSubmissionResponse, OpusMagnumApiGetSubmissionResponses, OpusMagnumApiListPuzzlesData, OpusMagnumApiListPuzzlesResponse, OpusMagnumApiListPuzzlesResponses, OpusMagnumApiListResponsesNeedingValidationData, OpusMagnumApiListResponsesNeedingValidationResponse, OpusMagnumApiListResponsesNeedingValidationResponses, OpusMagnumApiListSubmissionsData, OpusMagnumApiListSubmissionsResponse, OpusMagnumApiListSubmissionsResponses, OpusMagnumApiValidateAutoData, OpusMagnumApiValidateAutoResponse, OpusMagnumApiValidateAutoResponses, OpusMagnumApiValidateResponseData, OpusMagnumApiValidateResponseResponse, OpusMagnumApiValidateResponseResponses, OpusMagnumApiValidateSubmissionData, OpusMagnumApiValidateSubmissionResponse, OpusMagnumApiValidateSubmissionResponses, PagedSubmissionOut, PolylanSubmitterApiClearCacheData, PolylanSubmitterApiClearCacheResponses, PolylanSubmitterApiGetUserInfoData, PolylanSubmitterApiGetUserInfoResponse, PolylanSubmitterApiGetUserInfoResponses, PolylanSubmitterApiHealthCheckData, PolylanSubmitterApiHealthCheckResponses, PuzzlePointsFactorOut, PuzzleResponseIn, PuzzleResponseOut, PuzzleResponseRankingOut, PuzzleResultsOut, PuzzleSubmissionsOut, PuzzleSubmissionWithRankOut, RankingSchema, ResolveMarketSchema, ResultsOut, SteamCollectionItemOut, SteamCollectionOut, SubmissionFileOut, SubmissionIn, SubmissionOut, TournamentPuzzleResultsOut, TournamentSubmissionsOut, UserBetCreateSchema, UserBetSchema, UserDisplayOut, UserInfoOut, ValidationIn, WinnerFileOut, WinnerResponseOut } from './types.gen';

View File

@ -2,7 +2,7 @@
import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client';
import { client } from './client.gen';
import type { AnimationsApiPuzzleResultsData, AnimationsApiPuzzleResultsResponses, AnimationsApiResultsData, AnimationsApiResultsResponses, AnimationsApiTopSubmissionsData, AnimationsApiTopSubmissionsResponses, GamesApiListGamesData, GamesApiListGamesResponses, MarketApiCloseMarketData, MarketApiCloseMarketResponses, MarketApiCreateBetData, MarketApiCreateBetResponses, MarketApiListMarketsData, MarketApiListMarketsResponses, MarketApiListUserBetsData, MarketApiListUserBetsResponses, MarketApiResolveMarketData, MarketApiResolveMarketResponses, NoitaApiGetLeaderboardData, NoitaApiGetLeaderboardResponses, NoitaApiGetResultsData, NoitaApiGetResultsResponses, NoitaApiSubmitLogFileData, NoitaApiSubmitLogFileErrors, NoitaApiSubmitLogFileResponses, PolylanSubmitterApiClearCacheData, PolylanSubmitterApiClearCacheResponses, PolylanSubmitterApiGetUserInfoData, PolylanSubmitterApiGetUserInfoResponses, PolylanSubmitterApiHealthCheckData, PolylanSubmitterApiHealthCheckResponses, SubmissionsApiCreateSubmissionData, SubmissionsApiCreateSubmissionResponses, SubmissionsApiDeleteSubmissionData, SubmissionsApiDeleteSubmissionResponses, SubmissionsApiGetCollectionData, SubmissionsApiGetCollectionResponses, SubmissionsApiGetStatsData, SubmissionsApiGetStatsResponses, SubmissionsApiGetSubmissionData, SubmissionsApiGetSubmissionResponses, SubmissionsApiListPuzzlesData, SubmissionsApiListPuzzlesResponses, SubmissionsApiListResponsesNeedingValidationData, SubmissionsApiListResponsesNeedingValidationResponses, SubmissionsApiListSubmissionsData, SubmissionsApiListSubmissionsResponses, SubmissionsApiValidateAutoData, SubmissionsApiValidateAutoResponses, SubmissionsApiValidateResponseData, SubmissionsApiValidateResponseResponses, SubmissionsApiValidateSubmissionData, SubmissionsApiValidateSubmissionResponses } from './types.gen';
import type { AnimationsApiPuzzleResultsData, AnimationsApiPuzzleResultsResponses, AnimationsApiResultsData, AnimationsApiResultsResponses, AnimationsApiTopSubmissionsData, AnimationsApiTopSubmissionsResponses, GamesApiListGamesData, GamesApiListGamesResponses, MarketApiCloseMarketData, MarketApiCloseMarketResponses, MarketApiCreateBetData, MarketApiCreateBetResponses, MarketApiListMarketsData, MarketApiListMarketsResponses, MarketApiListUserBetsData, MarketApiListUserBetsResponses, MarketApiResolveMarketData, MarketApiResolveMarketResponses, NoitaApiGetLeaderboardData, NoitaApiGetLeaderboardResponses, NoitaApiGetResultsData, NoitaApiGetResultsResponses, NoitaApiSubmitLogFileData, NoitaApiSubmitLogFileErrors, NoitaApiSubmitLogFileResponses, OpusMagnumApiCreateSubmissionData, OpusMagnumApiCreateSubmissionResponses, OpusMagnumApiDeleteSubmissionData, OpusMagnumApiDeleteSubmissionResponses, OpusMagnumApiGetCollectionData, OpusMagnumApiGetCollectionResponses, OpusMagnumApiGetStatsData, OpusMagnumApiGetStatsResponses, OpusMagnumApiGetSubmissionData, OpusMagnumApiGetSubmissionResponses, OpusMagnumApiListPuzzlesData, OpusMagnumApiListPuzzlesResponses, OpusMagnumApiListResponsesNeedingValidationData, OpusMagnumApiListResponsesNeedingValidationResponses, OpusMagnumApiListSubmissionsData, OpusMagnumApiListSubmissionsResponses, OpusMagnumApiValidateAutoData, OpusMagnumApiValidateAutoResponses, OpusMagnumApiValidateResponseData, OpusMagnumApiValidateResponseResponses, OpusMagnumApiValidateSubmissionData, OpusMagnumApiValidateSubmissionResponses, PolylanSubmitterApiClearCacheData, PolylanSubmitterApiClearCacheResponses, PolylanSubmitterApiGetUserInfoData, PolylanSubmitterApiGetUserInfoResponses, PolylanSubmitterApiHealthCheckData, PolylanSubmitterApiHealthCheckResponses } from './types.gen';
export type Options<TData extends TDataShape = TDataShape, ThrowOnError extends boolean = boolean, TResponse = unknown> = Options2<TData, ThrowOnError, TResponse> & {
/**
@ -44,30 +44,30 @@ export const polylanSubmitterApiGetUserInfo = <ThrowOnError extends boolean = fa
*
* Get list of available puzzles
*/
export const submissionsApiListPuzzles = <ThrowOnError extends boolean = false>(options?: Options<SubmissionsApiListPuzzlesData, ThrowOnError>) => (options?.client ?? client).get<SubmissionsApiListPuzzlesResponses, unknown, ThrowOnError>({ url: '/api/submissions/puzzles', ...options });
export const opusMagnumApiListPuzzles = <ThrowOnError extends boolean = false>(options?: Options<OpusMagnumApiListPuzzlesData, ThrowOnError>) => (options?.client ?? client).get<OpusMagnumApiListPuzzlesResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/puzzles', ...options });
/**
* Get Collection
*
* Get the active collection details
*/
export const submissionsApiGetCollection = <ThrowOnError extends boolean = false>(options?: Options<SubmissionsApiGetCollectionData, ThrowOnError>) => (options?.client ?? client).get<SubmissionsApiGetCollectionResponses, unknown, ThrowOnError>({ url: '/api/submissions/collection', ...options });
export const opusMagnumApiGetCollection = <ThrowOnError extends boolean = false>(options?: Options<OpusMagnumApiGetCollectionData, ThrowOnError>) => (options?.client ?? client).get<OpusMagnumApiGetCollectionResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/collection', ...options });
/**
* List Submissions
*
* Get paginated list of submissions
*/
export const submissionsApiListSubmissions = <ThrowOnError extends boolean = false>(options?: Options<SubmissionsApiListSubmissionsData, ThrowOnError>) => (options?.client ?? client).get<SubmissionsApiListSubmissionsResponses, unknown, ThrowOnError>({ url: '/api/submissions/submissions', ...options });
export const opusMagnumApiListSubmissions = <ThrowOnError extends boolean = false>(options?: Options<OpusMagnumApiListSubmissionsData, ThrowOnError>) => (options?.client ?? client).get<OpusMagnumApiListSubmissionsResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/submissions', ...options });
/**
* Create Submission
*
* Create a new submission with multiple puzzle responses
*/
export const submissionsApiCreateSubmission = <ThrowOnError extends boolean = false>(options: Options<SubmissionsApiCreateSubmissionData, ThrowOnError>) => (options.client ?? client).post<SubmissionsApiCreateSubmissionResponses, unknown, ThrowOnError>({
export const opusMagnumApiCreateSubmission = <ThrowOnError extends boolean = false>(options: Options<OpusMagnumApiCreateSubmissionData, ThrowOnError>) => (options.client ?? client).post<OpusMagnumApiCreateSubmissionResponses, unknown, ThrowOnError>({
...formDataBodySerializer,
url: '/api/submissions/submissions',
url: '/api/opus-magnum/submissions',
...options,
headers: {
'Content-Type': null,
@ -80,22 +80,22 @@ export const submissionsApiCreateSubmission = <ThrowOnError extends boolean = fa
*
* Delete a submission (admin only)
*/
export const submissionsApiDeleteSubmission = <ThrowOnError extends boolean = false>(options: Options<SubmissionsApiDeleteSubmissionData, ThrowOnError>) => (options.client ?? client).delete<SubmissionsApiDeleteSubmissionResponses, unknown, ThrowOnError>({ url: '/api/submissions/submissions/{submission_id}', ...options });
export const opusMagnumApiDeleteSubmission = <ThrowOnError extends boolean = false>(options: Options<OpusMagnumApiDeleteSubmissionData, ThrowOnError>) => (options.client ?? client).delete<OpusMagnumApiDeleteSubmissionResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/submissions/{submission_id}', ...options });
/**
* Get Submission
*
* Get detailed submission by ID
*/
export const submissionsApiGetSubmission = <ThrowOnError extends boolean = false>(options: Options<SubmissionsApiGetSubmissionData, ThrowOnError>) => (options.client ?? client).get<SubmissionsApiGetSubmissionResponses, unknown, ThrowOnError>({ url: '/api/submissions/submissions/{submission_id}', ...options });
export const opusMagnumApiGetSubmission = <ThrowOnError extends boolean = false>(options: Options<OpusMagnumApiGetSubmissionData, ThrowOnError>) => (options.client ?? client).get<OpusMagnumApiGetSubmissionResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/submissions/{submission_id}', ...options });
/**
* Validate Response
*
* Manually validate a puzzle response
*/
export const submissionsApiValidateResponse = <ThrowOnError extends boolean = false>(options: Options<SubmissionsApiValidateResponseData, ThrowOnError>) => (options.client ?? client).put<SubmissionsApiValidateResponseResponses, unknown, ThrowOnError>({
url: '/api/submissions/responses/{response_id}/validate',
export const opusMagnumApiValidateResponse = <ThrowOnError extends boolean = false>(options: Options<OpusMagnumApiValidateResponseData, ThrowOnError>) => (options.client ?? client).put<OpusMagnumApiValidateResponseResponses, unknown, ThrowOnError>({
url: '/api/opus-magnum/responses/{response_id}/validate',
...options,
headers: {
'Content-Type': 'application/json',
@ -108,28 +108,28 @@ export const submissionsApiValidateResponse = <ThrowOnError extends boolean = fa
*
* Try to auto validate a puzzle response
*/
export const submissionsApiValidateAuto = <ThrowOnError extends boolean = false>(options: Options<SubmissionsApiValidateAutoData, ThrowOnError>) => (options.client ?? client).put<SubmissionsApiValidateAutoResponses, unknown, ThrowOnError>({ url: '/api/submissions/responses/{response_id}/validate/auto', ...options });
export const opusMagnumApiValidateAuto = <ThrowOnError extends boolean = false>(options: Options<OpusMagnumApiValidateAutoData, ThrowOnError>) => (options.client ?? client).put<OpusMagnumApiValidateAutoResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/responses/{response_id}/validate/auto', ...options });
/**
* List Responses Needing Validation
*
* Get all responses that need manual validation
*/
export const submissionsApiListResponsesNeedingValidation = <ThrowOnError extends boolean = false>(options?: Options<SubmissionsApiListResponsesNeedingValidationData, ThrowOnError>) => (options?.client ?? client).get<SubmissionsApiListResponsesNeedingValidationResponses, unknown, ThrowOnError>({ url: '/api/submissions/responses/needs-validation', ...options });
export const opusMagnumApiListResponsesNeedingValidation = <ThrowOnError extends boolean = false>(options?: Options<OpusMagnumApiListResponsesNeedingValidationData, ThrowOnError>) => (options?.client ?? client).get<OpusMagnumApiListResponsesNeedingValidationResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/responses/needs-validation', ...options });
/**
* Validate Submission
*
* Mark entire submission as validated
*/
export const submissionsApiValidateSubmission = <ThrowOnError extends boolean = false>(options: Options<SubmissionsApiValidateSubmissionData, ThrowOnError>) => (options.client ?? client).post<SubmissionsApiValidateSubmissionResponses, unknown, ThrowOnError>({ url: '/api/submissions/submissions/{submission_id}/validate', ...options });
export const opusMagnumApiValidateSubmission = <ThrowOnError extends boolean = false>(options: Options<OpusMagnumApiValidateSubmissionData, ThrowOnError>) => (options.client ?? client).post<OpusMagnumApiValidateSubmissionResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/submissions/{submission_id}/validate', ...options });
/**
* Get Stats
*
* Get submission statistics
*/
export const submissionsApiGetStats = <ThrowOnError extends boolean = false>(options?: Options<SubmissionsApiGetStatsData, ThrowOnError>) => (options?.client ?? client).get<SubmissionsApiGetStatsResponses, unknown, ThrowOnError>({ url: '/api/submissions/stats', ...options });
export const opusMagnumApiGetStats = <ThrowOnError extends boolean = false>(options?: Options<OpusMagnumApiGetStatsData, ThrowOnError>) => (options?.client ?? client).get<OpusMagnumApiGetStatsResponses, unknown, ThrowOnError>({ url: '/api/opus-magnum/stats', ...options });
/**
* Results

View File

@ -1111,14 +1111,14 @@ export type PolylanSubmitterApiGetUserInfoResponses = {
export type PolylanSubmitterApiGetUserInfoResponse = PolylanSubmitterApiGetUserInfoResponses[keyof PolylanSubmitterApiGetUserInfoResponses];
export type SubmissionsApiListPuzzlesData = {
export type OpusMagnumApiListPuzzlesData = {
body?: never;
path?: never;
query?: never;
url: '/api/submissions/puzzles';
url: '/api/opus-magnum/puzzles';
};
export type SubmissionsApiListPuzzlesResponses = {
export type OpusMagnumApiListPuzzlesResponses = {
/**
* Response
*
@ -1127,25 +1127,25 @@ export type SubmissionsApiListPuzzlesResponses = {
200: Array<SteamCollectionItemOut>;
};
export type SubmissionsApiListPuzzlesResponse = SubmissionsApiListPuzzlesResponses[keyof SubmissionsApiListPuzzlesResponses];
export type OpusMagnumApiListPuzzlesResponse = OpusMagnumApiListPuzzlesResponses[keyof OpusMagnumApiListPuzzlesResponses];
export type SubmissionsApiGetCollectionData = {
export type OpusMagnumApiGetCollectionData = {
body?: never;
path?: never;
query?: never;
url: '/api/submissions/collection';
url: '/api/opus-magnum/collection';
};
export type SubmissionsApiGetCollectionResponses = {
export type OpusMagnumApiGetCollectionResponses = {
/**
* OK
*/
200: SteamCollectionOut;
};
export type SubmissionsApiGetCollectionResponse = SubmissionsApiGetCollectionResponses[keyof SubmissionsApiGetCollectionResponses];
export type OpusMagnumApiGetCollectionResponse = OpusMagnumApiGetCollectionResponses[keyof OpusMagnumApiGetCollectionResponses];
export type SubmissionsApiListSubmissionsData = {
export type OpusMagnumApiListSubmissionsData = {
body?: never;
path?: never;
query?: {
@ -1158,19 +1158,19 @@ export type SubmissionsApiListSubmissionsData = {
*/
offset?: number;
};
url: '/api/submissions/submissions';
url: '/api/opus-magnum/submissions';
};
export type SubmissionsApiListSubmissionsResponses = {
export type OpusMagnumApiListSubmissionsResponses = {
/**
* OK
*/
200: PagedSubmissionOut;
};
export type SubmissionsApiListSubmissionsResponse = SubmissionsApiListSubmissionsResponses[keyof SubmissionsApiListSubmissionsResponses];
export type OpusMagnumApiListSubmissionsResponse = OpusMagnumApiListSubmissionsResponses[keyof OpusMagnumApiListSubmissionsResponses];
export type SubmissionsApiCreateSubmissionData = {
export type OpusMagnumApiCreateSubmissionData = {
/**
* MultiPartBodyParams
*/
@ -1183,19 +1183,19 @@ export type SubmissionsApiCreateSubmissionData = {
};
path?: never;
query?: never;
url: '/api/submissions/submissions';
url: '/api/opus-magnum/submissions';
};
export type SubmissionsApiCreateSubmissionResponses = {
export type OpusMagnumApiCreateSubmissionResponses = {
/**
* OK
*/
200: SubmissionOut;
};
export type SubmissionsApiCreateSubmissionResponse = SubmissionsApiCreateSubmissionResponses[keyof SubmissionsApiCreateSubmissionResponses];
export type OpusMagnumApiCreateSubmissionResponse = OpusMagnumApiCreateSubmissionResponses[keyof OpusMagnumApiCreateSubmissionResponses];
export type SubmissionsApiDeleteSubmissionData = {
export type OpusMagnumApiDeleteSubmissionData = {
body?: never;
path: {
/**
@ -1204,17 +1204,17 @@ export type SubmissionsApiDeleteSubmissionData = {
submission_id: string;
};
query?: never;
url: '/api/submissions/submissions/{submission_id}';
url: '/api/opus-magnum/submissions/{submission_id}';
};
export type SubmissionsApiDeleteSubmissionResponses = {
export type OpusMagnumApiDeleteSubmissionResponses = {
/**
* OK
*/
200: unknown;
};
export type SubmissionsApiGetSubmissionData = {
export type OpusMagnumApiGetSubmissionData = {
body?: never;
path: {
/**
@ -1223,19 +1223,19 @@ export type SubmissionsApiGetSubmissionData = {
submission_id: string;
};
query?: never;
url: '/api/submissions/submissions/{submission_id}';
url: '/api/opus-magnum/submissions/{submission_id}';
};
export type SubmissionsApiGetSubmissionResponses = {
export type OpusMagnumApiGetSubmissionResponses = {
/**
* OK
*/
200: SubmissionOut;
};
export type SubmissionsApiGetSubmissionResponse = SubmissionsApiGetSubmissionResponses[keyof SubmissionsApiGetSubmissionResponses];
export type OpusMagnumApiGetSubmissionResponse = OpusMagnumApiGetSubmissionResponses[keyof OpusMagnumApiGetSubmissionResponses];
export type SubmissionsApiValidateResponseData = {
export type OpusMagnumApiValidateResponseData = {
body: ValidationIn;
path: {
/**
@ -1244,19 +1244,19 @@ export type SubmissionsApiValidateResponseData = {
response_id: number;
};
query?: never;
url: '/api/submissions/responses/{response_id}/validate';
url: '/api/opus-magnum/responses/{response_id}/validate';
};
export type SubmissionsApiValidateResponseResponses = {
export type OpusMagnumApiValidateResponseResponses = {
/**
* OK
*/
200: PuzzleResponseOut;
};
export type SubmissionsApiValidateResponseResponse = SubmissionsApiValidateResponseResponses[keyof SubmissionsApiValidateResponseResponses];
export type OpusMagnumApiValidateResponseResponse = OpusMagnumApiValidateResponseResponses[keyof OpusMagnumApiValidateResponseResponses];
export type SubmissionsApiValidateAutoData = {
export type OpusMagnumApiValidateAutoData = {
body?: never;
path: {
/**
@ -1265,26 +1265,26 @@ export type SubmissionsApiValidateAutoData = {
response_id: number;
};
query?: never;
url: '/api/submissions/responses/{response_id}/validate/auto';
url: '/api/opus-magnum/responses/{response_id}/validate/auto';
};
export type SubmissionsApiValidateAutoResponses = {
export type OpusMagnumApiValidateAutoResponses = {
/**
* OK
*/
200: PuzzleResponseOut;
};
export type SubmissionsApiValidateAutoResponse = SubmissionsApiValidateAutoResponses[keyof SubmissionsApiValidateAutoResponses];
export type OpusMagnumApiValidateAutoResponse = OpusMagnumApiValidateAutoResponses[keyof OpusMagnumApiValidateAutoResponses];
export type SubmissionsApiListResponsesNeedingValidationData = {
export type OpusMagnumApiListResponsesNeedingValidationData = {
body?: never;
path?: never;
query?: never;
url: '/api/submissions/responses/needs-validation';
url: '/api/opus-magnum/responses/needs-validation';
};
export type SubmissionsApiListResponsesNeedingValidationResponses = {
export type OpusMagnumApiListResponsesNeedingValidationResponses = {
/**
* Response
*
@ -1293,9 +1293,9 @@ export type SubmissionsApiListResponsesNeedingValidationResponses = {
200: Array<PuzzleResponseOut>;
};
export type SubmissionsApiListResponsesNeedingValidationResponse = SubmissionsApiListResponsesNeedingValidationResponses[keyof SubmissionsApiListResponsesNeedingValidationResponses];
export type OpusMagnumApiListResponsesNeedingValidationResponse = OpusMagnumApiListResponsesNeedingValidationResponses[keyof OpusMagnumApiListResponsesNeedingValidationResponses];
export type SubmissionsApiValidateSubmissionData = {
export type OpusMagnumApiValidateSubmissionData = {
body?: never;
path: {
/**
@ -1304,26 +1304,26 @@ export type SubmissionsApiValidateSubmissionData = {
submission_id: string;
};
query?: never;
url: '/api/submissions/submissions/{submission_id}/validate';
url: '/api/opus-magnum/submissions/{submission_id}/validate';
};
export type SubmissionsApiValidateSubmissionResponses = {
export type OpusMagnumApiValidateSubmissionResponses = {
/**
* OK
*/
200: SubmissionOut;
};
export type SubmissionsApiValidateSubmissionResponse = SubmissionsApiValidateSubmissionResponses[keyof SubmissionsApiValidateSubmissionResponses];
export type OpusMagnumApiValidateSubmissionResponse = OpusMagnumApiValidateSubmissionResponses[keyof OpusMagnumApiValidateSubmissionResponses];
export type SubmissionsApiGetStatsData = {
export type OpusMagnumApiGetStatsData = {
body?: never;
path?: never;
query?: never;
url: '/api/submissions/stats';
url: '/api/opus-magnum/stats';
};
export type SubmissionsApiGetStatsResponses = {
export type OpusMagnumApiGetStatsResponses = {
/**
* OK
*/

View File

@ -109,11 +109,11 @@ export class ApiService {
// Puzzle endpoints
async getPuzzles(): Promise<ApiResponse<SteamCollectionItem[]>> {
return this.request<SteamCollectionItem[]>('/submissions/puzzles')
return this.request<SteamCollectionItem[]>('/opus-magnum/puzzles')
}
async getCollection(): Promise<ApiResponse<SteamCollection>> {
return this.request<SteamCollection>('/submissions/collection')
return this.request<SteamCollection>('/opus-magnum/collection')
}
async getTopSubmissions(limit = 5): Promise<ApiResponse<TournamentSubmissions>> {
@ -127,12 +127,12 @@ export class ApiService {
// Submission endpoints
async getSubmissions(limit = 20, offset = 0): Promise<ApiResponse<PaginatedResponse<Submission>>> {
return this.request<PaginatedResponse<Submission>>(
`/submissions/submissions?limit=${limit}&offset=${offset}`
`/opus-magnum/submissions?limit=${limit}&offset=${offset}`
)
}
async getSubmission(id: string): Promise<ApiResponse<Submission>> {
return this.request<Submission>(`/submissions/submissions/${id}`)
return this.request<Submission>(`/opus-magnum/submissions/${id}`)
}
async createSubmission(
@ -163,7 +163,7 @@ export class ApiService {
formData.append('files', file)
})
return this.uploadRequest<Submission>('/submissions/submissions', formData)
return this.uploadRequest<Submission>('/opus-magnum/submissions', formData)
}
// Admin endpoints (require staff permissions)
@ -175,37 +175,37 @@ export class ApiService {
validated_area?: number
}
): Promise<ApiResponse<PuzzleResponse>> {
return this.request<PuzzleResponse>(`/submissions/responses/${responseId}/validate`, {
return this.request<PuzzleResponse>(`/opus-magnum/responses/${responseId}/validate`, {
method: 'PUT',
body: JSON.stringify(validationData),
})
}
async autoValidateResponses(responseId: number): Promise<ApiResponse<PuzzleResponse>> {
return this.request<PuzzleResponse>(`/submissions/responses/${responseId}/validate/auto`, {
return this.request<PuzzleResponse>(`/opus-magnum/responses/${responseId}/validate/auto`, {
method: 'PUT',
})
}
async getResponsesNeedingValidation(): Promise<ApiResponse<PuzzleResponse[]>> {
return this.request<PuzzleResponse[]>('/submissions/responses/needs-validation')
return this.request<PuzzleResponse[]>('/opus-magnum/responses/needs-validation')
}
async validateSubmission(submissionId: string): Promise<ApiResponse<Submission>> {
return this.request<Submission>(`/submissions/submissions/${submissionId}/validate`, {
return this.request<Submission>(`/opus-magnum/submissions/${submissionId}/validate`, {
method: 'POST',
})
}
async deleteSubmission(submissionId: string): Promise<ApiResponse<{ detail: string }>> {
return this.request<{ detail: string }>(`/submissions/submissions/${submissionId}`, {
return this.request<{ detail: string }>(`/opus-magnum/submissions/${submissionId}`, {
method: 'DELETE',
})
}
// Statistics endpoint
async getStats(): Promise<ApiResponse<SubmissionStats>> {
return this.request<SubmissionStats>('/submissions/stats')
return this.request<SubmissionStats>('/opus-magnum/stats')
}
// Health check

View File

@ -1,6 +1,6 @@
import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { submissionsApiListPuzzles } from '@/api'
import { opusMagnumApiListPuzzles } from '@/api'
import type { SteamCollectionItem } from '@/types'
export const usePuzzlesStore = defineStore('puzzles', () => {
@ -38,7 +38,7 @@ export const usePuzzlesStore = defineStore('puzzles', () => {
isLoading.value = true
error.value = ''
const response = await submissionsApiListPuzzles()
const response = await opusMagnumApiListPuzzles()
if (response.error) {
error.value = String(response.error)
console.error('Failed to load puzzles:', response.error)

View File

@ -1 +1 @@
import{d as v,r as l,q as g,a as o,o as r,b as e,j as f,F as x,g as h,t as y,f as _,E as w}from"./style-BkYIZIDm.js";import{g as k}from"./sdk.gen-CMTwTM_A.js";const j={class:"min-h-screen bg-base-300 flex items-center justify-center px-4"},S={class:"w-full max-w-6xl"},E={key:0,class:"flex justify-center py-20"},C={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-8"},N=["onClick"],$={class:"relative h-60 bg-base-300 overflow-hidden"},A=["src","alt","onError"],B={key:1,class:"w-full h-full bg-gradient-to-br from-blue-600 to-blue-400 flex items-center justify-center text-white"},L={class:"card-body"},P={class:"card-title text-2xl"},V=v({__name:"Home",setup(F){const i=l(),n=l(!0),d=l(new Set),u=s=>`https://cdn.akamai.steamstatic.com/steam/apps/${s}/header.jpg`,b=s=>{d.value.add(s)},c=s=>{window.location.href=s};return g(async()=>{const s=await k();s.data&&(i.value=s.data),n.value=!1}),(s,t)=>(r(),o("div",j,[e("div",S,[t[6]||(t[6]=e("div",{class:"text-center mb-12"},[e("h1",{class:"text-5xl font-bold mb-4"},"PolyLAN Submitter"),e("p",{class:"text-xl text-base-content/70"}," Choose a game and submit your best solutions ")],-1)),n.value?(r(),o("div",E,[...t[1]||(t[1]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(r(),o("div",C,[e("div",{onClick:t[0]||(t[0]=a=>c("/market")),class:"card card-xl bg-base-200 shadow-xl hover:shadow-2xl transition-all cursor-pointer transform hover:-translate-y-2 hover:scale-[1.05] hover:bg-base-100 overflow-hidden"},[...t[2]||(t[2]=[f('<figure class="relative h-60 bg-gradient-to-br from-purple-600 to-blue-600 flex items-center justify-center"><i class="mdi mdi-chart-box text-6xl text-white opacity-80"></i><div class="absolute inset-0 bg-black/30 group-hover:bg-black/20 transition-colors"></div></figure><div class="card-body"><h2 class="card-title text-2xl">Market</h2><p class="text-base-content/70">Place your bets and compete</p><div class="card-actions justify-end mt-4"><button class="btn btn-primary"><i class="mdi mdi-arrow-right mr-2"></i> Place bets </button></div></div>',2)])]),(r(!0),o(x,null,h(i.value,a=>(r(),o("div",{key:a.steam_app_id,onClick:p=>c(a.path),class:"card card-xl bg-base-200 shadow-xl hover:shadow-2xl transition-all cursor-pointer transform hover:-translate-y-2 hover:scale-[1.05] hover:bg-base-100 overflow-hidden"},[e("figure",$,[d.value.has(a.steam_app_id)?(r(),o("div",B,[...t[3]||(t[3]=[e("i",{class:"mdi mdi-gamepad-variant text-5xl"},null,-1)])])):(r(),o("img",{key:0,src:u(a.steam_app_id),alt:a.name,onError:p=>b(a.steam_app_id),class:"w-full h-full object-cover"},null,40,A)),t[4]||(t[4]=e("div",{class:"absolute inset-0 bg-black/30 group-hover:bg-black/20 transition-colors"},null,-1))]),e("div",L,[e("h2",P,y(a.name),1),t[5]||(t[5]=e("div",{class:"card-actions justify-end mt-4"},[e("button",{class:"btn btn-primary"},[e("i",{class:"mdi mdi-arrow-right mr-2"}),_(" Submit results ")])],-1))])],8,N))),128))])),t[7]||(t[7]=e("div",{class:"text-center mt-12 text-base-content/50"},[e("p",null,"Select a game above to begin submitting")],-1))])]))}}),m="#app",q=document.querySelector(m),D=w(V,{...q?.dataset});D.mount(m);
import{d as v,r as l,q as g,a as o,o as r,b as e,j as f,F as x,g as h,t as y,f as _,E as w}from"./style-BkYIZIDm.js";import{g as k}from"./sdk.gen-CA3PL0uK.js";const j={class:"min-h-screen bg-base-300 flex items-center justify-center px-4"},S={class:"w-full max-w-6xl"},E={key:0,class:"flex justify-center py-20"},C={key:1,class:"grid grid-cols-1 md:grid-cols-2 gap-8"},N=["onClick"],$={class:"relative h-60 bg-base-300 overflow-hidden"},A=["src","alt","onError"],B={key:1,class:"w-full h-full bg-gradient-to-br from-blue-600 to-blue-400 flex items-center justify-center text-white"},L={class:"card-body"},P={class:"card-title text-2xl"},V=v({__name:"Home",setup(F){const i=l(),n=l(!0),d=l(new Set),u=s=>`https://cdn.akamai.steamstatic.com/steam/apps/${s}/header.jpg`,b=s=>{d.value.add(s)},c=s=>{window.location.href=s};return g(async()=>{const s=await k();s.data&&(i.value=s.data),n.value=!1}),(s,t)=>(r(),o("div",j,[e("div",S,[t[6]||(t[6]=e("div",{class:"text-center mb-12"},[e("h1",{class:"text-5xl font-bold mb-4"},"PolyLAN Submitter"),e("p",{class:"text-xl text-base-content/70"}," Choose a game and submit your best solutions ")],-1)),n.value?(r(),o("div",E,[...t[1]||(t[1]=[e("span",{class:"loading loading-spinner loading-lg"},null,-1)])])):(r(),o("div",C,[e("div",{onClick:t[0]||(t[0]=a=>c("/market")),class:"card card-xl bg-base-200 shadow-xl hover:shadow-2xl transition-all cursor-pointer transform hover:-translate-y-2 hover:scale-[1.05] hover:bg-base-100 overflow-hidden"},[...t[2]||(t[2]=[f('<figure class="relative h-60 bg-gradient-to-br from-purple-600 to-blue-600 flex items-center justify-center"><i class="mdi mdi-chart-box text-6xl text-white opacity-80"></i><div class="absolute inset-0 bg-black/30 group-hover:bg-black/20 transition-colors"></div></figure><div class="card-body"><h2 class="card-title text-2xl">Market</h2><p class="text-base-content/70">Place your bets and compete</p><div class="card-actions justify-end mt-4"><button class="btn btn-primary"><i class="mdi mdi-arrow-right mr-2"></i> Place bets </button></div></div>',2)])]),(r(!0),o(x,null,h(i.value,a=>(r(),o("div",{key:a.steam_app_id,onClick:p=>c(a.path),class:"card card-xl bg-base-200 shadow-xl hover:shadow-2xl transition-all cursor-pointer transform hover:-translate-y-2 hover:scale-[1.05] hover:bg-base-100 overflow-hidden"},[e("figure",$,[d.value.has(a.steam_app_id)?(r(),o("div",B,[...t[3]||(t[3]=[e("i",{class:"mdi mdi-gamepad-variant text-5xl"},null,-1)])])):(r(),o("img",{key:0,src:u(a.steam_app_id),alt:a.name,onError:p=>b(a.steam_app_id),class:"w-full h-full object-cover"},null,40,A)),t[4]||(t[4]=e("div",{class:"absolute inset-0 bg-black/30 group-hover:bg-black/20 transition-colors"},null,-1))]),e("div",L,[e("h2",P,y(a.name),1),t[5]||(t[5]=e("div",{class:"card-actions justify-end mt-4"},[e("button",{class:"btn btn-primary"},[e("i",{class:"mdi mdi-arrow-right mr-2"}),_(" Submit results ")])],-1))])],8,N))),128))])),t[7]||(t[7]=e("div",{class:"text-center mt-12 text-base-content/50"},[e("p",null,"Select a game above to begin submitting")],-1))])]))}}),m="#app",q=document.querySelector(m),D=w(V,{...q?.dataset});D.mount(m);

View File

@ -6,8 +6,8 @@
"_style-BkYIZIDm.js"
]
},
"_sdk.gen-CMTwTM_A.js": {
"file": "assets/sdk.gen-CMTwTM_A.js",
"_sdk.gen-CA3PL0uK.js": {
"file": "assets/sdk.gen-CA3PL0uK.js",
"name": "sdk.gen"
},
"_style-B5FWYd7r.css": {
@ -44,13 +44,13 @@
"src": "node_modules/.pnpm/@mdi+font@7.4.47/node_modules/@mdi/font/fonts/materialdesignicons-webfont.woff2"
},
"src/home.ts": {
"file": "assets/home-CYjKnyvD.js",
"file": "assets/home-Bd8zSeuF.js",
"name": "home",
"src": "src/home.ts",
"isEntry": true,
"imports": [
"_style-BkYIZIDm.js",
"_sdk.gen-CMTwTM_A.js"
"_sdk.gen-CA3PL0uK.js"
]
},
"src/noita.ts": {
@ -64,14 +64,14 @@
]
},
"src/opus-magnum.ts": {
"file": "assets/opus_magnum-DdwCzot1.js",
"file": "assets/opus_magnum-CX0R2B7z.js",
"name": "opus_magnum",
"src": "src/opus-magnum.ts",
"isEntry": true,
"imports": [
"_style-BkYIZIDm.js",
"_index-C0ZY4EM6.js",
"_sdk.gen-CMTwTM_A.js"
"_sdk.gen-CA3PL0uK.js"
]
}
}