import VocabService from '../services/vocabService.js'; function extractHashedUserId(req) { return req.headers?.userid; } class VocabController { constructor() { this.service = new VocabService(); this.listLanguages = this._wrapWithUser((userId) => this.service.listLanguages(userId)); this.createLanguage = this._wrapWithUser((userId, req) => this.service.createLanguage(userId, req.body), { successStatus: 201 }); this.subscribe = this._wrapWithUser((userId, req) => this.service.subscribeByShareCode(userId, req.body), { successStatus: 201 }); this.getLanguage = this._wrapWithUser((userId, req) => this.service.getLanguage(userId, req.params.languageId)); this.listChapters = this._wrapWithUser((userId, req) => this.service.listChapters(userId, req.params.languageId)); this.createChapter = this._wrapWithUser((userId, req) => this.service.createChapter(userId, req.params.languageId, req.body), { successStatus: 201 }); this.listLanguageVocabs = this._wrapWithUser((userId, req) => this.service.listLanguageVocabs(userId, req.params.languageId)); this.getChapter = this._wrapWithUser((userId, req) => this.service.getChapter(userId, req.params.chapterId)); this.listChapterVocabs = this._wrapWithUser((userId, req) => this.service.listChapterVocabs(userId, req.params.chapterId)); this.addVocabToChapter = this._wrapWithUser((userId, req) => this.service.addVocabToChapter(userId, req.params.chapterId, req.body), { successStatus: 201 }); } _wrapWithUser(fn, { successStatus = 200 } = {}) { return async (req, res) => { try { const hashedUserId = extractHashedUserId(req); if (!hashedUserId) { return res.status(400).json({ error: 'Missing user identifier' }); } const result = await fn(hashedUserId, req, res); res.status(successStatus).json(result); } catch (error) { console.error('Controller error:', error); const status = error.status && typeof error.status === 'number' ? error.status : 500; res.status(status).json({ error: error.message || 'Internal error' }); } }; } } export default VocabController;