90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
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('/<int:folder_id>', 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('/<int:folder_id>', 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
|