remove /media endpoint
This commit is contained in:
+37
-33
@@ -2,12 +2,12 @@ import { Router } from 'express';
|
||||
import { upload } from '../middleware/upload.js';
|
||||
import { config } from '../config.js';
|
||||
import {
|
||||
listRoutes, getRoute, createRoute, updateRoute, appendRoute,
|
||||
listRoutes, getRoute, getRouteGpxFile, createRoute, updateRoute, appendRoute,
|
||||
listPois, getPoi, createPoi, updatePoi, softDeleteRoute, restoreRoute
|
||||
} from '../services/routes-service.js';
|
||||
import {
|
||||
listPictures, getPictureContent, createPicture, updatePicture, deletePicture,
|
||||
listAudio, getAudioContent, createAudio, updateAudio, deleteAudio
|
||||
listPictures, getPicture, getPictureFile, createPicture, updatePicture, deletePicture,
|
||||
listAudio, getAudio, getAudioFile, createAudio, updateAudio, deleteAudio
|
||||
} from '../services/media-service.js';
|
||||
|
||||
const numberOrUndefined = value => {
|
||||
@@ -16,24 +16,16 @@ const numberOrUndefined = value => {
|
||||
return Number.isFinite(parsed) ? parsed : undefined;
|
||||
};
|
||||
|
||||
const positiveInteger = (value, name) => {
|
||||
const parsed = Number.parseInt(value, 10);
|
||||
if (!Number.isInteger(parsed) || parsed <= 0) {
|
||||
const error = new Error(`${name} muss eine positive Ganzzahl sein.`);
|
||||
error.status = 400;
|
||||
throw error;
|
||||
}
|
||||
return parsed;
|
||||
};
|
||||
|
||||
function sendMedia(res, resource) {
|
||||
res.set({
|
||||
'Cache-Control': 'private, max-age=60',
|
||||
'Content-Disposition': `inline; filename="${resource.filename.replace(/["\\]/g, '_')}"`,
|
||||
'X-Content-Type-Options': 'nosniff'
|
||||
function sendFileResource(res, file, contentType = null) {
|
||||
if (contentType) res.type(contentType);
|
||||
res.setHeader('Content-Disposition', `inline; filename*=UTF-8''${encodeURIComponent(file.filename)}`);
|
||||
res.setHeader('X-Content-Type-Options', 'nosniff');
|
||||
return res.sendFile(file.absolutePath, {
|
||||
acceptRanges: true,
|
||||
cacheControl: true,
|
||||
immutable: false,
|
||||
maxAge: '1h'
|
||||
});
|
||||
res.type(resource.contentType);
|
||||
res.sendFile(resource.absolutePath);
|
||||
}
|
||||
|
||||
export function createApiRouter(db) {
|
||||
@@ -63,6 +55,10 @@ export function createApiRouter(db) {
|
||||
res.json(getRoute(db, Number(req.params.id), req.query.includeDeleted === 'true'));
|
||||
});
|
||||
|
||||
api.get('/routes/:id/gpx', (req, res) => {
|
||||
sendFileResource(res, getRouteGpxFile(db, Number(req.params.id)), 'application/gpx+xml');
|
||||
});
|
||||
|
||||
api.get('/routes/:id/pois', (req, res) => {
|
||||
getRoute(db, Number(req.params.id));
|
||||
res.json({ pois: listPois(db, Number(req.params.id)) });
|
||||
@@ -99,7 +95,13 @@ export function createApiRouter(db) {
|
||||
});
|
||||
|
||||
api.get('/routes/:id/pictures/:pictureId', (req, res) => {
|
||||
sendMedia(res, getPictureContent(db, Number(req.params.id), Number(req.params.pictureId)));
|
||||
const routeId = Number(req.params.id);
|
||||
const pictureId = Number(req.params.pictureId);
|
||||
if (req.query.metadata === 'true') {
|
||||
res.json(getPicture(db, routeId, pictureId));
|
||||
return;
|
||||
}
|
||||
sendFileResource(res, getPictureFile(db, routeId, pictureId));
|
||||
});
|
||||
|
||||
api.post('/routes/:id/pictures', upload.single('picture'), (req, res) => {
|
||||
@@ -118,30 +120,32 @@ export function createApiRouter(db) {
|
||||
});
|
||||
|
||||
api.get('/routes/:id/audio', (req, res) => {
|
||||
if (req.query.poiId == null || req.query.poiId === '') {
|
||||
res.json({ audio: listAudio(db, Number(req.params.id)) });
|
||||
res.json({ audio: listAudio(db, Number(req.params.id), { poiId: req.query.poiId }) });
|
||||
});
|
||||
|
||||
api.get('/routes/:id/audio/:poiId', (req, res) => {
|
||||
const routeId = Number(req.params.id);
|
||||
const poiId = Number(req.params.poiId);
|
||||
if (req.query.metadata === 'true') {
|
||||
res.json(getAudio(db, routeId, poiId));
|
||||
return;
|
||||
}
|
||||
|
||||
const poiId = positiveInteger(req.query.poiId, 'poiId');
|
||||
sendMedia(res, getAudioContent(db, Number(req.params.id), poiId));
|
||||
sendFileResource(res, getAudioFile(db, routeId, poiId));
|
||||
});
|
||||
|
||||
api.post('/routes/:id/audio', upload.single('audio'), (req, res) => {
|
||||
const audio = createAudio(db, Number(req.params.id), req.body, req.file);
|
||||
res.status(201)
|
||||
.location(`/api/routes/${req.params.id}/audio?poiId=${encodeURIComponent(audio.poiId)}`)
|
||||
.location(`/api/routes/${req.params.id}/audio/${audio.poiId}`)
|
||||
.json(audio);
|
||||
});
|
||||
|
||||
api.put('/routes/:id/audio', upload.single('audio'), (req, res) => {
|
||||
const poiId = positiveInteger(req.query.poiId ?? req.body.poiId, 'poiId');
|
||||
res.json(updateAudio(db, Number(req.params.id), poiId, req.file));
|
||||
api.put('/routes/:id/audio/:poiId', upload.single('audio'), (req, res) => {
|
||||
res.json(updateAudio(db, Number(req.params.id), Number(req.params.poiId), req.file));
|
||||
});
|
||||
|
||||
api.delete('/routes/:id/audio', (req, res) => {
|
||||
const poiId = positiveInteger(req.query.poiId ?? req.body?.poiId, 'poiId');
|
||||
res.json(deleteAudio(db, Number(req.params.id), poiId));
|
||||
api.delete('/routes/:id/audio/:poiId', (req, res) => {
|
||||
res.json(deleteAudio(db, Number(req.params.id), Number(req.params.poiId)));
|
||||
});
|
||||
|
||||
api.delete('/routes/:id', (req, res) => {
|
||||
|
||||
Reference in New Issue
Block a user