api.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. const mime = require("mime-types");
  2. const fs = require('fs');
  3. const Path = require('path');
  4. const Security = require('../src/security.js');
  5. const MediaService = require('../model/mediaService.js');
  6. const { AccessModel, ACCESS_TYPE } = require('../model/access.js');
  7. module.exports = { register: app => {
  8. app.router.get("/api/access/list", (req, res) => {
  9. app.routerUtils.onApiRequest(req, res);
  10. app.routerUtils.jsonResponse(res, req.sessionObj?.accessList || {});
  11. });
  12. app.router.post("/api/access/link", async (req, res) => { // /api/access/link, post: { linkIds: [string] (JSON) }
  13. app.routerUtils.onApiRequest(req, res);
  14. if (!req.post?.linkIds?.length)
  15. return app.routerUtils.httpResponse(res, 400, "Missing argument");
  16. for (let i of JSON.parse(req.post.linkIds)) {
  17. if (await app.databaseHelper.findOne(AccessModel, { type: ACCESS_TYPE.link, typeData: i }))
  18. Security.addLinkToSession(req, i);
  19. }
  20. app.routerUtils.jsonResponse(res, req.sessionObj.accessList);
  21. });
  22. app.router.del("/api/access/:id", (req, res) => {
  23. app.routerUtils.onApiRequest(req, res);
  24. const result = Security.removeFromSession(req, req.params.id);
  25. app.routerUtils.jsonResponse(res, result);
  26. });
  27. app.router.get("/api/media/list", async (req, res) => {
  28. app.routerUtils.onApiRequest(req, res);
  29. let first = undefined,
  30. last = undefined;
  31. if (req.body?.chronology !== undefined) {
  32. let range = await MediaService.getMediaRange(app);
  33. first = range[0];
  34. last = range[1];
  35. }
  36. let fromDate = parseInt(req.body?.from);
  37. let count = parseInt(req.body?.count);
  38. app.routerUtils.jsonResponse(res, {
  39. data: await MediaService.fetchMediasWithAccess(
  40. app,
  41. isNaN(fromDate) ? 0 : fromDate,
  42. isNaN(count) ? 25 : Math.min(75, count),
  43. req.sessionObj?.accessList),
  44. first: first,
  45. last: last
  46. });
  47. });
  48. app.router.get("/api/media/:md5sum", async (req, res) => {
  49. app.routerUtils.onApiRequest(req, res);
  50. let data = await MediaService.fetchOne(app, req.params.md5sum, req.sessionObj?.accessList);
  51. if (!data)
  52. return app.routerUtils.onPageNotFound(res);
  53. app.routerUtils.jsonResponse(res, data);
  54. });
  55. app.router.get("/api/media/thumbnail/:md5sum.jpg", async (req, res) => {
  56. app.routerUtils.onApiRequest(req, res);
  57. let data = await MediaService.fetchOne(app, req.params.md5sum, req.sessionObj?.accessList);
  58. if (!data)
  59. return app.routerUtils.onPageNotFound(res);
  60. try {
  61. let thumbnail = null;
  62. try {
  63. thumbnail = await (await app.libraryManager.findMedia(data.path))?.createThumbnail(req.body?.w || 0, req.body?.h || 0, req.body?.q || 6);
  64. } catch (err) {
  65. return app.routerUtils.apiError(res);
  66. }
  67. if (!thumbnail)
  68. return app.routerUtils.onPageNotFound(res);
  69. res.setHeader("Content-Type", "image/jpeg");
  70. res.setHeader("Content-Length", fs.statSync(thumbnail.name)?.size || undefined);
  71. res.setHeader("Cache-Control", "private, max-age=2630000"); // 1 month cache
  72. let rd = fs.createReadStream(thumbnail.name);
  73. rd.once('end', () => thumbnail.removeCallback());
  74. rd.pipe(res);
  75. }
  76. catch (err) {
  77. console.error(err);
  78. app.routerUtils.onPageNotFound(res);
  79. }
  80. });
  81. app.router.get("/api/media/original/:md5sum", async (req, res) => {
  82. app.routerUtils.onApiRequest(req, res);
  83. let data = await MediaService.fetchOne(app, req.params.md5sum, req.sessionObj?.accessList);
  84. if (!data)
  85. return app.routerUtils.onPageNotFound(res);
  86. const fileName = Path.basename(data.path);
  87. res.setHeader("Content-Type", mime.lookup(data.path));
  88. res.setHeader("Content-Length", fs.statSync(data.path)?.size || undefined);
  89. res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
  90. res.setHeader("Cache-Control", "private, max-age=2630000"); // 1 month cache
  91. fs.createReadStream(data.path).pipe(res);
  92. });
  93. }};