Przeglądaj źródła

Remove posts via a scade on thread destroy, remove reports manually because cascade is not working

sbkwgh 7 lat temu
rodzic
commit
668bfa7841
3 zmienionych plików z 17 dodań i 4 usunięć
  1. 2 0
      models/post.js
  2. 1 1
      models/thread.js
  3. 14 3
      routes/thread.js

+ 2 - 0
models/post.js

@@ -46,6 +46,8 @@ module.exports = (sequelize, DataTypes) => {
 				Post.belongsTo(models.Thread)
 				Post.hasMany(models.Post, { as: 'Replies', foreignKey: 'replyId' })
 				Post.belongsToMany(models.User, { as: 'Likes', through: 'user_post' })
+
+				Post.hasMany(models.Report, { foreignKeyConstraint: true, onDelete: 'CASCADE', hooks: true })
 			},
 			includeOptions () {
 				let models = sequelize.models

+ 1 - 1
models/thread.js

@@ -95,7 +95,7 @@ module.exports = (sequelize, DataTypes) => {
 				Thread.belongsTo(models.User)
 				Thread.belongsTo(models.Category)
 				Thread.belongsTo(models.PollQuestion)
-				Thread.hasMany(models.Post)
+				Thread.hasMany(models.Post, { foreignKeyConstraint: true, onDelete: 'CASCADE' })
 			},
 			includeOptions (from, limit) {
 				let models = sequelize.models

+ 14 - 3
routes/thread.js

@@ -2,7 +2,7 @@ let express = require('express')
 let router = express.Router()
 
 const Errors = require('../lib/errors.js')
-let { User, Thread, Category, Post, Ban, Sequelize } = require('../models')
+let { User, Thread, Category, Post, Ban, Report, Sequelize } = require('../models')
 let pagination = require('../lib/pagination.js')
 
 router.get('/:thread_id', async (req, res) => {
@@ -121,11 +121,22 @@ router.delete('/:thread_id', async (req, res) => {
 				value: req.params.thread_id
 			})
 		} else {
-			await Post.destroy({
+			//Find all posts with reports and get reports
+			//Then delete those reports
+			//Temporary fix because cascade is not working
+			let posts = await Post.findAll({
 				where: {
 					ThreadId: thread.id
-				}
+				},
+				include: [Report]
 			})
+			let reports = posts
+				.map(post => post.Reports)
+				.reduce((a, b) => a.concat(b), [])
+			
+			let destroyPromises = reports.map(report => report.destroy())
+
+			await Promise.all(destroyPromises)
 			await thread.destroy()
 
 			res.json({ success: true })