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:
1 parent
1cc4528295
commit
8fbe7866bf
2 files changed
+139
-94
No files matched your search
+136
-92
@@ -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
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in new issue
Block a user