- Introduced `cnb-login` route to handle user login via CNB token. - Created `CnbServices` class for managing CNB user interactions. - Added `findByCnbId` method in the User model to retrieve users by CNB ID. - Updated error handling to provide more structured error messages. - Enhanced user creation logic to handle CNB users. - Added tests for the new CNB login functionality.
37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
import { CNB } from '@kevisual/cnb'
|
|
import { UserModel } from '../../../auth/index.ts';
|
|
import { CustomError } from '@kevisual/router';
|
|
|
|
export class CnbServices {
|
|
cnb: CNB;
|
|
constructor(token?: string) {
|
|
this.cnb = new CNB({
|
|
token,
|
|
});
|
|
}
|
|
|
|
async login(): Promise<ReturnType<typeof UserModel.prototype.createToken>> {
|
|
const cnbUserRes = await this.cnb.user.getUser();
|
|
if (cnbUserRes.code !== 200) {
|
|
throw new CustomError('CNB Token is invalid');
|
|
}
|
|
const cnbUser = cnbUserRes?.data;
|
|
const cnbUserId = cnbUser?.id
|
|
if (!cnbUserId) {
|
|
throw new CustomError('CNB User ID is missing');
|
|
}
|
|
let user = await UserModel.findByCnbId(cnbUserId);
|
|
if (!user) {
|
|
const username = '@cnb-' + cnbUser.username;
|
|
// 如果用户不存在,创建一个新用户
|
|
user = await UserModel.createUser(username, cnbUserId);
|
|
user.data = {
|
|
...user.data,
|
|
cnbId: cnbUserId,
|
|
}
|
|
await user.save();
|
|
}
|
|
const token = await user.createToken();
|
|
return token;
|
|
}
|
|
} |