Testato classe cRac.cs

Test degli spunti ottenuti da una chat con Gemini.
- [X] Test della classe cRac.cs
- [ ] Test della funzione di salvataggio sul DB
- [ ] Test della funzione di lettura dal DB
- [ ] Test della funzione di ricerca nel DB
- [ ] Test funzione di cancellazione nel DB
- [ ] Test nella ricerca di duplicati
- [X] Test della funzione di esportazione in html con stile

Riepilogo della chat:
- connesso a gemini con chrome e utente mirko
- dato in pasto il file *ATDB Database Schema.sql* con la struttura del DB
- richiesto la classe cRac per rappresentare un racconto.
- ottenuto *cRac.cs*
- richiesto come salvare un cRac sul DB con diagnostica errori ed evitando spurie sul DB
- ottenuto *Salvataggio cRac su DB.cs*
- richiesto come leggere un racconto
- ottenuto *GetRaccontoById.cs*
- richiesto: ragruppiamo le funzioni di helper su un file Helper.cs e quelle di lettura/scrittura sul DB sul file DB.cs
- ottenuto *Helper.cs* e *DB.cs*
- richiesto: facciamo le ricerche avanzate per titolo, tag, autore, data di creazione, sorgente
- ottenuta la nuova versione di *Aggiornamento 1 di DB.cs*
- richiesto come eliminare un racconto dal DB
- ottenuta la nuova versione di *Aggiornamento 2 di DB.cs*
- richiesto: come ricercare racconti duplicati
- ottenuto spunti di ricerca salvati in *Ricerca duplicati.cs*
- richiesto come fare il merge di racconti duplicati
- ottenuto *merge.cs*
- richiesto delle idee per la UI
- ottenuto il file *UI_idee.md*
- richiesto un esempio di esportazione di un racconto in html con stile
- ottenuto: *export.cs*
This commit is contained in:
CSiCoAlm committed 2025-12-28 14:32:57 +01:00
1 parent 1cc4528295
commit 8fbe7866bf
2 files changed
+139 -94

No files matched your search

+136 -92
View File
@@ -8,98 +8,116 @@ using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace A69WD.Data {
/// <summary>
/// Rappresenta un singolo racconto all'interno del database ATDB.
/// Questa classe mappa la tabella [Racconti] e tutte le sue relazioni correlate.
/// </summary>
public class cRac {
#region Costruttori
#region Propietà: IDrac, Title, SubTitle, Creato, Updated, Trama, Voto, Autori, Tags, Origini, Notes
#region --- DATI BASE (Tabella [Racconti]) ---
/// <summary>
/// Costruttore
/// Identificativo univoco del racconto
/// Default: -1
/// Mappa [IDrac]
/// </summary>
public cRac() { isValid = false; }
public long IDrac { get; set; } = -1;
/// <summary>
/// Costruttore per un racconto nullo, utilizzato per mostrare eventuali errori o messaggi
/// <summary> Titolo del racconto
/// Default: 'Unknown'
/// Mappa [Title]
/// </summary>
/// <param name="title">Stringa che si vuole visualizzare come titolo del racconto</param>
/// <param name="trama">Stringa che si vuole visualizzare come testo del racconto</param>
public cRac(string title, string trama) {
this.IDrac = 0;
this.Title = title;
this.Trama = "\n\n" + trama + "\n\n";
this.Creato = DateTime.Now;
this.Updated = DateTime.Now;
this.isValid = true;
}
public string Title { get; set; } = "Unknown";
#endregion
#region Propietà e Fields:
/// <summary>
/// Identificativo del racconto
/// </summary>
public long IDrac = -1;
/// <summary>
/// Titolo del racconto
/// </summary>
public string Title = null;
/// <summary>
/// <summary>
/// Sottotitolo del racconto
/// Default: ''
/// Mappa [SubTitle]
/// </summary>
public string SubTitle = null;
/// <summary>
/// Elenco dei tag (ex Props) associati al racconto
/// </summary>
public List<string> Tags = null;
/// <summary>
/// Note aggiuntive associate al racconto, sono del tipo: {Key} - {Descrizione}
/// Un tipo di nota sempre presente è la "Src" che individua la sorgente (link del file downloadato) da dove ho preso il racconto
/// Devo poter aver più source e quindi abbandono la struttura dizionario per avere una lista di coppie di stringhe
/// </summary>
//public System.Collections.Generic.Dictionary<string, string> Notes = null;
public List<cNota> Notes = null;
/// <summary>
/// Elenco degli autori del racconto
/// </summary>
public List<string> Autori = null;
/// <summary>
/// Elenco delle origini del racconto
/// </summary>
public List<string> Origini = null;
/// <summary>
/// Voto assegnato al racconto
/// </summary>
public string Voto = null;
/// <summary>
/// Trama del racconto
/// </summary>
public string Trama = null;
public string SubTitle { get; set; } = "";
/// <summary>
/// Data di creazione/pubblicazione del racconto o in mancanza di essa, data di inserimento del racconto in ATDB
/// Default: DateTime.MinValue
/// Mappa [Creato]
/// </summary>
public DateTime Creato = DateTime.MinValue;
public DateTime Creato { get; set; } = DateTime.MinValue;
/// <summary>
/// Data dell'ultimo update del racconto.
/// Inizialmente sarà la data di inserimento in ATDB, poi sarà la data dell'ultima lettura o dell'ultima iterazione con il racconto stesso.
/// Data dell'ultima modifica
/// Default: DateTime.MinValue
/// Mappa [Aggiornato]
/// </summary>
public DateTime Updated = DateTime.MinValue;
public DateTime Updated { get; set; } = DateTime.MinValue;
#endregion
#region --- CONTENUTO (Relazione 1-1 con Tabella [Trame]) ---
/// <summary>
/// Testo completo della trama del racconto
/// Default: null
/// Mappa [Trama]
/// </summary>
public string Trama { get; set; } = null;
#endregion
#region --- CONTENUTO (Relazione 1-1 con Tabella [Voti]) ---
/// <summary>
/// Etichetta testuale del voto assegnato al racconto (es. 'Bello')
/// Default: 'Non Letto'
/// Mappa [Voto]
/// </summary>
public string Voto { get; set; } = "Non Letto";
#endregion
#region --- RELAZIONI MOLTI-A-MOLTI (Tramite tabelle Links_Rac_...) ---
/// <summary>
/// Elenco dei nomi degli autori associati al racconto.
/// Default: null
/// Mappa la relazione tramite [Links_Rac_Aut] con la tabella [Autori].
/// </summary>
public List<string> Autori { get; set; } = null;
/// <summary>
/// Elenco dei tag o proprietà associati (es. Genere, Mood).
/// Default: null
/// Mappa la relazione tramite [Links_Rac_Tag] con la tabella [Tags].
/// </summary>
public List<string> Tags { get; set; } = null;
/// <summary>
/// Elenco delle sorgenti o origini da cui proviene il racconto.
/// Default: null
/// Mappa la relazione tramite [Links_Rac_Ori] con la tabella [Origini].
/// </summary>
public List<string> Origini { get; set; } = null;
/// <summary>
/// Note informative strutturate come coppia Chiave-Valore (es. Link, Resume).
/// Note aggiuntive associate al racconto, sono del tipo: {Key} - {Descrizione}
/// Un tipo di nota sempre presente è la "Src" che individua la sorgente (link del file downloadato) da dove ho preso il racconto
/// Devo poter aver più source e quindi abbandono la struttura dizionario per avere una lista di coppie di stringhe
/// Default: null
/// Mappa la relazione tramite [Links_Rac_Not] con la tabella [Notes].
/// </summary>
//public Dictionary<string, string> Note { get; set; } = new Dictionary<string, string>();
public List<cNota> Notes { get; set; } = null;
#endregion
#endregion
#region Metodi: strIDrac, strTags, fullTitle
#region Metodi: str..., fullTitle, IsValid, Validate, FileRacName
#region Conversioni a stringa dei campi non stringhe:
/// <summary>
/// ID del racconto espresso in formato testuale
@@ -166,6 +184,8 @@ namespace A69WD.Data {
}
}
#endregion
/// <summary>
/// Indica se il racconto è valido o no (nullo)
/// </summary>
@@ -224,9 +244,41 @@ namespace A69WD.Data {
return isValid;
}
/// <summary>
/// Crea un nome univoco per il file htm che rappresenta un racconto.
/// Rac00000.htm
/// </summary>
public static string FileRacName(long RacID) { return "Rac" + RacID.ToString("00000") + ".htm"; }
#endregion
#region Costruttori
/// <summary>
/// Costruttore
/// </summary>
public cRac() { isValid = false; }
/// <summary>
/// Costruttore per un racconto nullo, utilizzato per mostrare eventuali errori o messaggi
/// </summary>
/// <param name="title">Stringa che si vuole visualizzare come titolo del racconto</param>
/// <param name="trama">Stringa che si vuole visualizzare come testo del racconto</param>
public cRac(string title, string trama) {
this.IDrac = 0;
this.Title = title;
this.Trama = "\n\n" + trama + "\n\n";
this.Creato = DateTime.Now;
this.Updated = DateTime.Now;
this.isValid = true;
}
#endregion
/// <summary>
/// Crea il file html che rappresenta il racconto.
@@ -331,24 +383,6 @@ namespace A69WD.Data {
}
/// <summary>
/// Crea un nome univoco per il file htm che rappresenta un racconto.
/// Rac00000.htm
/// </summary>
public static string FileRacName(long RacID) { return "Rac" + RacID.ToString("00000") + ".htm"; }
/// <summary>
/// Stringa di separazione fra i vari campi quando esprimo un elenco tramite una singola stringa
/// </summary>
private const string SEPARATORETXT = " -|- ";
/// <summary>
/// Esprime la data indicata con una stringa opportunamente formattata
/// </summary>
/// <param name="dt">DateTime da esprimere in testo</param>
/// <returns>Il testo opportunamente formattato</returns>
private string DateFormat(DateTime dt) { return dt.ToString("yyyy/MM/dd"); }
/// <summary>
/// Override per esprimere in modo formale un racconto con una singola stringa.
/// </summary>
@@ -404,6 +438,19 @@ namespace A69WD.Data {
}
/// <summary>
/// Stringa di separazione fra i vari campi quando esprimo un elenco tramite una singola stringa
/// </summary>
private const string SEPARATORETXT = " -|- ";
/// <summary>
/// Esprime la data indicata con una stringa opportunamente formattata
/// </summary>
/// <param name="dt">DateTime da esprimere in testo</param>
/// <returns>Il testo opportunamente formattato</returns>
private string DateFormat(DateTime dt) { return dt.ToString("yyyy/MM/dd"); }
/// <summary>
/// Esprime il racconto in formato HTML formale.
/// </summary>
@@ -827,9 +874,6 @@ namespace A69WD.Data {
}
}
public static string EsportaInHtml(cRac racconto, string cartellaDestinazione) {
// Crea il nome del file pulendo il titolo da caratteri non validi
+3 -2
View File
@@ -222,10 +222,11 @@ namespace A69WD.Net {
if (parts.Length == 3) {
CultureInfo culture = CultureInfo.CreateSpecificCulture("it-IT");
DateTimeStyles styles = DateTimeStyles.None;
rac.Creato = DateTime.Now;
if (!DateTime.TryParse(parts[0].Trim(), culture, styles, out rac.Creato)) {
DateTime tmpDT = DateTime.Now;
if (!DateTime.TryParse(parts[0].Trim(), culture, styles, out tmpDT)) {
Logger.Error($"A69 - Import - No data - {filePathName}");
}
rac.Creato = tmpDT;
}
}
} catch (Exception ex) { Logger.Warning(string.Format("Data non riconosciuta nel file {0}\r\n{1}", FileName, ex.Message)); return null; }