新增邮件发送和管理员功能

This commit is contained in:
eoao
2025-05-29 17:38:50 +08:00
parent de742d31e7
commit 2341d14b2d
364 changed files with 24202 additions and 1079 deletions

View File

@@ -2,31 +2,51 @@ import KvConst from '../const/kv-const';
import setting from '../entity/setting';
import orm from '../entity/orm';
import { settingConst } from '../const/entity-const';
import BizError from "../error/biz-error";
import fileUtils from '../utils/file-utils';
import r2Service from './r2-service';
import emailService from './email-service';
import accountService from './account-service';
import userService from './user-service';
import starService from './star-service';
import constant from '../const/constant';
import BizError from '../error/biz-error';
const settingService = {
async refresh(c) {
const settingRow = await orm(c).select().from(setting).get();
settingRow.resendTokens = JSON.parse(settingRow.resendTokens);
await c.env.kv.put(KvConst.SETTING, JSON.stringify(settingRow));
},
async query(c) {
const setting = await c.env.kv.get(KvConst.SETTING, { type: 'json' });
let domainList = c.env.domain;
if (typeof domainList === 'string') {
throw new BizError('环境变量domain必须是JSON类型');
}
domainList = domainList.map(item => '@' + item);
setting.domainList = domainList;
setting.siteKey = c.env.site_key;
setting.r2Domain = c.env.r2_domain;
return setting;
},
async get(c) {
const settingRow = await this.query(c);
settingRow.siteKey = settingRow.siteKey ? `${settingRow.siteKey.slice(0, 11)}******` : null ;
settingRow.secretKey = settingRow.secretKey ? `${settingRow.secretKey.slice(0, 11)}******`: null ;
Object.keys(settingRow.resendTokens).forEach(key => {
settingRow.resendTokens[key] = `${settingRow.resendTokens[key].slice(0, 11)}******`;
});
return settingRow
},
async set(c, params) {
if (params.registerVerify === 0 || params.addEmailVerify === 0) {
if (!c.env.site_key || !c.env.secret_key) {
throw new BizError('Turnstile密钥未配置,不能开启人机验证')
}
}
const settingData = await this.query(c)
let resendTokens = {...settingData.resendTokens,...params.resendTokens}
Object.keys(resendTokens).forEach(domain => {
if(!resendTokens[domain]) delete resendTokens[domain]
})
params.resendTokens = JSON.stringify(resendTokens)
await orm(c).update(setting).set({ ...params }).returning().get();
await this.refresh(c);
},
@@ -54,6 +74,42 @@ const settingService = {
async isAddEmailVerify(c) {
const { addEmailVerify } = await this.query(c);
return addEmailVerify === settingConst.addEmailVerify.OPEN;
},
async setBackground(c, params) {
const settingRow = await this.query(c);
if (!c.env.r2) {
throw new BizError('r2对象存储未配置不能上传背景');
}
if (!settingRow.r2Domain) {
throw new BizError('r2域名未配置不上传背景');
}
const { background } = params;
const file = fileUtils.base64ToFile(background);
const arrayBuffer = await file.arrayBuffer();
const key = constant.BACKGROUND_PREFIX + await fileUtils.getBuffHash(arrayBuffer) + fileUtils.getExtFileName(file.name);
await r2Service.putObj(c, key, file, {
contentType: file.type
});
if (settingRow.background) {
await r2Service.delete(c, settingRow.background);
}
await orm(c).update(setting).set({ background: key }).run();
await this.refresh(c);
return key;
},
async physicsDeleteAll(c) {
await emailService.physicsDeleteAll(c);
await accountService.physicsDeleteAll(c);
await userService.physicsDeleteAll(c);
}
};