import api 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, etag_response import logging resource_bp = Blueprint('resource', __name__, url_prefix='/api/resource') logger = logging.getLogger(__name__) @resource_bp.route('/', methods=['GET']) @limiter.limit(api.get_rate_limit) 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(api.get_rate_limit) 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('/', methods=['DELETE']) @require_auth(roles=["admin"]) @limiter.limit(api.get_rate_limit) 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