highlightRecording.js
4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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);
}
});
// 独立的高光定时入口,不占用原整堂录制 GET /recording。
router.post('/recording/scheduled', async function (req, res) {
try {
const data = await service.runScheduledRecording();
return res.send({
code: 0,
message: data.received ? 'success' : '无高光数据',
data
});
} 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;