You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.6 KiB
48 lines
1.6 KiB
import log4js from "logger";
|
|
import { getUserFromEvent } from "#server/utils/jwt";
|
|
import { getCurrentUser } from "#server/service/auth";
|
|
import { setContextUser } from "#server/utils/context";
|
|
|
|
interface IConfig {
|
|
auth?: 'required' | 'public' | 'optional';
|
|
}
|
|
|
|
const defaultConfig: IConfig = {
|
|
auth: 'required',
|
|
}
|
|
|
|
const logger = log4js.getLogger("ERROR");
|
|
|
|
export const defineWrappedResponseHandler = <T extends EventHandlerRequest, D>(
|
|
handlerOrConfig?: EventHandler<T, D> | IConfig,
|
|
_handler?: EventHandler<T, D>,
|
|
): EventHandler<T, D> => {
|
|
const handler = typeof handlerOrConfig === 'function' ? handlerOrConfig : _handler;
|
|
if (!handler) {
|
|
throw new Error('handler or config is required');
|
|
}
|
|
const config = Object.assign({ ...defaultConfig }, typeof handlerOrConfig === 'object' ? handlerOrConfig : {});
|
|
|
|
return defineEventHandler<T>(async (event) => {
|
|
// ---- auth guard ----
|
|
if (config.auth !== 'public') {
|
|
const payload = getUserFromEvent(event);
|
|
if (config.auth === 'required' && !payload) {
|
|
return R.error("未登录", null);
|
|
}
|
|
if (payload) {
|
|
const user = await getCurrentUser(payload);
|
|
if (config.auth === 'required' && !user) {
|
|
return R.error("用户不存在", null);
|
|
}
|
|
if (user) {
|
|
setContextUser(event, user);
|
|
}
|
|
}
|
|
}
|
|
// ---- end auth guard ----
|
|
|
|
const response = await handler(event)
|
|
return response
|
|
})
|
|
}
|
|
|