| # Crossword Puzzle API Specification |
|
|
| ## Base URL |
| - Development: `http://localhost:3000/api` |
| - Production: `https://your-backend-domain.com/api` |
|
|
| ## Authentication |
| No authentication required for this MVP version. |
|
|
| ## Endpoints |
|
|
| ### GET /topics |
| Retrieve all available topics for crossword generation. |
|
|
| **Response:** |
| ```json |
| { |
| "topics": [ |
| { |
| "id": 1, |
| "name": "Animals", |
| "description": "Creatures from the animal kingdom" |
| }, |
| { |
| "id": 2, |
| "name": "Science", |
| "description": "Scientific terms and concepts" |
| } |
| ] |
| } |
| ``` |
|
|
| **Status Codes:** |
| - `200 OK` - Success |
| - `500 Internal Server Error` - Database error |
|
|
| --- |
|
|
| ### POST /generate |
| Generate a new crossword puzzle based on selected topics and difficulty. |
|
|
| **Request Body:** |
| ```json |
| { |
| "topics": ["Animals", "Science"], |
| "difficulty": "medium", |
| "gridSize": 15 |
| } |
| ``` |
|
|
| **Parameters:** |
| - `topics` (string[]): Array of topic names to include |
| - `difficulty` (string): "easy" | "medium" | "hard" |
| - `gridSize` (number, optional): Grid size (default: 15) |
|
|
| **Response:** |
| ```json |
| { |
| "puzzle": { |
| "id": "puzzle_123", |
| "grid": [ |
| [ |
| { "letter": "D", "number": 1, "isBlocked": false }, |
| { "letter": "", "number": null, "isBlocked": true } |
| ] |
| ], |
| "clues": { |
| "across": [ |
| { |
| "number": 1, |
| "clue": "Man's best friend", |
| "answer": "DOG", |
| "startRow": 0, |
| "startCol": 0, |
| "length": 3 |
| } |
| ], |
| "down": [ |
| { |
| "number": 2, |
| "clue": "Feline pet", |
| "answer": "CAT", |
| "startRow": 0, |
| "startCol": 2, |
| "length": 3 |
| } |
| ] |
| }, |
| "metadata": { |
| "difficulty": "medium", |
| "topics": ["Animals"], |
| "wordCount": 8, |
| "generatedAt": "2024-01-15T10:30:00Z" |
| } |
| } |
| } |
| ``` |
|
|
| **Status Codes:** |
| - `200 OK` - Puzzle generated successfully |
| - `400 Bad Request` - Invalid request parameters |
| - `422 Unprocessable Entity` - Unable to generate puzzle with given constraints |
| - `500 Internal Server Error` - Generation failed |
|
|
| --- |
|
|
| ### POST /validate |
| Validate user answers against the puzzle solution. |
|
|
| **Request Body:** |
| ```json |
| { |
| "puzzleId": "puzzle_123", |
| "answers": { |
| "1_across": "DOG", |
| "2_down": "CAT" |
| } |
| } |
| ``` |
|
|
| **Response:** |
| ```json |
| { |
| "validation": { |
| "isComplete": false, |
| "correctCount": 1, |
| "totalCount": 2, |
| "results": { |
| "1_across": { |
| "correct": true, |
| "expected": "DOG", |
| "provided": "DOG" |
| }, |
| "2_down": { |
| "correct": false, |
| "expected": "CAT", |
| "provided": "CAR" |
| } |
| } |
| } |
| } |
| ``` |
|
|
| **Status Codes:** |
| - `200 OK` - Validation completed |
| - `400 Bad Request` - Invalid puzzle ID or answers format |
| - `404 Not Found` - Puzzle not found |
| - `500 Internal Server Error` - Validation failed |
|
|
| --- |
|
|
| ### GET /words/:topic (Admin/Development) |
| Retrieve all words for a specific topic. Useful for development and debugging. |
|
|
| **Parameters:** |
| - `topic` (string): Topic name |
|
|
| **Response:** |
| ```json |
| { |
| "topic": "Animals", |
| "words": [ |
| { |
| "id": 1, |
| "word": "DOG", |
| "length": 3, |
| "difficulty": 1, |
| "clues": [ |
| { |
| "id": 1, |
| "text": "Man's best friend", |
| "difficulty": 1 |
| } |
| ] |
| } |
| ] |
| } |
| ``` |
|
|
| **Status Codes:** |
| - `200 OK` - Words retrieved |
| - `404 Not Found` - Topic not found |
| - `500 Internal Server Error` - Database error |
|
|
| ## Error Response Format |
|
|
| All error responses follow this format: |
|
|
| ```json |
| { |
| "error": { |
| "code": "VALIDATION_ERROR", |
| "message": "Invalid difficulty level", |
| "details": { |
| "field": "difficulty", |
| "allowedValues": ["easy", "medium", "hard"] |
| } |
| } |
| } |
| ``` |
|
|
| ## Rate Limiting |
|
|
| - Generate endpoint: 10 requests per minute per IP |
| - Other endpoints: 100 requests per minute per IP |
|
|
| ## CORS Configuration |
|
|
| - Allowed origins: Frontend domain(s) |
| - Allowed methods: GET, POST, OPTIONS |
| - Allowed headers: Content-Type, Authorization |
|
|
| ## Data Types |
|
|
| ### Grid Cell |
| ```typescript |
| interface GridCell { |
| letter: string; // Empty string for user input cells |
| number: number | null; // Clue number if cell starts a word |
| isBlocked: boolean; // True for black squares |
| } |
| ``` |
|
|
| ### Clue |
| ```typescript |
| interface Clue { |
| number: number; // Clue number |
| clue: string; // Clue text |
| answer: string; // Expected answer |
| startRow: number; // Starting row in grid |
| startCol: number; // Starting column in grid |
| length: number; // Word length |
| } |
| ``` |
|
|
| ### Puzzle Metadata |
| ```typescript |
| interface PuzzleMetadata { |
| difficulty: 'easy' | 'medium' | 'hard'; |
| topics: string[]; |
| wordCount: number; |
| generatedAt: string; // ISO timestamp |
| } |
| ``` |