新增KV数据库存储附件
This commit is contained in:
36
mail-worker/src/service/kv-obj-service.js
Normal file
36
mail-worker/src/service/kv-obj-service.js
Normal file
@@ -0,0 +1,36 @@
|
||||
const kvObjService = {
|
||||
|
||||
async putObj(c, key, content, metadata) {
|
||||
await c.env.kv.put(key, content, { metadata: metadata });
|
||||
},
|
||||
|
||||
async deleteObj(c, keys) {
|
||||
|
||||
if (typeof keys === 'string') {
|
||||
keys = [keys];
|
||||
}
|
||||
|
||||
if (keys.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
await Promise.all(keys.map( key => c.env.kv.delete(key)));
|
||||
},
|
||||
|
||||
async toObjResp(c, key) {
|
||||
|
||||
const obj = await c.env.kv.getWithMetadata(key, { type: "arrayBuffer"});
|
||||
|
||||
return new Response(obj.value, {
|
||||
headers: {
|
||||
'Content-Type': obj.metadata?.contentType || 'application/octet-stream',
|
||||
'Content-Disposition': obj.metadata?.contentDisposition || null,
|
||||
'Cache-Control': obj.metadata?.cacheControl || null
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
export default kvObjService;
|
||||
@@ -1,23 +1,35 @@
|
||||
import s3Service from './s3-service';
|
||||
import settingService from './setting-service';
|
||||
import kvObjService from './kv-obj-service';
|
||||
import { settingConst } from '../const/entity-const';
|
||||
|
||||
const r2Service = {
|
||||
|
||||
async hasOSS(c) {
|
||||
|
||||
if (c.env.r2) {
|
||||
const setting = await settingService.query(c);
|
||||
const { kvStorage, bucket, endpoint, s3AccessKey, s3SecretKey } = setting;
|
||||
|
||||
if (kvStorage === settingConst.kvStorage.OPEN) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const setting = await settingService.query(c);
|
||||
const { bucket, endpoint, s3AccessKey, s3SecretKey } = setting;
|
||||
if (c.env.r2) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return !!(bucket && endpoint && s3AccessKey && s3SecretKey);
|
||||
},
|
||||
|
||||
async putObj(c, key, content, metadata) {
|
||||
|
||||
if (c.env.r2) {
|
||||
const { kvStorage } = await settingService.query(c);
|
||||
|
||||
if (kvStorage === settingConst.kvStorage.OPEN) {
|
||||
|
||||
await kvObjService.putObj(c, key, content, metadata);
|
||||
|
||||
} else if (c.env.r2) {
|
||||
|
||||
await c.env.r2.put(key, content, {
|
||||
httpMetadata: { ...metadata }
|
||||
@@ -37,7 +49,13 @@ const r2Service = {
|
||||
|
||||
async delete(c, key) {
|
||||
|
||||
if (c.env.r2) {
|
||||
const { kvStorage } = await settingService.query(c);
|
||||
|
||||
if (kvStorage === settingConst.kvStorage.OPEN) {
|
||||
|
||||
await kvObjService.deleteObj(c, key);
|
||||
|
||||
} else if (c.env.r2) {
|
||||
|
||||
await c.env.r2.delete(key);
|
||||
|
||||
|
||||
@@ -1,12 +1,9 @@
|
||||
import KvConst from '../const/kv-const';
|
||||
import setting from '../entity/setting';
|
||||
import orm from '../entity/orm';
|
||||
import { settingConst, verifyRecordType } from '../const/entity-const';
|
||||
import { verifyRecordType } from '../const/entity-const';
|
||||
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 constant from '../const/constant';
|
||||
import BizError from '../error/biz-error';
|
||||
import { t } from '../i18n/i18n'
|
||||
@@ -100,12 +97,38 @@ const settingService = {
|
||||
await this.refresh(c);
|
||||
},
|
||||
|
||||
async deleteBackground(c) {
|
||||
|
||||
const { background } = await this.query(c);
|
||||
if (!background) return
|
||||
|
||||
if (background.startsWith('http')) {
|
||||
await orm(c).update(setting).set({ background: '' }).run();
|
||||
await this.refresh(c)
|
||||
return;
|
||||
}
|
||||
|
||||
const hasOss = await r2Service.hasOSS(c);
|
||||
|
||||
if (hasOss) {
|
||||
|
||||
if (background) {
|
||||
await r2Service.delete(c,background)
|
||||
await orm(c).update(setting).set({ background: '' }).run();
|
||||
await this.refresh(c)
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
async setBackground(c, params) {
|
||||
|
||||
const settingRow = await this.query(c);
|
||||
|
||||
let { background } = params
|
||||
|
||||
await this.deleteBackground(c);
|
||||
|
||||
if (background && !background.startsWith('http')) {
|
||||
|
||||
if (!await r2Service.hasOSS(c)) {
|
||||
@@ -130,14 +153,6 @@ const settingService = {
|
||||
|
||||
}
|
||||
|
||||
if (settingRow.background) {
|
||||
try {
|
||||
await r2Service.delete(c, settingRow.background);
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
}
|
||||
|
||||
await orm(c).update(setting).set({ background }).run();
|
||||
await this.refresh(c);
|
||||
return background;
|
||||
|
||||
Reference in New Issue
Block a user