| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- const mime = require("mime-types");
- const fs = require('fs');
- const Path = require('path');
- const Security = require('../src/security.js');
- const MediaService = require('../model/mediaService.js');
- const MediaFileMetaModel = require('../model/mediaItemMeta.js').MediaFileMetaModel;
- const { AccessModel, ACCESS_TYPE, ACCESS_GRANT } = require('../model/access.js');
- module.exports = { register: app => {
- app.router.get("/api/access/list", (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- app.routerUtils.jsonResponse(res, req.sessionObj?.accessList || {});
- });
- app.router.post("/api/access/link", async (req, res) => { // /api/access/link, post: { linkIds: [string] (JSON) }
- app.routerUtils.onApiRequest(req, res);
- if (!req.post?.linkIds?.length)
- return app.routerUtils.httpResponse(res, 400, "Missing argument");
- for (let i of JSON.parse(req.post.linkIds)) {
- if (await app.databaseHelper.findOne(AccessModel, { type: ACCESS_TYPE.link, typeData: i }))
- Security.addLinkToSession(req, i);
- }
- app.routerUtils.jsonResponse(res, req.sessionObj.accessList);
- });
- app.router.del("/api/access/:id", (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- const result = Security.removeFromSession(req, req.params.id);
- app.routerUtils.jsonResponse(res, result);
- });
- app.router.patch("/api/media/:id/meta/:key", async (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- if (!req.params.id ||!req.params.key || !req.body)
- return app.routerUtils.onBadRequest(res);
- let data = await MediaService.fetchOne(app, req.params.id, req.sessionObj?.accessList);
- if (!data || data.accessType !== ACCESS_GRANT.write)
- return app.routerUtils.onPageNotFound(res);
- let newMediaItemMedia = new MediaFileMetaModel(data.md5sum, req.params.key, req.body.value, false);
- await app.databaseHelper.upsertOne(newMediaItemMedia);
- res.end();
- });
- app.router.get("/api/media/list", async (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- let first = undefined,
- last = undefined;
- if (req.body?.chronology !== undefined) {
- let range = await MediaService.getMediaRange(app);
- first = range[0];
- last = range[1];
- }
- let fromDate = parseInt(req.body?.from);
- let count = parseInt(req.body?.count);
- app.routerUtils.jsonResponse(res, {
- data: await MediaService.fetchMediasWithAccess(
- app,
- isNaN(fromDate) ? 0 : fromDate,
- isNaN(count) ? 25 : Math.min(75, count),
- req.sessionObj?.accessList),
- first: first,
- last: last
- });
- });
- app.router.get("/api/media/:md5sum", async (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- let data = await MediaService.fetchOne(app, req.params.md5sum, req.sessionObj?.accessList);
- if (!data)
- return app.routerUtils.onPageNotFound(res);
- app.routerUtils.jsonResponse(res, data);
- });
- app.router.get("/api/media/thumbnail/:md5sum.jpg", async (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- let data = await MediaService.fetchOne(app, req.params.md5sum, req.sessionObj?.accessList);
- if (!data)
- return app.routerUtils.onPageNotFound(res);
- try {
- let thumbnail = null;
- try {
- thumbnail = await (await app.libraryManager.findMedia(data.path))?.createThumbnail(req.body?.w || 0, req.body?.h || 0, req.body?.q || 6);
- } catch (err) {
- return app.routerUtils.apiError(res);
- }
- if (!thumbnail)
- return app.routerUtils.onPageNotFound(res);
- res.setHeader("Content-Type", "image/jpeg");
- res.setHeader("Content-Length", fs.statSync(thumbnail.name)?.size || undefined);
- res.setHeader("Cache-Control", "private, max-age=2630000"); // 1 month cache
- let rd = fs.createReadStream(thumbnail.name);
- rd.once('end', () => thumbnail.removeCallback());
- rd.pipe(res);
- }
- catch (err) {
- console.error(err);
- app.routerUtils.onPageNotFound(res);
- }
- });
- app.router.get("/api/media/original/:md5sum", async (req, res) => {
- app.routerUtils.onApiRequest(req, res);
- let data = await MediaService.fetchOne(app, req.params.md5sum, req.sessionObj?.accessList);
- if (!data)
- return app.routerUtils.onPageNotFound(res);
- const fileName = Path.basename(data.path);
- res.setHeader("Content-Type", mime.lookup(data.path));
- res.setHeader("Content-Length", fs.statSync(data.path)?.size || undefined);
- res.setHeader("Content-Disposition", `attachment; filename="${fileName}"`);
- res.setHeader("Cache-Control", "private, max-age=2630000"); // 1 month cache
- fs.createReadStream(data.path).pipe(res);
- });
- }};
|