44d7e96f29
Email/calendar/files routes now return 404 when the service is not installed, using a require_active_service decorator that checks ServiceRegistry. Status endpoints are exempt so health checks always work. SetupManager.complete_setup() now accepts a service_store_manager and installs any wizard-selected services in a background daemon thread after setup completes. Failures are logged but do not fail the wizard. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
172 lines
6.1 KiB
Python
172 lines
6.1 KiB
Python
import logging
|
|
from flask import Blueprint, request, jsonify
|
|
from routes import require_active_service
|
|
|
|
logger = logging.getLogger('picell')
|
|
bp = Blueprint('files', __name__)
|
|
|
|
@bp.route('/api/files/users', methods=['GET'])
|
|
@require_active_service('files')
|
|
def get_file_users():
|
|
"""Get file storage users."""
|
|
try:
|
|
from app import file_manager
|
|
users = file_manager.get_users()
|
|
return jsonify(users)
|
|
except Exception as e:
|
|
logger.error(f"Error getting file users: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/users', methods=['POST'])
|
|
@require_active_service('files')
|
|
def create_file_user():
|
|
"""Create file storage user."""
|
|
try:
|
|
from app import file_manager
|
|
data = request.get_json(silent=True)
|
|
if data is None:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
username = data.get('username')
|
|
password = data.get('password')
|
|
if not username or not password:
|
|
return jsonify({"error": "Missing required fields: username, password"}), 400
|
|
result = file_manager.create_user(username, password)
|
|
return jsonify({"created": result})
|
|
except Exception as e:
|
|
logger.error(f"Error creating file user: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/users/<username>', methods=['DELETE'])
|
|
@require_active_service('files')
|
|
def delete_file_user(username):
|
|
"""Delete file storage user."""
|
|
try:
|
|
from app import file_manager
|
|
result = file_manager.delete_user(username)
|
|
return jsonify(result)
|
|
except Exception as e:
|
|
logger.error(f"Error deleting file user: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/folders', methods=['POST'])
|
|
@require_active_service('files')
|
|
def create_folder():
|
|
"""Create folder."""
|
|
try:
|
|
from app import file_manager
|
|
data = request.get_json(silent=True)
|
|
if data is None:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
username = data.get('username')
|
|
folder_path = data.get('folder_path') or data.get('path')
|
|
if not username or not folder_path:
|
|
return jsonify({"error": "Missing required fields: username, folder_path"}), 400
|
|
result = file_manager.create_folder(username, folder_path)
|
|
return jsonify({"created": result})
|
|
except ValueError as e:
|
|
return jsonify({"error": str(e)}), 400
|
|
except Exception as e:
|
|
logger.error(f"Error creating folder: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/folders/<username>/<path:folder_path>', methods=['DELETE'])
|
|
@require_active_service('files')
|
|
def delete_folder(username, folder_path):
|
|
"""Delete folder."""
|
|
try:
|
|
from app import file_manager
|
|
result = file_manager.delete_folder(username, folder_path)
|
|
return jsonify(result)
|
|
except ValueError as e:
|
|
return jsonify({"error": str(e)}), 400
|
|
except Exception as e:
|
|
logger.error(f"Error deleting folder: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/upload/<username>', methods=['POST'])
|
|
@require_active_service('files')
|
|
def upload_file(username):
|
|
"""Upload file."""
|
|
try:
|
|
from app import file_manager
|
|
if 'file' not in request.files:
|
|
return jsonify({"error": "No file provided"}), 400
|
|
|
|
file = request.files['file']
|
|
path = request.form.get('path', '') or file.filename or ''
|
|
file_data = file.read()
|
|
|
|
result = file_manager.upload_file(username, path, file_data)
|
|
return jsonify({"uploaded": result})
|
|
except ValueError as e:
|
|
return jsonify({"error": str(e)}), 400
|
|
except Exception as e:
|
|
logger.error(f"Error uploading file: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/download/<username>/<path:file_path>', methods=['GET'])
|
|
@require_active_service('files')
|
|
def download_file(username, file_path):
|
|
"""Download file."""
|
|
try:
|
|
from app import file_manager
|
|
result = file_manager.download_file(username, file_path)
|
|
return jsonify(result)
|
|
except ValueError as e:
|
|
return jsonify({"error": str(e)}), 400
|
|
except Exception as e:
|
|
logger.error(f"Error downloading file: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/delete/<username>/<path:file_path>', methods=['DELETE'])
|
|
@require_active_service('files')
|
|
def delete_file(username, file_path):
|
|
"""Delete file."""
|
|
try:
|
|
from app import file_manager
|
|
result = file_manager.delete_file(username, file_path)
|
|
return jsonify(result)
|
|
except ValueError as e:
|
|
return jsonify({"error": str(e)}), 400
|
|
except Exception as e:
|
|
logger.error(f"Error deleting file: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/list/<username>', methods=['GET'])
|
|
@require_active_service('files')
|
|
def list_files(username):
|
|
"""List files."""
|
|
try:
|
|
from app import file_manager
|
|
folder = request.args.get('folder', '')
|
|
result = file_manager.list_files(username, folder)
|
|
return jsonify(result)
|
|
except ValueError as e:
|
|
return jsonify({"error": str(e)}), 400
|
|
except Exception as e:
|
|
logger.error(f"Error listing files: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/status', methods=['GET'])
|
|
def get_file_status():
|
|
"""Get file service status."""
|
|
try:
|
|
from app import file_manager
|
|
status = file_manager.get_status()
|
|
return jsonify(status)
|
|
except Exception as e:
|
|
logger.error(f"Error getting file status: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/files/connectivity', methods=['GET'])
|
|
@require_active_service('files')
|
|
def test_file_connectivity():
|
|
"""Test file service connectivity."""
|
|
try:
|
|
from app import file_manager
|
|
result = file_manager.test_connectivity()
|
|
return jsonify(result)
|
|
except Exception as e:
|
|
logger.error(f"Error testing file connectivity: {e}")
|
|
return jsonify({"error": str(e)}), 500
|