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:
@@ -0,0 +1,40 @@
|
||||
using JobsMedical.Web.Data;
|
||||
using JobsMedical.Web.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace JobsMedical.Web.Services.Scraping;
|
||||
|
||||
/// <summary>Loads/creates the single platform-settings row (Id=1).</summary>
|
||||
public class SettingsService
|
||||
{
|
||||
private readonly AppDbContext _db;
|
||||
public SettingsService(AppDbContext db) => _db = db;
|
||||
|
||||
public async Task<AppSetting> GetAsync()
|
||||
{
|
||||
var s = await _db.AppSettings.FirstOrDefaultAsync(x => x.Id == 1);
|
||||
if (s is null)
|
||||
{
|
||||
s = new AppSetting { Id = 1 };
|
||||
_db.AppSettings.Add(s);
|
||||
await _db.SaveChangesAsync();
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
public async Task SaveAsync(AppSetting incoming)
|
||||
{
|
||||
var s = await GetAsync();
|
||||
s.Mode = incoming.Mode;
|
||||
s.AutoPublishMinConfidence = Math.Clamp(incoming.AutoPublishMinConfidence, 0, 100);
|
||||
s.AiEnabled = incoming.AiEnabled;
|
||||
s.AiEndpoint = incoming.AiEndpoint?.Trim();
|
||||
s.AiApiKey = incoming.AiApiKey?.Trim();
|
||||
s.AiModel = incoming.AiModel?.Trim();
|
||||
s.AiSystemPrompt = string.IsNullOrWhiteSpace(incoming.AiSystemPrompt)
|
||||
? AppSetting.DefaultPrompt : incoming.AiSystemPrompt;
|
||||
s.AiAutoApprove = incoming.AiAutoApprove;
|
||||
s.UpdatedAt = DateTime.UtcNow;
|
||||
await _db.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user