const { DataTypes } = require('sequelize'); const { sequelize } = require('../config/database'); const Vocab = sequelize.define('Vocab', { vocab_id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true, comment: 'Unique identifier for vocabulary entry' }, // Từ thực tế (wash, washes, washing, ate, eaten...) text: { type: DataTypes.STRING(100), allowNull: false, index: true }, // Từ gốc để nhóm lại (wash, eat...) base_word: { type: DataTypes.STRING(100), allowNull: false, index: true }, // Đã xuất hiện trong khối nào, bài học nào, lesson nào // Ví dụ 111 là grade 1, unit 1, lesson 1 location: { type: DataTypes.INTEGER, defaultValue: 100, comment: 'It is number of gradeX100 + unitX10 + lesson (e.g., Grade 1 Unit 2 Lesson 3 = 123)' }, // Loại biến thể (V1, V2, V3, V_ing, Noun_Form...) form_key: { type: DataTypes.STRING(20), defaultValue: 'base' }, // Nội dung dùng chung (có thể lưu JSON để dễ quản lý hoặc dùng chung cho cả group) translation: { type: DataTypes.STRING(200) }, difficulty_score: { type: DataTypes.INTEGER, defaultValue: 1, comment: 'Difficulty level (1-10)' }, category: { type: DataTypes.STRING(100), comment: 'Category of the word (e.g., Action Verbs, Nouns)' }, topic: { type: DataTypes.STRING(100), comment: 'Topic of the word (e.g., Food, Travel, Education)' }, images: { type: DataTypes.JSON, comment: 'Array of image URLs' }, tags: { type: DataTypes.JSON, comment: 'Array of tags for categorization' }, syntax: { type: DataTypes.JSON, comment: 'Syntax roles for Grammar Engine (is_subject, is_verb, is_object, is_be, is_adj, is_adv, is_article, verb_type, article_type, adv_type, position, priority, etc.)' }, semantics: { type: DataTypes.JSON, comment: 'Semantic constraints (can_be_subject_type, can_take_object_type, can_modify, cannot_modify, word_type, is_countable, person_type, etc.)' }, constraints: { type: DataTypes.JSON, comment: 'Grammar constraints (followed_by, match_subject, match_with, phonetic_rules, etc.)' }, is_active: { type: DataTypes.BOOLEAN, defaultValue: true, comment: 'Whether this vocab entry is active' }, created_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW }, updated_at: { type: DataTypes.DATE, defaultValue: DataTypes.NOW } }, { tableName: 'vocab', timestamps: true, createdAt: 'created_at', updatedAt: 'updated_at', indexes: [ { name: 'idx_vocab_text', fields: ['text'] }, { name: 'idx_base_word', fields: ['base_word'] }, { name: 'idx_category', fields: ['category'] }, { name: 'idx_location', fields: ['location'] } ] }); module.exports = Vocab;