|
|
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)
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
|
|
|
sentiment = db.Column(db.Float, nullable=True)
|
|
|
|
|
|
|
|
|
created_at = db.Column(db.DateTime, default=datetime.utcnow)
|
|
|
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
|
|
|
|
|
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."""
|
|
|
|
|
|
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
|
|
|
)
|
|
|
|
|
|
|
|
|
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
|
|
|
} |