from flask import session, jsonify 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, ProductsDetails, ProductsDetails, ProvisionActions, \ MembersProductsSettings, ProductsTemplates from app.api.helpers.response_helper import ResponseHelper from app.api.schemas.myproduct import MyProductSchema from app.api.schemas.provision import ProvisionSchema from app.api.schemas.myproduct_settings import MyProductSettingsSchema from threading import Thread import datetime import jwt import random from app.config import Config class MyProductsService(BaseService): @staticmethod def process_provision_actions(data): pass @staticmethod def mpproduct_template_data(data): try: with db.session.begin(): # logger.info(f"Incoming MyProduct data ==>>>> {data}") validated_data = MyProductsService.validate_data(data, MyProductSchema()) token = validated_data.get('token') uid = validated_data.get('uid') member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') # class MyProductSchema(Schema): # token = fields.Str(required=True) # uid = fields.Str(required=True) # product_id = fields.Str(required=True) templates = ProductsTemplates.get_template_by_product_id(product_id) template_data = { 'template_16': {'title': 'Template Name-16', 'template_id': '02af24fd-2b1a-46ed-af21-87018e726408', 'banner': 'file-icon/svg.png', 'active': '0'}, 'template_22': {'title': 'Template Name-22', 'template_id': '8b296894-42e4-4f2e-abd1-7c2a38d6e07b', 'banner': 'file-icon/svg.png', 'active': '0'}, 'template_47': {'title': 'Template Name-47', 'template_id': 'ef2ffa1c-9272-42cd-9d33-0e614047b4f8', 'banner': 'file-icon/svg.png', 'active': '0'}, 'template_25': {'title': 'Template Name-25', 'template_id': 'b3a7ba31-dc47-4a40-a5cc-fd1ff27d6b78', 'banner': 'file-icon/svg.png', 'active': '1'}, 'template_49': {'title': 'Template Name-49', 'template_id': '60959c69-6672-4f69-a006-eeb7d210e605', 'banner': 'file-icon/svg.png', 'active': '0'}, 'template_27': {'title': 'Template Name-27', 'template_id': 'e4acb98a-c584-45f2-bece-af677dcf0a1f', 'banner': 'file-icon/svg.png', 'active': '0'}, 'template_51': {'title': 'Template Name-51', 'template_id': '975ee42e-3169-4978-92d7-d28e7e2ac014', 'banner': 'file-icon/svg.png', 'active': '0'}, 'template_9': {'title': 'Template Name-9', 'template_id': 'fc8f0738-6500-4775-9895-2047cd275302', 'banner': 'file-icon/svg.png', 'active': '0'}, } template_data =[] for t in templates: template_data.append({ 'id': t.id, 'template_uid': t.uid, 'title': t.name, 'active': 1, 'added': t.added.isoformat() if t.added else None }) response_data = { "product_id": product_id, "templates": template_data, "last_update": datetime.datetime.utcnow(), } 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 process_provision(data): try: with db.session.begin(): # logger.info(f"Incoming MyProduct data ==>>>> {data}") validated_data = MyProductsService.validate_data(data, ProvisionSchema()) token = validated_data.get('token') uid = validated_data.get('uid') member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') product_data = Products.get_product_by_product_id(product_id) if not product_data: return { "message": "Please provide product_id", "data": None, "error": "Bad request" }, 400 logger.info(f"GET HERE ******************************** : {data}", exc_info=True) subscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) provision_activities = ProvisionActions.get_provision_action_by_product_uid(subscription.uid, 4) provision_activities_data = [] for t in provision_activities: provision_activities_data.append({ 'id': t.id, 'uid': t.uid, 'action': t.action, 'added': t.added.isoformat() if t.added else None, }) response_data = { "subscription_uid": subscription.uid, "subscription_id": subscription.id, "last_update": datetime.datetime.utcnow(), "percent_completed": random.randint(10, 99), "activities": provision_activities_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 process_subscription(data): try: with db.session.begin(): # logger.info(f"Incoming MyProduct data ==>>>> {data}") validated_data = MyProductsService.validate_data(data, MyProductSchema()) token = validated_data.get('token') uid = validated_data.get('uid') member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') product_data = Products.get_product_by_product_id(product_id) if not product_data: return { "message": "Please provide product_id", "data": None, "error": "Bad request" }, 400 logger.info(f"GET HERE ******************************** : {data}", exc_info=True) mumberSub = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) if mumberSub: logger.error(f"Ready to add data to tables") response_data = { "subscription": mumberSub, "member_id": member_id, "error": "already_subscribed", "uid": uid } return ResponseHelper.success(data=response_data) internal_url = str(random.randint(100000, 999999)) + ".devprov.mermsemr.com" # INSERT_NEW_PRODUCT = "INSERT INTO members_products (member_id ,product_id,status,internal_url) VALUES (%s, %s, %s, %s)" # val_insert = (member_id, product_id,6,internal_url) status = 6 subscription = MembersProducts.create_subscription(member_id, product_id, status, internal_url) response_data = { "subscription_uid": subscription.uid, "subscription_id": subscription.id, "internal_url": subscription.internal_url, "member_id": member_id, "uid": uid } 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 process_settings(data): try: with db.session.begin(): logger.info(f"Incoming MyProduct Settings Data ==>>>> {data}") settings = data["settings"] data.pop("settings") validated_data = MyProductsService.validate_data(data, MyProductSettingsSchema()) token = validated_data.get('token') uid = validated_data.get('uid') member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') product_settings = validated_data.get('settings') memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) if memberSubscription is not None: # logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") productDataStatus = memberSubscription.status product_subscription_uid = memberSubscription.uid # product_subscription_external_url = memberSubscription.external_url # product_subscription_internal_url = memberSubscription.internal_url # result_data = { # "myproudct": { # "result": "Reveived under development ", # "message": "to be fixed" # } # } for key in settings.keys(): setting_value = settings[key] subscription_uid = memberSubscription.uid MembersProductsSettings.save_update_product_settings(member_id, subscription_uid, product_id, key, 'TXT', setting_value) # Simulate processing response_data = { "member_id": member_id, "subscription_uid": str(subscription_uid), "uid": str(uid), } logger.error(f"Going for Thread ******************** ") thread = Thread(target=MyProductsService.async_send_settings_refresh_to_kafka, args=(response_data, subscription_uid, "REFRESH_PRODUCT_SETTINGS")) thread.start() logger.error(f"After the Thread ******************** ") 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 process_request(data): try: with db.session.begin(): # logger.info(f"Incoming MyProduct data ==>>>> {data}") validated_data = MyProductsService.validate_data(data, MyProductSchema()) token = validated_data.get('token') uid = validated_data.get('uid') member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') product_subscription_uid = '' product_subscription_external_url = '' product_subscription_internal_url = '' product_data = Products.get_product_by_product_id(product_id) product_description = ProductsDetails.get_product_details_with_product_id(product_id) productDataStatus = product_data.status memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) if memberSubscription is not None: # logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") productDataStatus = memberSubscription.status product_subscription_uid = memberSubscription.uid product_subscription_external_url = memberSubscription.external_url product_subscription_internal_url = memberSubscription.internal_url # "banner": "banner.jpg", myproduct_data = { "myproudct": { "banner": product_data.banner, "description": product_description.details, "sale_text": product_description.sale_text, "internal_url": product_subscription_internal_url, "external_url": product_subscription_external_url, "price_text": "90 days free and 3.95/Month", "product_id": product_data.product_id, "product_name": product_data.name, "product_subscription_uid": product_subscription_uid, "product_uid": product_data.uid, "promotion_text": "Start Free Today !", "subscription_uid": product_subscription_uid, "status": productDataStatus, "subscription_text": "Start with your goals in mind and then work possible.ith yand Goals. If the plan doesn\u2019t support the vision then change it!", "title": "Your personal professional web presence" } } # Simulate processing response_data = { "myproduct": myproduct_data, "member_id": member_id, "uid": uid, } 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 process_settings_values(data): try: with db.session.begin(): # logger.info(f"Incoming MyProduct data ==>>>> {data}") validated_data = MyProductsService.validate_data(data, MyProductSchema()) token = validated_data.get('token') uid = validated_data.get('uid') member_data = Members.get_member_by_uid(uid) member_id = member_data.id product_id = validated_data.get('product_id') product_subscription_uid = '' product_data = Products.get_product_by_product_id(product_id) product_description = ProductsDetails.get_product_details_with_product_id(product_id) productDataStatus = product_data.status memberSubscription = MembersProducts.get_member_product_by_product_member_id(member_id, product_id) settings_data = [] if memberSubscription is not None: # logger.info(f"Incoming MyProduct data ==>>>> {memberSubscription}") product_subscription_uid = memberSubscription.uid settings_data_result = MembersProductsSettings.get_product_settings_by_product_id_and_member_id( product_id, member_id) if settings_data_result is not None: for t in settings_data_result: settings_data.append({ 'setting_key': t.settings_key, 'setting_value': t.setting_value, }) # Simulate processing response_data = { "settings": settings_data, "member_id": member_id, "product_subscription_uid": product_subscription_uid, } 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()