优化多个地方

This commit is contained in:
eoao
2025-09-03 08:31:44 +08:00
parent 97a7950808
commit b4954e948b
30 changed files with 156 additions and 89 deletions

View File

@@ -12,6 +12,7 @@ import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';
import roleService from '../service/role-service';
import verifyUtils from '../utils/verify-utils';
import r2Service from '../service/r2-service';
dayjs.extend(utc);
dayjs.extend(timezone);
@@ -152,7 +153,7 @@ export async function email(message, env, ctx) {
attachment.accountId = emailRow.accountId;
});
if (attachments.length > 0 && env.r2) {
if (attachments.length > 0 && await r2Service.hasOSS({env})) {
await attService.addAtt({ env }, attachments);
}

View File

@@ -14,15 +14,15 @@ app.onError((err, c) => {
}
if (err.message === `Cannot read properties of undefined (reading 'get')`) {
return c.text('初始化失败:KV数据库未绑定或变量名错误 Initialization failed: KV database not bound or invalid variable name');
return c.json(result.fail('初始化失败:KV数据库未绑定或变量名错误'));
}
if (err.message === `Cannot read properties of undefined (reading 'put')`) {
return c.text('初始化失败:KV数据库未绑定或变量名错误 Initialization failed: KV database not bound or invalid variable name');
return c.json(result.fail('初始化失败:KV数据库未绑定或变量名错误'));
}
if (err.message === `Cannot read properties of undefined (reading 'prepare')`) {
return c.text('初始化失败:D1数据库未绑定或变量名错误 Initialization failed: D1 database not bound or invalid variable name');
return c.json(result.fail('初始化失败:D1数据库未绑定或变量名错误'));
}
return c.json(result.fail(err.message, err.code));

View File

@@ -96,7 +96,6 @@ const en = {
"系统设置": "System Settings",
"设置查看": "View Settings",
"设置修改": "Change Settings",
"物理清空": "Physical Purge",
"发件重置": "Reset Send Count"
}
};

View File

@@ -96,7 +96,6 @@ const zh = {
"系统设置": "系统设置",
"设置查看": "设置查看",
"设置修改": "设置修改",
"物理清空": "物理清空",
'发件重置': '发件重置'
}
}

View File

@@ -21,7 +21,6 @@ const init = {
await this.v1_5DB(c);
await this.v1_6DB(c);
await this.v1_7DB(c);
await this.v1_7DB(c);
await this.v2DB(c);
await settingService.refresh(c);
return c.text(t('initSuccess'));
@@ -34,7 +33,8 @@ const init = {
c.env.db.prepare(`ALTER TABLE setting ADD COLUMN region TEXT NOT NULL DEFAULT '';`),
c.env.db.prepare(`ALTER TABLE setting ADD COLUMN endpoint TEXT NOT NULL DEFAULT '';`),
c.env.db.prepare(`ALTER TABLE setting ADD COLUMN s3_access_key TEXT NOT NULL DEFAULT '';`),
c.env.db.prepare(`ALTER TABLE setting ADD COLUMN s3_secret_key TEXT NOT NULL DEFAULT '';`)
c.env.db.prepare(`ALTER TABLE setting ADD COLUMN s3_secret_key TEXT NOT NULL DEFAULT '';`),
c.env.db.prepare(`DELETE FROM perm WHERE perm_key = 'setting:clean'`)
]);
} catch (e) {
console.error(e.message)

View File

@@ -1,21 +1,31 @@
import orm from '../entity/orm';
import { att } from '../entity/att';
import { and, eq, isNull, inArray, notInArray } from 'drizzle-orm';
import { and, eq, isNull, inArray } from 'drizzle-orm';
import r2Service from './r2-service';
import constant from '../const/constant';
import fileUtils from '../utils/file-utils';
import { attConst } from '../const/entity-const';
import { parseHTML } from 'linkedom';
import domainUtils from '../utils/domain-uitls';
const attService = {
async addAtt(c, attachments) {
for (let attachment of attachments) {
await r2Service.putObj(c, attachment.key, attachment.content, {
let metadate = {
contentType: attachment.mimeType,
contentDisposition: `attachment; filename="${attachment.filename}"`
});
}
if (!attachment.contentId) {
metadate.contentDisposition = `attachment; filename="${attachment.filename}"`
} else {
metadate.contentDisposition = `inline; filename="${attachment.filename}"`
metadate.cacheControl = `max-age=604800`
}
await r2Service.putObj(c, attachment.key, attachment.content, metadate);
}
await orm(c).insert(att).values(attachments).run();
@@ -49,7 +59,7 @@ const attService = {
const file = fileUtils.base64ToFile(src);
const buff = await file.arrayBuffer();
const key = constant.ATTACHMENT_PREFIX + await fileUtils.getBuffHash(buff) + fileUtils.getExtFileName(file.name);
img.setAttribute('src', r2Domain + '/' + key);
img.setAttribute('src', domainUtils.toOssDomain(r2Domain) + '/' + key);
const attData = {};
attData.key = key;
@@ -108,7 +118,9 @@ const attService = {
attData.accountId = accountId;
attData.type = attConst.type.EMBED;
await r2Service.putObj(c, attData.key, attData.buff, {
contentType: attData.mimeType
contentType: attData.mimeType,
cacheControl: `max-age=604800`,
contentDisposition: `inline; filename="${attData.filename}"`
});
}
@@ -153,9 +165,7 @@ const attService = {
await this.batchDelete(c, delKeyList);
}
const delAttSql = fieldValues.map(value => c.env.db.prepare(`DELETE
FROM attachments
WHERE ${fieldName} = ?`).bind(value));
const delAttSql = fieldValues.map(value => c.env.db.prepare(`DELETE FROM attachments WHERE ${fieldName} = ?`).bind(value));
await c.env.db.batch(delAttSql);
},

View File

@@ -18,6 +18,7 @@ import dayjs from 'dayjs';
import kvConst from '../const/kv-const';
import { t } from '../i18n/i18n'
import r2Service from './r2-service';
import domainUtils from '../utils/domain-uitls';
const emailService = {
@@ -407,6 +408,8 @@ const emailService = {
}
r2domain = domainUtils.toOssDomain(r2domain)
if (src && src.startsWith(r2domain + '/')) {
img.setAttribute('src', src.replace(r2domain + '/', '{{domain}}'));
}

View File

@@ -9,9 +9,23 @@ const s3Service = {
const { bucket } = await settingService.query(c);
await client.send(
new PutObjectCommand({ Bucket: bucket, Key: key, Body: content, ...metadata })
)
let obj = { Bucket: bucket, Key: key, Body: content,
CacheControl: metadata.cacheControl
}
if (metadata.cacheControl) {
obj.CacheControl = metadata.cacheControl
}
if (metadata.contentDisposition) {
obj.ContentDisposition = metadata.contentDisposition
}
if (metadata.contentType) {
obj.ContentType = metadata.contentType
}
await client.send(new PutObjectCommand(obj))
},
async deleteObj(c,keys) {

View File

@@ -119,7 +119,9 @@ const settingService = {
await r2Service.putObj(c, background, arrayBuffer, {
contentType: file.type
contentType: file.type,
cacheControl: `public, max-age=31536000, immutable`,
contentDisposition: `inline; filename="${file.name}"`
});
}