mirror of
https://github.com/dreamhunter2333/cloudflare_temp_email.git
synced 2026-08-30 04:26:42 +08:00
refactor: centralize mail state feature checks
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
import { Context } from "hono";
|
||||
import { handleMailListQuery } from "../common";
|
||||
import { resolveRawEmailRow } from "../gzip";
|
||||
import { getBooleanValue } from "../utils";
|
||||
import { serializeMailState } from "../mail_flags";
|
||||
|
||||
export default {
|
||||
@@ -35,7 +34,7 @@ export default {
|
||||
if (!result) return c.json(null);
|
||||
return c.json(serializeMailState(
|
||||
await resolveRawEmailRow(result),
|
||||
getBooleanValue(c.env.ENABLE_MAIL_FLAGS),
|
||||
c.env,
|
||||
));
|
||||
},
|
||||
deleteMail: async (c: Context<HonoCustomType>) => {
|
||||
|
||||
@@ -724,7 +724,7 @@ export const handleMailListQuery = async (
|
||||
const resolvedResults = await resolveRawEmailList(results);
|
||||
const serializedResults = resolvedResults.map(row => serializeMailState(
|
||||
row,
|
||||
getBooleanValue(c.env.ENABLE_MAIL_FLAGS),
|
||||
c.env,
|
||||
));
|
||||
const count = offset == 0 ? await c.env.DB.prepare(
|
||||
countQuery
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { getBooleanValue } from './utils';
|
||||
|
||||
export const MAIL_FLAGS = {
|
||||
UNREAD: 1 << 0,
|
||||
ANSWERED: 1 << 1,
|
||||
@@ -94,12 +96,12 @@ export const createCustomMailStateDefinitions = (
|
||||
|
||||
export const serializeMailState = <T extends Record<string, unknown>>(
|
||||
row: T,
|
||||
enabled: boolean,
|
||||
env: Bindings,
|
||||
): T => {
|
||||
const result = { ...row };
|
||||
const flags = Number(result.flags ?? 0);
|
||||
delete result.flags;
|
||||
if (!enabled) {
|
||||
if (!getBooleanValue(env.ENABLE_MAIL_FLAGS)) {
|
||||
return result;
|
||||
}
|
||||
result.unread = (flags & MAIL_FLAGS.UNREAD) !== 0;
|
||||
@@ -196,6 +198,7 @@ type MailScope = {
|
||||
|
||||
export const applyMailStateUpdate = async (
|
||||
db: D1Database,
|
||||
env: Bindings,
|
||||
scope: MailScope,
|
||||
value: unknown,
|
||||
customStates: MailStateDefinition[] = [],
|
||||
@@ -224,6 +227,6 @@ export const applyMailStateUpdate = async (
|
||||
return {
|
||||
success: true,
|
||||
changes: result.meta.changes ?? 0,
|
||||
results: results.map(row => serializeMailState(row, true)),
|
||||
results: results.map(row => serializeMailState(row, env)),
|
||||
};
|
||||
};
|
||||
|
||||
@@ -48,7 +48,7 @@ const getMail = async (c: Context<HonoCustomType>) => {
|
||||
if (!result) return c.json(null);
|
||||
return c.json(serializeMailState(
|
||||
await resolveRawEmailRow(result),
|
||||
getBooleanValue(c.env.ENABLE_MAIL_FLAGS),
|
||||
c.env,
|
||||
));
|
||||
};
|
||||
|
||||
@@ -73,6 +73,7 @@ const updateMailState = async (c: Context<HonoCustomType>) => {
|
||||
const { address } = c.get("jwtPayload");
|
||||
const result = await applyMailStateUpdate(
|
||||
c.env.DB,
|
||||
c.env,
|
||||
{ clause: 'address = ?', params: [address] },
|
||||
await c.req.json().catch(() => null),
|
||||
);
|
||||
|
||||
@@ -2,7 +2,6 @@ import { Context } from 'hono'
|
||||
|
||||
import { commonParseMail, handleMailListQuery, updateAddressUpdatedAt } from '../common'
|
||||
import { resolveRawEmailRow } from '../gzip'
|
||||
import { getBooleanValue } from '../utils';
|
||||
import { serializeMailState } from '../mail_flags';
|
||||
|
||||
const toParsedMailRow = async (row: Record<string, unknown>): Promise<Record<string, unknown>> => {
|
||||
@@ -49,7 +48,7 @@ const getParsedMail = async (c: Context<HonoCustomType>) => {
|
||||
if (!row) return c.json(null);
|
||||
const resolved = serializeMailState(
|
||||
await resolveRawEmailRow(row),
|
||||
getBooleanValue(c.env.ENABLE_MAIL_FLAGS),
|
||||
c.env,
|
||||
);
|
||||
return c.json(await toParsedMailRow(resolved));
|
||||
};
|
||||
|
||||
@@ -146,7 +146,7 @@ async function getMail(c: Context<HonoCustomType>): Promise<Response> {
|
||||
if (!result) {
|
||||
return c.text("Mail not found", 404);
|
||||
}
|
||||
return c.json(serializeMailState(await resolveRawEmailRow(result), false));
|
||||
return c.json(serializeMailState(await resolveRawEmailRow(result), c.env));
|
||||
}
|
||||
const userId = await checkTelegramAuth(c, initData);
|
||||
const jwtList = await c.env.KV.get<string[]>(`${CONSTANTS.TG_KV_PREFIX}:${userId}`, 'json') || [];
|
||||
@@ -169,7 +169,7 @@ async function getMail(c: Context<HonoCustomType>): Promise<Response> {
|
||||
return c.text(msgs.TgNoPermissionViewMailMsg, 403);
|
||||
}
|
||||
}
|
||||
return c.json(serializeMailState(await resolveRawEmailRow(result), false));
|
||||
return c.json(serializeMailState(await resolveRawEmailRow(result), c.env));
|
||||
}
|
||||
catch (e) {
|
||||
return c.text((e as Error).message, 400);
|
||||
|
||||
@@ -69,6 +69,7 @@ export default {
|
||||
const { user_id } = c.get("userPayload");
|
||||
const result = await applyMailStateUpdate(
|
||||
c.env.DB,
|
||||
c.env,
|
||||
{
|
||||
clause: `EXISTS (`
|
||||
+ `SELECT 1 FROM users_address ua`
|
||||
|
||||
Reference in New Issue
Block a user