Skip to content

Commit

Permalink
Merge pull request #48 from DostEducation/feature/18-user-attribute-s…
Browse files Browse the repository at this point in the history
…ervice

Feature/18 user attribute service
  • Loading branch information
Sachinbisht27 authored May 23, 2024
2 parents d43df23 + 54c3024 commit 131c611
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 2 deletions.
11 changes: 11 additions & 0 deletions api/models/user_attributes.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,19 @@
from flask_sqlalchemy.query import Query as BaseQuery

from api import db
from api.mixins import TimestampMixin


class UserAttributesQuery(BaseQuery):
def get_existing_user_attributes(self, user_id):
user_attributes = self.filter(
UserAttributes.user_id == user_id,
).all()
return {attribute.field_name: attribute for attribute in user_attributes}


class UserAttributes(TimestampMixin, db.Model):
query_class = UserAttributesQuery

__tablename__ = "user_attributes"
id = db.Column(db.Integer, primary_key=True)
Expand Down
1 change: 1 addition & 0 deletions api/services/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .flow_run_log_service import *
from .user_activities_service import *
from .user_attribute_service import *
from .user_creation_service import *
from .user_indicator_response_service import *
from .webhook_transaction_log_service import *
45 changes: 45 additions & 0 deletions api/services/user_attribute_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from typing import Any

from api import db, models
from api.utils.loggingutils import logger


class UserAttributeService:
def __init__(self, user):
self.user_id = user.id
self.user_phone = user.phone
self.class_model = models.UserAttributes

def handle_contact_fields_data(self, contact_data: dict[str, Any]):
try:
contact_fields_data = contact_data.get("fields", {})
existing_attributes = self.class_model.query.get_existing_user_attributes(
self.user_id
)
for field_key, field_value in contact_fields_data.items():
value = field_value.get("value")
user_attribute = existing_attributes.get(field_key)

if user_attribute:
if user_attribute.field_value != value:
user_attribute.field_value = value
else:
user_attribute = self.create_user_attribute(field_key, value)
db.session.add(user_attribute)

db.session.commit()
except Exception as e:
logger.error(
f"Error occured while handling contact fields data. Error: {e}"
)

def create_user_attribute(
self, field_key: str, value: str
) -> models.UserAttributes:
user_attribute = self.class_model(
user_id=self.user_id,
user_phone=self.user_phone,
field_name=field_key,
field_value=value,
)
return user_attribute
11 changes: 9 additions & 2 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from api.services import (
FlowRunLogService,
UserActivitiesService,
UserAttributeService,
UserCreationService,
UserIndicatorResponseService,
WebhookTransactionLogService,
Expand Down Expand Up @@ -42,15 +43,16 @@ def handle_webhook(json_data):

contact_data = json_data["contact"]
if contact_data:
user = handle_contact_field_data(contact_data)
user = handle_user_creation_from_contact(contact_data)
user_flow = handle_user_flow_logs(user, json_data)
handle_flow_activity_data(user, user_flow, json_data)
process_user_indicators(user, user_flow, json_data)
process_contact_data(user, contact_data)

transaction_log_service.mark_webhook_log_as_processed(webhook_log)


def handle_contact_field_data(contact_data):
def handle_user_creation_from_contact(contact_data):
user_creation_service = UserCreationService()
return user_creation_service.create_new_user(contact_data)

Expand All @@ -73,3 +75,8 @@ def process_user_indicators(
user_indicator_res_service = UserIndicatorResponseService(user, user_flow)
user_indicator_res_service.process_user_indicator_responses(json_data)
return True


def process_contact_data(user, contact_data):
user_attribute_service = UserAttributeService(user)
user_attribute_service.handle_contact_fields_data(contact_data)

0 comments on commit 131c611

Please sign in to comment.