- Implemented a new searchVocabs method in VocabService to allow users to search for vocabulary based on learning and mother tongue terms. - Updated VocabController to include the searchVocabs method wrapped with user authentication. - Added a new route in vocabRouter for searching vocabulary by language ID. - Enhanced VocabChapterView and VocabLanguageView components to include a button for opening the search dialog. - Added translations for search-related terms in both German and English locales, improving user accessibility.
47 lines
2.3 KiB
JavaScript
47 lines
2.3 KiB
JavaScript
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.searchVocabs = this._wrapWithUser((userId, req) => this.service.searchVocabs(userId, req.params.languageId, req.query));
|
|
|
|
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;
|
|
|
|
|