mon-site-perso/backend/routes/projects.py

89 lines
No EOL
2.9 KiB
Python

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('/<project_id>', 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('/<project_id>', 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('/<project_id>', 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