feat: add CNB login functionality and user management
- 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.
This commit is contained in:
37
src/routes/user/modules/cnb-services.ts
Normal file
37
src/routes/user/modules/cnb-services.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user