refactor: harden field mapping and sqlite boolean toggles
This commit is contained in:
21
SubMind.py
21
SubMind.py
@@ -242,7 +242,15 @@ def format_frequency(unit, value) -> str:
|
|||||||
|
|
||||||
|
|
||||||
CATEGORY_CB_PREFIX = "list_subs_in_category_id_"
|
CATEGORY_CB_PREFIX = "list_subs_in_category_id_"
|
||||||
EDITABLE_SUB_FIELDS = {'name', 'cost', 'currency', 'category', 'next_due', 'renewal_type', 'notes'}
|
EDITABLE_SUB_FIELDS = {
|
||||||
|
'name': 'name',
|
||||||
|
'cost': 'cost',
|
||||||
|
'currency': 'currency',
|
||||||
|
'category': 'category',
|
||||||
|
'next_due': 'next_due',
|
||||||
|
'renewal_type': 'renewal_type',
|
||||||
|
'notes': 'notes'
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def _build_category_callback_data(category_id: int) -> str:
|
def _build_category_callback_data(category_id: int) -> str:
|
||||||
@@ -1050,7 +1058,8 @@ async def edit_new_value_received(update: Update, context: CallbackContext):
|
|||||||
if update.effective_message:
|
if update.effective_message:
|
||||||
await update.effective_message.reply_text("错误:未选择要编辑的字段。")
|
await update.effective_message.reply_text("错误:未选择要编辑的字段。")
|
||||||
return ConversationHandler.END
|
return ConversationHandler.END
|
||||||
if field not in EDITABLE_SUB_FIELDS:
|
db_field = EDITABLE_SUB_FIELDS.get(field)
|
||||||
|
if not db_field:
|
||||||
if update.effective_message:
|
if update.effective_message:
|
||||||
await update.effective_message.reply_text("错误:不允许编辑该字段。")
|
await update.effective_message.reply_text("错误:不允许编辑该字段。")
|
||||||
logger.warning(f"Blocked unsafe field update attempt: {field}")
|
logger.warning(f"Blocked unsafe field update attempt: {field}")
|
||||||
@@ -1111,7 +1120,7 @@ async def edit_new_value_received(update: Update, context: CallbackContext):
|
|||||||
|
|
||||||
with get_db_connection() as conn:
|
with get_db_connection() as conn:
|
||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
cursor.execute(f"UPDATE subscriptions SET {field} = ? WHERE id = ? AND user_id = ?",
|
cursor.execute(f"UPDATE subscriptions SET {db_field} = ? WHERE id = ? AND user_id = ?",
|
||||||
(new_value, sub_id, user_id))
|
(new_value, sub_id, user_id))
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|
||||||
@@ -1195,12 +1204,14 @@ async def remind_action_handler(update: Update, context: CallbackContext):
|
|||||||
cursor = conn.cursor()
|
cursor = conn.cursor()
|
||||||
if action == 'toggle_enabled':
|
if action == 'toggle_enabled':
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"UPDATE subscriptions SET reminders_enabled = NOT reminders_enabled WHERE id = ? AND user_id = ?",
|
"UPDATE subscriptions SET reminders_enabled = CASE WHEN reminders_enabled THEN 0 ELSE 1 END "
|
||||||
|
"WHERE id = ? AND user_id = ?",
|
||||||
(sub_id, user_id)
|
(sub_id, user_id)
|
||||||
)
|
)
|
||||||
elif action == 'toggle_due_date':
|
elif action == 'toggle_due_date':
|
||||||
cursor.execute(
|
cursor.execute(
|
||||||
"UPDATE subscriptions SET reminder_on_due_date = NOT reminder_on_due_date WHERE id = ? AND user_id = ?",
|
"UPDATE subscriptions SET reminder_on_due_date = CASE WHEN reminder_on_due_date THEN 0 ELSE 1 END "
|
||||||
|
"WHERE id = ? AND user_id = ?",
|
||||||
(sub_id, user_id)
|
(sub_id, user_id)
|
||||||
)
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
|||||||
Reference in New Issue
Block a user