atlan-collect / gateway / submit_svc / submit.py
submit.py
Raw
import pika, json

import re 
from pymongo import MongoClient

class DataValidator:
    def __init__(self):
        pass

    def validate_mobile_number(self, mobile_number):
        # Updated regex to allow more flexible mobile number formats
        if  not re.match(r'^[1-9][0-9]{9}$', mobile_number):
            return False
        return True

    def validate_salary_savings(self, salary, savings):
        # Added validation for negative values
        if salary < 0 or savings < 0:
            return False
        if savings > salary:
            return False
        return True

    def validate_name(self, name):
        # Updated regex to allow more characters in names
        if not re.match(r'^[a-zA-Z\s\'-]+$', name):
            return False
        return True
    
    def validate_email(self, email):
        if not re.match(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$', email):
            return False
        return True
    
    def is_email_duplicate(self, email):
        client = MongoClient("host.minikube.internal", 27017)
        db = client.submit_form
        collection = db.forms
        return collection.find_one({"email": email}) is None

    def validate_data(self, mobile_number, salary, savings, first_name, last_name, email):
        if not self.validate_mobile_number(mobile_number):
            return False, "Invalid mobile number"
        if not self.validate_salary_savings(salary, savings):
            return False, "Savings cannot be more than or negative relative to salary"
        if not self.validate_name(first_name) or not self.validate_name(last_name):
            return False, "Invalid first or last name"
        if not self.validate_email(email):
            return False, "Invalid Email!"
        if not self.is_email_duplicate(email):
            return False, "Email Already Taken!"
        return True, "Data is valid"

def submit_data(data, channel):
  try:
    channel.basic_publish(
      exchange="",
      routing_key="submit",
      body= json.dumps(data),
      properties=pika.BasicProperties(
        delivery_mode=pika.spec.PERSISTENT_DELIVERY_MODE
      ),
    )
  except Exception as err:
    print(err)
    return f"error in translating this text, {err}", 500