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 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) member_id = member_data.id res_options = [] sub_options = SubscriptionOptions.get_subscription_options(1) for t in sub_options: 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), "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": "BASIC001", "subs": [ 'Post Jobs', 'advanced instructors search', 'invite candidates', 'post events', 'Cancel Anytime' ], "next_payment": '2025-10-15 11:00:07.47214' }, "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