From 523f9b8af6ce54f7deea479507683e174ca2d19e Mon Sep 17 00:00:00 2001 From: dreamhunter2333 Date: Wed, 26 Aug 2026 00:33:04 +0800 Subject: [PATCH] refactor: centralize mail state feature checks --- worker/src/admin_api/admin_mail_api.ts | 3 +-- worker/src/common.ts | 2 +- worker/src/mail_flags.ts | 9 ++++++--- worker/src/mails_api/mails_crud.ts | 3 ++- worker/src/mails_api/parsed_mail_api.ts | 3 +-- worker/src/telegram_api/miniapp.ts | 4 ++-- worker/src/user_api/user_mail_api.ts | 1 + 7 files changed, 14 insertions(+), 11 deletions(-) diff --git a/worker/src/admin_api/admin_mail_api.ts b/worker/src/admin_api/admin_mail_api.ts index e1f373a..7516b43 100644 --- a/worker/src/admin_api/admin_mail_api.ts +++ b/worker/src/admin_api/admin_mail_api.ts @@ -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) => { diff --git a/worker/src/common.ts b/worker/src/common.ts index d47c117..341a6fa 100644 --- a/worker/src/common.ts +++ b/worker/src/common.ts @@ -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 diff --git a/worker/src/mail_flags.ts b/worker/src/mail_flags.ts index 301f688..79e91dd 100644 --- a/worker/src/mail_flags.ts +++ b/worker/src/mail_flags.ts @@ -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 = >( 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)), }; }; diff --git a/worker/src/mails_api/mails_crud.ts b/worker/src/mails_api/mails_crud.ts index fc96987..6979bcb 100644 --- a/worker/src/mails_api/mails_crud.ts +++ b/worker/src/mails_api/mails_crud.ts @@ -48,7 +48,7 @@ const getMail = async (c: Context) => { 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) => { const { address } = c.get("jwtPayload"); const result = await applyMailStateUpdate( c.env.DB, + c.env, { clause: 'address = ?', params: [address] }, await c.req.json().catch(() => null), ); diff --git a/worker/src/mails_api/parsed_mail_api.ts b/worker/src/mails_api/parsed_mail_api.ts index 13fa3c2..df91738 100644 --- a/worker/src/mails_api/parsed_mail_api.ts +++ b/worker/src/mails_api/parsed_mail_api.ts @@ -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): Promise> => { @@ -49,7 +48,7 @@ const getParsedMail = async (c: Context) => { 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)); }; diff --git a/worker/src/telegram_api/miniapp.ts b/worker/src/telegram_api/miniapp.ts index 0eae0f1..e9d91bc 100644 --- a/worker/src/telegram_api/miniapp.ts +++ b/worker/src/telegram_api/miniapp.ts @@ -146,7 +146,7 @@ async function getMail(c: Context): Promise { 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(`${CONSTANTS.TG_KV_PREFIX}:${userId}`, 'json') || []; @@ -169,7 +169,7 @@ async function getMail(c: Context): Promise { 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); diff --git a/worker/src/user_api/user_mail_api.ts b/worker/src/user_api/user_mail_api.ts index 24f8d62..efab1e2 100644 --- a/worker/src/user_api/user_mail_api.ts +++ b/worker/src/user_api/user_mail_api.ts @@ -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`