#api/markdown.py from flask import Blueprint, request, jsonify from api import require_auth from contexts.RequestContext import RequestContext from db import get_db from db.models.Markdown import Markdown import logging logger = logging.getLogger(__name__) markdown_bp = Blueprint('markdown', __name__, url_prefix='/api/markdown') @markdown_bp.route('/', methods=['GET']) def get_markdown(markdown_id): with get_db() as db: markdown = db.query(Markdown).get(markdown_id) if markdown is None: return jsonify({"error": "file not found"}), 404 return jsonify(markdown.to_dict()) @markdown_bp.route('/', methods=['POST']) @require_auth(roles=['admin', 'creator']) def create_markdown(): data = request.json title = data.get('title') content = data.get('content') path = data.get('path') if not title or not content: return jsonify({"error": "missing required fields"}), 400 new_markdown = Markdown(title=title, content=content, path=path) with get_db() as db: try: db.add(new_markdown) db.commit() return jsonify(new_markdown.to_dict()), 201 except Exception as e: logger.error(f"failed to create markdown: {e}") errno = RequestContext.get_error_id() db.rollback() return jsonify({"error": f"create failed - {errno}"}), 500 @markdown_bp.route('/', methods=['PUT']) @require_auth(roles=['admin', 'creator']) def update_markdown(markdown_id): with get_db() as db: markdown = db.query(Markdown).get(markdown_id) if markdown is None: return jsonify({"error": "file not found"}), 404 data = request.json markdown.title = data.get('title') markdown.content = data.get('content') markdown.path = data.get('path') db.commit() return jsonify(markdown.to_dict()), 200 @markdown_bp.route('/', methods=['DELETE']) @require_auth(roles=['admin']) def delete_markdown(markdown_id): with get_db() as db: markdown = db.query(Markdown).get(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 db.delete(markdown) db.commit() return jsonify({"message": "deleted"}), 200