Talent lifecycle (21-day expiry) + noindex expired job/shift details
- Talent «آماده به کار» now has its own freshness window (21 days, vs 30 for jobs) since availability goes stale fast; archiver, browse, and home use TalentCutoffUtc. - Expired/filled job openings and past/filled shifts now emit robots noindex so Google drops dead listings instead of keeping soft-404 pages. (Talent details were already noindex.) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,11 @@ public static class ListingPolicy
|
||||
/// <summary>A job opening older than this (since posting) is treated as stale and hidden.</summary>
|
||||
public const int JobFreshnessDays = 30;
|
||||
|
||||
/// <summary>«آماده به کار» goes stale faster — the person is usually hired within a few weeks.</summary>
|
||||
public const int TalentFreshnessDays = 21;
|
||||
|
||||
public static DateTime JobCutoffUtc => DateTime.UtcNow.AddDays(-JobFreshnessDays);
|
||||
public static DateTime TalentCutoffUtc => DateTime.UtcNow.AddDays(-TalentFreshnessDays);
|
||||
}
|
||||
|
||||
/// <summary>Sweeps stale listings into the Expired state (archive). Idempotent and cheap.</summary>
|
||||
@@ -42,8 +46,9 @@ public class ListingArchiver
|
||||
.Where(j => j.Status == ShiftStatus.Open && j.CreatedAt < jobCutoff)
|
||||
.ExecuteUpdateAsync(u => u.SetProperty(j => j.Status, ShiftStatus.Expired), ct);
|
||||
|
||||
var talentCutoff = ListingPolicy.TalentCutoffUtc;
|
||||
var expiredTalent = await _db.TalentListings
|
||||
.Where(t => t.Status == ShiftStatus.Open && t.CreatedAt < jobCutoff)
|
||||
.Where(t => t.Status == ShiftStatus.Open && t.CreatedAt < talentCutoff)
|
||||
.ExecuteUpdateAsync(u => u.SetProperty(t => t.Status, ShiftStatus.Expired), ct);
|
||||
|
||||
if (expiredShifts + expiredJobs + expiredTalent > 0)
|
||||
|
||||
Reference in New Issue
Block a user