提供 gieea webhooks (#2)
chore: debug log 仅输出app的log fix(commons): fix sanitize not return value. feat(webhooks): add gitea webhooks api. Co-authored-by: Ivan Li <ivanli@live.cn> Co-authored-by: Ivan <ivanli@live.cn> Reviewed-on: #2 Co-Authored-By: Ivan Li <ivan@noreply.%(DOMAIN)s> Co-Committed-By: Ivan Li <ivan@noreply.%(DOMAIN)s>
This commit is contained in:
@ -3,25 +3,49 @@ import {
|
||||
Catch,
|
||||
ArgumentsHost,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
} from '@nestjs/common';
|
||||
import { ApolloError } from 'apollo-server-errors';
|
||||
|
||||
@Catch(HttpException)
|
||||
export class HttpExceptionFilter implements ExceptionFilter {
|
||||
catch(exception: HttpException, host: ArgumentsHost) {
|
||||
const message = exception.message;
|
||||
const extensions: Record<string, any> = {};
|
||||
const err = exception.getResponse();
|
||||
if (typeof err === 'string') {
|
||||
extensions.message = err;
|
||||
} else {
|
||||
Object.assign(extensions, (err as any).extension);
|
||||
extensions.message = (err as any).message;
|
||||
switch (host.getType<'http' | 'graphql' | string>()) {
|
||||
case 'graphql': {
|
||||
const message = exception.message;
|
||||
const extensions: Record<string, any> = {};
|
||||
const err = exception.getResponse();
|
||||
if (typeof err === 'string') {
|
||||
extensions.message = err;
|
||||
} else {
|
||||
Object.assign(extensions, (err as any).extension);
|
||||
extensions.message = (err as any).message;
|
||||
}
|
||||
return new ApolloError(
|
||||
message,
|
||||
exception.getStatus().toString(),
|
||||
extensions,
|
||||
);
|
||||
}
|
||||
case 'http': {
|
||||
const ctx = host.switchToHttp();
|
||||
const response = ctx.getResponse();
|
||||
const request = ctx.getRequest();
|
||||
|
||||
const status =
|
||||
exception instanceof HttpException
|
||||
? exception.getStatus()
|
||||
: HttpStatus.INTERNAL_SERVER_ERROR;
|
||||
|
||||
response.status(status).json({
|
||||
statusCode: status,
|
||||
message: exception.message,
|
||||
timestamp: new Date().toISOString(),
|
||||
path: request.url,
|
||||
});
|
||||
}
|
||||
default:
|
||||
throw exception;
|
||||
}
|
||||
return new ApolloError(
|
||||
message,
|
||||
exception.getStatus().toString(),
|
||||
extensions,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
7
src/commons/middlewares/parse-body.middleware.spec.ts
Normal file
7
src/commons/middlewares/parse-body.middleware.spec.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { ParseBodyMiddleware } from './parse-body.middleware';
|
||||
|
||||
describe('ParseBodyMiddleware', () => {
|
||||
it('should be defined', () => {
|
||||
expect(new ParseBodyMiddleware()).toBeDefined();
|
||||
});
|
||||
});
|
13
src/commons/middlewares/parse-body.middleware.ts
Normal file
13
src/commons/middlewares/parse-body.middleware.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { Injectable, NestMiddleware } from '@nestjs/common';
|
||||
import { json, urlencoded, text } from 'body-parser';
|
||||
import { Request, Response, NextFunction } from 'express';
|
||||
|
||||
@Injectable()
|
||||
export class ParseBodyMiddleware implements NestMiddleware {
|
||||
use(req: Request, res: Response, next: NextFunction) {
|
||||
json()(req, res, () =>
|
||||
urlencoded()(req, res, () => text()(req, res, next)),
|
||||
);
|
||||
// next();
|
||||
}
|
||||
}
|
7
src/commons/middlewares/raw-body.middleware.spec.ts
Normal file
7
src/commons/middlewares/raw-body.middleware.spec.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import { RawBodyMiddleware } from './raw-body.middleware';
|
||||
|
||||
describe('RawBodyMiddleware', () => {
|
||||
it('should be defined', () => {
|
||||
expect(new RawBodyMiddleware()).toBeDefined();
|
||||
});
|
||||
});
|
10
src/commons/middlewares/raw-body.middleware.ts
Normal file
10
src/commons/middlewares/raw-body.middleware.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { Injectable, NestMiddleware } from '@nestjs/common';
|
||||
import { raw } from 'body-parser';
|
||||
import { Request, Response, NextFunction } from 'express';
|
||||
|
||||
@Injectable()
|
||||
export class RawBodyMiddleware implements NestMiddleware {
|
||||
use(req: Request, res: Response, next: NextFunction) {
|
||||
raw({ type: '*/*' })(req, res, next);
|
||||
}
|
||||
}
|
@ -4,12 +4,24 @@ import { sanitize } from '@neuralegion/class-sanitizer/dist';
|
||||
@Injectable()
|
||||
export class SanitizePipe implements PipeTransform {
|
||||
transform(value: any, metadata: ArgumentMetadata) {
|
||||
// console.log(value, typeof value);
|
||||
if (value instanceof Object) {
|
||||
value = Object.assign(new metadata.metatype(), value);
|
||||
sanitize(value);
|
||||
// console.log(value);
|
||||
if (
|
||||
!(value instanceof Object) ||
|
||||
value instanceof Buffer ||
|
||||
value instanceof Array
|
||||
) {
|
||||
return value;
|
||||
}
|
||||
const constructorFunction = metadata.metatype;
|
||||
if (!constructorFunction) {
|
||||
return value;
|
||||
}
|
||||
value = Object.assign(new constructorFunction(), value);
|
||||
try {
|
||||
sanitize(value);
|
||||
return value;
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
throw err;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user