from app import db from datetime import datetime import uuid import json class FacebookAd(db.Model): """Model for storing Facebook ads data.""" __tablename__ = 'facebook_ads' id = db.Column(db.Integer, primary_key=True) ad_id = db.Column(db.String(255), index=True, unique=True) advertiser = db.Column(db.String(255), index=True) advertiser_id = db.Column(db.String(255), index=True, nullable=True) content = db.Column(db.Text) search_query = db.Column(db.String(255), index=True, nullable=True) # Store JSON data as text fields image_urls_json = db.Column(db.Text, nullable=True) links_json = db.Column(db.Text, nullable=True) metadata_json = db.Column(db.Text, nullable=True) topics_json = db.Column(db.Text, nullable=True) entities_json = db.Column(db.Text, nullable=True) # Analysis results sentiment = db.Column(db.Float, nullable=True) # Timestamps created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # User relationship user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True) def get_image_urls(self): """Get image URLs as a list.""" if not self.image_urls_json: return [] try: return json.loads(self.image_urls_json) except: return [] def set_image_urls(self, value): """Set image URLs from a list.""" if value is None: self.image_urls_json = None else: self.image_urls_json = json.dumps(value) def get_links(self): """Get links as a list.""" if not self.links_json: return [] try: return json.loads(self.links_json) except: return [] def set_links(self, value): """Set links from a list.""" if value is None: self.links_json = None else: self.links_json = json.dumps(value) def get_metadata(self): """Get metadata as a dictionary.""" if not self.metadata_json: return {} try: return json.loads(self.metadata_json) except: return {} def set_metadata(self, value): """Set metadata from a dictionary.""" if value is None: self.metadata_json = None else: self.metadata_json = json.dumps(value) def get_topics(self): """Get topics as a list.""" if not self.topics_json: return [] try: return json.loads(self.topics_json) except: return [] def set_topics(self, value): """Set topics from a list.""" if value is None: self.topics_json = None else: self.topics_json = json.dumps(value) def get_entities(self): """Get entities as a list of dictionaries.""" if not self.entities_json: return [] try: return json.loads(self.entities_json) except: return [] def set_entities(self, value): """Set entities from a list of dictionaries.""" if value is None: self.entities_json = None else: self.entities_json = json.dumps(value) @classmethod def from_scraper_data(cls, data, user_id=None): """Create a FacebookAd instance from scraper data.""" # Generate a unique ID if not provided ad_id = data.get('ad_id', str(uuid.uuid4())) ad = cls( ad_id=ad_id, advertiser=data.get('advertiser', ''), advertiser_id=data.get('advertiser_id'), content=data.get('content', ''), search_query=data.get('search_query'), user_id=user_id ) # Set JSON fields ad.set_image_urls(data.get('image_urls', [])) ad.set_links(data.get('links', [])) ad.set_metadata(data.get('metadata', {})) return ad def to_dict(self): """Convert the ad to a dictionary for API responses.""" return { 'id': self.id, 'ad_id': self.ad_id, 'advertiser': self.advertiser, 'advertiser_id': self.advertiser_id, 'content': self.content, 'search_query': self.search_query, 'image_urls': self.get_image_urls(), 'links': self.get_links(), 'sentiment': self.sentiment, 'topics': self.get_topics(), 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None }