Source: download/index.js

  1. /**
  2. * @module download
  3. */
  4. const courseService = require("../course");
  5. const videoService = require("../video");
  6. const fs = require("fs");
  7. const log = require("../../util/log");
  8. const {Parser} = require('json2csv');
  9. const AdmZip = require('adm-zip');
  10. const rimraf = require('rimraf');
  11. const fields = ['id', 'title', 'hyperlink', 'capabilityTitle', 'capabilityId',
  12. 'categoryTitle', 'categoryId', 'competencyTitle', 'competencyId', 'phases'];
  13. const opts = {fields};
  14. fs.existsSync("./exports") || fs.mkdirSync("./exports");
  15. /**
  16. * Export stored learning objects to various archive formats
  17. * if export files do not yet exist.
  18. */
  19. const generateExportFiles = async () => {
  20. if (
  21. fs.existsSync("./exports/rdf-mapped-combined.json") &&
  22. fs.existsSync("./exports/rdf-mapped-courses.json") &&
  23. fs.existsSync("./exports/rdf-mapped-videos.json") &&
  24. fs.existsSync("./exports/rdf-mapped-courses.csv") &&
  25. fs.existsSync("./exports/rdf-mapped-videos.csv") &&
  26. fs.existsSync("./exports/rdf-mapped-combined.zip")
  27. ) {
  28. // all export files present
  29. return;
  30. }
  31. const courses = await courseService.fetchAllWithUniqueTitles();
  32. const videos = await videoService.fetchAllWithUniqueTitles();
  33. if (!fs.existsSync("./exports/rdf-mapped-combined.json")) {
  34. log.info("Generating JSON export of course & video data..");
  35. const exportObject = {
  36. courses,
  37. videos,
  38. };
  39. fs.writeFileSync("./exports/rdf-mapped-combined.json", JSON.stringify(exportObject));
  40. }
  41. if (!fs.existsSync("./exports/rdf-mapped-courses.json")) {
  42. log.info("Generating JSON export of course data..");
  43. fs.writeFileSync("./exports/rdf-mapped-courses.json", JSON.stringify(courses));
  44. }
  45. if (!fs.existsSync("./exports/rdf-mapped-videos.json")) {
  46. log.info("Generating JSON export of video data..");
  47. fs.writeFileSync("./exports/rdf-mapped-videos.json", JSON.stringify(videos));
  48. }
  49. if (!fs.existsSync("./exports/rdf-mapped-courses.csv")) {
  50. log.info("Generating CSV export of course data..");
  51. const parser = new Parser(opts);
  52. const csv = parser.parse(courses);
  53. fs.writeFileSync("./exports/rdf-mapped-courses.csv", csv);
  54. }
  55. if (!fs.existsSync("./exports/rdf-mapped-videos.csv")) {
  56. log.info("Generating CSV export of video data..");
  57. const parser = new Parser(opts);
  58. const csv = parser.parse(videos);
  59. fs.writeFileSync("./exports/rdf-mapped-videos.csv", csv);
  60. }
  61. if (!fs.existsSync("./exports/rdf-mapped-combined.zip")) {
  62. log.info("Generating zipped CSV export of course & video data..");
  63. const zip = new AdmZip();
  64. zip.addLocalFile("./exports/rdf-mapped-courses.csv");
  65. zip.addLocalFile("./exports/rdf-mapped-videos.csv");
  66. zip.writeZip("./exports/rdf-mapped-combined.zip");
  67. }
  68. };
  69. /**
  70. * Delete all archives, i.e. clear the export folder.
  71. * This is often called after database changes to ensure
  72. * archives are up to date.
  73. */
  74. const deleteExportFiles = () => {
  75. rimraf("./exports/*", () => {
  76. log.info("Cleared exports folder");
  77. });
  78. };
  79. module.exports = {
  80. generateExportFiles,
  81. deleteExportFiles,
  82. };