43 lines
1.5 KiB
C#
43 lines
1.5 KiB
C#
|
|
using Microsoft.Extensions.Options;
|
||
|
|
|
||
|
|
namespace JobsMedical.Web.Services.Scraping;
|
||
|
|
|
||
|
|
public class DivarOptions
|
||
|
|
{
|
||
|
|
public bool Enabled { get; set; }
|
||
|
|
public string? City { get; set; } // e.g. "tehran"
|
||
|
|
public List<string> Queries { get; set; } = new(); // search terms, e.g. "استخدام پزشک"
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// Divar source. Credential-ready: configure city + queries in (Ingestion:Divar) and implement
|
||
|
|
/// the fetch against Divar's listing API/HTML. Dormant until enabled.
|
||
|
|
/// </summary>
|
||
|
|
public class DivarListingSource : IListingSource
|
||
|
|
{
|
||
|
|
private readonly DivarOptions _opts;
|
||
|
|
private readonly ILogger<DivarListingSource> _log;
|
||
|
|
|
||
|
|
public DivarListingSource(IOptions<DivarOptions> opts, ILogger<DivarListingSource> log)
|
||
|
|
{
|
||
|
|
_opts = opts.Value;
|
||
|
|
_log = log;
|
||
|
|
}
|
||
|
|
|
||
|
|
public string Name => "دیوار";
|
||
|
|
public bool Enabled => _opts.Enabled && _opts.Queries.Count > 0;
|
||
|
|
|
||
|
|
public Task<IReadOnlyList<ScrapedItem>> FetchAsync(CancellationToken ct = default)
|
||
|
|
{
|
||
|
|
if (!Enabled)
|
||
|
|
{
|
||
|
|
_log.LogInformation("Divar source not configured — skipping.");
|
||
|
|
return Task.FromResult<IReadOnlyList<ScrapedItem>>(Array.Empty<ScrapedItem>());
|
||
|
|
}
|
||
|
|
// TODO(prod): query Divar for each term in the configured city, map each ad's
|
||
|
|
// title+description to new ScrapedItem(Name, text, adUrl).
|
||
|
|
_log.LogWarning("Divar fetch not yet implemented; returning empty.");
|
||
|
|
return Task.FromResult<IReadOnlyList<ScrapedItem>>(Array.Empty<ScrapedItem>());
|
||
|
|
}
|
||
|
|
}
|