UNPKG

zqs-plugin-alicloud-sms

Version:
206 lines 18.9 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Controller = void 0; const auth_1 = require("zqs-core/lib/auth"); const db_1 = require("zqs-core/lib/db"); const errors_1 = require("zqs-core/lib/errors"); const response_1 = require("zqs-core/lib/response"); const sms = require("ali-sms"); const moment = require("moment"); class Controller { constructor(model, config) { this.model = model; this.config = config; this.index = (ctx) => __awaiter(this, void 0, void 0, function* () { try { const paginateResult = yield db_1.paginate(this.model, ctx); response_1.response(ctx, 200, paginateResult); } catch (e) { console.error(e); errors_1.handleError(ctx, e); } }); this.send = (ctx) => __awaiter(this, void 0, void 0, function* () { try { if (!ctx.request.fields) throw errors_1.Boom.badData(this.config.errors.empty); if (!ctx.request.fields.category) throw errors_1.Boom.badData(this.config.errors.emptyCategory); if (!ctx.request.fields.mobile) throw errors_1.Boom.badData(this.config.errors.emptyMobile); const category = this.config.categories.find(x => x.name === ctx.request.fields.category); if (!category) throw errors_1.Boom.badData(this.config.errors.unknownCategory); if (category.captcha) { const verified = yield category.captcha(ctx); if (!verified) throw errors_1.Boom.badData(this.config.errors.captcha); } const exists = yield this.model .count({ mobile: ctx.request.fields.mobile, category: category.name, createdAt: { $gt: moment() .subtract(category.resendInterval.quantity, category.resendInterval.unit) .toDate(), }, }) .exec(); if (exists) throw errors_1.Boom.badData(category.resendInterval.error); const code = Math.random() .toString() .substring(2, category.codeLength + 2); const paramString = { code }; if (category.product) paramString.product = category.product; const body = { accessKeyID: category.accessKeyID, accessKeySecret: category.accessKeySecret, paramString, recNum: [ctx.request.fields.mobile], signName: category.signName, templateCode: category.templateCode, }; const res = yield this.sendSms(body); yield this.model.create({ mobile: ctx.request.fields.mobile, code, expiresIn: moment() .add(category.expiresIn.quantity, category.expiresIn.unit) .toDate(), category: category.name, }); response_1.response(ctx, 201, res); } catch (e) { errors_1.handleError(ctx, e); } }); this.verify = (body) => __awaiter(this, void 0, void 0, function* () { const category = this.config.categories.find(x => x.name === body.category); if (!category) throw errors_1.Boom.badData(this.config.errors.unknownCategory); const exists = yield this.model .count({ mobile: body.mobile, category: category.name, code: body.code, createdAt: { $gt: moment() .subtract(category.expiresIn.quantity, category.expiresIn.unit) .toDate(), }, }) .exec(); return !!exists; }); this.signin = (ctx) => __awaiter(this, void 0, void 0, function* () { try { if (!ctx.request.fields) throw errors_1.Boom.badData(this.config.errors.empty); if (!ctx.request.fields.code) throw errors_1.Boom.badData(this.config.errors.emptyCode); if (!ctx.request.fields.mobile) throw errors_1.Boom.badData(this.config.errors.emptyMobile); const correct = yield this.verify({ mobile: ctx.request.fields.mobile, code: ctx.request.fields.code, category: this.config.signin.categoryName, }); if (!correct) throw errors_1.Boom.badData(this.config.signin.errors.invalidCode); let auth = yield auth_1.AuthModel.findOne({ 'providers.name': this.config.signin.categoryName, 'providers.openid': ctx.request.fields.mobile, }).exec(); let status = 200; if (!auth) { const oldAuth = yield auth_1.AuthModel.findOne({ username: ctx.request.fields.mobile, }).exec(); if (!oldAuth) { auth = yield auth_1.AuthModel.create({ username: ctx.request.fields.mobile, providers: { name: this.config.signin.categoryName, openid: ctx.request.fields.mobile, }, }); status = 201; } else { oldAuth['providers'].push({ name: this.config.signin.categoryName, openid: ctx.request.fields.mobile, }); auth = yield oldAuth.save(); } } const token = auth_1.signToken(auth, { expiresIn: this.config.signin.expiresIn, }); response_1.response(ctx, status, { token }); } catch (e) { errors_1.handleError(ctx, e); } }); this.reset = (ctx) => __awaiter(this, void 0, void 0, function* () { try { if (!ctx.request.fields) throw errors_1.Boom.badData(this.config.errors.empty); if (!ctx.request.fields.code) throw errors_1.Boom.badData(this.config.errors.emptyCode); if (!ctx.request.fields.username) throw errors_1.Boom.badData(this.config.errors.emptyUsername); if (!ctx.request.fields.password) throw errors_1.Boom.badData(this.config.errors.emptyPassword); const correct = yield this.verify({ mobile: ctx.request.fields.username, code: ctx.request.fields.code, category: this.config.reset.categoryName, }); if (!correct) throw errors_1.Boom.badData(this.config.reset.errors.invalidCode); const auth = yield auth_1.AuthModel.findOne({ username: ctx.request.fields.username, }).exec(); if (!auth) throw errors_1.Boom.badData(this.config.errors.usernameNotFound); auth['password'] = String(ctx.request.fields.password); yield auth.save(); response_1.response(ctx, 204); } catch (e) { errors_1.handleError(ctx, e); } }); this.sendSms = (body) => { return new Promise((resolve, reject) => { sms(body, (err, body) => { if (err) { console.log(err); reject(err); } else resolve(body); }); }); }; Controller.instance = this; } } exports.Controller = Controller; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDRDQUF5RDtBQUV6RCx3Q0FBNkQ7QUFDN0QsZ0RBQXdEO0FBQ3hELG9EQUFpRDtBQUNqRCwrQkFBK0I7QUFDL0IsaUNBQWlDO0FBR2pDLE1BQWEsVUFBVTtJQUdyQixZQUFvQixLQUFhLEVBQVUsTUFBZTtRQUF0QyxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUtuRCxVQUFLLEdBQUcsQ0FBTyxHQUFhLEVBQUUsRUFBRTtZQUNyQyxJQUFJO2dCQUNGLE1BQU0sY0FBYyxHQUFHLE1BQU0sYUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZELG1CQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQzthQUNwQztZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLG9CQUFXLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFBLENBQUM7UUFFSyxTQUFJLEdBQUcsQ0FBTyxHQUFhLEVBQUUsRUFBRTtZQUNwQyxJQUFJO2dCQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU07b0JBQUUsTUFBTSxhQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUTtvQkFDOUIsTUFBTSxhQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RCxJ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