| export const userRatingSchema = { | |
| summary: 'Get User Rating', | |
| description: 'Fetches AtCoder user rating, rank, and platform details', | |
| tags: ['AtCoder'], | |
| querystring: { | |
| type: 'object', | |
| properties: { | |
| username: { type: 'string', description: 'AtCoder username' }, | |
| }, | |
| required: ['username'], | |
| }, | |
| response: { | |
| 200: { | |
| type: 'object', | |
| properties: { | |
| username: { type: 'string' }, | |
| display_name: { type: 'string' }, | |
| platform: { type: 'string' }, | |
| rating: { type: 'number' }, | |
| max_rating: { type: 'number' }, | |
| level: { type: 'string' }, | |
| rank: { type: 'string' }, | |
| contests_participated: { type: 'number' }, | |
| last_competed: { type: 'string' }, | |
| kyu: { type: 'string' }, | |
| country: { type: 'string' }, | |
| birth_year: { type: 'string' }, | |
| avatar: { type: 'string' }, | |
| rating_history: { | |
| type: 'array', | |
| items: { | |
| type: 'object', | |
| properties: { | |
| IsRated: { type: 'boolean' }, | |
| Place: { type: 'number' }, | |
| OldRating: { type: 'number' }, | |
| NewRating: { type: 'number' }, | |
| Performance: { type: 'number' }, | |
| InnerPerformance: { type: 'number' }, | |
| ContestScreenName: { type: 'string' }, | |
| ContestName: { type: 'string' }, | |
| ContestNameEn: { type: 'string' }, | |
| EndTime: { type: 'string' }, | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| export const userHistorySchema = { | |
| summary: 'Get User History', | |
| description: 'Fetches AtCoder user rating history directly from the JSON endpoint', | |
| tags: ['AtCoder'], | |
| querystring: { | |
| type: 'object', | |
| properties: { | |
| username: { type: 'string', description: 'AtCoder username' }, | |
| }, | |
| required: ['username'], | |
| }, | |
| response: { | |
| 200: { | |
| type: 'array', | |
| items: { | |
| type: 'object', | |
| properties: { | |
| IsRated: { type: 'boolean' }, | |
| Place: { type: 'number' }, | |
| OldRating: { type: 'number' }, | |
| NewRating: { type: 'number' }, | |
| Performance: { type: 'number' }, | |
| InnerPerformance: { type: 'number' }, | |
| ContestScreenName: { type: 'string' }, | |
| ContestName: { type: 'string' }, | |
| ContestNameEn: { type: 'string' }, | |
| EndTime: { type: 'string' }, | |
| } | |
| } | |
| } | |
| } | |
| }; | |
| export const contestStandingsSchema = { | |
| summary: 'Get Contest Standings', | |
| description: 'Fetches AtCoder contest standings in JSON format', | |
| tags: ['AtCoder'], | |
| querystring: { | |
| type: 'object', | |
| properties: { | |
| contestId: { type: 'string', description: 'AtCoder contest ID (e.g., abc300)' }, | |
| extended: { type: 'boolean', description: 'Whether to fetch extended standings' }, | |
| }, | |
| required: ['contestId'], | |
| }, | |
| response: { | |
| 200: { | |
| type: 'object', | |
| additionalProperties: true | |
| } | |
| } | |
| }; | |
| export const contestResultsSchema = { | |
| summary: 'Get Contest Results', | |
| description: 'Fetches AtCoder contest results in JSON format', | |
| tags: ['AtCoder'], | |
| querystring: { | |
| type: 'object', | |
| properties: { | |
| contestId: { type: 'string', description: 'AtCoder contest ID' }, | |
| }, | |
| required: ['contestId'], | |
| }, | |
| response: { | |
| 200: { | |
| type: 'object', | |
| additionalProperties: true | |
| } | |
| } | |
| }; | |
| export const virtualStandingsSchema = { | |
| summary: 'Get Virtual Standings', | |
| description: 'Fetches AtCoder virtual standings in JSON format', | |
| tags: ['AtCoder'], | |
| querystring: { | |
| type: 'object', | |
| properties: { | |
| contestId: { type: 'string', description: 'AtCoder contest ID' }, | |
| showGhost: { type: 'boolean', description: 'Whether to show ghost entries' }, | |
| }, | |
| required: ['contestId'], | |
| }, | |
| response: { | |
| 200: { | |
| type: 'object', | |
| additionalProperties: true | |
| } | |
| } | |
| }; | |