Files
sena_db_api_layer/routes/vocabRoutes.js
silverpro89 816794a861
All checks were successful
Deploy to Production / deploy (push) Successful in 23s
update
2026-01-27 18:33:35 +07:00

338 lines
9.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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('/', 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;