1
0

api.js 4.1 KB

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