core: user: private and public projection (#507)

This commit is contained in:
undefined authored and GitHub committed 2023-02-24 14:58:22 +08:00
1 parent 4fe734a6f3
commit bd13c57d82
6 files changed
+44 -26

No files matched your search

@@ -1,17 +1,10 @@
import { ObjectID } from 'mongodb';
import avatar from '../../lib/avatar';
import serializer from '../../lib/serializer';
import { PERM } from '../../model/builtin';
import * as system from '../../model/system';
import { User } from '../../model/user';
import type { KoaContext } from '../server';
const serializer = (showDisplayName = false) => (k: string, v: any) => {
if (k.startsWith('_') && k !== '_id') return undefined;
if (typeof v === 'bigint') return `BigInt::${v.toString()}`;
if (v instanceof User && !showDisplayName) delete v.displayName;
return v;
};
export default (router, logger) => async (ctx: KoaContext, next) => {
const { request, response } = ctx.HydroContext;
ctx.renderHTML = (templateName, args) => {
@@ -22,7 +15,9 @@ export default (router, logger) => async (ctx: KoaContext, next) => {
viewLang: ctx.translate('__id'),
};
const engine = global.Hydro.lib.template?.render
|| (() => JSON.stringify(args, serializer(user?.hasPerm(PERM.PREM_VIEW_DISPLAYNAME))));
|| (() => JSON.stringify(args, serializer({
showDisplayName: user?.hasPerm(PERM.PREM_VIEW_DISPLAYNAME),
})));
return engine(templateName, {
handler: ctx.handler,
UserContext,
@@ -1,16 +1,9 @@
import { errorMessage } from '@hydrooj/utils/lib/utils';
import { SystemError, UserFacingError } from '../../error';
import serializer from '../../lib/serializer';
import { PERM } from '../../model/builtin';
import { User } from '../../model/user';
import type { KoaContext } from '../server';
const serializer = (showDisplayName = false) => (k: string, v: any) => {
if (k.startsWith('_') && k !== '_id') return undefined;
if (typeof v === 'bigint') return `BigInt::${v.toString()}`;
if (v instanceof User && !showDisplayName) delete v.displayName;
return v;
};
export default (logger) => async (ctx: KoaContext, next) => {
const { request, response } = ctx.HydroContext;
try {
@@ -34,7 +27,7 @@ export default (logger) => async (ctx: KoaContext, next) => {
response.body.UiContext = UiContext;
response.body.UserContext = user;
}
response.body = JSON.stringify(response.body, serializer(user?.hasPerm(PERM.PREM_VIEW_DISPLAYNAME)));
response.body = JSON.stringify(response.body, serializer({ showDisplayName: user?.hasPerm(PERM.PREM_VIEW_DISPLAYNAME) }));
} catch (e) {
response.body = new SystemError('Serialize failure', e.message);
}
+1 -1
View File
@@ -16,7 +16,7 @@ export default async (ctx: KoaContext, next) => {
}
if (user._id === 0) delete user.viewLang;
user.avatarUrl = avatar(user.avatar, 128);
ctx.HydroContext.user = user;
ctx.HydroContext.user = await user.private();
if (!domain) {
ctx.pendingError = new NotFoundError(args.domainId);
args.domainId = 'system';