Aggiunta pagina "Esplora Aste" per browser pubblico

Introdotta la funzionalità di esplorazione delle aste pubbliche di Bidoo senza login, accessibile dal menu principale.
Aggiunti nuovi modelli (`BidooBrowserAuction`, `BidooCategoryInfo`) e servizio (`BidooBrowserService`) per scraping e polling delle aste e categorie.
Creata la pagina Blazor `AuctionBrowser.razor` con griglia responsive, badge, filtri per categoria, caricamento incrementale e aggiornamento automatico degli stati.
Aggiornati i servizi in `Program.cs` e aggiunti nuovi stili CSS per la UI moderna.
Le aste possono essere aggiunte rapidamente al monitor personale. Parsing robusto e fallback su categorie predefinite in caso di errori.
This commit is contained in:
2026-01-22 00:08:16 +01:00
parent 70ed8f0a61
commit 865bfa2752
8 changed files with 369048 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
using System;
namespace AutoBidder.Models
{
/// <summary>
/// Rappresenta un'asta visualizzata nel browser delle aste
/// Contiene informazioni base per la visualizzazione nella griglia
/// </summary>
public class BidooBrowserAuction
{
/// <summary>
/// ID univoco dell'asta
/// </summary>
public string AuctionId { get; set; } = "";
/// <summary>
/// URL completo dell'asta
/// </summary>
public string Url { get; set; } = "";
/// <summary>
/// Nome/titolo del prodotto
/// </summary>
public string Name { get; set; } = "";
/// <summary>
/// URL dell'immagine del prodotto
/// </summary>
public string ImageUrl { get; set; } = "";
/// <summary>
/// Prezzo attuale dell'asta in euro
/// </summary>
public decimal CurrentPrice { get; set; }
/// <summary>
/// Username dell'ultimo bidder
/// </summary>
public string LastBidder { get; set; } = "";
/// <summary>
/// Tempo rimanente in secondi
/// </summary>
public int RemainingSeconds { get; set; }
/// <summary>
/// Timer formattato (es: "00:08")
/// </summary>
public string TimerDisplay => $"{RemainingSeconds / 60:00}:{RemainingSeconds % 60:00}";
/// <summary>
/// Frequenza timer dell'asta (in secondi)
/// </summary>
public int TimerFrequency { get; set; } = 8;
/// <summary>
/// Prezzo "Compralo Subito"
/// </summary>
public decimal BuyNowPrice { get; set; }
/// <summary>
/// Indica se l'asta è già stata aggiunta al monitor
/// </summary>
public bool IsMonitored { get; set; }
/// <summary>
/// Indica se l'asta è attiva (non chiusa)
/// </summary>
public bool IsActive { get; set; } = true;
/// <summary>
/// Indica se l'asta è venduta
/// </summary>
public bool IsSold { get; set; }
/// <summary>
/// Indica se l'asta richiede solo puntate manuali (no autobid)
/// </summary>
public bool IsManualOnly { get; set; }
/// <summary>
/// Indica se è un'asta turbo (timer < 10 sec)
/// </summary>
public bool IsTurbo => TimerFrequency <= 8;
/// <summary>
/// ID del prodotto
/// </summary>
public int ProductId { get; set; }
/// <summary>
/// Indica se l'asta è un'asta di puntate/crediti
/// </summary>
public bool IsCreditAuction { get; set; }
/// <summary>
/// Valore crediti se è un'asta di puntate
/// </summary>
public int CreditValue { get; set; }
/// <summary>
/// Timestamp ultimo aggiornamento stato
/// </summary>
public DateTime LastUpdated { get; set; } = DateTime.UtcNow;
}
}

View File

@@ -0,0 +1,40 @@
namespace AutoBidder.Models
{
/// <summary>
/// Rappresenta una categoria/scheda di aste su Bidoo
/// </summary>
public class BidooCategoryInfo
{
/// <summary>
/// ID del tab (es: 1, 2, 3, 4, 5)
/// </summary>
public int TabId { get; set; }
/// <summary>
/// ID del tag per le categorie specifiche (es: 6=Buoni, 5=Smartphone)
/// </summary>
public int TagId { get; set; }
/// <summary>
/// Slug della categoria (es: "buoni", "smartphone")
/// </summary>
public string Slug { get; set; } = "";
/// <summary>
/// Nome visualizzato della categoria
/// </summary>
public string DisplayName { get; set; } = "";
/// <summary>
/// Indica se questa categoria è una categoria speciale (preferite, tutte, puntate, manuali)
/// </summary>
public bool IsSpecialCategory { get; set; }
/// <summary>
/// Icona da mostrare (opzionale)
/// </summary>
public string? Icon { get; set; }
public override string ToString() => DisplayName;
}
}