reports.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. 'use strict';
  2. const async = require('async');
  3. const db = require('../db');
  4. const cache = require('../cache');
  5. const utils = require('../utils');
  6. const hooks = require('./hooks');
  7. const songs = require('../songs');
  8. cache.sub('report.resolve', reportId => {
  9. utils.emitToRoom('admin.reports', 'event:admin.report.resolved', reportId);
  10. });
  11. module.exports = {
  12. index: hooks.adminRequired((session, cb) => {
  13. db.models.report.find({ resolved: false }).sort({ released: 'desc' }).exec((err, reports) => {
  14. if (err) {
  15. console.error(err);
  16. cb({ 'status': 'failure', 'message': 'Something went wrong'});
  17. }
  18. cb({ status: 'success', data: reports });
  19. });
  20. }),
  21. resolve: hooks.adminRequired((session, _id, cb) => {
  22. db.models.report.findOne({ _id }).sort({ released: 'desc' }).exec((err, report) => {
  23. if (err) {
  24. console.error(err);
  25. cb({ 'status': 'failure', 'message': 'Something went wrong'});
  26. }
  27. report.resolved = true;
  28. report.save(err => {
  29. if (err) console.error(err);
  30. else {
  31. cache.pub('report.resolve', _id);
  32. cb({ status: 'success', message: 'Successfully resolved Report' });
  33. }
  34. });
  35. });
  36. }),
  37. create: hooks.loginRequired((session, data, cb, userId) => {
  38. async.waterfall([
  39. (next) => {
  40. songs.getSong(data.songId, (err, song) => {
  41. if (err) return next(err);
  42. if (!song) return next('Song does not exist in our Database');
  43. next();
  44. });
  45. },
  46. (next) => {
  47. let issues = [
  48. {
  49. name: 'Video',
  50. reasons: [
  51. 'Doesn\'t exist',
  52. 'It\'s private',
  53. 'It\'s not available in my country'
  54. ]
  55. },
  56. {
  57. name: 'Title',
  58. reasons: [
  59. 'Incorrect',
  60. 'Inappropriate'
  61. ]
  62. },
  63. {
  64. name: 'Duration',
  65. reasons: [
  66. 'Skips too soon',
  67. 'Skips too late',
  68. 'Starts too soon',
  69. 'Skips too late'
  70. ]
  71. },
  72. {
  73. name: 'Artists',
  74. reasons: [
  75. 'Incorrect',
  76. 'Inappropriate'
  77. ]
  78. },
  79. {
  80. name: 'Thumbnail',
  81. reasons: [
  82. 'Incorrect',
  83. 'Inappropriate',
  84. 'Doesn\'t exist'
  85. ]
  86. }
  87. ];
  88. for (let z = 0; z < data.issues.length; z++) {
  89. if (issues.filter(issue => { return issue.name == data.issues[z].name; }).length > 0) {
  90. for (let r = 0; r < issues.length; r++) {
  91. if (issues[r].reasons.every(reason => data.issues[z].reasons.indexOf(reason) < -1)) {
  92. return cb({ 'status': 'failure', 'message': 'Invalid data' });
  93. }
  94. }
  95. } else return cb({ 'status': 'failure', 'message': 'Invalid data' });
  96. }
  97. next();
  98. },
  99. (next) => {
  100. data.createdBy = userId;
  101. data.createdAt = Date.now();
  102. db.models.report.create(data, next);
  103. }
  104. ], err => {
  105. if (err) return cb({ 'status': 'failure', 'message': 'Something went wrong'});
  106. return cb({ 'status': 'success', 'message': 'Successfully created report' });
  107. });
  108. })
  109. };