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