f77d7fabcd
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66 lines
2.0 KiB
Python
66 lines
2.0 KiB
Python
import logging
|
|
from flask import Blueprint, request, jsonify
|
|
|
|
logger = logging.getLogger('picell')
|
|
|
|
setup_bp = Blueprint('setup', __name__, url_prefix='/api/setup')
|
|
|
|
|
|
def _get_setup_manager():
|
|
from app import setup_manager
|
|
return setup_manager
|
|
|
|
|
|
@setup_bp.route('/status', methods=['GET'])
|
|
def get_setup_status():
|
|
"""Return wizard status and available options."""
|
|
sm = _get_setup_manager()
|
|
if sm.is_setup_complete():
|
|
return jsonify({'error': 'Setup already complete'}), 410
|
|
return jsonify(sm.get_setup_status())
|
|
|
|
|
|
@setup_bp.route('/validate', methods=['POST'])
|
|
def validate_setup_step():
|
|
"""Validate a single wizard step.
|
|
|
|
Expects JSON body: ``{'step': '<step_name>', 'data': {...}}``.
|
|
Supported steps: ``cell_name``, ``password``.
|
|
"""
|
|
sm = _get_setup_manager()
|
|
if sm.is_setup_complete():
|
|
return jsonify({'error': 'Setup already complete'}), 410
|
|
|
|
body = request.get_json(silent=True) or {}
|
|
step = body.get('step', '')
|
|
data = body.get('data', {})
|
|
|
|
if step == 'cell_name':
|
|
errors = sm.validate_cell_name(data.get('cell_name', ''))
|
|
elif step == 'password':
|
|
errors = sm.validate_password(data.get('password', ''))
|
|
else:
|
|
return jsonify({'valid': False, 'errors': [f"Unknown step: {step!r}"]}), 400
|
|
|
|
return jsonify({'valid': len(errors) == 0, 'errors': errors})
|
|
|
|
|
|
@setup_bp.route('/complete', methods=['POST'])
|
|
def complete_setup():
|
|
"""Complete the first-run wizard and create the admin account."""
|
|
sm = _get_setup_manager()
|
|
if sm.is_setup_complete():
|
|
return jsonify({'error': 'Setup already complete'}), 410
|
|
|
|
payload = request.get_json(silent=True) or {}
|
|
result = sm.complete_setup(payload)
|
|
status_code = 200 if result.get('success') else 400
|
|
|
|
# TODO (Phase 3): if result.get('success') and domain_mode == 'pic_ngo':
|
|
# from app import ddns_manager
|
|
# name = payload.get('cell_name', '')
|
|
# ip = payload.get('public_ip', '')
|
|
# ddns_manager.register(name, ip)
|
|
|
|
return jsonify(result), status_code
|