mirror of
https://git.mirrors.martin98.com/https://github.com/sub-store-org/Sub-Store.git
synced 2025-10-13 12:01:30 +08:00
132 lines
3.7 KiB
JavaScript
132 lines
3.7 KiB
JavaScript
import { deleteByName, findByName, updateByName } from '@/utils/database';
|
|
import { COLLECTIONS_KEY, ARTIFACTS_KEY } from '@/constants';
|
|
import { failed, success } from '@/restful/response';
|
|
import $ from '@/core/app';
|
|
import { RequestInvalidError, ResourceNotFoundError } from '@/restful/errors';
|
|
|
|
export default function register($app) {
|
|
if (!$.read(COLLECTIONS_KEY)) $.write({}, COLLECTIONS_KEY);
|
|
|
|
$app.route('/api/collection/:name')
|
|
.get(getCollection)
|
|
.patch(updateCollection)
|
|
.delete(deleteCollection);
|
|
|
|
$app.route('/api/collections')
|
|
.get(getAllCollections)
|
|
.post(createCollection)
|
|
.put(replaceCollection);
|
|
}
|
|
|
|
// collection API
|
|
function createCollection(req, res) {
|
|
const collection = req.body;
|
|
$.info(`正在创建组合订阅:${collection.name}`);
|
|
if (/\//.test(collection.name)) {
|
|
failed(
|
|
res,
|
|
new RequestInvalidError(
|
|
'INVALID_NAME',
|
|
`Collection ${collection.name} is invalid`,
|
|
),
|
|
);
|
|
return;
|
|
}
|
|
const allCols = $.read(COLLECTIONS_KEY);
|
|
if (findByName(allCols, collection.name)) {
|
|
failed(
|
|
res,
|
|
new RequestInvalidError(
|
|
'DUPLICATE_KEY',
|
|
`Collection ${collection.name} already exists.`,
|
|
),
|
|
);
|
|
return;
|
|
}
|
|
allCols.push(collection);
|
|
$.write(allCols, COLLECTIONS_KEY);
|
|
success(res, collection, 201);
|
|
}
|
|
|
|
function getCollection(req, res) {
|
|
let { name } = req.params;
|
|
name = decodeURIComponent(name);
|
|
const allCols = $.read(COLLECTIONS_KEY);
|
|
const collection = findByName(allCols, name);
|
|
if (collection) {
|
|
success(res, collection);
|
|
} else {
|
|
failed(
|
|
res,
|
|
new ResourceNotFoundError(
|
|
`SUBSCRIPTION_NOT_FOUND`,
|
|
`Collection ${name} does not exist`,
|
|
404,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
function updateCollection(req, res) {
|
|
let { name } = req.params;
|
|
name = decodeURIComponent(name);
|
|
let collection = req.body;
|
|
const allCols = $.read(COLLECTIONS_KEY);
|
|
const oldCol = findByName(allCols, name);
|
|
if (oldCol) {
|
|
const newCol = {
|
|
...oldCol,
|
|
...collection,
|
|
};
|
|
$.info(`正在更新组合订阅:${name}...`);
|
|
|
|
if (name !== newCol.name) {
|
|
// update all artifacts referring this collection
|
|
const allArtifacts = $.read(ARTIFACTS_KEY) || [];
|
|
for (const artifact of allArtifacts) {
|
|
if (
|
|
artifact.type === 'collection' &&
|
|
artifact.source === oldCol.name
|
|
) {
|
|
artifact.source = newCol.name;
|
|
}
|
|
}
|
|
$.write(allArtifacts, ARTIFACTS_KEY);
|
|
}
|
|
|
|
updateByName(allCols, name, newCol);
|
|
$.write(allCols, COLLECTIONS_KEY);
|
|
success(res, newCol);
|
|
} else {
|
|
failed(
|
|
res,
|
|
new ResourceNotFoundError(
|
|
'RESOURCE_NOT_FOUND',
|
|
`Collection ${name} does not exist!`,
|
|
),
|
|
404,
|
|
);
|
|
}
|
|
}
|
|
|
|
function deleteCollection(req, res) {
|
|
let { name } = req.params;
|
|
name = decodeURIComponent(name);
|
|
$.info(`正在删除组合订阅:${name}`);
|
|
let allCols = $.read(COLLECTIONS_KEY);
|
|
deleteByName(allCols, name);
|
|
$.write(allCols, COLLECTIONS_KEY);
|
|
success(res);
|
|
}
|
|
|
|
function getAllCollections(req, res) {
|
|
const allCols = $.read(COLLECTIONS_KEY);
|
|
success(res, allCols);
|
|
}
|
|
|
|
function replaceCollection(req, res) {
|
|
const allCols = req.body;
|
|
$.write(allCols, COLLECTIONS_KEY);
|
|
success(res);
|
|
}
|