58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
#api/resource.py
|
|
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('/<identifier>', 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('/<identifier>', 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
|
|
|