🚧 refactoring is ongoing

This commit is contained in:
Song
2021-01-17 10:49:19 +08:00
parent aa2635afcd
commit 22975603c6
20 changed files with 327 additions and 199 deletions
+9
View File
@@ -0,0 +1,9 @@
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: 'data.db',
logging: false,
});
module.exports = sequelize;
+24
View File
@@ -0,0 +1,24 @@
const { pushWechatMessage } = require('./wechat');
module.exports = {
async processMessage(userPrefix, message) {
let result = {
success: false,
message: `unsupported message type ${message.type}`,
};
switch (message.type) {
case '0': // WeChat message
result = await pushWechatMessage(userPrefix, message);
break;
case '1': // Email message
// TODO: Email message
break;
case '2': // HTTP GET request
// TODO: HTTP GET request
break;
default:
break;
}
return result;
},
};
+25
View File
@@ -0,0 +1,25 @@
const { User } = require('../models');
const tokenStore = new Map();
async function initializeTokenStore() {
const users = await User.findAll();
users.forEach((user) => {
if (user.wechatAppId) {
tokenStore.set(user.prefix, {
appId: user.wechatAppId,
appSecret: user.wechatAppSecret,
templateId: user.wechatTemplateId,
openId: user.wechatOpenId,
token: '',
});
}
});
console.debug(tokenStore);
console.log('Token store initialized.');
}
module.exports = {
initializeTokenStore,
tokenStore,
};
+33
View File
@@ -0,0 +1,33 @@
function formatTime(format) {
if (format === undefined) format = 'yyyy-MM-dd hh:mm:ss';
const date = new Date();
const o = {
'M+': date.getMonth() + 1,
'd+': date.getDate(),
'h+': date.getHours(),
'm+': date.getMinutes(),
's+': date.getSeconds(),
S: date.getMilliseconds(),
};
if (/(y+)/.test(format)) {
format = format.replace(
RegExp.$1,
(date.getFullYear() + '').substr(4 - RegExp.$1.length)
);
}
for (let k in o) {
if (new RegExp('(' + k + ')').test(format)) {
format = format.replace(
RegExp.$1,
RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length)
);
}
}
return format;
}
module.exports = {
formatTime,
};
+68
View File
@@ -0,0 +1,68 @@
const axios = require('axios');
const { tokenStore } = require('./token');
const config = require('../config');
async function refreshToken() {
for (const item of tokenStore) {
item.token = await this.requestToken();
}
console.log('Token refreshed.');
}
async function requestToken(appId, appSecret) {
let token = '';
try {
let res = await axios.get(
`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appId}&secret=${appSecret}`
);
console.log(res);
if (res && res.data && res.data.access_token) {
token = res.data.access_token;
}
} catch (e) {
console.error(e);
}
return token;
}
async function pushWeChatMessage(userPrefix, message) {
// Reference: https://mp.weixin.qq.com/debug/cgi-bin/readtmpl?t=tmplmsg/faq_tmpl
let user = tokenStore.get(userPrefix);
let access_token = user.token;
let request_data = {
touser: user.wechatOpenId,
template_id: user.wechatTemplateId,
};
if (message.content) {
// TODO
// Generate html, save message to database and then return the id
let id = 'TODO';
request_data.url = `${config.href}${userPrefix}/${id}`;
}
request_data.data = { text: { value: message.description } };
let requestUrl = `https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=${access_token}`;
try {
let response = await axios.post(requestUrl, request_data);
if (response && response.data && response.data.errcode === '40001') {
await requestToken(user.wechatAppId, user.wechatAppSecret);
await axios.post(requestUrl, request_data);
}
console.log(response.data);
return {
success: true,
message: '',
};
} catch (e) {
console.error(e);
return {
success: false,
message: e.message,
};
}
}
module.exports = {
refreshToken,
requestToken,
pushWeChatMessage,
};