From 62c33c47c60fbf8176853ab9ff5eeda701bffdf4 Mon Sep 17 00:00:00 2001 From: hzhang Date: Mon, 23 Jun 2025 15:41:03 +0100 Subject: [PATCH] add: markdown deletion --- api/markdown.py | 57 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/api/markdown.py b/api/markdown.py index 93a8607..cc2166b 100644 --- a/api/markdown.py +++ b/api/markdown.py @@ -268,7 +268,8 @@ def delete_markdown(markdown_id): """ Delete a markdown document. - This endpoint deletes an existing markdown document. + This endpoint deletes an existing markdown document and cascades the deletion + to related settings to avoid foreign key conflicts. It requires authentication with the 'admin' role. Request: @@ -280,18 +281,54 @@ def delete_markdown(markdown_id): Response Codes: - 200: Deleted successfully - 404: Markdown not found + - 500: Server error during cascade deletion """ with get_db() as session: - markdown = session.get(Markdown, markdown_id) - if markdown is None: - logger.error(f"failed to delete markdown: {markdown_id}") + try: + markdown = session.get(Markdown, markdown_id) + if markdown is None: + logger.error(f"failed to delete markdown: {markdown_id}") + errno = RequestContext.get_error_id() + return jsonify({"error": f"file not found - {errno}"}), 404 + + md = markdown.to_dict() + + + if markdown.setting_id: + markdown_setting = session.query(MarkdownSetting).get(markdown.setting_id) + if markdown_setting: + template_setting_id = markdown_setting.template_setting_id + permission_setting_id = markdown_setting.permission_setting_id + + markdown_setting.template_setting_id = None + markdown_setting.permission_setting_id = None + session.flush() + + if template_setting_id: + from db.models.MarkdownTemplateSetting import MarkdownTemplateSetting + template_setting = session.query(MarkdownTemplateSetting).get(template_setting_id) + if template_setting: + session.delete(template_setting) + + if permission_setting_id: + permission_setting = session.query(MarkdownPermissionSetting).get(permission_setting_id) + if permission_setting: + session.delete(permission_setting) + + session.delete(markdown_setting) + + session.delete(markdown) + session.commit() + + markdown_deleted.send(None, payload=md) + logger.info(f"Successfully deleted markdown {markdown_id} with cascade deletion") + return jsonify(md), 200 + + except Exception as e: + logger.error(f"Failed to delete markdown {markdown_id}: {e}") errno = RequestContext.get_error_id() - return jsonify({"error": f"file not found - {errno}"}), 404 - md = markdown.to_dict() - session.delete(markdown) - session.commit() - markdown_deleted.send(None, payload=md) - return jsonify(md), 200 + session.rollback() + return jsonify({"error": f"delete failed - {errno}"}), 500 @markdown_bp.route('/move_forward/', methods=['PATCH'])