From ce1519c424dac644fd660b2d66b12b645788d720 Mon Sep 17 00:00:00 2001 From: YadaDelta Date: Tue, 21 May 2024 20:13:24 +0400 Subject: [PATCH 1/5] news crud --- app.js | 1 + .../20240521155203-news_deleted_column.cjs | 29 +++++++ routes/news.js | 79 +++++++++++++++++++ 3 files changed, 109 insertions(+) create mode 100644 migrations/20240521155203-news_deleted_column.cjs create mode 100644 routes/news.js diff --git a/app.js b/app.js index 4dce2c8..c2b830f 100644 --- a/app.js +++ b/app.js @@ -17,6 +17,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/routes/news.js b/routes/news.js new file mode 100644 index 0000000..514b08d --- /dev/null +++ b/routes/news.js @@ -0,0 +1,79 @@ +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(`Все новости: ${JSON.stringify(news, null, 2)}`); + } catch (e) { + res.status(503).send(`Ошибка базы данных: ${e}`); + } +}); + +newsRouter.post('/', async (req, res) => { + try { + const thisNews = await News.findOrCreate({ + where: { + header: req.body.header, + }, + defaults: { + userId: req.body.userId, + header: req.body.header, + imageSrc: req.body.imageSrc, + text: req.body.text, + }, + }); + res.status(201).send(`id: ${JSON.stringify(thisNews[0].id, null, 2)}`); + } catch (e) { + res.status(400).send(`Ошибка создания новости: ${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(`Новость ${id}: ${newsInfo}`); + } else { + res.status(404).send('Новость не найдена!'); + } +}); + +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(`Новость ${id} обновлена`); + } catch (error) { + res.status(400).send(`Ошибка: ${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('Новость не найдена!'); + return; + } + + res.send('Новость успешно удалена!'); + } catch (error) { + console.error('Ошибка при удалении новости:', error); + res.status(500).send('Произошла ошибка при удалении новости.'); + } +}); + +export default newsRouter; From b9415090b31693c9e3ea0338a18a29cd712c0636 Mon Sep 17 00:00:00 2001 From: YadaDelta Date: Tue, 21 May 2024 20:18:41 +0400 Subject: [PATCH 2/5] add isDeleted column --- app.js | 1 + models/news.js | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 models/news.js diff --git a/app.js b/app.js index c2b830f..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; diff --git a/models/news.js b/models/news.js new file mode 100644 index 0000000..54bf573 --- /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', + }, + }, + header: { + 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; From bdc30b7c26f0a76d32f460b4a008335c8b2eb091 Mon Sep 17 00:00:00 2001 From: YadaDelta Date: Fri, 24 May 2024 19:15:42 +0400 Subject: [PATCH 3/5] header to title --- routes/news.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/news.js b/routes/news.js index 514b08d..9dd1342 100644 --- a/routes/news.js +++ b/routes/news.js @@ -20,7 +20,7 @@ newsRouter.post('/', async (req, res) => { }, defaults: { userId: req.body.userId, - header: req.body.header, + title: req.body.title, imageSrc: req.body.imageSrc, text: req.body.text, }, From 6de43a9c03b0a0c857b94d5657715d804bca85e3 Mon Sep 17 00:00:00 2001 From: YadaDelta Date: Fri, 24 May 2024 19:16:27 +0400 Subject: [PATCH 4/5] header to title --- routes/news.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routes/news.js b/routes/news.js index 9dd1342..9d42280 100644 --- a/routes/news.js +++ b/routes/news.js @@ -16,7 +16,7 @@ newsRouter.post('/', async (req, res) => { try { const thisNews = await News.findOrCreate({ where: { - header: req.body.header, + title: req.body.title, }, defaults: { userId: req.body.userId, From 35270d31bd68553490a232b234fc9f8b1fbfdfce Mon Sep 17 00:00:00 2001 From: YadaDelta Date: Tue, 28 May 2024 21:27:24 +0400 Subject: [PATCH 5/5] some fixes --- models/news.js | 2 +- routes/news.js | 37 ++++++++++++++++--------------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/models/news.js b/models/news.js index 54bf573..aded0b3 100644 --- a/models/news.js +++ b/models/news.js @@ -18,7 +18,7 @@ const model = News.init( key: 'id', }, }, - header: { + title: { type: DataTypes.TEXT, validate: { notEmpty: true, diff --git a/routes/news.js b/routes/news.js index 9d42280..02fa6dc 100644 --- a/routes/news.js +++ b/routes/news.js @@ -6,28 +6,23 @@ const newsRouter = express.Router(); newsRouter.get('/', async (req, res) => { try { const news = await News.findAll({}); - res.status(200).send(`Все новости: ${JSON.stringify(news, null, 2)}`); + res.status(200).send(news); } catch (e) { - res.status(503).send(`Ошибка базы данных: ${e}`); + res.status(503).send({ message: `Ошибка базы данных: ${e}` }); } }); newsRouter.post('/', async (req, res) => { try { - const thisNews = await News.findOrCreate({ - where: { - title: req.body.title, - }, - defaults: { - userId: req.body.userId, - title: req.body.title, - imageSrc: req.body.imageSrc, - text: req.body.text, - }, + 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(`id: ${JSON.stringify(thisNews[0].id, null, 2)}`); + res.status(201).send(thisNews.id); } catch (e) { - res.status(400).send(`Ошибка создания новости: ${e}`); + res.status(400).send({ message: `Ошибка создания новости: ${e}` }); } }); @@ -38,9 +33,9 @@ newsRouter.get('/:id', async (req, res) => { }); const newsInfo = JSON.stringify(news, null, 2); if (newsInfo.length - 2 !== 0) { - res.status(200).send(`Новость ${id}: ${newsInfo}`); + res.status(200).send(news); } else { - res.status(404).send('Новость не найдена!'); + res.status(404).send({ message: 'Новость не найдена!' }); } }); @@ -50,9 +45,9 @@ newsRouter.put('/:id', async (req, res) => { const obj = req.body; const news = await News.findOne({ where: { id } }); news.update(obj); - res.status(200).send(`Новость ${id} обновлена`); + res.status(200).send({ message: `Новость ${id} обновлена` }); } catch (error) { - res.status(400).send(`Ошибка: ${error}`); + res.status(400).send({ message: `Ошибка: ${error}` }); } }); @@ -65,14 +60,14 @@ newsRouter.delete('/:id', async (req, res) => { ); if (updatedRowsCount === 0) { - res.status(404).send('Новость не найдена!'); + res.status(404).send({ message: 'Новость не найдена!' }); return; } - res.send('Новость успешно удалена!'); + res.send({ message: 'Новость успешно удалена!' }); } catch (error) { console.error('Ошибка при удалении новости:', error); - res.status(500).send('Произошла ошибка при удалении новости.'); + res.status(500).send({ message: 'Произошла ошибка при удалении новости.' }); } });