thread.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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, posts) {
  23. let meta = {}
  24. let firstPost = posts[0]
  25. let lastPost = posts.slice(-1)[0]
  26. //next url
  27. if(!lastPost || lastPost.postNumber+1 === this.postsCount) {
  28. meta.nextURL = null
  29. } else {
  30. meta.nextURL =
  31. `/api/v1/thread/${this.id}?limit=${limit}&from=${lastPost.postNumber + 1}`
  32. }
  33. //previous url
  34. if(!firstPost || firstPost.postNumber === 0) {
  35. meta.previousURL = null
  36. } else if(firstPost.postNumber - limit < 0) {
  37. meta.previousURL =
  38. `/api/v1/thread/${this.id}?limit=${firstPost.postNumber}&from=0`
  39. } else {
  40. meta.previousURL =
  41. `/api/v1/thread/${this.id}?limit=${limit}&from=${firstPost.postNumber - limit}`
  42. }
  43. //remaining posts
  44. if(lastPost === undefined) {
  45. meta.nextPostsCount = 0
  46. meta.previousPostsCount = 0
  47. meta.postsRemaining = 0
  48. } else {
  49. let postsRemaining =
  50. this.postsCount - lastPost.postNumber - 1
  51. meta.postsRemaining = postsRemaining
  52. if(postsRemaining < limit) {
  53. meta.nextPostsCount = postsRemaining
  54. } else {
  55. meta.nextPostsCount = limit
  56. }
  57. if(firstPost.postNumber === 0) {
  58. meta.previousPostsCount = 0
  59. } else if(firstPost.postNumber - limit < 0) {
  60. meta.previousPostsCount = firstPost.postNumber
  61. } else {
  62. meta.previousPostsCount = limit
  63. }
  64. }
  65. return meta
  66. }
  67. },
  68. classMethods: {
  69. associate (models) {
  70. Thread.belongsTo(models.User)
  71. Thread.belongsTo(models.Category)
  72. Thread.hasMany(models.Post)
  73. },
  74. includeOptions (from, limit) {
  75. let models = sequelize.models
  76. return [
  77. { model: models.User, attributes: ['username', 'createdAt', 'color', 'updatedAt', 'id'] },
  78. models.Category,
  79. {
  80. model: models.Post,
  81. where: { postNumber: { $gte: from } },
  82. order: [['id', 'ASC']],
  83. limit,
  84. include: [
  85. { model: models.Thread, attributes: ['slug'] },
  86. { model: models.User, as: 'Likes', attributes: ['username', 'createdAt', 'id', 'color'] },
  87. { model: models.User, attributes: ['username', 'createdAt', 'id', 'color'] },
  88. {
  89. model: models.Post, as: 'Replies', include:
  90. [{ model: models.User, attributes: ['username', 'id', 'color'] }]
  91. }
  92. ]
  93. }
  94. ]
  95. }
  96. }
  97. })
  98. return Thread
  99. }