from flask import Blueprint, jsonify, request, current_app from utils.data_loader import load_data from utils.json_crud import load_json, save_json, add_entry, delete_entry, update_entry from models.project_model import ProjectModel import os DATA_DIR = os.path.join(os.path.dirname(__file__), '../data') PROJECTS_FILE = os.path.join(DATA_DIR, 'projects.json') projects_bp = Blueprint('projects', __name__, url_prefix='/api/projects') @projects_bp.route('/', methods=['GET']) def get_projects(): projects = load_data('projects.json') return jsonify(projects) @projects_bp.route('/', methods=['GET']) def get_project(project_id): projects = load_data('projects.json') # Ensure numeric comparison for id project = next((p for p in projects if str(p.get('id')) == str(project_id)), None) if not project: return jsonify({"error": "Project not found"}), 404 return jsonify(project) @projects_bp.route('/', methods=['POST']) def create_project(): key = request.headers.get('x-api-key') if key != current_app.config['API_KEY']: return jsonify({ "error": "Unauthorized" }), 401 projects = load_data('projects.json') entry = request.json or {} project = ProjectModel(entry) if not project.is_valid(): return jsonify({ "error": "Invalid project data" }), 400 new_id = max((p.get('id') for p in projects), default=0) + 1 data = project.to_dict() data['id'] = new_id added = add_entry(PROJECTS_FILE, data) return jsonify(added), 201 @projects_bp.route('/', methods=['PUT', 'PATCH']) def update_project(project_id): key = request.headers.get('x-api-key') if key != current_app.config['API_KEY']: return jsonify({"error": "Unauthorized"}), 401 projects = load_json(PROJECTS_FILE) project = next((p for p in projects if str(p.get('id')) == str(project_id)), None) if not project: return jsonify({"error": "Project not found"}), 404 payload = request.json or {} # Merge existing with payload updated = {**project, **payload} # Preserve id updated['id'] = project['id'] # Validate using model model = ProjectModel(updated) if not model.is_valid(): return jsonify({"error": "Invalid project data"}), 400 saved = update_entry(PROJECTS_FILE, updated['id'], model.to_dict()) return jsonify(saved), 200 @projects_bp.route('/', methods=['DELETE']) def delete_project(project_id): key = request.headers.get('x-api-key') if key != current_app.config['API_KEY']: return jsonify({"error": "Unauthorized"}), 401 projects = load_json(PROJECTS_FILE) project = next((p for p in projects if str(p.get('id')) == str(project_id)), None) if project: deleted = delete_entry(PROJECTS_FILE, project_id) return jsonify(deleted), 200 return jsonify({"error": "Project not found"}), 404