tachybase_todo/packages/plugins/@tachybase/plugin-api-keys/src/server/actions/api-keys.ts
sealday 90a09dfa40 feat: access token (#1320)
Co-authored-by: sealday <sealday@gmail.com>
Reviewed-on: daoyoucloud/tachybase#1320
2024-07-15 18:45:45 +08:00

57 lines
1.3 KiB
TypeScript

import { createHash } from 'crypto';
import actions, { Context, Next } from '@tachybase/actions';
import { Repository } from '@tachybase/database';
export async function create(ctx: Context, next: Next) {
const { values } = ctx.action.params;
if (!values.role) {
return;
}
const repository = ctx.db.getRepository('users.roles', ctx.auth.user.id) as unknown as Repository;
const role = await repository.findOne({
filter: {
name: values.role.name,
},
});
if (!role) {
throw ctx.throw(400, ctx.t('Role not found'));
}
const hash = createHash('sha256');
const jwtToken = ctx.app.authManager.jwt.sign(
{ userId: ctx.auth.user.id, roleName: role.name },
{ expiresIn: values.expiresIn },
);
hash.update(jwtToken);
const token = hash.digest('hex');
ctx.action.mergeParams({
values: {
token: jwtToken,
accessToken: token,
},
});
return actions.create(ctx, async () => {
ctx.body = {
token,
};
await next();
});
}
export async function destroy(ctx: Context, next: Next) {
const repo = ctx.db.getRepository(ctx.action.resourceName);
const { filterByTk } = ctx.action.params;
const data = await repo.findById(filterByTk);
const token = data?.get('token');
if (token) {
await ctx.app.authManager.jwt.block(token);
}
return actions.destroy(ctx, next);
}