using BlueLaminate.Core.CsMoney; using BlueLaminate.Core.SkinLand; namespace BlueLaminate.C2; /// A unit of scrape work handed to a worker: one skin+wear, as a search. /// Opaque id the worker echoes back when posting results. /// Catalogue skin this job targets. /// Wear band (skin_conditions row), or null for a whole skin. /// Free-text market search, e.g. "M4A4 Cyber Security ft". /// Safety cap on page fetches (60 items each). The worker /// paginates by walking the float axis, so a skin+wear needs ceil(listings/60) pages. public sealed record ScrapeJobDto(string JobId, int SkinId, int? ConditionId, string Search, int MaxPages); /// A worker's results for a claimed job: the listings it scraped. /// All sell-order items gathered across pages (raw cs.money shape). /// How many pages the worker fetched. /// Why it stopped. "completed" = full sweep (authoritative); /// anything else (fetch-cap / challenged / stuck-float-tie) is partial. public sealed record ScrapeResultDto(List Items, int Pages, string? StoppedReason); /// A unit of skin.land scrape work: one skin+wear, as its market page URL. /// Opaque id the worker echoes back when posting results. /// Catalogue skin this job targets. /// Wear band (skin_conditions row). /// The skin.land market page, e.g. /// "https://skin.land/market/csgo/ak-47-redline-field-tested/". The worker resolves the /// internal skin_id from this page, then pages the obtained-skins API. /// Safety cap on offer-page fetches (Laravel paginator, ~26/page). public sealed record SkinLandJobDto(string JobId, int SkinId, int ConditionId, string Url, int MaxPages); /// A worker's results for a claimed skin.land job: the offers it scraped. /// All obtained-skins offers gathered across pages (raw skin.land shape). /// How many offer pages the worker fetched. /// Why it stopped. "completed" = full sweep (authoritative); /// anything else (fetch-cap / challenged / no-skin-id) is partial. public sealed record SkinLandResultDto(List Items, int Pages, string? StoppedReason);