2026-06-03 17:41:02 +03:30
|
|
|
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;
|
2026-06-04 00:44:11 +03:30
|
|
|
// Channel scraping sources
|
|
|
|
|
s.AutoIngestEnabled = incoming.AutoIngestEnabled;
|
|
|
|
|
s.IngestIntervalMinutes = Math.Max(1, incoming.IngestIntervalMinutes);
|
|
|
|
|
s.TelegramEnabled = incoming.TelegramEnabled;
|
|
|
|
|
s.TelegramChannels = incoming.TelegramChannels?.Trim();
|
|
|
|
|
s.BaleEnabled = incoming.BaleEnabled;
|
|
|
|
|
s.BaleBotToken = incoming.BaleBotToken?.Trim();
|
2026-06-04 13:43:07 +03:30
|
|
|
s.DemoMode = incoming.DemoMode;
|
|
|
|
|
s.WebsitesEnabled = incoming.WebsitesEnabled;
|
|
|
|
|
s.WebsiteUrls = incoming.WebsiteUrls?.Trim();
|
2026-06-04 17:53:17 +03:30
|
|
|
s.IngestProxyUrl = incoming.IngestProxyUrl?.Trim();
|
2026-06-04 18:46:48 +03:30
|
|
|
s.TelegramUseProxy = incoming.TelegramUseProxy;
|
|
|
|
|
s.BaleUseProxy = incoming.BaleUseProxy;
|
|
|
|
|
s.DivarUseProxy = incoming.DivarUseProxy;
|
|
|
|
|
s.MedjobsUseProxy = incoming.MedjobsUseProxy;
|
|
|
|
|
s.WebsitesUseProxy = incoming.WebsitesUseProxy;
|
2026-06-04 00:44:11 +03:30
|
|
|
s.DivarEnabled = incoming.DivarEnabled;
|
|
|
|
|
s.DivarCity = string.IsNullOrWhiteSpace(incoming.DivarCity) ? "tehran" : incoming.DivarCity.Trim();
|
|
|
|
|
s.DivarQueries = incoming.DivarQueries?.Trim();
|
2026-06-04 06:12:10 +03:30
|
|
|
s.MedjobsEnabled = incoming.MedjobsEnabled;
|
|
|
|
|
s.MedjobsMaxAds = Math.Clamp(incoming.MedjobsMaxAds, 1, 500);
|
2026-06-04 10:27:21 +03:30
|
|
|
s.SmsEnabled = incoming.SmsEnabled;
|
|
|
|
|
s.SmsApiKey = incoming.SmsApiKey?.Trim();
|
|
|
|
|
s.SmsTemplate = incoming.SmsTemplate?.Trim();
|
|
|
|
|
s.SmsSender = incoming.SmsSender?.Trim();
|
2026-06-04 10:47:33 +03:30
|
|
|
s.NeshanMapKey = incoming.NeshanMapKey?.Trim();
|
2026-06-04 15:56:40 +03:30
|
|
|
s.WebNotificationsEnabled = incoming.WebNotificationsEnabled;
|
2026-06-04 11:23:13 +03:30
|
|
|
s.PushEnabled = incoming.PushEnabled;
|
|
|
|
|
s.VapidPublicKey = incoming.VapidPublicKey?.Trim();
|
|
|
|
|
s.VapidPrivateKey = incoming.VapidPrivateKey?.Trim();
|
|
|
|
|
s.VapidSubject = string.IsNullOrWhiteSpace(incoming.VapidSubject) ? "mailto:admin@hamkadr.ir" : incoming.VapidSubject.Trim();
|
2026-06-03 17:41:02 +03:30
|
|
|
s.UpdatedAt = DateTime.UtcNow;
|
|
|
|
|
await _db.SaveChangesAsync();
|
|
|
|
|
}
|
|
|
|
|
}
|