refactor: centralize mail state feature checks

This commit is contained in:
dreamhunter2333
2026-08-26 00:33:04 +08:00
parent fe73bbc54c
commit 523f9b8af6
7 changed files with 14 additions and 11 deletions
+1 -2
View File
@@ -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>) => {
+1 -1
View File
@@ -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
+6 -3
View File
@@ -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)),
};
};
+2 -1
View File
@@ -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),
);
+1 -2
View File
@@ -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));
};
+2 -2
View File
@@ -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);
+1
View File
@@ -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`