from flask import Blueprint, request, jsonify, g from app import db from app.models.folder import Folder from app.models.audit_log import AuditLog from app.services.auth_service import require_jwt folders_bp = Blueprint('folders', __name__) def _client_ip(): from flask import request as _req return _req.headers.get('X-Forwarded-For', _req.remote_addr or '').split(',')[0].strip() @folders_bp.route('', methods=['GET']) @require_jwt def list_folders(): folders = Folder.query.filter_by(user_id=g.current_user_id).order_by(Folder.name.asc()).all() return jsonify([f.to_dict() for f in folders]), 200 @folders_bp.route('', methods=['POST']) @require_jwt def create_folder(): data = request.get_json(silent=True) or {} name = (data.get('name') or '').strip() if not name: return jsonify({'error': 'name is required'}), 400 folder = Folder(user_id=g.current_user_id, name=name) db.session.add(folder) db.session.flush() # populate folder.id before logging AuditLog.log( user_id=g.current_user_id, action='folder.create', resource_type='folder', resource_id=folder.id, detail=f'Created folder: "{name}"', ip_address=_client_ip(), ) db.session.commit() return jsonify(folder.to_dict()), 201 @folders_bp.route('/', methods=['PUT']) @require_jwt def update_folder(folder_id): folder = Folder.query.filter_by(id=folder_id, user_id=g.current_user_id).first() if not folder: return jsonify({'error': 'Folder not found'}), 404 data = request.get_json(silent=True) or {} name = (data.get('name') or '').strip() if not name: return jsonify({'error': 'name is required'}), 400 old_name = folder.name folder.name = name AuditLog.log( user_id=g.current_user_id, action='folder.update', resource_type='folder', resource_id=folder.id, detail=f'Renamed folder: "{old_name}" → "{name}"', ip_address=_client_ip(), ) db.session.commit() return jsonify(folder.to_dict()), 200 @folders_bp.route('/', methods=['DELETE']) @require_jwt def delete_folder(folder_id): folder = Folder.query.filter_by(id=folder_id, user_id=g.current_user_id).first() if not folder: return jsonify({'error': 'Folder not found'}), 404 folder_name = folder.name folder_id = folder.id db.session.delete(folder) db.session.flush() AuditLog.log( user_id=g.current_user_id, action='folder.delete', resource_type='folder', resource_id=folder_id, detail=f'Deleted folder: "{folder_name}"', ip_address=_client_ip(), ) db.session.commit() return jsonify({'message': 'Folder deleted'}), 200