using JobsMedical.Web.Models; namespace JobsMedical.Web.Services.Scraping; /// One raw post pulled from a source (a Telegram message, a Divar ad, etc.). public record ScrapedItem(string Source, string RawText, string? SourceUrl = null); /// /// A pluggable source the ingestion engine pulls from. Configuration (enabled, channels, tokens) /// comes from the DB-backed passed in — set in the admin panel, not env. /// A disabled/unconfigured source returns an empty list. /// public interface IListingSource { string Name { get; } Task> FetchAsync(AppSetting settings, CancellationToken ct = default); }