myrmidon / python /src /server /services /marketing_service.py
tek Atrust
chore(deploy): build monolithic server for Hugging Face
d5ef46f
Raw
History Blame Contribute Delete
6.01 kB
import asyncio
from ..config.logfire_config import get_logger
from ..repositories.base_repository import BaseRepository
from ..services.job_board_service import JobData
from ..utils import get_supabase_client
logger = get_logger(__name__)
class MarketingService(BaseRepository):
"""
Marketing Service - Slim Facade for Alice/Bob workflows.
Physically delegates logic to specialized handlers for Phase 4.6.47 Hardening.
"""
def __init__(self, supabase_client=None):
super().__init__(supabase_client or get_supabase_client())
# --- 1. Leads & Jobs (LeadHandler) ---
async def search_jobs(self, keyword: str, limit: int = 10) -> list[JobData]:
from ..services.job_board_service import JobBoardService
service = JobBoardService()
jobs = await service.search_jobs(keyword, limit)
asyncio.create_task(service.identify_leads_and_save(jobs))
return jobs
async def list_leads(self, user_id: str | None = None, role: str | None = None) -> list[dict]:
from .marketing.lead_handler import LeadHandler
return await LeadHandler(self.supabase_client).list_leads(user_id, role)
async def create_lead(self, lead_data: dict, creator_id: str | None = None) -> tuple[bool, dict]:
from .marketing.lead_handler import LeadHandler
return await LeadHandler(self.supabase_client).create_lead(lead_data, creator_id)
async def update_lead(self, lead_id: str, update_data: dict) -> tuple[bool, dict]:
from .marketing.lead_handler import LeadHandler
return await LeadHandler(self.supabase_client).update_lead(lead_id, update_data)
async def promote_to_vendor(
self, lead_id: str, vendor_name: str, email: str | None, notes: str | None, owner_id: str
) -> tuple[bool, dict]:
from .marketing.lead_handler import LeadHandler
return await LeadHandler(self.supabase_client).promote_to_vendor(lead_id, vendor_name, email, notes, owner_id)
async def reset_leads(self) -> bool:
from .marketing.lead_handler import LeadHandler
return await LeadHandler(self.supabase_client).reset_leads()
# --- 2. AI Content & Approvals (ContentHandler) ---
async def generate_pitch(self, company: str, job_title: str) -> dict:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).generate_pitch(company, job_title)
async def generate_visual_asset(self, style: str) -> dict:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).generate_visual_asset(style)
async def draft_blog(self, topic: str, industry: list[str] | None, keywords: str | None) -> tuple[bool, dict]:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).draft_blog(topic, industry, keywords)
async def draft_from_leads(self, lead_ids: list[str]) -> tuple[bool, dict]:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).draft_from_leads(lead_ids)
async def submit_blog(self, post_id: str) -> tuple[bool, dict]:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).submit_blog(post_id)
async def process_approval(self, item_type: str, item_id: str, action: str, notes: str | None) -> bool:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).process_approval(item_type, item_id, action, notes)
async def generate_reject_suggestion(self, item_type: str, item_id: str) -> dict:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).generate_reject_suggestion(item_type, item_id)
async def get_pending_approvals(self) -> dict:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).get_pending_approvals()
async def get_content_context(self, source_id: str, source_type: str) -> dict:
from .marketing.content_handler import ContentHandler
return await ContentHandler(self.supabase_client).get_content_context(source_id, source_type)
# --- 3. Analytics, Seeding & Background (AnalyticsHandler) ---
async def get_marketing_stats(self) -> dict:
from .marketing.analytics_handler import AnalyticsHandler
return await AnalyticsHandler(self.supabase_client).get_marketing_stats()
async def get_marketing_trends(self) -> dict:
from .marketing.analytics_handler import AnalyticsHandler
return await AnalyticsHandler(self.supabase_client).get_marketing_trends()
async def get_combined_sources(self, user_id: str) -> list[dict]:
from .marketing.analytics_handler import AnalyticsHandler
return await AnalyticsHandler(self.supabase_client).get_combined_sources(user_id)
async def run_sentinel(self) -> dict:
from .marketing.analytics_handler import AnalyticsHandler
return await AnalyticsHandler(self.supabase_client).run_sentinel()
async def seed_knowledge(self) -> dict:
from .marketing.analytics_handler import AnalyticsHandler
# Type safety: seed_knowledge in handler returns dict
res = await AnalyticsHandler(self.supabase_client).seed_knowledge()
return res
# --- Private Method Facades (For backward compatibility / internal calls) ---
async def _calculate_lead_score(self, job_title: str | None) -> int:
from .marketing.lead_handler import LeadHandler
return await LeadHandler(self.supabase_client).calculate_lead_score(job_title)
def _calculate_ai_score(self, content: str) -> int:
from .marketing.content_handler import ContentHandler
return ContentHandler(self.supabase_client).calculate_ai_score(content)