116 lines
4.4 KiB
Python
116 lines
4.4 KiB
Python
from flask import Blueprint, request, jsonify
|
|
import api
|
|
from api import require_auth, etag_response
|
|
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)
|
|
@etag_response
|
|
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('/get_home', methods=['GET'])
|
|
@limiter.limit(api.get_rate_limit)
|
|
@etag_response
|
|
def get_home():
|
|
with get_db() as session:
|
|
markdown = session.query(Markdown).filter(Markdown.path_id == 1).filter(Markdown.title == "index").first()
|
|
if markdown is None:
|
|
return jsonify({}), 204
|
|
return jsonify(markdown.to_dict()), 200
|
|
@markdown_bp.route('/by_path/<int:path_id>', methods=['GET'])
|
|
@limiter.limit(api.get_rate_limit)
|
|
@etag_response
|
|
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/<int:path_id>', methods=['GET'])
|
|
@limiter.limit(api.get_rate_limit)
|
|
@etag_response
|
|
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({}), 204
|
|
return jsonify(markdown.to_dict()), 200
|
|
|
|
|
|
|
|
@markdown_bp.route('/<int:markdown_id>', methods=['GET'])
|
|
@limiter.limit(api.get_rate_limit)
|
|
@etag_response
|
|
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('/<int:markdown_id>', methods=['PUT', 'PATCH'])
|
|
@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
|
|
if request.method == "PUT":
|
|
markdown.title = data.get('title')
|
|
markdown.content = data.get('content')
|
|
markdown.path_id = data.get('path_id')
|
|
elif request.method == "PATCH":
|
|
if 'title' in data:
|
|
markdown.title = data.get('title')
|
|
if 'content' in data:
|
|
markdown.content = data.get('content')
|
|
if 'path_id' in data:
|
|
markdown.path_id = data.get('path_id')
|
|
session.commit()
|
|
return jsonify(markdown.to_dict()), 200
|
|
|
|
@markdown_bp.route('/<int:markdown_id>', 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 |