Brings up the pull-model scraper: the .NET C2 hands skin+wear jobs to Python nodriver workers that scrape cs.money and post results back, plus the supporting Core/EFCore data model, migrations, and docker-compose orchestration. IPRoyal proxying lets workers scale horizontally with a distinct residential exit IP each: every worker process mints its own sticky session at startup, and an in-process forwarding proxy injects the gateway auth so Chromium talks only to an auth-free localhost endpoint (zero CDP). On a Cloudflare challenge a worker rotates to a fresh session/IP and re-warms. Verified end-to-end against live IPRoyal: distinct US residential exits per worker and IP rotation on demand. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
23 lines
804 B
C#
23 lines
804 B
C#
using BlueLaminate.EFCore.Entities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
|
|
namespace BlueLaminate.EFCore.Configurations;
|
|
|
|
public class SkinConditionConfiguration : IEntityTypeConfiguration<SkinCondition>
|
|
{
|
|
public void Configure(EntityTypeBuilder<SkinCondition> entity)
|
|
{
|
|
entity.Property(e => e.MinFloat).HasColumnType("numeric(10,9)");
|
|
entity.Property(e => e.MaxFloat).HasColumnType("numeric(10,9)");
|
|
|
|
// The catalogue sweep orders bands by this (never-swept first, then stalest),
|
|
// so index it like the equivalent column on skins.
|
|
entity.HasIndex(e => e.ListingsSweptAt);
|
|
|
|
entity.HasOne(e => e.Skin)
|
|
.WithMany(s => s.Conditions)
|
|
.HasForeignKey(e => e.SkinId);
|
|
}
|
|
}
|