| 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()) |
|
|
| |
|
|
| 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() |
|
|
| |
|
|
| 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) |
|
|
| |
|
|
| 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 |
|
|
| |
| res = await AnalyticsHandler(self.supabase_client).seed_knowledge() |
| return res |
|
|
| |
|
|
| 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) |
|
|