Files
HangmanLab.Backend/api/resource.py

56 lines
2.2 KiB
Python

#api/resource.py
from flask import Blueprint, jsonify, request
from contexts.RequestContext import RequestContext
from db import get_db
from db.models.Resource import Resource
from api import require_auth, limiter
import logging
resource_bp = Blueprint('resource', __name__, url_prefix='/api/resource')
logger = logging.getLogger(__name__)
@resource_bp.route('/<identifier>', methods=['GET'])
@limiter.limit('10 per second')
def get_resource(identifier):
with get_db() as session:
resource = session.query(Resource).get(identifier)
if resource is None:
logger.error(f"resource not found: {identifier}")
errno = RequestContext.get_error_id()
return jsonify({"error": f"resource not found - {errno}"}), 404
return jsonify(resource.to_dict()), 200
@resource_bp.route('/', methods=['POST'])
@require_auth(roles=["admin", "creator"])
@limiter.limit('20 per minute')
def create_resource():
data = request.get_json()
identifier = data.get('id')
content = data.get('content')
data_type = data.get('data_type')
if not identifier or not content or not data_type:
return jsonify({"error": "missing required fields"}), 400
resource_entry = Resource(id=identifier, content=content, data_type=data_type)
with get_db() as session:
try:
session.add(resource_entry)
session.commit()
return jsonify(resource_entry.to_dict()), 201
except Exception as e:
session.rollback()
logger.error(f"Failed to create resource: {e}")
errno = RequestContext.get_error_id()
return jsonify({"error": f"failed to create resource - {errno}"}), 500
@resource_bp.route('/<identifier>', methods=['DELETE'])
@require_auth(roles=["admin"])
@limiter.limit('20 per minute')
def delete_resource(identifier):
with get_db() as session:
resource = session.query(Resource).get(identifier)
if not resource:
logger.error(f"resource not found: {identifier}")
errno = RequestContext.get_error_id()
return jsonify({"error": f"Resource not found - {errno}"}), 404
session.delete(resource)
session.commit()
return jsonify({"message": "Resource deleted"}), 200