Add validation to dependencies GET endpoint and update service logic

This commit is contained in:
taozhiyu 2025-08-10 17:21:30 +08:00
parent 55c92dc320
commit 6063bc3a67
No known key found for this signature in database
GPG Key ID: A38E8DF826ECA7E3
3 changed files with 43 additions and 27 deletions

View File

@ -8,7 +8,18 @@ const route = Router();
export default (app: Router) => { export default (app: Router) => {
app.use('/dependencies', route); app.use('/dependencies', route);
route.get('/', async (req: Request, res: Response, next: NextFunction) => { route.get(
'/',
celebrate({
body: Joi.array().items(
Joi.object({
searchValue: Joi.string().optional().allow(''),
type: Joi.string().optional().allow(''),
status: Joi.string().optional().allow(''),
}),
),
}),
async (req: Request, res: Response, next: NextFunction) => {
const logger: Logger = Container.get('logger'); const logger: Logger = Container.get('logger');
try { try {
const dependenceService = Container.get(DependenceService); const dependenceService = Container.get(DependenceService);
@ -18,7 +29,8 @@ export default (app: Router) => {
logger.error('🔥 error: %o', e); logger.error('🔥 error: %o', e);
return next(e); return next(e);
} }
}); },
);
route.post( route.post(
'/', '/',

View File

@ -27,6 +27,13 @@ class Application {
constructor() { constructor() {
this.app = express(); this.app = express();
// 创建一个全局中间件删除查询参数中的t
this.app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {
if (req.query.t) {
delete req.query.t;
}
next();
});
} }
async start() { async start() {
@ -54,8 +61,7 @@ class Application {
if (metadata) { if (metadata) {
if (!this.isShuttingDown) { if (!this.isShuttingDown) {
Logger.error( Logger.error(
`${metadata.serviceType} worker ${worker.process.pid} died (${ `${metadata.serviceType} worker ${worker.process.pid} died (${signal || code
signal || code
}). Restarting...`, }). Restarting...`,
); );
const newWorker = this.forkWorker(metadata.serviceType); const newWorker = this.forkWorker(metadata.serviceType);

View File

@ -28,7 +28,7 @@ export default class DependenceService {
constructor( constructor(
@Inject('logger') private logger: winston.Logger, @Inject('logger') private logger: winston.Logger,
private sockService: SockService, private sockService: SockService,
) {} ) { }
public async create(payloads: Dependence[]): Promise<Dependence[]> { public async create(payloads: Dependence[]): Promise<Dependence[]> {
const tabs = payloads.map((x) => { const tabs = payloads.map((x) => {
@ -98,34 +98,32 @@ export default class DependenceService {
searchValue, searchValue,
type, type,
status, status,
}: { searchValue: string; type: string; status: string }, }: {
searchValue: string;
type: keyof typeof DependenceTypes;
status: string;
},
sort: any = [], sort: any = [],
query: any = {}, query: any = {},
): Promise<Dependence[]> { ): Promise<Dependence[]> {
let condition = { let condition = query;
...query, if (type && ['nodejs', 'python3', 'linux'].includes(type)) {
type: DependenceTypes[type as any], condition.type = DependenceTypes[type];
}; } else condition.type = [0, 1, 2];
if (status) { if (status) {
condition.status = status.split(',').map(Number); condition.status = status.split(',').map(Number);
} }
if (searchValue) { if (searchValue) {
const encodeText = encodeURI(searchValue); const encodeText = encodeURI(searchValue);
const reg = { condition.name = {
[Op.or]: [ [Op.or]: [
{ [Op.like]: `%${searchValue}%` }, { [Op.like]: `%${searchValue}%` },
{ [Op.like]: `%${encodeText}%` }, { [Op.like]: `%${encodeText}%` },
], ],
}; };
condition = {
...condition,
name: reg,
};
} }
try { try {
const result = await this.find(condition, sort); return await this.find(condition, sort);
return result as any;
} catch (error) { } catch (error) {
throw error; throw error;
} }