zqs-plugin-alicloud-sms
Version:
zqs-plugin-alicloud-sms
206 lines • 18.9 kB
JavaScript
"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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