from flask import session, jsonify from app.api.schemas.report import ReportSchema from app.utils.logger import logger from app.api.services.base_service import BaseService from marshmallow import ValidationError from app.extensions import db from app.models import MembersProducts, Products, Members, Payments, MembersActions from app.api.helpers.response_helper import ResponseHelper from app.api.schemas.user import UserSchema import datetime class SystemReportService(BaseService): @staticmethod def process_report_topic_request(data): try: with db.session.begin(): logger.info(f"Incoming SystemReportService data ==>>>> {data}") validated_data = SystemReportService.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 topics_data = SystemReportService.configured_report_types() response_data = { "last_update": datetime.datetime.utcnow(), "member_id": member_id, "topics": topics_data, } return ResponseHelper.success(data=response_data) except ValidationError as err: logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}") db.session.rollback() return ResponseHelper.unprocessable_entity(result_description="Validation exception") except ValueError as err: logger.error(f"{getattr(err, 'messages', str(err))}") db.session.rollback() return ResponseHelper.error(result_description=str(err)) except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) db.session.rollback() return ResponseHelper.internal_server_error() @staticmethod def configured_report_types(): data = { "topics": [ {"name": 'Payments', "url": 'payment', "active": True, "list_order": 0}, {"name": 'Product', "url": 'product', "active": True, "list_order": 1}, {"name": 'System', "url": 'system', "active": True, "list_order": 2}, ] } return data @staticmethod def process_report_topic_item(report_type, data): try: with db.session.begin(): logger.info(f"Incoming ReportService Item Data ==>>>> {data}") validated_data = SystemReportService.validate_data(data, ReportSchema()) token = validated_data.get('token') uid = validated_data.get('uid') page = validated_data.get('page') member_data = Members.get_member_by_uid(uid) member_id = member_data.id response_data =[] if report_type == "PAYMENT": member_payments = Payments.get_member_payments_by_member_id(member_id) member_payments_data = [] for t in member_payments: member_payments_data.append({ 'id': t.id, 'uid': t.uid, 'option_name': t.option_name, 'option_type': t.option_type, 'payment_uid': t.payment_uid, 'amount': round(t.amount * 0.01, 2), 'currency': '$', 'status': t.status, 'added': t.added }) response_data = { "last_update": datetime.datetime.utcnow(), "member_id": member_id, "payment": member_payments_data, } if report_type == "PRODUCT": sub_status = [] member_subs = MembersProducts.get_member_productlist_by_member_id(member_id) for tt in member_subs: sub_status.append({ 'product_id': tt.product_id, 'product_name': "Name for - " + tt.product_id, 'added': tt.added, 'subscription_uid': tt.uid, 'status': tt.status, 'internal_url': tt.internal_url, 'dns_group': tt.dns_group, }) logger.info(f"Member Product Sub Data ****** *****: {sub_status}") response_data = { "last_update": datetime.datetime.utcnow(), "member_id": member_id, "product": sub_status, } if report_type == "SYSTEM": member_actions = MembersActions.get_recent_member_actions(member_id) member_actions_data = [] if member_actions: for t in member_actions: member_actions_data.append({ 'id': t.id, 'uid': t.uid, 'member_id': t.member_id, 'member_uid': t.member_uid, 'action_label': t.action_label, 'action_name': t.action_name, 'status_description': t.status_description, 'status': t.status, 'added': t.added, 'updated': t.updated }) response_data = { "last_update": datetime.datetime.utcnow(), "member_id": member_id, "system": member_actions_data, } return ResponseHelper.success(data=response_data) except ValidationError as err: logger.error(f"Validation Error: {getattr(err, 'messages', str(err))}") db.session.rollback() return ResponseHelper.unprocessable_entity(result_description="Validation exception") except ValueError as err: logger.error(f"{getattr(err, 'messages', str(err))}") db.session.rollback() return ResponseHelper.error(result_description=str(err)) except Exception as e: logger.error(f"An error occurred: {str(e)}", exc_info=True) db.session.rollback() return ResponseHelper.internal_server_error()