47 lines
2.2 KiB
JavaScript
47 lines
2.2 KiB
JavaScript
import { Router } from 'express'
|
|
import { openAttachment, sendAttachment } from '../../services/chatAttachments.js'
|
|
import { verifyFileLink } from '../../services/signedLinks.js'
|
|
import { getTakeoverRequest, readUpload } from '../../services/takeoverCredits.js'
|
|
|
|
/**
|
|
* Chat-Anhaenge und Gutschrift-Nachweise mit signiertem Link (?exp=&sig=, 15 min) ohne JWT ausliefern: <img>, <audio> und Downloads im
|
|
* Ticketsystem koennen keinen Authorization-Header tragen. Ohne sig geht es weiter zur JWT-Pruefung.
|
|
* Eingehaengt in routes/team/index.js VOR requireStaffJwt.
|
|
*/
|
|
const router = Router()
|
|
|
|
router.get('/chats/:customerId/attachments/:id', async (req, res, next) => {
|
|
if (req.query.sig === undefined) return next()
|
|
const { customerId, id } = req.params
|
|
if (!verifyFileLink({ kind: 'chat', customerId, id, exp: req.query.exp, sig: String(req.query.sig) })) {
|
|
return res.status(403).json({ error: 'Link abgelaufen. Bitte die Unterhaltung neu laden.' })
|
|
}
|
|
try {
|
|
const found = await openAttachment({ customerId, id, viewer: 'admin' })
|
|
return sendAttachment(req, res, found)
|
|
} catch (err) {
|
|
return res.status(err.status || 500).json({ error: err.status ? err.message : 'Datei nicht verfügbar' })
|
|
}
|
|
})
|
|
|
|
// Nachweise einer Uebernahmegutschrift (wie takeoverAdminRouter GET /:id/files/:fileId), signiert ueber die Antrags-ID
|
|
router.get('/takeover-credits/:id/files/:fileId', async (req, res, next) => {
|
|
if (req.query.sig === undefined) return next()
|
|
const { id, fileId } = req.params
|
|
if (!verifyFileLink({ kind: 'takeover', customerId: id, id: fileId, exp: req.query.exp, sig: String(req.query.sig) })) {
|
|
return res.status(403).json({ error: 'Link abgelaufen. Bitte den Antrag neu öffnen.' })
|
|
}
|
|
try {
|
|
const { file, content } = await readUpload(await getTakeoverRequest(id), fileId)
|
|
res.setHeader('Content-Type', file.type)
|
|
res.setHeader('Content-Disposition', `inline; filename*=UTF-8''${encodeURIComponent(file.name)}`)
|
|
res.setHeader('X-Content-Type-Options', 'nosniff')
|
|
res.setHeader('Cache-Control', 'private, no-store')
|
|
return res.send(content)
|
|
} catch (err) {
|
|
return res.status(err.status || 500).send(err.message || 'Datei nicht verfügbar')
|
|
}
|
|
})
|
|
|
|
export default router
|