mirror of
https://github.com/vastxie/99AI.git
synced 2025-09-17 17:26:38 +08:00
249 lines
12 KiB
JavaScript
249 lines
12 KiB
JavaScript
"use strict";
|
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
};
|
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
};
|
|
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.AuthService = void 0;
|
|
const globalConfig_service_1 = require("../globalConfig/globalConfig.service");
|
|
const verification_constant_1 = require("../../common/constants/verification.constant");
|
|
const verification_service_1 = require("./../verification/verification.service");
|
|
const common_1 = require("@nestjs/common");
|
|
const jwt_1 = require("@nestjs/jwt");
|
|
const user_service_1 = require("../user/user.service");
|
|
const mailer_service_1 = require("../mailer/mailer.service");
|
|
const user_constant_1 = require("../../common/constants/user.constant");
|
|
const userBalance_service_1 = require("../userBalance/userBalance.service");
|
|
const config_entity_1 = require("../globalConfig/config.entity");
|
|
const typeorm_1 = require("typeorm");
|
|
const typeorm_2 = require("@nestjs/typeorm");
|
|
const utils_1 = require("../../common/utils");
|
|
const os = require("os");
|
|
const redisCache_service_1 = require("../redisCache/redisCache.service");
|
|
const svgCaptcha = require("svg-captcha");
|
|
const bcrypt = require("bcryptjs");
|
|
let AuthService = class AuthService {
|
|
constructor(configEntity, userService, jwtService, mailerService, verificationService, userBalanceService, redisCacheService, globalConfigService) {
|
|
this.configEntity = configEntity;
|
|
this.userService = userService;
|
|
this.jwtService = jwtService;
|
|
this.mailerService = mailerService;
|
|
this.verificationService = verificationService;
|
|
this.userBalanceService = userBalanceService;
|
|
this.redisCacheService = redisCacheService;
|
|
this.globalConfigService = globalConfigService;
|
|
}
|
|
async onModuleInit() {
|
|
this.getIp();
|
|
}
|
|
async register(body, req) {
|
|
await this.verificationService.verifyCaptcha(body);
|
|
const user = await this.userService.createUserAndVerifycation(body, req);
|
|
const { username, email, client, id } = user;
|
|
const res = { username, email, id };
|
|
client && (res.client = client);
|
|
return res;
|
|
}
|
|
async registerByPhone(body, req) {
|
|
const { username, password, phone, phoneCode, invitedBy } = body;
|
|
await this.userService.verifyUserRegisterByPhone(body);
|
|
const nameSpace = await this.globalConfigService.getNamespace();
|
|
const key = `${nameSpace}:PHONECODE:${phone}`;
|
|
const redisPhoneCode = await this.redisCacheService.get({ key });
|
|
if (!redisPhoneCode) {
|
|
throw new common_1.HttpException('验证码已过期、请重新发送!', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
if (phoneCode !== redisPhoneCode) {
|
|
throw new common_1.HttpException('验证码填写错误、请重新输入!', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
const email = `${(0, utils_1.createRandomUid)()}@nine.com`;
|
|
const newUser = { username, password, phone, invitedBy, email, status: user_constant_1.UserStatusEnum.ACTIVE };
|
|
const userDefautlAvatar = await this.globalConfigService.getConfigs(['userDefautlAvatar']);
|
|
newUser.avatar = userDefautlAvatar;
|
|
const hashedPassword = bcrypt.hashSync(password, 10);
|
|
newUser.password = hashedPassword;
|
|
const u = await this.userService.createUser(newUser);
|
|
let inviteUser;
|
|
if (invitedBy) {
|
|
inviteUser = await this.userService.qureyUserInfoByInviteCode(invitedBy);
|
|
}
|
|
await this.userBalanceService.addBalanceToNewUser(u.id, inviteUser === null || inviteUser === void 0 ? void 0 : inviteUser.id);
|
|
return;
|
|
}
|
|
async login(user, req) {
|
|
const u = await this.userService.verifyUserCredentials(user);
|
|
const { username, id, email, role, openId, client } = u;
|
|
const ip = (0, utils_1.getClientIp)(req);
|
|
await this.userService.savaLoginIp(id, ip);
|
|
const token = await this.jwtService.sign({ username, id, email, role, openId, client });
|
|
await this.redisCacheService.saveToken(id, token);
|
|
return token;
|
|
}
|
|
async loginByPhone(body, req) {
|
|
const u = await this.userService.verifyUserCredentials(body);
|
|
const { username, id, email, role, openId, client } = u;
|
|
const ip = (0, utils_1.getClientIp)(req);
|
|
await this.userService.savaLoginIp(id, ip);
|
|
const { phone } = body;
|
|
const token = await this.jwtService.sign({ username, id, email, role, openId, client, phone });
|
|
await this.redisCacheService.saveToken(id, token);
|
|
return token;
|
|
}
|
|
async loginByOpenId(user, req) {
|
|
const { status } = user;
|
|
if (status !== user_constant_1.UserStatusEnum.ACTIVE) {
|
|
throw new common_1.HttpException(user_constant_1.UserStatusErrMsg[status], common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
const { username, id, email, role, openId, client } = user;
|
|
const ip = (0, utils_1.getClientIp)(req);
|
|
await this.userService.savaLoginIp(id, ip);
|
|
const token = await this.jwtService.sign({ username, id, email, role, openId, client });
|
|
await this.redisCacheService.saveToken(id, token);
|
|
return token;
|
|
}
|
|
async getInfo(req) {
|
|
const { id } = req.user;
|
|
return await this.userService.getUserInfo(id);
|
|
}
|
|
async activateAccount(params, res) {
|
|
const emailConfigs = await this.configEntity.find({
|
|
where: {
|
|
configKey: (0, typeorm_1.In)([
|
|
'registerSuccessEmailTitle',
|
|
'registerSuccessEmailTeamName',
|
|
'registerSuccessEmaileAppend',
|
|
'registerFailEmailTitle',
|
|
'registerFailEmailTeamName',
|
|
]),
|
|
},
|
|
});
|
|
const configMap = emailConfigs.reduce((pre, cur) => {
|
|
pre[cur.configKey] = cur.configVal;
|
|
return pre;
|
|
}, {});
|
|
try {
|
|
const v = await this.verificationService.verifyCode(params, verification_constant_1.VerificationEnum.Registration);
|
|
const { type, userId } = v;
|
|
if (type !== verification_constant_1.VerificationEnum.Registration) {
|
|
throw new common_1.HttpException('验证码类型错误', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
const status = await this.userService.getUserStatus(userId);
|
|
if (status === user_constant_1.UserStatusEnum.ACTIVE) {
|
|
throw new common_1.HttpException('账户已被激活过', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
await this.userService.updateUserStatus(v.userId, user_constant_1.UserStatusEnum.ACTIVE);
|
|
const u = await this.userService.queryUserInfoById(v.userId);
|
|
const { username, email, id, invitedBy } = u;
|
|
let inviteUser;
|
|
if (invitedBy) {
|
|
inviteUser = await this.userService.qureyUserInfoByInviteCode(invitedBy);
|
|
}
|
|
await this.userBalanceService.addBalanceToNewUser(id, inviteUser === null || inviteUser === void 0 ? void 0 : inviteUser.id);
|
|
res.redirect(`/api/auth/registerSuccess?id=${id.toString().padStart(4, '0')}&username=${username}&email=${email}®isterSuccessEmailTitle=${configMap.registerSuccessEmailTitle}®isterSuccessEmailTeamName=${configMap.registerSuccessEmailTeamName}®isterSuccessEmaileAppend=${configMap.registerSuccessEmaileAppend}`);
|
|
}
|
|
catch (error) {
|
|
console.log('error: ', error);
|
|
const message = error.response;
|
|
res.redirect(`/api/auth/registerError?message=${message}®isterFailEmailTitle=${configMap.registerFailEmailTitle}®isterFailEmailTeamName=${configMap.registerFailEmailTeamName}`);
|
|
}
|
|
}
|
|
async updatePassword(req, body) {
|
|
const { id, client, role } = req.user;
|
|
if (client && Number(client) > 0) {
|
|
throw new common_1.HttpException('无权此操作、请联系管理员!', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
if (role === 'admin') {
|
|
throw new common_1.HttpException('非法操作、请联系管理员!', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
const bool = await this.userService.verifyUserPassword(id, body.oldPassword);
|
|
if (!bool) {
|
|
throw new common_1.HttpException('旧密码错误、请检查提交', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
this.userService.updateUserPassword(id, body.password);
|
|
return '密码修改成功';
|
|
}
|
|
async updatePassByOther(req, body) {
|
|
const { id, client } = req.user;
|
|
if (!client) {
|
|
throw new common_1.HttpException('无权此操作!', common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
this.userService.updateUserPassword(id, body.password);
|
|
return '密码修改成功';
|
|
}
|
|
getIp() {
|
|
let ipAddress;
|
|
const interfaces = os.networkInterfaces();
|
|
Object.keys(interfaces).forEach((interfaceName) => {
|
|
const interfaceInfo = interfaces[interfaceName];
|
|
for (let i = 0; i < interfaceInfo.length; i++) {
|
|
const alias = interfaceInfo[i];
|
|
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
|
|
ipAddress = alias.address;
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
this.ipAddress = ipAddress;
|
|
}
|
|
async captcha(parmas) {
|
|
const nameSpace = await this.globalConfigService.getNamespace();
|
|
const { color = '#fff' } = parmas;
|
|
const captcha = svgCaptcha.createMathExpr({ background: color, height: 34, width: 120, noise: 3 });
|
|
const text = captcha.text;
|
|
const randomId = (0, utils_1.createRandomUid)();
|
|
const key = `${nameSpace}:CAPTCHA:${randomId}`;
|
|
await this.redisCacheService.set({ key, val: captcha.text }, 5 * 60);
|
|
return {
|
|
svgCode: captcha.data,
|
|
code: randomId,
|
|
};
|
|
}
|
|
async sendPhoneCode(body) {
|
|
await this.verificationService.verifyCaptcha(body);
|
|
const { phone } = body;
|
|
const nameSpace = await this.globalConfigService.getNamespace();
|
|
const key = `${nameSpace}:PHONECODE:${phone}`;
|
|
const ttl = await this.redisCacheService.ttl(key);
|
|
if (ttl && ttl > 0) {
|
|
throw new common_1.HttpException(`${ttl}秒内不得重复发送短信!`, common_1.HttpStatus.BAD_REQUEST);
|
|
}
|
|
const code = (0, utils_1.createRandomCode)();
|
|
const messageInfo = { phone, code };
|
|
await this.verificationService.sendPhoneCode(messageInfo);
|
|
await this.redisCacheService.set({ key, val: code }, 1 * 60);
|
|
return '验证码发送成功、请填写验证码完成注册!';
|
|
}
|
|
createTokenFromFingerprint(fingerprint) {
|
|
const token = this.jwtService.sign({
|
|
username: `游客${fingerprint}`,
|
|
id: fingerprint,
|
|
email: `${fingerprint}@nine.com`,
|
|
role: 'visitor',
|
|
openId: null,
|
|
client: null,
|
|
});
|
|
return token;
|
|
}
|
|
};
|
|
AuthService = __decorate([
|
|
(0, common_1.Injectable)(),
|
|
__param(0, (0, typeorm_2.InjectRepository)(config_entity_1.ConfigEntity)),
|
|
__metadata("design:paramtypes", [typeorm_1.Repository,
|
|
user_service_1.UserService,
|
|
jwt_1.JwtService,
|
|
mailer_service_1.MailerService,
|
|
verification_service_1.VerificationService,
|
|
userBalance_service_1.UserBalanceService,
|
|
redisCache_service_1.RedisCacheService,
|
|
globalConfig_service_1.GlobalConfigService])
|
|
], AuthService);
|
|
exports.AuthService = AuthService;
|