diff --git a/app.js b/app.js index 4dce2c8..b417c78 100644 --- a/app.js +++ b/app.js @@ -1,6 +1,7 @@ import Express from 'express'; import db from './models/index.js'; import userRouter from './routes/user.js'; +import newsRouter from './routes/news.js'; const app = Express(); const port = 3000; @@ -17,6 +18,7 @@ app.use(Express.json()); // Роуты app.use('/user', userRouter); +app.use('/news', newsRouter); app.listen(port, () => { console.log(`Bards Express app listening on port ${port}`); diff --git a/migrations/20240521155203-news_deleted_column.cjs b/migrations/20240521155203-news_deleted_column.cjs new file mode 100644 index 0000000..69db071 --- /dev/null +++ b/migrations/20240521155203-news_deleted_column.cjs @@ -0,0 +1,29 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + return queryInterface.sequelize.transaction(t => { + return Promise.all([ + queryInterface.addColumn( + 'News', + 'isDeleted', + { + type: Sequelize.BOOLEAN, + defaultValue: false, + allowNull: false, + }, + { transaction: t }, + ), + ]); + }); + }, + + async down (queryInterface, Sequelize) { + return queryInterface.sequelize.transaction(t => { + return Promise.all([ + queryInterface.removeColumn('News', 'isDeleted', { transaction: t }), + ]); + }); + } +}; diff --git a/models/news.js b/models/news.js new file mode 100644 index 0000000..aded0b3 --- /dev/null +++ b/models/news.js @@ -0,0 +1,54 @@ +import { DataTypes, Model } from 'sequelize'; +import db from './index.js'; +import user from './user.js'; + +class News extends Model {} + +const model = News.init( + { + id: { + type: DataTypes.BIGINT, + autoIncrement: true, + primaryKey: true, + }, + userId: { + type: DataTypes.INTEGER, + references: { + model: user, + key: 'id', + }, + }, + title: { + type: DataTypes.TEXT, + validate: { + notEmpty: true, + }, + }, + createdAt: { + type: DataTypes.DATE, + defaultValue: DataTypes.NOW, + }, + updatedAt: { + type: DataTypes.DATE, + defaultValue: DataTypes.NOW, + }, + imageSrc: DataTypes.TEXT, + text: DataTypes.TEXT, + isDeleted: { + type: DataTypes.BOOLEAN, + defaultValue: false, + allowNull: false, + }, + }, + { + sequelize: db, + tableName: 'News', + timestamps: true, + createdAt: 'createdAt', + updatedAt: 'updatedAt', + }, +); + +model.belongsTo(user, { foreignKey: 'userId' }); + +export default model; diff --git a/routes/news.js b/routes/news.js new file mode 100644 index 0000000..02fa6dc --- /dev/null +++ b/routes/news.js @@ -0,0 +1,74 @@ +import express from 'express'; +import News from '../models/news.js'; + +const newsRouter = express.Router(); + +newsRouter.get('/', async (req, res) => { + try { + const news = await News.findAll({}); + res.status(200).send(news); + } catch (e) { + res.status(503).send({ message: `Ошибка базы данных: ${e}` }); + } +}); + +newsRouter.post('/', async (req, res) => { + try { + const thisNews = await News.create({ + userId: req.body.userId, + title: req.body.title, + imageSrc: req.body.imageSrc, + text: req.body.text, + }); + res.status(201).send(thisNews.id); + } catch (e) { + res.status(400).send({ message: `Ошибка создания новости: ${e}` }); + } +}); + +newsRouter.get('/:id', async (req, res) => { + const { id } = req.params; + const news = await News.findAll({ + where: { id }, + }); + const newsInfo = JSON.stringify(news, null, 2); + if (newsInfo.length - 2 !== 0) { + res.status(200).send(news); + } else { + res.status(404).send({ message: 'Новость не найдена!' }); + } +}); + +newsRouter.put('/:id', async (req, res) => { + try { + const { id } = req.params; + const obj = req.body; + const news = await News.findOne({ where: { id } }); + news.update(obj); + res.status(200).send({ message: `Новость ${id} обновлена` }); + } catch (error) { + res.status(400).send({ message: `Ошибка: ${error}` }); + } +}); + +newsRouter.delete('/:id', async (req, res) => { + try { + const { id } = req.params; + const [updatedRowsCount] = await News.update( + { isDeleted: true }, + { where: { id } }, + ); + + if (updatedRowsCount === 0) { + res.status(404).send({ message: 'Новость не найдена!' }); + return; + } + + res.send({ message: 'Новость успешно удалена!' }); + } catch (error) { + console.error('Ошибка при удалении новости:', error); + res.status(500).send({ message: 'Произошла ошибка при удалении новости.' }); + } +}); + +export default newsRouter;