import { auth, method, route, swagger, validate } from "@noderun/hapi-router"; import { gSuccess, gFail } from "@/util"; import User from "@/model/User"; import * as bcrypt from "bcrypt"; import * as jwt from "jsonwebtoken"; import * as Joi from "joi"; export default class { @validate({ payload: Joi.object({ username: Joi.string().alphanum().min(6).max(35).required(), password: Joi.string().pattern(new RegExp("^[a-zA-Z0-9]{3,30}$")), email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ["com", "net"] }, }), }), }) @method("POST") @route("/register") @swagger("用户注册", "返回注册用户的信息", ["api"]) @auth(false) async register(request, h) { let { username, password, email } = request.payload; try { const result = await User.findOne({ where: { username: username } }); if (result != null) { return gFail(null, "已存在该用户"); } let salt = bcrypt.genSaltSync(10); let pwdLock = bcrypt.hashSync(password, salt); await User.create({ username, password: pwdLock, email }); return gSuccess("success", "you have a good heart."); } catch (e) { return gFail(null, "新建用户失败"); } } @validate({ payload: Joi.object({ username: Joi.string().alphanum().min(6).max(35).required(), password: Joi.string().pattern(new RegExp("^[a-zA-Z0-9]{3,30}$")), }), }) @auth(false) @method("POST") @route("/login") @swagger("用户登录", "返回注册用户的信息", ["api"]) async login(request, h) { let { username, password } = request.payload; const result = await User.findOne({ where: { username: username } }); if (result == null) { return gFail(null, "不存在该用户"); } const validUser = bcrypt.compareSync(password, result.password); if (!validUser) { return gFail(null, "密码不正确"); } let token = jwt.sign({ id: result.id }, process.env.KEY); return gSuccess({ token: token }); } @method("DELETE") @auth() @route("/del") @swagger("删除用户", "删除用户账号", ["api"]) async del(request, h) { const { id } = request.auth.credentials; let result = await User.findOne({ where: { id: id } }); if (result == null) { return gFail(null, "不存在该用户"); } await result.destroy(); return gSuccess(null, "删除成功"); } @method("GET") @route("/userinfo") @validate({ headers: Joi.object({ Authorization: Joi.string(), }).unknown(), // 注意加上这个 }) @swagger("获取用户信息", "返回注册用户的信息", ["api"]) async userinfo(request, h) { console.log(request); const { id } = request.auth.credentials; let result = await User.findOne({ where: { id: id } }); if (result == null) { return gFail(null, "不存在该用户"); } result = result.toJSON(); delete result.password; return gSuccess(result); } }