thread.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. let slug = require('slug')
  2. module.exports = (sequelize, DataTypes) => {
  3. let Thread = sequelize.define('Thread', {
  4. name: {
  5. type: DataTypes.TEXT,
  6. set (val) {
  7. this.setDataValue('name', val)
  8. this.setDataValue('slug', slug(val).toLowerCase())
  9. }
  10. },
  11. slug: DataTypes.TEXT,
  12. postsCount: {
  13. type: DataTypes.INTEGER,
  14. defaultValue: 0
  15. },
  16. locked: {
  17. type: DataTypes.BOOLEAN,
  18. defaultValue: false
  19. }
  20. }, {
  21. instanceMethods: {
  22. async getMeta (limit) {
  23. let meta = {}
  24. let posts = this.Posts
  25. let firstPost = posts[0]
  26. let lastPost = posts.slice(-1)[0]
  27. //next url
  28. if(!lastPost || lastPost.postNumber+1 === this.postsCount) {
  29. meta.nextURL = null
  30. } else {
  31. meta.nextURL =
  32. `/api/v1/thread/${this.id}?limit=${limit}&from=${lastPost.postNumber + 1}`
  33. }
  34. //previous url
  35. if(!firstPost || firstPost.postNumber === 0) {
  36. meta.previousURL = null
  37. } else if(firstPost.postNumber - limit < 0) {
  38. meta.previousURL =
  39. `/api/v1/thread/${this.id}?limit=${firstPost.postNumber}&from=0`
  40. } else {
  41. meta.previousURL =
  42. `/api/v1/thread/${this.id}?limit=${limit}&from=${firstPost.postNumber - limit}`
  43. }
  44. //remaining posts
  45. if(lastPost === undefined) {
  46. meta.nextPostsCount = 0
  47. meta.previousPostsCount = 0
  48. meta.postsRemaining = 0
  49. } else {
  50. let postsRemaining =
  51. this.postsCount - lastPost.postNumber - 1
  52. meta.postsRemaining = postsRemaining
  53. if(postsRemaining < limit) {
  54. meta.nextPostsCount = postsRemaining
  55. } else {
  56. meta.nextPostsCount = limit
  57. }
  58. if(firstPost.postNumber === 0) {
  59. meta.previousPostsCount = 0
  60. } else if(firstPost.postNumber - limit < 0) {
  61. meta.previousPostsCount = firstPost.postNumber
  62. } else {
  63. meta.previousPostsCount = limit
  64. }
  65. }
  66. return meta
  67. }
  68. },
  69. classMethods: {
  70. associate (models) {
  71. Thread.belongsTo(models.User)
  72. Thread.belongsTo(models.Category)
  73. Thread.hasMany(models.Post)
  74. },
  75. includeOptions (from, limit) {
  76. let models = sequelize.models
  77. return [
  78. { model: models.User, attributes: ['username', 'createdAt', 'color', 'updatedAt', 'id'] },
  79. models.Category,
  80. {
  81. model: models.Post,
  82. where: { postNumber: { $gte: from } },
  83. order: [['id', 'ASC']],
  84. limit,
  85. include: [
  86. { model: models.Thread, attributes: ['slug'] },
  87. { model: models.User, as: 'Likes', attributes: ['username', 'createdAt', 'id', 'color'] },
  88. { model: models.User, attributes: ['username', 'createdAt', 'id', 'color'] },
  89. {
  90. model: models.Post, as: 'Replies', include:
  91. [{ model: models.User, attributes: ['username', 'id', 'color'] }]
  92. }
  93. ]
  94. }
  95. ]
  96. }
  97. }
  98. })
  99. return Thread
  100. }