Real channel fetch (Telegram/Bale/Divar) + AI-audited automation engine + CI/CD
- Fetch: Telegram via t.me/s, Bale via Bot API, Divar via web-search (HttpClient, config-gated, graceful) - AI layer: DB-backed AppSetting (mode auto/manual, thresholds, AI endpoint/model/key/prompt/framework, auto-approve); OpenAI-compatible IAiAuditor (self-host/Iranian endpoints; fails safe to manual) - Pipeline: fetch → dedupe(hash) → parse → validate → AI audit → Discard/Flag/Queue/auto-publish (resolve-or-create facility) - Admin: /Admin/Settings automation+AI panel; queue shows confidence + AI verdict; flagged section - CI/CD: Dockerfile, docker-compose.prod.yml, .gitea/workflows/ci-cd.yml, nginx vhost, DEPLOY.md; forwarded headers + /healthz + prod reference-only seed; ports 22/80/443 only Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -21,18 +21,31 @@ builder.Services.AddScoped<OtpService>();
|
||||
// Listing parser: heuristic now; swap for an LLM-backed IListingParser later.
|
||||
builder.Services.AddSingleton<IListingParser, HeuristicListingParser>();
|
||||
|
||||
// Scrape/ingestion engine: pluggable sources → dedupe → parse → validate → review queue.
|
||||
// Scrape/ingestion engine: pluggable sources → dedupe → parse → validate → (AI audit) → publish/queue.
|
||||
builder.Services.AddHttpClient("scrape", c =>
|
||||
{
|
||||
c.Timeout = TimeSpan.FromSeconds(20);
|
||||
c.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (compatible; HamkadrBot/1.0)");
|
||||
});
|
||||
builder.Services.AddHttpClient("ai");
|
||||
builder.Services.Configure<JobsMedical.Web.Services.Scraping.IngestionOptions>(
|
||||
builder.Configuration.GetSection("Ingestion"));
|
||||
builder.Services.Configure<JobsMedical.Web.Services.Scraping.TelegramOptions>(
|
||||
builder.Configuration.GetSection("Ingestion:Telegram"));
|
||||
builder.Services.Configure<JobsMedical.Web.Services.Scraping.BaleOptions>(
|
||||
builder.Configuration.GetSection("Ingestion:Bale"));
|
||||
builder.Services.Configure<JobsMedical.Web.Services.Scraping.DivarOptions>(
|
||||
builder.Configuration.GetSection("Ingestion:Divar"));
|
||||
builder.Services.AddSingleton<JobsMedical.Web.Services.Scraping.ListingValidator>();
|
||||
builder.Services.AddSingleton<JobsMedical.Web.Services.Scraping.IAiAuditor,
|
||||
JobsMedical.Web.Services.Scraping.OpenAiCompatibleAuditor>();
|
||||
builder.Services.AddScoped<JobsMedical.Web.Services.Scraping.SettingsService>();
|
||||
builder.Services.AddSingleton<JobsMedical.Web.Services.Scraping.IListingSource,
|
||||
JobsMedical.Web.Services.Scraping.SampleListingSource>();
|
||||
builder.Services.AddSingleton<JobsMedical.Web.Services.Scraping.IListingSource,
|
||||
JobsMedical.Web.Services.Scraping.TelegramListingSource>();
|
||||
builder.Services.AddSingleton<JobsMedical.Web.Services.Scraping.IListingSource,
|
||||
JobsMedical.Web.Services.Scraping.BaleListingSource>();
|
||||
builder.Services.AddSingleton<JobsMedical.Web.Services.Scraping.IListingSource,
|
||||
JobsMedical.Web.Services.Scraping.DivarListingSource>();
|
||||
builder.Services.AddScoped<JobsMedical.Web.Services.Scraping.IngestionService>();
|
||||
|
||||
Reference in New Issue
Block a user