338 lines
9.4 KiB
JavaScript
338 lines
9.4 KiB
JavaScript
const express = require('express');
|
||
const router = express.Router();
|
||
const vocabController = require('../controllers/vocabController');
|
||
const { authenticateToken } = require('../middleware/auth');
|
||
|
||
/**
|
||
* @swagger
|
||
* tags:
|
||
* name: Vocabulary
|
||
* description: Vocabulary management system for curriculum-based language learning
|
||
*/
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab:
|
||
* post:
|
||
* summary: Create a new vocabulary entry
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* requestBody:
|
||
* required: true
|
||
* content:
|
||
* application/json:
|
||
* schema:
|
||
* $ref: '#/components/schemas/VocabComplete'
|
||
* example:
|
||
* vocab_code: "vocab-001-eat"
|
||
* base_word: "eat"
|
||
* translation: "ăn"
|
||
* attributes:
|
||
* difficulty_score: 1
|
||
* category: "Action Verbs"
|
||
* images:
|
||
* - "https://cdn.sena.tech/img/eat-main.png"
|
||
* - "https://cdn.sena.tech/img/eat-context.jpg"
|
||
* tags: ["daily-routine", "verb"]
|
||
* mappings:
|
||
* - book_id: "global-success-1"
|
||
* grade: 1
|
||
* unit: 2
|
||
* lesson: 3
|
||
* form_key: "v1"
|
||
* - book_id: "global-success-2"
|
||
* grade: 2
|
||
* unit: 5
|
||
* lesson: 1
|
||
* form_key: "v_ing"
|
||
* forms:
|
||
* v1:
|
||
* text: "eat"
|
||
* phonetic: "/iːt/"
|
||
* audio: "https://cdn.sena.tech/audio/eat_v1.mp3"
|
||
* min_grade: 1
|
||
* v_s_es:
|
||
* text: "eats"
|
||
* phonetic: "/iːts/"
|
||
* audio: "https://cdn.sena.tech/audio/eats_s.mp3"
|
||
* min_grade: 2
|
||
* v_ing:
|
||
* text: "eating"
|
||
* phonetic: "/ˈiː.tɪŋ/"
|
||
* audio: "https://cdn.sena.tech/audio/eating_ing.mp3"
|
||
* min_grade: 2
|
||
* v2:
|
||
* text: "ate"
|
||
* phonetic: "/et/"
|
||
* audio: "https://cdn.sena.tech/audio/ate_v2.mp3"
|
||
* min_grade: 3
|
||
* relations:
|
||
* synonyms: ["consume", "dine"]
|
||
* antonyms: ["fast", "starve"]
|
||
* syntax:
|
||
* is_subject: false
|
||
* is_verb: true
|
||
* is_object: false
|
||
* is_be: false
|
||
* is_adj: false
|
||
* verb_type: "transitive"
|
||
* semantics:
|
||
* can_be_subject_type: ["human", "animal"]
|
||
* can_take_object_type: ["food", "plant"]
|
||
* word_type: "action"
|
||
* constraints:
|
||
* requires_object: true
|
||
* semantic_object_types: ["food", "plant"]
|
||
* responses:
|
||
* 201:
|
||
* description: Vocabulary created successfully
|
||
* 400:
|
||
* description: Invalid input
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.post('/', authenticateToken, vocabController.createVocab);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab:
|
||
* get:
|
||
* summary: Get all vocabulary entries with pagination and filters
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* parameters:
|
||
* - in: query
|
||
* name: page
|
||
* schema:
|
||
* type: integer
|
||
* default: 1
|
||
* description: Page number
|
||
* - in: query
|
||
* name: limit
|
||
* schema:
|
||
* type: integer
|
||
* default: 20
|
||
* description: Items per page
|
||
* - in: query
|
||
* name: category
|
||
* schema:
|
||
* type: string
|
||
* description: Filter by category (e.g., "Action Verbs")
|
||
* - in: query
|
||
* name: grade
|
||
* schema:
|
||
* type: integer
|
||
* description: Filter by grade level
|
||
* - in: query
|
||
* name: book_id
|
||
* schema:
|
||
* type: string
|
||
* description: Filter by book ID (e.g., "global-success-1")
|
||
* - in: query
|
||
* name: difficulty_min
|
||
* schema:
|
||
* type: integer
|
||
* description: Minimum difficulty score
|
||
* - in: query
|
||
* name: difficulty_max
|
||
* schema:
|
||
* type: integer
|
||
* description: Maximum difficulty score
|
||
* - in: query
|
||
* name: search
|
||
* schema:
|
||
* type: string
|
||
* description: Search in base_word, translation, or vocab_code
|
||
* - in: query
|
||
* name: include_relations
|
||
* schema:
|
||
* type: string
|
||
* enum: ['true', 'false']
|
||
* default: 'false'
|
||
* description: Include synonyms/antonyms in response
|
||
* responses:
|
||
* 200:
|
||
* description: List of vocabularies
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.get('/', authenticateToken, vocabController.getAllVocabs);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab/curriculum:
|
||
* get:
|
||
* summary: Get vocabularies by curriculum mapping
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* parameters:
|
||
* - in: query
|
||
* name: book_id
|
||
* required: false
|
||
* schema:
|
||
* type: string
|
||
* description: Book ID (e.g., "global-success-1")
|
||
* - in: query
|
||
* name: grade
|
||
* required: false
|
||
* schema:
|
||
* type: integer
|
||
* description: Grade level
|
||
* - in: query
|
||
* name: unit
|
||
* schema:
|
||
* type: integer
|
||
* description: Unit number
|
||
* - in: query
|
||
* name: lesson
|
||
* schema:
|
||
* type: integer
|
||
* description: Lesson number
|
||
* responses:
|
||
* 200:
|
||
* description: List of vocabularies for the specified curriculum
|
||
* 400:
|
||
* description: Invalid parameters
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.get('/curriculum', authenticateToken, vocabController.getVocabsByCurriculum);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab/guide:
|
||
* get:
|
||
* summary: Get comprehensive guide for AI to create vocabulary entries
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* responses:
|
||
* 200:
|
||
* description: Complete guide with rules, examples, and data structures
|
||
* content:
|
||
* application/json:
|
||
* schema:
|
||
* type: object
|
||
* properties:
|
||
* guide_version:
|
||
* type: string
|
||
* last_updated:
|
||
* type: string
|
||
* data_structure:
|
||
* type: object
|
||
* rules:
|
||
* type: object
|
||
* examples:
|
||
* type: object
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.get('/guide', authenticateToken, vocabController.getVocabGuide);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab/stats:
|
||
* get:
|
||
* summary: Get vocabulary statistics
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* responses:
|
||
* 200:
|
||
* description: Vocabulary statistics
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.get('/stats', authenticateToken, vocabController.getVocabStats);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab/{id}:
|
||
* get:
|
||
* summary: Get vocabulary by ID or code
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* parameters:
|
||
* - in: path
|
||
* name: id
|
||
* required: true
|
||
* schema:
|
||
* type: string
|
||
* description: Vocabulary ID (numeric) or vocab_code (string)
|
||
* responses:
|
||
* 200:
|
||
* description: Vocabulary details
|
||
* 404:
|
||
* description: Vocabulary not found
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.get('/:id', authenticateToken, vocabController.getVocabById);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab/{id}:
|
||
* put:
|
||
* summary: Update vocabulary entry
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* parameters:
|
||
* - in: path
|
||
* name: id
|
||
* required: true
|
||
* schema:
|
||
* type: string
|
||
* description: Vocabulary ID (numeric) or vocab_code (string)
|
||
* requestBody:
|
||
* required: true
|
||
* content:
|
||
* application/json:
|
||
* schema:
|
||
* $ref: '#/components/schemas/VocabComplete'
|
||
* example:
|
||
* translation: "ăn uống"
|
||
* attributes:
|
||
* difficulty_score: 2
|
||
* tags: ["daily-routine", "verb", "food"]
|
||
* responses:
|
||
* 200:
|
||
* description: Vocabulary updated successfully
|
||
* 404:
|
||
* description: Vocabulary not found
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.put('/:id', authenticateToken, vocabController.updateVocab);
|
||
|
||
/**
|
||
* @swagger
|
||
* /api/vocab/{id}:
|
||
* delete:
|
||
* summary: Delete vocabulary (soft delete)
|
||
* tags: [Vocabulary]
|
||
* security:
|
||
* - bearerAuth: []
|
||
* parameters:
|
||
* - in: path
|
||
* name: id
|
||
* required: true
|
||
* schema:
|
||
* type: string
|
||
* description: Vocabulary ID (numeric) or vocab_code (string)
|
||
* responses:
|
||
* 200:
|
||
* description: Vocabulary deleted successfully
|
||
* 404:
|
||
* description: Vocabulary not found
|
||
* 500:
|
||
* description: Server error
|
||
*/
|
||
router.delete('/:id', authenticateToken, vocabController.deleteVocab);
|
||
|
||
module.exports = router;
|