diff --git a/app/api/routes/routes.py b/app/api/routes/routes.py index d22586f..a9b3221 100644 --- a/app/api/routes/routes.py +++ b/app/api/routes/routes.py @@ -227,6 +227,13 @@ def myproduct_dash(): response = MyProductsService.process_request(data) return response +@api.route("/panel/myproduct/external-url", methods=["POST"]) +def set_external_url(): + data = request.get_json() + # logger.info(f"Route MyProduct Data ==>>>> {data}") + response = MyProductsService.set_external_url(data) + return response + @api.route("/panel/myproduct/settings", methods=["POST"]) def myproduct_settings(): diff --git a/app/api/schemas/myproduct_external_url.py b/app/api/schemas/myproduct_external_url.py new file mode 100644 index 0000000..7cea016 --- /dev/null +++ b/app/api/schemas/myproduct_external_url.py @@ -0,0 +1,8 @@ +from marshmallow import Schema, fields + +class MyProductExternalUrlSchema(Schema): + token = fields.Str(required=True) + uid = fields.Str(required=True) + subscription_uid = fields.Str(required=True) + external_url = fields.Str(required=True) + diff --git a/app/api/services/myproduct.py b/app/api/services/myproduct.py index 11ba0ec..7e7208e 100644 --- a/app/api/services/myproduct.py +++ b/app/api/services/myproduct.py @@ -2,7 +2,8 @@ from urllib import request from flask import session, jsonify -from app.api.enums import SettingsItemsData,KafkaMessage +from app.api.enums import SettingsItemsData, KafkaMessage +from app.api.schemas.myproduct_external_url import MyProductExternalUrlSchema from app.api.schemas.myproduct_set_template import MyProductSetTemplateSchema from app.utils.logger import logger from app.api.services.base_service import BaseService @@ -23,7 +24,7 @@ from app.config import Config class MyProductsService(BaseService): - START_URL_PATTERN = Config.START_URL_PATTERN + START_URL_PATTERN = Config.START_URL_PATTERN @staticmethod def process_provision_actions(data): @@ -197,8 +198,8 @@ class MyProductsService(BaseService): member_id = member_data.id # getting the url-name part - url_name_part = str(random.randint(100000, 999999)) # Starr with random numbers - member_profile_data = MembersProfile.get_member_profile_by_member_id(member_id) + url_name_part = str(random.randint(100000, 999999)) # Starr with random numbers + member_profile_data = MembersProfile.get_member_profile_by_member_id(member_id) if member_profile_data and member_profile_data.url_name != None: url_name_part = member_profile_data.url_name @@ -206,11 +207,11 @@ class MyProductsService(BaseService): product_data = Products.get_product_by_product_id(product_id) configured_start_url = product_data.start_url - if configured_start_url =='': + if configured_start_url == '': configured_start_url = MyProductsService.START_URL_PATTERN - internal_url = url_name_part + configured_start_url # ".devprov.mermsemr.com" = - internal_url=internal_url.lower() + internal_url = url_name_part + configured_start_url # ".devprov.mermsemr.com" = + internal_url = internal_url.lower() # let us see if this is in USE anybodyUsingUrl = MembersProducts.get_member_product_by_internal_url(internal_url) @@ -247,13 +248,14 @@ class MyProductsService(BaseService): status = 6 subscription = MembersProducts.create_subscription(member_id, product_id, status, internal_url) - #-let prepare the flags for auto generated stuffs + # -let prepare the flags for auto generated stuffs profile_data = MembersProfile.get_member_profile_by_member_id(member_id) if profile_data: practice = profile_data.practice - specialization = profile_data.specialization + specialization = profile_data.specialization subscription_uid = subscription.uid - SubscriptionGenerative.create_subscription_generative(member_id ,practice,specialization,product_id, subscription_uid) + SubscriptionGenerative.create_subscription_generative(member_id, practice, specialization, + product_id, subscription_uid) response_data = { "subscription_uid": subscription.uid, @@ -303,7 +305,6 @@ class MyProductsService(BaseService): productDataStatus = memberSubscription.status product_subscription_uid = memberSubscription.uid - for key in settings.keys(): setting_value = settings[key] subscription_uid = memberSubscription.uid @@ -379,7 +380,6 @@ class MyProductsService(BaseService): product_template = memberSubscription.product_template custom_template = memberSubscription.custom_template - # "banner": "banner.jpg", myproduct_data = { "myproudct": { @@ -557,7 +557,7 @@ class MyProductsService(BaseService): if product_id == "A000002": settings_items = { "url_config_tab": {"title": 'URL Configuration', "controls": 'url-config', "active": '', - "custom": True, "data": {}, "list_order": 0}, + "custom": True, "data": {}, "list_order": 0}, "settings": {"title": 'Settings', "controls": 'settings', "active": 'active show', "custom": False, "data": settingsFields, "list_order": 1}, "home_tab": {"title": 'Home Page', "controls": 'home', "active": '', "custom": False, @@ -605,3 +605,74 @@ class MyProductsService(BaseService): logger.error(f"An error occurred: {str(e)}", exc_info=True) db.session.rollback() return ResponseHelper.internal_server_error() + + @staticmethod + def set_external_url(data): + try: + with db.session.begin(): + # logger.info(f"Incoming MyProduct data ==>>>> {data}") + validated_data = MyProductsService.validate_data(data, MyProductExternalUrlSchema()) + token = validated_data.get('token') + uid = validated_data.get('uid') + subscription_uid = validated_data.get('subscription_uid') + external_url = validated_data.get('external_url') + + member_data = Members.get_member_by_uid(uid) + if not member_data: + return { + "message": "Invalid User", + "error_message": "Error - Please select a valid product to view", + "data": None, + "error": f"User with UID {uid} does not exist." + }, 400 + + member_id = member_data.id + + + membersSubResult = MembersProducts.get_member_product_by_subscription_uid(subscription_uid) + if not membersSubResult: + return { + "message": "Invalid Subscription", + "error_message": "Error - Please select a valid product to view", + "data": None, + "error": f"Subscription with UID {subscription_uid} does not exist." + }, 400 + logger.info(f"External URL Member Data: {member_data}") + + + if int(membersSubResult.member_id) != member_id: + return { + "message": "Mismatch subscription and User", + "error_message": "Error - Please select a valid product to view", + "data": None, + "error": f"Mismatch subscription and User." + }, 400 + + + setUrlResult = MembersProducts.set_member_product_external_url(member_id, membersSubResult.product_id, + external_url) + + # Simulate processing + response_data = { + "subscription_uid": subscription_uid, + "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() diff --git a/app/api/services/office_dashboard.py b/app/api/services/office_dashboard.py index cb1af45..a4579ad 100644 --- a/app/api/services/office_dashboard.py +++ b/app/api/services/office_dashboard.py @@ -94,11 +94,11 @@ class OfficeDashboardService(BaseService): dashboard_data = { "subscription": subscription_data, - "loans": { + "signups": { "currency": "Naira", "currency_text": "\u20a6", "text": "last 30 days", - "value": sub_count + "value": int(sub_count) }, "payments": { "currency": "Dollars", diff --git a/app/models/members.py b/app/models/members.py index 50099ce..a417c8c 100644 --- a/app/models/members.py +++ b/app/models/members.py @@ -30,6 +30,7 @@ class Members(db.Model): def to_dict(self): return { "id": self.id, + "member_id": self.id, "uid": str(self.uid), "profile_completed": self.profile_completed, "username": self.username, @@ -69,7 +70,6 @@ class Members(db.Model): @classmethod def get_member_by_uid(cls, uid): member = cls.query.filter_by(uid=str(uid)).first() - if not member: logger.info(f"User UID = {uid} found") return None diff --git a/app/models/members_products.py b/app/models/members_products.py index b6bbf58..1f4bd91 100644 --- a/app/models/members_products.py +++ b/app/models/members_products.py @@ -98,6 +98,14 @@ class MembersProducts(db.Model): member_product.product_template = product_template return product_template + @classmethod + def set_member_product_external_url(cls, member_id, product_id, external_url): + member_product = cls.query.filter_by(member_id=str(member_id), product_id=str(product_id)).first() + if not member_product: + return None + member_product.external_url = external_url + return external_url + @classmethod def create_subscription(cls, member_id ,product_id,status,internal_url): dns_group = "DNS_G01" @@ -162,6 +170,7 @@ class MembersProducts(db.Model): return { 'id': self.id, 'uid': self.uid, + 'member_id': self.member_id, 'product_id': self.product_id, 'internal_url': self.internal_url, 'external_url': self.external_url,