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>
101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
import logging
|
|
from flask import Blueprint, request, jsonify
|
|
from routes import require_active_service
|
|
|
|
logger = logging.getLogger('picell')
|
|
bp = Blueprint('email', __name__)
|
|
|
|
@bp.route('/api/email/users', methods=['GET'])
|
|
@require_active_service('email')
|
|
def get_email_users():
|
|
"""Get email users."""
|
|
try:
|
|
from app import email_manager
|
|
users = email_manager.get_users()
|
|
return jsonify(users)
|
|
except Exception as e:
|
|
logger.error(f"Error getting email users: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/email/users', methods=['POST'])
|
|
@require_active_service('email')
|
|
def create_email_user():
|
|
"""Create email user."""
|
|
try:
|
|
from app import email_manager, config_manager
|
|
data = request.get_json(silent=True)
|
|
if data is None:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
username = data.get('username')
|
|
domain = data.get('domain') or config_manager.get_effective_domain()
|
|
password = data.get('password')
|
|
if not username or not password:
|
|
return jsonify({"error": "Missing required fields: username, password"}), 400
|
|
result = email_manager.create_email_user(username, domain, password)
|
|
return jsonify({"created": result})
|
|
except Exception as e:
|
|
logger.error(f"Error creating email user: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/email/users/<username>', methods=['DELETE'])
|
|
@require_active_service('email')
|
|
def delete_email_user(username):
|
|
"""Delete email user."""
|
|
try:
|
|
from app import email_manager, config_manager
|
|
domain = request.args.get('domain') or config_manager.get_effective_domain()
|
|
result = email_manager.delete_email_user(username, domain)
|
|
return jsonify({"deleted": result})
|
|
except Exception as e:
|
|
logger.error(f"Error deleting email user: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/email/status', methods=['GET'])
|
|
def get_email_status():
|
|
"""Get email service status."""
|
|
try:
|
|
from app import email_manager
|
|
status = email_manager.get_status()
|
|
return jsonify(status)
|
|
except Exception as e:
|
|
logger.error(f"Error getting email status: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/email/connectivity', methods=['GET'])
|
|
@require_active_service('email')
|
|
def test_email_connectivity():
|
|
"""Test email connectivity."""
|
|
try:
|
|
from app import email_manager
|
|
result = email_manager.test_connectivity()
|
|
return jsonify(result)
|
|
except Exception as e:
|
|
logger.error(f"Error testing email connectivity: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/email/send', methods=['POST'])
|
|
@require_active_service('email')
|
|
def send_email():
|
|
try:
|
|
from app import email_manager
|
|
data = request.get_json(silent=True)
|
|
if data is None:
|
|
return jsonify({"error": "No data provided"}), 400
|
|
result = email_manager.send_email(data)
|
|
return jsonify(result)
|
|
except Exception as e:
|
|
logger.error(f"Error sending email: {e}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@bp.route('/api/email/mailbox/<username>', methods=['GET'])
|
|
@require_active_service('email')
|
|
def get_mailbox_info(username):
|
|
"""Get mailbox information."""
|
|
try:
|
|
from app import email_manager
|
|
result = email_manager.get_mailbox_info(username)
|
|
return jsonify(result)
|
|
except Exception as e:
|
|
logger.error(f"Error getting mailbox info: {e}")
|
|
return jsonify({"error": str(e)}), 500
|