importer.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. 'use strict';
  2. const extract = require('extract-zip')
  3. const config = require('config')
  4. const fs = require('fs')
  5. const path = require('path')
  6. const db = require('../models/db')
  7. const Sequelize = require('sequelize')
  8. const Op = Sequelize.Op
  9. const uuidv4 = require('uuid/v4')
  10. require('../models/db')
  11. module.exports = {
  12. importZIP: function(user, zipPath) {
  13. // 1. extract zip to local storage folder
  14. // 2. read spaces.json from this folder
  15. // 3. iterate through spaces and read all their artifact jsons
  16. // 4. fixup storage paths
  17. // 5. replace creator id by user._id
  18. let relativeImportDir = 'import_'+user._id
  19. let importDir = path.resolve(config.get('storage_local_path')+'/'+config.get('storage_bucket')+'/'+relativeImportDir)
  20. if (!fs.existsSync(importDir)) {
  21. fs.mkdirSync(importDir)
  22. }
  23. extract(zipPath, {dir: importDir}, function(err) {
  24. if (err) {
  25. console.log(err)
  26. return
  27. }
  28. console.log('[import] extracted to',importDir)
  29. let spacesJson = fs.readFileSync(importDir+'/spaces.json')
  30. let spaces = JSON.parse(spacesJson)
  31. var homeFolderId = null
  32. console.log('[import] spaces:',spaces.length)
  33. // pass 1: find homefolder
  34. for (var i=0; i<spaces.length; i++) {
  35. let space = spaces[i]
  36. if (!space.parent_space_id) {
  37. homeFolderId = space._id
  38. break
  39. }
  40. }
  41. console.log("[import] homeFolderId:",homeFolderId)
  42. for (var i=0; i<spaces.length; i++) {
  43. let space = spaces[i]
  44. if (space.parent_space_id) {
  45. let artifacts = JSON.parse(fs.readFileSync(importDir+'/'+space._id+'_artifacts.json'))
  46. console.log('[import] space',space._id,'artifacts:',artifacts.length)
  47. //let q = {where: {_id: space._id}}
  48. space.creator_id = user._id
  49. delete space.__v
  50. // transplant homefolder
  51. console.log("parent:",space.parent_space_id)
  52. if (space.parent_space_id+"" == homeFolderId+"") {
  53. space.parent_space_id = user.home_folder_id
  54. }
  55. // move nested attrs
  56. console.log(space)
  57. for (k in space.advanced) {
  58. space[k] = space.advanced[k]
  59. }
  60. db.Space.create(space)
  61. .error((err) => {
  62. console.error("[import] space upsert err:",err)
  63. })
  64. for (var j=0; j<artifacts.length; j++) {
  65. let a = artifacts[j]
  66. let q = {_id: a._id}
  67. a.user_id = user._id
  68. delete a.__v
  69. delete a.payload_thumbnail_big_uri
  70. // move nested attrs
  71. for (k in a.style) {
  72. a[k] = a.style[k]
  73. }
  74. for (k in a.meta) {
  75. a[k] = a.meta[k]
  76. }
  77. for (k in a.board) {
  78. a[k] = a.board[k]
  79. }
  80. let prefix = "/storage/"+relativeImportDir+"/"+space._id+"_files/"
  81. if (a.thumbnail_uri && a.thumbnail_uri[0]!='/') a.thumbnail_uri = prefix + a.thumbnail_uri
  82. if (a.payload_uri && a.payload_uri[0]!='/') a.payload_uri = prefix + a.payload_uri
  83. if (a.payload_thumbnail_web_uri && a.payload_thumbnail_web_uri[0]!='/') a.payload_thumbnail_web_uri = prefix + a.payload_thumbnail_web_uri
  84. if (a.payload_thumbnail_medium_uri && a.payload_thumbnail_medium_uri[0]!='/') a.payload_thumbnail_medium_uri = prefix + a.payload_thumbnail_medium_uri
  85. if (a.payload_alternatives) {
  86. for (var k=0; k<a.payload_alternatives.length; k++) {
  87. let alt = a.payload_alternatives[k]
  88. if (alt.payload_uri && alt.payload_uri[0]!='/') alt.payload_uri = prefix + alt.payload_uri
  89. if (alt.payload_thumbnail_web_uri && alt.payload_thumbnail_web_uri[0]!='/') alt.payload_thumbnail_web_uri = prefix + alt.payload_thumbnail_web_uri
  90. if (alt.payload_thumbnail_medium_uri && alt.payload_thumbnail_medium_uri[0]!='/') alt.payload_thumbnail_medium_uri = prefix + alt.payload_thumbnail_medium_uri
  91. }
  92. }
  93. db.packArtifact(a)
  94. db.Artifact.create(a).error(function(err) {
  95. console.error("[import] artifact upsert err:",err)
  96. })
  97. }
  98. }
  99. }
  100. })
  101. }
  102. }