admin-panel/backend/app/routes/plans.py

192 lines
6.0 KiB
Python
Raw Permalink Normal View History

"""
Subscription Plans Management Routes
"""
from flask import Blueprint, request, jsonify
from app.models import db, SubscriptionPlan, AuditLog
from app.routes.auth import token_required
plans_bp = Blueprint('plans', __name__)
@plans_bp.route('', methods=['GET'])
@token_required
def get_plans(current_admin):
"""Get all subscription plans"""
try:
plans = SubscriptionPlan.query.order_by(SubscriptionPlan.sort_order).all()
return jsonify({
'status': 'success',
'plans': [plan.to_dict() for plan in plans]
}), 200
except Exception as e:
return jsonify({'error': str(e)}), 500
@plans_bp.route('/<int:plan_id>', methods=['GET'])
@token_required
def get_plan(current_admin, plan_id):
"""Get single plan"""
try:
plan = SubscriptionPlan.query.get(plan_id)
if not plan:
return jsonify({'error': 'Plan not found'}), 404
return jsonify({
'status': 'success',
'plan': plan.to_dict()
}), 200
except Exception as e:
return jsonify({'error': str(e)}), 500
@plans_bp.route('', methods=['POST'])
@token_required
def create_plan(current_admin):
"""Create new subscription plan"""
try:
data = request.get_json()
# Validate required fields
required = ['name', 'slug']
for field in required:
if not data.get(field):
return jsonify({'error': f'{field} is required'}), 400
# Check if slug already exists
if SubscriptionPlan.query.filter_by(slug=data['slug']).first():
return jsonify({'error': 'Plan with this slug already exists'}), 400
plan = SubscriptionPlan(
name=data['name'],
slug=data['slug'],
description=data.get('description'),
price_monthly=data.get('price_monthly', 0),
price_yearly=data.get('price_yearly', 0),
max_domains=data.get('max_domains', 1),
max_containers=data.get('max_containers', 1),
max_storage_gb=data.get('max_storage_gb', 10),
max_bandwidth_gb=data.get('max_bandwidth_gb', 100),
features=data.get('features', []),
is_active=data.get('is_active', True),
is_visible=data.get('is_visible', True),
sort_order=data.get('sort_order', 0)
)
db.session.add(plan)
db.session.commit()
# Log action
log = AuditLog(
admin_id=current_admin.id,
action='create_plan',
resource_type='plan',
resource_id=plan.id,
details={'plan_name': plan.name},
ip_address=request.remote_addr
)
db.session.add(log)
db.session.commit()
return jsonify({
'status': 'success',
'message': 'Plan created successfully',
'plan': plan.to_dict()
}), 201
except Exception as e:
db.session.rollback()
return jsonify({'error': str(e)}), 500
@plans_bp.route('/<int:plan_id>', methods=['PUT'])
@token_required
def update_plan(current_admin, plan_id):
"""Update subscription plan"""
try:
plan = SubscriptionPlan.query.get(plan_id)
if not plan:
return jsonify({'error': 'Plan not found'}), 404
data = request.get_json()
# Update fields
if 'name' in data:
plan.name = data['name']
if 'description' in data:
plan.description = data['description']
if 'price_monthly' in data:
plan.price_monthly = data['price_monthly']
if 'price_yearly' in data:
plan.price_yearly = data['price_yearly']
if 'max_domains' in data:
plan.max_domains = data['max_domains']
if 'max_containers' in data:
plan.max_containers = data['max_containers']
if 'max_storage_gb' in data:
plan.max_storage_gb = data['max_storage_gb']
if 'max_bandwidth_gb' in data:
plan.max_bandwidth_gb = data['max_bandwidth_gb']
if 'features' in data:
plan.features = data['features']
if 'is_active' in data:
plan.is_active = data['is_active']
if 'is_visible' in data:
plan.is_visible = data['is_visible']
if 'sort_order' in data:
plan.sort_order = data['sort_order']
db.session.commit()
# Log action
log = AuditLog(
admin_id=current_admin.id,
action='update_plan',
resource_type='plan',
resource_id=plan.id,
details={'plan_name': plan.name},
ip_address=request.remote_addr
)
db.session.add(log)
db.session.commit()
return jsonify({
'status': 'success',
'message': 'Plan updated successfully',
'plan': plan.to_dict()
}), 200
except Exception as e:
db.session.rollback()
return jsonify({'error': str(e)}), 500
@plans_bp.route('/<int:plan_id>', methods=['DELETE'])
@token_required
def delete_plan(current_admin, plan_id):
"""Delete subscription plan"""
try:
plan = SubscriptionPlan.query.get(plan_id)
if not plan:
return jsonify({'error': 'Plan not found'}), 404
plan_name = plan.name
db.session.delete(plan)
db.session.commit()
# Log action
log = AuditLog(
admin_id=current_admin.id,
action='delete_plan',
resource_type='plan',
resource_id=plan_id,
details={'plan_name': plan_name},
ip_address=request.remote_addr
)
db.session.add(log)
db.session.commit()
return jsonify({
'status': 'success',
'message': 'Plan deleted successfully'
}), 200
except Exception as e:
db.session.rollback()
return jsonify({'error': str(e)}), 500