/
TimurIsm
/
OpenEyes
Обзор
Документация
Войти
/
TimurIsm
/
OpenEyes
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
back/controllers/articlesController.js
148 строк
6 KB
TimurIsm
first_commit
16 май 2026, 15:34
16 май 2026, 15:34
4d3f198
Код
Авторство
О чём код?
const {Articles} = require('../models/models') const ApiError = require('../error/ApiError') const { Op } = require('sequelize'); const { deepTrim } = require('../utils/stringUtils'); const MAX_TITLE_LENGTH = 60; const MAX_DESCRIPTION_LENGTH = 250; class ArticlesController { async create(req, res, next) { try { let { title, description, content } = req.body; title = deepTrim(title); description = deepTrim(description); content = deepTrim(content); if (!title || !description || !content) { return next(ApiError.badRequest('Все поля обязательны для заполнения!')); } if (title.length > MAX_TITLE_LENGTH) { return next(ApiError.badRequest(`Название статьи не может превышать ${MAX_TITLE_LENGTH} символов!`)); } if (description.length > MAX_DESCRIPTION_LENGTH) { return next(ApiError.badRequest(`Краткое описание не может превышать ${MAX_DESCRIPTION_LENGTH} символов!`)); } const existingArticle = await Articles.findOne({ where: { title } }); if (existingArticle) { return next(ApiError.badRequest('Статья с таким названием уже существует!')); } const articles = await Articles.create({ title, description, content, adminId: req.user.id }); return res.json(articles); } catch (e) { return next(ApiError.internal('Ошибка при создании статьи!')); } } async getArticlesList(req, res, next) { try { const articles = await Articles.findAll(); return res.json(articles); } catch (e) { return next(ApiError.internal('Ошибка при получении всех статей!')); } } async getAll(req, res, next) { try { let {limit, page, sort} = req.query; page = parseInt(page) || 1; limit = parseInt(limit) || 9; const offset = (page - 1) * limit; const order = sort ? [sort.split(',')] : [['id', 'ASC']]; const { count, rows} = await Articles.findAndCountAll({ limit, offset, order }); return res.json({ count, rows }); } catch (e) { return next(ApiError.internal('Ошибка при получении статей!')); } } async getOne(req, res, next) { const { id } = req.params; try { const article = await Articles.findOne({where: { id } }) if (!article) { return next(ApiError.internal('Статья не найдена!')) } return res.json(article) } catch (e) { return next(ApiError.internal('Ошибка при получении статьи!')) } } async delete(req, res, next) { const { id } = req.params try { const article = await Articles.destroy({ where: { id }}) if (!article) { return next(ApiError.internal('Статья не найдена!')) } return res.json({ message: 'Статья успешно удалена' }); } catch (e) { return next(ApiError.internal('Ошибка при удалении статьи!')) } } async update(req, res, next) { const { id } = req.params; let { title, description, content } = req.body; try { title = deepTrim(title); description = deepTrim(description); content = deepTrim(content); if (!title || !description || !content) { return next(ApiError.badRequest('Все поля обязательны для заполнения!')); } const article = await Articles.findOne({ where: { id } }); if (!article) { return next(ApiError.internal('Статья не найдена!')); } if (title.length > MAX_TITLE_LENGTH) { return next(ApiError.badRequest(`Название статьи не может превышать ${MAX_TITLE_LENGTH} символов!`)); } if (description.length > MAX_DESCRIPTION_LENGTH) { return next(ApiError.badRequest(`Краткое описание не может превышать ${MAX_DESCRIPTION_LENGTH} символов!`)); } const existingArticle = await Articles.findOne({ where: { title, id: { [Op.ne]: id } } }); if (existingArticle) { return next(ApiError.badRequest('Статья с таким названием уже существует!')); } await Articles.update({ title, description, content }, { where: { id } }); return res.json({ message: 'Статья успешно обновлена' }); } catch (e) { return next(ApiError.internal('Ошибка при обновлении статьи!')); } } } module.exports = new ArticlesController()