feat: 实现后端基础架构与 VOD 核心 API(Express + SQLite + JWT)
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
import { Router } from 'express';
|
||||
import { z } from 'zod';
|
||||
import {
|
||||
listAccounts,
|
||||
createAccount,
|
||||
updateAccount,
|
||||
deleteAccount,
|
||||
switchActiveAccount,
|
||||
} from '../services/config';
|
||||
import { authMiddleware, requireAdmin } from '../middleware/auth';
|
||||
import { asyncHandler } from '../utils/asyncHandler';
|
||||
|
||||
const router = Router();
|
||||
|
||||
const accountSchema = z.object({
|
||||
name: z.string().min(1),
|
||||
accessKeyId: z.string().min(1),
|
||||
accessKeySecret: z.string().min(1),
|
||||
region: z.string().min(1),
|
||||
endpoint: z.string().optional(),
|
||||
});
|
||||
|
||||
router.get(
|
||||
'/',
|
||||
authMiddleware,
|
||||
asyncHandler(async (_req, res) => {
|
||||
const accounts = await listAccounts();
|
||||
res.json({ code: 200, data: accounts });
|
||||
})
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/',
|
||||
authMiddleware,
|
||||
requireAdmin,
|
||||
asyncHandler(async (req, res) => {
|
||||
const parsed = accountSchema.safeParse(req.body);
|
||||
if (!parsed.success) {
|
||||
res.status(400).json({ code: 400, message: parsed.error.message });
|
||||
return;
|
||||
}
|
||||
|
||||
const account = await createAccount(parsed.data);
|
||||
res.json({
|
||||
code: 200,
|
||||
data: {
|
||||
id: account.id,
|
||||
name: account.name,
|
||||
accessKeyId: account.accessKeyId,
|
||||
region: account.region,
|
||||
endpoint: account.endpoint,
|
||||
isActive: account.isActive,
|
||||
createdAt: account.createdAt,
|
||||
updatedAt: account.updatedAt,
|
||||
},
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
router.put(
|
||||
'/:id',
|
||||
authMiddleware,
|
||||
requireAdmin,
|
||||
asyncHandler(async (req, res) => {
|
||||
const parsed = accountSchema.partial().safeParse(req.body);
|
||||
if (!parsed.success) {
|
||||
res.status(400).json({ code: 400, message: parsed.error.message });
|
||||
return;
|
||||
}
|
||||
|
||||
const account = await updateAccount(req.params.id, parsed.data);
|
||||
res.json({
|
||||
code: 200,
|
||||
data: {
|
||||
id: account.id,
|
||||
name: account.name,
|
||||
accessKeyId: account.accessKeyId,
|
||||
region: account.region,
|
||||
endpoint: account.endpoint,
|
||||
isActive: account.isActive,
|
||||
createdAt: account.createdAt,
|
||||
updatedAt: account.updatedAt,
|
||||
},
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
router.delete(
|
||||
'/:id',
|
||||
authMiddleware,
|
||||
requireAdmin,
|
||||
asyncHandler(async (req, res) => {
|
||||
await deleteAccount(req.params.id);
|
||||
res.json({ code: 200, data: null });
|
||||
})
|
||||
);
|
||||
|
||||
router.post(
|
||||
'/:id/switch',
|
||||
authMiddleware,
|
||||
requireAdmin,
|
||||
asyncHandler(async (req, res) => {
|
||||
const account = await switchActiveAccount(req.params.id);
|
||||
res.json({
|
||||
code: 200,
|
||||
data: {
|
||||
id: account.id,
|
||||
name: account.name,
|
||||
isActive: account.isActive,
|
||||
},
|
||||
});
|
||||
})
|
||||
);
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user