assetFolders.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. const Model = require('objection').Model
  2. const _ = require('lodash')
  3. /**
  4. * Users model
  5. */
  6. module.exports = class AssetFolder extends Model {
  7. static get tableName() { return 'assetFolders' }
  8. static get jsonSchema () {
  9. return {
  10. type: 'object',
  11. properties: {
  12. id: {type: 'integer'},
  13. name: {type: 'string'},
  14. slug: {type: 'string'}
  15. }
  16. }
  17. }
  18. static get relationMappings() {
  19. return {
  20. parent: {
  21. relation: Model.BelongsToOneRelation,
  22. modelClass: AssetFolder,
  23. join: {
  24. from: 'assetFolders.folderId',
  25. to: 'assetFolders.id'
  26. }
  27. }
  28. }
  29. }
  30. /**
  31. * Get full folder hierarchy starting from specified folder to root
  32. *
  33. * @param {Number} folderId Id of the folder
  34. */
  35. static async getHierarchy (folderId) {
  36. let hier
  37. if (WIKI.config.db.type === 'mssql') {
  38. hier = await WIKI.db.knex.with('ancestors', qb => {
  39. qb.select('id', 'name', 'slug', 'parentId').from('assetFolders').where('id', folderId).unionAll(sqb => {
  40. sqb.select('a.id', 'a.name', 'a.slug', 'a.parentId').from('assetFolders AS a').join('ancestors', 'ancestors.parentId', 'a.id')
  41. })
  42. }).select('*').from('ancestors')
  43. } else {
  44. hier = await WIKI.db.knex.withRecursive('ancestors', qb => {
  45. qb.select('id', 'name', 'slug', 'parentId').from('assetFolders').where('id', folderId).union(sqb => {
  46. sqb.select('a.id', 'a.name', 'a.slug', 'a.parentId').from('assetFolders AS a').join('ancestors', 'ancestors.parentId', 'a.id')
  47. })
  48. }).select('*').from('ancestors')
  49. }
  50. // The ancestors are from children to grandparents, must reverse for correct path order.
  51. return _.reverse(hier)
  52. }
  53. /**
  54. * Get full folder paths
  55. */
  56. static async getAllPaths () {
  57. const all = await WIKI.db.assetFolders.query()
  58. let folders = {}
  59. all.forEach(fld => {
  60. _.set(folders, fld.id, fld.slug)
  61. let parentId = fld.parentId
  62. while (parentId !== null || parentId > 0) {
  63. const parent = _.find(all, ['id', parentId])
  64. _.set(folders, fld.id, `${parent.slug}/${_.get(folders, fld.id)}`)
  65. parentId = parent.parentId
  66. }
  67. })
  68. return folders
  69. }
  70. }