Files
ServerKit/backend/app/api/php.py
T
Juan Denis c0a2a01fc1 Initial project structure and core API implementation
Add backend and frontend foundations for ServerKit, including Flask API structure, SQLAlchemy models, service layers, and React app with authentication context and service hooks. Implement core API endpoints for authentication, application management, Docker, databases, and system operations. Update README with project overview, tech stack, and setup instructions. Add development roadmap and example environment configuration.
2026-01-17 04:22:12 -05:00

153 lines
4.4 KiB
Python

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from app.models import User
from app.services.php_service import PHPService
php_bp = Blueprint('php', __name__)
def admin_required(fn):
"""Decorator to require admin role."""
from functools import wraps
@wraps(fn)
def wrapper(*args, **kwargs):
current_user_id = get_jwt_identity()
user = User.query.get(current_user_id)
if not user or user.role != 'admin':
return jsonify({'error': 'Admin access required'}), 403
return fn(*args, **kwargs)
return wrapper
@php_bp.route('/versions', methods=['GET'])
@jwt_required()
@admin_required
def get_versions():
"""Get installed PHP versions."""
versions = PHPService.get_installed_versions()
default = PHPService.get_default_version()
return jsonify({
'versions': versions,
'default': default,
'supported': PHPService.SUPPORTED_VERSIONS
}), 200
@php_bp.route('/versions/<version>/install', methods=['POST'])
@jwt_required()
@admin_required
def install_version(version):
"""Install a PHP version."""
result = PHPService.install_version(version)
return jsonify(result), 200 if result['success'] else 400
@php_bp.route('/versions/default', methods=['POST'])
@jwt_required()
@admin_required
def set_default_version():
"""Set default PHP version."""
data = request.get_json()
version = data.get('version') if data else None
if not version:
return jsonify({'error': 'version is required'}), 400
result = PHPService.set_default_version(version)
return jsonify(result), 200 if result['success'] else 400
@php_bp.route('/versions/<version>/extensions', methods=['GET'])
@jwt_required()
@admin_required
def get_extensions(version):
"""Get installed extensions for a PHP version."""
extensions = PHPService.get_extensions(version)
return jsonify({'extensions': extensions, 'version': version}), 200
@php_bp.route('/versions/<version>/extensions', methods=['POST'])
@jwt_required()
@admin_required
def install_extension(version):
"""Install a PHP extension."""
data = request.get_json()
extension = data.get('extension') if data else None
if not extension:
return jsonify({'error': 'extension is required'}), 400
result = PHPService.install_extension(version, extension)
return jsonify(result), 200 if result['success'] else 400
@php_bp.route('/versions/<version>/pools', methods=['GET'])
@jwt_required()
@admin_required
def get_pools(version):
"""Get FPM pools for a PHP version."""
pools = PHPService.get_pools(version)
return jsonify({'pools': pools, 'version': version}), 200
@php_bp.route('/versions/<version>/pools', methods=['POST'])
@jwt_required()
@admin_required
def create_pool(version):
"""Create a new FPM pool."""
data = request.get_json()
if not data or 'name' not in data:
return jsonify({'error': 'Pool name is required'}), 400
result = PHPService.create_pool(version, data['name'], data)
return jsonify(result), 201 if result['success'] else 400
@php_bp.route('/versions/<version>/pools/<pool_name>', methods=['DELETE'])
@jwt_required()
@admin_required
def delete_pool(version, pool_name):
"""Delete an FPM pool."""
result = PHPService.delete_pool(version, pool_name)
return jsonify(result), 200 if result['success'] else 400
@php_bp.route('/versions/<version>/fpm/restart', methods=['POST'])
@jwt_required()
@admin_required
def restart_fpm(version):
"""Restart PHP-FPM service."""
result = PHPService.restart_fpm(version)
return jsonify(result), 200 if result['success'] else 400
@php_bp.route('/versions/<version>/fpm/reload', methods=['POST'])
@jwt_required()
@admin_required
def reload_fpm(version):
"""Reload PHP-FPM service."""
result = PHPService.reload_fpm(version)
return jsonify(result), 200 if result['success'] else 400
@php_bp.route('/versions/<version>/fpm/status', methods=['GET'])
@jwt_required()
@admin_required
def get_fpm_status(version):
"""Get PHP-FPM service status."""
status = PHPService.get_fpm_status(version)
return jsonify(status), 200
@php_bp.route('/versions/<version>/info', methods=['GET'])
@jwt_required()
@admin_required
def get_php_info(version):
"""Get PHP configuration info."""
info = PHPService.get_php_info(version)
if 'error' in info:
return jsonify(info), 400
return jsonify({'info': info, 'version': version}), 200