highlightRecording.js 3.8 KB
const express = require('express');
const {
    HighlightUpstreamError,
    HighlightValidationError,
    highlightRecordingService: service
} = require('../services/highlightRecordingService');

const router = express.Router();

function sendError(res, error) {
    if (error instanceof HighlightValidationError) {
        return res.status(400).send({ code: 10, message: error.message });
    }
    if (error instanceof HighlightUpstreamError) {
        return res.status(502).send({
            code: error.upstreamCode,
            message: error.message
        });
    }
    console.error('高光录制接口异常:', error);
    return res.status(500).send({ code: -1, message: '服务器内部错误' });
}

router.post('/preview/by-class', async function (req, res) {
    try {
        const records = await service.fetchByClass(req.body && req.body.classId);
        const data = await service.preview(records);
        return res.send({ code: 0, message: records.length ? 'success' : '无高光数据', data });
    } catch (error) {
        return sendError(res, error);
    }
});

router.post('/preview/by-site', async function (req, res) {
    try {
        const records = await service.fetchBySite(req.body || {});
        const data = await service.preview(records);
        return res.send({ code: 0, message: records.length ? 'success' : '无高光数据', data });
    } catch (error) {
        return sendError(res, error);
    }
});

router.post('/recording/by-class', async function (req, res) {
    try {
        const records = await service.fetchByClass(req.body && req.body.classId);
        if (records.length === 0) {
            return res.send({ code: 0, message: '无高光数据', data: [] });
        }
        const data = await service.enqueue(records);
        return res.send({ code: 0, message: 'success', data });
    } catch (error) {
        return sendError(res, error);
    }
});

router.post('/recording/by-site', async function (req, res) {
    try {
        const records = await service.fetchBySite(req.body || {});
        if (records.length === 0) {
            return res.send({
                code: 0,
                message: '无高光数据',
                data: { received: 0, queued: 0, recording: 0, uploading: 0, generated: 0, invalid: 0, failed: 0 }
            });
        }
        const tasks = await service.enqueue(records);
        const summary = service.summarizeTasks(tasks);
        return res.send({ code: 0, message: 'success', data: summary });
    } catch (error) {
        return sendError(res, error);
    }
});

router.post('/fileExists', async function (req, res) {
    try {
        const data = await service.getClassFileStatuses(req.body || {});
        const allGenerated = data.length > 0 && data.every(item => item.generated);
        return res.send({
            code: allGenerated ? 0 : 1,
            message: allGenerated ? '文件已生成' : (data.length ? '部分文件未生成' : '文件未生成'),
            onlyHighlight: 1,
            classUrlList: data
        });
    } catch (error) {
        return sendError(res, error);
    }
});

router.post('/files', async function (req, res) {
    try {
        const items = req.body && req.body.items;
        if (!Array.isArray(items) || items.length === 0) {
            throw new HighlightValidationError('items 必须是非空数组');
        }
        if (items.length > 1000) {
            throw new HighlightValidationError('items 不能超过1000条');
        }
        const data = await service.getFileStatuses(items);
        return res.send({ code: 0, message: 'success', data });
    } catch (error) {
        return sendError(res, error);
    }
});

router.get('/status', function (req, res) {
    res.send({ code: 0, message: 'success', data: service.getQueueInfo() });
});

module.exports = router;