Files
MermsCoreFlask/app/api/services/subscription.py
T
2025-08-23 15:05:56 -04:00

148 lines
6.2 KiB
Python

from flask import jsonify
from app.utils.logger import logger
from app.api.services.base_service import BaseService
from sqlalchemy import func, desc
from app.api.helpers.response_helper import ResponseHelper
from app.api.schemas.user import UserSchema
from app.models import Members, MembersProducts, SubscriptionOptions, SubscriptionOptionsItems
from app.extensions import db
from app.api.integrations import StripeIntegration
class SubscriptionService(BaseService):
# def get_all_subscriptions(cls, product_id=None, member_id=None, page=1, limit=20):
@staticmethod
def get_subscription_data(filters=None):
try:
if filters is None:
filters = {}
# Extract filters
product_id = filters.get('product_id')
member_id = filters.get('member_id')
# Extract pagination parameters
page = int(filters.get('page', 1))
limit = int(filters.get('limit', 20))
# Ensure page and limit are valid
if page < 1:
page = 1
if limit < 1 or limit > 100:
limit = 20
membersSubList, total_count = MembersProducts.get_all_subscriptions(product_id, member_id, page, limit)
# Convert loans to dictionary format
member_sub_data = []
for subs in membersSubList:
member_sub_data.append({
'id': subs.id,
'member_id': subs.member_id,
'product_id': subs.product_id,
'internal_url': subs.internal_url,
'external_url': subs.external_url,
'dns_group': subs.dns_group,
'status': subs.status,
'updated': subs.updated,
"added": subs.added,
})
# Calculate total pages
total_pages = (total_count + limit - 1) // limit
response_data = {
'subscriptions': member_sub_data,
'count': len(member_sub_data),
'pagination': {
'total_count': total_count,
'total_pages': total_pages,
'current_page': page,
'limit': limit,
'has_next': page < total_pages,
'has_prev': page > 1
}
}
return response_data
except Exception as e:
logger.error(f"An error occurred while getting dashboard data: {str(e)}", exc_info=True)
return jsonify({"message": "Internal Server Error"}), 500
@staticmethod
def subscription_available_products(data):
try:
with db.session.begin():
validated_data = SubscriptionService.validate_data(data, UserSchema())
token = validated_data.get('token')
uid = validated_data.get('uid')
member_data = Members.get_member_by_uid(uid)
if not member_data:
invalid_data = {
"error_message": "Member Data",
"message_key": "invalid_member",
}
return ResponseHelper.success(data=invalid_data)
# option_name
member_id = member_data.id
option_name = member_data.option_name
trial_name = "TRIAL-90"
res_options = []
sub_options = SubscriptionOptions.get_subscription_options(1)
for t in sub_options:
if t.stripe_product_id is None or t.stripe_product_id.strip() == "" or t.stripe_price_id is None or t.stripe_price_id.strip() == "":
price_create_result = StripeIntegration.create_product(t.display_name, t.monthly)
logger.info(f"Inside Stripe_Product ===== : {price_create_result}")
if price_create_result:
SubscriptionOptions.set_stripe_product_id(t.uid,price_create_result['product_id'])
SubscriptionOptions.set_stripe_price_id(t.uid,price_create_result['price_id'])
res_options.append({
'option_id': t.id,
'package_uid': t.uid,
'display_name': t.display_name,
'option_name': t.option_name,
'monthly': round(t.monthly * 0.01, 2),
'stripe_product_id': t.stripe_product_id,
'stripe_price_id': t.stripe_price_id,
"items": SubscriptionService.subscription_items_data(t.option_name),
'added': t.added.isoformat() if t.added else None,
'updated': t.updated.isoformat() if t.updated else None
})
subscription_products_data = {
"current_product": {
"display_name": trial_name if option_name is None else option_name,
"subs": [
'Post Jobs',
'advanced instructors search',
'invite candidates',
'post events',
'Cancel Anytime'
],
"next_payment": '2025-10-15 11:00:07.47214'
},
'stripe_customer_id': member_data.stripe_customer_id,
"options": res_options
}
return ResponseHelper.success(data=subscription_products_data)
except Exception as e:
logger.error(f"An error occurred while getting dashboard data: {str(e)}", exc_info=True)
return jsonify({"message": "Internal Server Error"}), 500
@staticmethod
def subscription_items_data(option_name):
items_data = SubscriptionOptionsItems.get_subscription_item(option_name)
res_options_items = []
for t in items_data:
res_options_items.append({
'description': t.description
})
# return ['Post Jobs 222', 'advanced instructors search', 'invite candidates', 'post events',
# 'Cancel anytime']
return res_options_items