#api/markdown.py from flask import Blueprint, request, jsonify import api from api import require_auth from contexts.RequestContext import RequestContext from db import get_db from db.models.Markdown import Markdown import logging from api import limiter logger = logging.getLogger(__name__) markdown_bp = Blueprint('markdown', __name__, url_prefix='/api/markdown') @markdown_bp.route('/', methods=['GET']) @limiter.limit(api.get_rate_limit) def get_markdowns(): with get_db() as session: mds = session.query(Markdown).all() return jsonify([md.to_dict() for md in mds]), 200 @markdown_bp.route('/by_path/', methods=['GET']) @limiter.limit(api.get_rate_limit) def get_markdowns_by_path(path_id): with get_db() as session: markdowns = session.query(Markdown).filter(Markdown.path_id == path_id).all() return jsonify([md.to_dict() for md in markdowns]), 200 @markdown_bp.route('/get_index/', methods=['GET']) @limiter.limit(api.get_rate_limit) def get_index(path_id): with get_db() as session: markdown = session.query(Markdown).filter(Markdown.path_id == path_id).filter(Markdown.title == "index").first() if markdown is None: return jsonify({"error": "index not exist"}), 404 return jsonify(markdown.to_dict()), 200 @markdown_bp.route('/', methods=['GET']) @limiter.limit(api.get_rate_limit) def get_markdown(markdown_id): with get_db() as session: markdown = session.query(Markdown).get(markdown_id) if markdown is None: return jsonify({"error": "file not found"}), 404 return jsonify(markdown.to_dict()), 200 @markdown_bp.route('/', methods=['POST']) @require_auth(roles=['admin', 'creator']) @limiter.limit(api.get_rate_limit) def create_markdown(): data = request.json title = data.get('title') content = data.get('content') path_id = data.get('path_id') if not title or not content: return jsonify({"error": "missing required fields"}), 400 new_markdown = Markdown(title=title, content=content, path_id=path_id) with get_db() as session: try: session.add(new_markdown) session.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() session.rollback() return jsonify({"error": f"create failed - {errno}"}), 500 @markdown_bp.route('/', methods=['PUT']) @require_auth(roles=['admin', 'creator']) @limiter.limit(api.get_rate_limit) def update_markdown(markdown_id): with get_db() as session: markdown = session.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_id = data.get('path_id') session.commit() return jsonify(markdown.to_dict()), 200 @markdown_bp.route('/', methods=['DELETE']) @require_auth(roles=['admin']) @limiter.limit(api.get_rate_limit) def delete_markdown(markdown_id): with get_db() as session: markdown = session.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 session.delete(markdown) session.commit() return jsonify({"message": "deleted"}), 200