Files
code-center/src/routes/config/list.ts
2025-12-03 16:40:46 +08:00

201 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { app } from '@/app.ts';
import { ConfigModel } from './models/model.ts';
import { ShareConfigService } from './services/share.ts';
import { oss } from '@/app.ts';
import { ConfigOssService } from '@kevisual/oss/services';
app
.route({
path: 'config',
key: 'list',
middleware: ['auth'],
})
.define(async (ctx) => {
const { id } = ctx.state.tokenUser;
const config = await ConfigModel.findAll({
where: {
uid: id,
},
order: [['updatedAt', 'DESC']],
});
ctx.body = {
list: config,
};
})
.addTo(app);
app
.route({
path: 'config',
key: 'update',
middleware: ['auth'],
})
.define(async (ctx) => {
const tokernUser = ctx.state.tokenUser;
const tuid = tokernUser.id;
const { id, data, ...rest } = ctx.query?.data || {};
let config: ConfigModel;
if (id) {
config = await ConfigModel.findByPk(id);
let keyIsChange = false;
if (rest?.key) {
keyIsChange = rest.key !== config?.key;
}
if (!config || config.uid !== tuid) {
ctx.throw(403, 'no permission');
}
if (keyIsChange) {
const key = rest.key;
const keyConfig = await ConfigModel.findOne({
where: {
key,
uid: tuid,
},
});
if (keyConfig && keyConfig.id !== id) {
ctx.throw(403, 'key is already exists');
}
}
await config.update({
data: {
...config.data,
...data,
},
...rest,
});
if (config.data?.permission?.share === 'public') {
await ShareConfigService.expireShareConfig(config.key, tokernUser.username);
}
ctx.body = config;
} else if (rest?.key) {
// id 不存在key存在则属于更新key不能重复
const key = rest.key;
config = await ConfigModel.findOne({
where: {
key,
uid: tuid,
},
});
if (config) {
await config.update({
data: { ...config.data, ...data },
...rest,
});
ctx.body = config;
} else {
// 根据key创建一个配置
config = await ConfigModel.create({
key,
...rest,
data: data,
uid: tuid,
});
ctx.body = config;
}
}
const key = config?.key;
const ossConfig = ConfigOssService.fromBase({
oss,
opts: {
owner: tokernUser.username,
},
});
if (ossConfig.isEndWithJson(key)) {
const data = config.data;
const hash = ossConfig.hash(data);
if (config.hash !== hash) {
config.hash = hash;
await config.save({
fields: ['hash'],
});
await ossConfig.putJsonObject(key, data);
}
}
if (config) return;
// id和key不存在。创建一个新的配置, 而且没有id的
const newConfig = await ConfigModel.create({
...rest,
data: data,
uid: tuid,
});
ctx.body = newConfig;
})
.addTo(app);
app
.route({
path: 'config',
key: 'get',
middleware: ['auth'],
})
.define(async (ctx) => {
const tokernUser = ctx.state.tokenUser;
const tuid = tokernUser.id;
const { id, key } = ctx.query?.data || {};
if (!id && !key) {
ctx.throw(400, 'id or key is required');
}
let config: ConfigModel;
if (id) {
config = await ConfigModel.findByPk(id);
}
if (!config && key) {
config = await ConfigModel.findOne({
where: {
key,
uid: tuid,
},
});
}
if (!config) {
ctx.throw(404, 'config not found');
}
if (config && config.uid === tuid) {
ctx.body = config;
} else {
ctx.throw(403, 'no permission');
}
})
.addTo(app);
app
.route({
path: 'config',
key: 'delete',
middleware: ['auth'],
})
.define(async (ctx) => {
const tokernUser = ctx.state.tokenUser;
const tuid = tokernUser.id;
const { id, key } = ctx.query?.data || {};
if (id || key) {
const search: any = id ? { id } : { key };
const config = await ConfigModel.findOne({
where: {
...search
},
});
if (config && config.uid === tuid) {
const key = config.key;
const ossConfig = ConfigOssService.fromBase({
oss,
opts: {
owner: tokernUser.username,
},
});
if (ossConfig.isEndWithJson(key)) {
try {
await ossConfig.deleteObject(key);
} catch (e) { }
}
await config.destroy();
} else {
ctx.throw(403, 'no permission');
}
} else {
ctx.throw(400, 'id is required');
}
})
.addTo(app);