Add news tracking for various entities and update database schema

- Introduced a new migration to change the `added_id` column type from `int` to `long` in the `news` table and added a new `name` column.
- Updated the `News` model to include the `Name` property.
- Modified the `MarechaiContext` to reflect the changes in the `News` model.
- Enhanced multiple controllers (Books, Documents, Gpus, Machines, Magazines, News, People, Processors, Software, SoftwareReleases, SoftwareVersions, SoundSynths) to create news entries upon creation and updates of respective entities.
- Implemented logic to generate appropriate news names based on entity details.
- Updated the front-end to display new news types and their corresponding icons.
- Added Spanish translations for new news types in the resource files.
This commit is contained in:
2026-04-25 10:13:19 +01:00
parent 994588d814
commit f99fae703b
30 changed files with 9612 additions and 74 deletions

View File

@@ -15,7 +15,7 @@ namespace Marechai.ApiClient.Models
/// <summary>Stores additional data not described in the OpenAPI description found when deserializing. Can be used for serialization as well.</summary>
public IDictionary<string, object> AdditionalData { get; set; }
/// <summary>The affected_id property</summary>
public int? AffectedId { get; set; }
public long? AffectedId { get; set; }
/// <summary>The controller property</summary>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
@@ -33,6 +33,14 @@ namespace Marechai.ApiClient.Models
#nullable restore
#else
public string ItemName { get; set; }
#endif
/// <summary>The name property</summary>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
#nullable enable
public string? Name { get; set; }
#nullable restore
#else
public string Name { get; set; }
#endif
/// <summary>The text property</summary>
#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP3_1_OR_GREATER
@@ -71,10 +79,11 @@ namespace Marechai.ApiClient.Models
{
return new Dictionary<string, Action<IParseNode>>
{
{ "affected_id", n => { AffectedId = n.GetIntValue(); } },
{ "affected_id", n => { AffectedId = n.GetLongValue(); } },
{ "controller", n => { Controller = n.GetStringValue(); } },
{ "id", n => { Id = n.GetIntValue(); } },
{ "item_name", n => { ItemName = n.GetStringValue(); } },
{ "name", n => { Name = n.GetStringValue(); } },
{ "text", n => { Text = n.GetStringValue(); } },
{ "timestamp", n => { Timestamp = n.GetDateTimeOffsetValue(); } },
{ "type", n => { Type = n.GetIntValue(); } },
@@ -87,10 +96,11 @@ namespace Marechai.ApiClient.Models
public virtual void Serialize(ISerializationWriter writer)
{
if(ReferenceEquals(writer, null)) throw new ArgumentNullException(nameof(writer));
writer.WriteIntValue("affected_id", AffectedId);
writer.WriteLongValue("affected_id", AffectedId);
writer.WriteStringValue("controller", Controller);
writer.WriteIntValue("id", Id);
writer.WriteStringValue("item_name", ItemName);
writer.WriteStringValue("name", Name);
writer.WriteStringValue("text", Text);
writer.WriteDateTimeOffsetValue("timestamp", Timestamp);
writer.WriteIntValue("type", Type);

View File

@@ -1,5 +1,5 @@
{
"descriptionHash": "5FA86B439275E38EC7A0C23D1258AB8B9FE90EEE81BE82C55B8CA42C883D5B3A7A3706740519449FBF51C144142A70893B24BD7730FB51C2A104977412B86553",
"descriptionHash": "180C13118CC0FB9D7D20641B70174A8A6E9087183E8E28E0B4E9F58D8D72F75BCD8A178553461F31625ED679C9345769F48799D007D30D599D917A54D9142E62",
"descriptionLocation": "../../../../../tmp/openapi.json",
"lockFileVersion": "1.0.0",
"kiotaVersion": "1.31.1",

View File

@@ -20,7 +20,7 @@ public class NewsItemViewModel
public required IAsyncRelayCommand<NewsDto> NavigateToItemCommand { get; init; }
/// <summary>
/// Determines if this news item can be navigated to (only computers and consoles)
/// Determines if this news item can be navigated to
/// </summary>
public bool CanNavigateToItem
{
@@ -36,7 +36,27 @@ public class NewsItemViewModel
or NewsType.NewComputerInCollection
or NewsType.NewConsoleInCollection
or NewsType.UpdatedComputerInCollection
or NewsType.UpdatedConsoleInCollection;
or NewsType.UpdatedConsoleInCollection
or NewsType.NewBookInDb
or NewsType.UpdatedBookInDb
or NewsType.NewDocumentInDb
or NewsType.UpdatedDocumentInDb
or NewsType.NewMagazineInDb
or NewsType.UpdatedMagazineInDb
or NewsType.NewPersonInDb
or NewsType.UpdatedPersonInDb
or NewsType.NewSoftwareInDb
or NewsType.UpdatedSoftwareInDb
or NewsType.NewSoftwareVersionInDb
or NewsType.UpdatedSoftwareVersionInDb
or NewsType.NewSoftwareReleaseInDb
or NewsType.UpdatedSoftwareReleaseInDb
or NewsType.NewGpuInDb
or NewsType.UpdatedGpuInDb
or NewsType.NewSoundSynthInDb
or NewsType.UpdatedSoundSynthInDb
or NewsType.NewProcessorInDb
or NewsType.UpdatedProcessorInDb;
}
}
}
@@ -79,33 +99,83 @@ public partial class NewsViewModel : ObservableObject
var newsType = (NewsType)news.Type.Value;
// Only navigate for computer and console news items
bool isComputerOrConsole = newsType is NewsType.NewComputerInDb
or NewsType.NewConsoleInDb
or NewsType.UpdatedComputerInDb
or NewsType.UpdatedConsoleInDb
or NewsType.NewComputerInCollection
or NewsType.NewConsoleInCollection
or NewsType.UpdatedComputerInCollection
or NewsType.UpdatedConsoleInCollection;
if(news.AffectedId is null or <= 0) return;
if(!isComputerOrConsole) return;
int affectedId = (int)(news.AffectedId ?? 0);
string viewName;
var parameters = new NavigationParameters { { NavParamKeys.NavigationSource, nameof(NewsViewModel) } };
// Extract the machine ID from AffectedId
if(news.AffectedId is null) return;
int machineId = news.AffectedId ?? 0;
if(machineId <= 0) return;
// Navigate to machine view with source information
var parameters = new NavigationParameters
switch(newsType)
{
{ NavParamKeys.MachineId, machineId },
{ NavParamKeys.NavigationSource, nameof(NewsViewModel) }
};
case NewsType.NewComputerInDb or NewsType.UpdatedComputerInDb
or NewsType.NewComputerInCollection or NewsType.UpdatedComputerInCollection
or NewsType.NewConsoleInDb or NewsType.UpdatedConsoleInDb
or NewsType.NewConsoleInCollection or NewsType.UpdatedConsoleInCollection:
viewName = nameof(MachineViewPage);
parameters.Add(NavParamKeys.MachineId, affectedId);
_regionManager.RequestNavigate(RegionNames.Content, nameof(MachineViewPage), parameters);
break;
case NewsType.NewBookInDb or NewsType.UpdatedBookInDb:
viewName = nameof(BookViewPage);
parameters.Add(NavParamKeys.BookId, affectedId);
break;
case NewsType.NewDocumentInDb or NewsType.UpdatedDocumentInDb:
viewName = nameof(DocumentViewPage);
parameters.Add(NavParamKeys.DocumentId, affectedId);
break;
case NewsType.NewMagazineInDb or NewsType.UpdatedMagazineInDb:
viewName = nameof(MagazineViewPage);
parameters.Add(NavParamKeys.MagazineId, affectedId);
break;
case NewsType.NewPersonInDb or NewsType.UpdatedPersonInDb:
viewName = nameof(PersonViewPage);
parameters.Add(NavParamKeys.PersonId, affectedId);
break;
case NewsType.NewSoftwareInDb or NewsType.UpdatedSoftwareInDb
or NewsType.NewSoftwareVersionInDb or NewsType.UpdatedSoftwareVersionInDb:
viewName = nameof(SoftwareViewPage);
parameters.Add(NavParamKeys.SoftwareId, affectedId);
break;
case NewsType.NewSoftwareReleaseInDb or NewsType.UpdatedSoftwareReleaseInDb:
viewName = nameof(SoftwareReleaseViewPage);
parameters.Add(NavParamKeys.SoftwareReleaseId, affectedId);
break;
case NewsType.NewGpuInDb or NewsType.UpdatedGpuInDb:
viewName = nameof(GpuDetailPage);
parameters.Add(NavParamKeys.GpuId, affectedId);
break;
case NewsType.NewSoundSynthInDb or NewsType.UpdatedSoundSynthInDb:
viewName = nameof(SoundSynthDetailPage);
parameters.Add(NavParamKeys.SoundSynthId, affectedId);
break;
case NewsType.NewProcessorInDb or NewsType.UpdatedProcessorInDb:
viewName = nameof(ProcessorDetailPage);
parameters.Add(NavParamKeys.ProcessorId, affectedId);
break;
default:
return;
}
_regionManager.RequestNavigate(RegionNames.Content, viewName, parameters);
}
/// <summary>
@@ -126,6 +196,26 @@ public partial class NewsViewModel : ObservableObject
NewsType.UpdatedConsoleInDb => _localizer["Updated console in database"].Value,
NewsType.UpdatedComputerInCollection => _localizer["Updated computer in collection"].Value,
NewsType.UpdatedConsoleInCollection => _localizer["Updated console in collection"].Value,
NewsType.NewBookInDb => _localizer["New book in database"].Value,
NewsType.UpdatedBookInDb => _localizer["Updated book in database"].Value,
NewsType.NewDocumentInDb => _localizer["New document in database"].Value,
NewsType.UpdatedDocumentInDb => _localizer["Updated document in database"].Value,
NewsType.NewMagazineInDb => _localizer["New magazine in database"].Value,
NewsType.UpdatedMagazineInDb => _localizer["Updated magazine in database"].Value,
NewsType.NewPersonInDb => _localizer["New person in database"].Value,
NewsType.UpdatedPersonInDb => _localizer["Updated person in database"].Value,
NewsType.NewSoftwareInDb => _localizer["New software in database"].Value,
NewsType.UpdatedSoftwareInDb => _localizer["Updated software in database"].Value,
NewsType.NewSoftwareVersionInDb => _localizer["New software version in database"].Value,
NewsType.UpdatedSoftwareVersionInDb => _localizer["Updated software version in database"].Value,
NewsType.NewSoftwareReleaseInDb => _localizer["New software release in database"].Value,
NewsType.UpdatedSoftwareReleaseInDb => _localizer["Updated software release in database"].Value,
NewsType.NewGpuInDb => _localizer["New GPU in database"].Value,
NewsType.UpdatedGpuInDb => _localizer["Updated GPU in database"].Value,
NewsType.NewSoundSynthInDb => _localizer["New sound synthesizer in database"].Value,
NewsType.UpdatedSoundSynthInDb => _localizer["Updated sound synthesizer in database"].Value,
NewsType.NewProcessorInDb => _localizer["New processor in database"].Value,
NewsType.UpdatedProcessorInDb => _localizer["Updated processor in database"].Value,
_ => string.Empty
};
}

View File

@@ -510,6 +510,66 @@
<data name="Updated console in collection" xml:space="preserve">
<value>Aktualisierte Konsole in der Sammlung</value>
</data>
<data name="New book in database" xml:space="preserve">
<value>Neues Buch in der Datenbank</value>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Aktualisiertes Buch in der Datenbank</value>
</data>
<data name="New document in database" xml:space="preserve">
<value>Neues Dokument in der Datenbank</value>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Aktualisiertes Dokument in der Datenbank</value>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>Neue Zeitschrift in der Datenbank</value>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Aktualisierte Zeitschrift in der Datenbank</value>
</data>
<data name="New person in database" xml:space="preserve">
<value>Neue Person in der Datenbank</value>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Aktualisierte Person in der Datenbank</value>
</data>
<data name="New software in database" xml:space="preserve">
<value>Neue Software in der Datenbank</value>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Aktualisierte Software in der Datenbank</value>
</data>
<data name="New software version in database" xml:space="preserve">
<value>Neue Softwareversion in der Datenbank</value>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Aktualisierte Softwareversion in der Datenbank</value>
</data>
<data name="New software release in database" xml:space="preserve">
<value>Neue Softwareveröffentlichung in der Datenbank</value>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Aktualisierte Softwareveröffentlichung in der Datenbank</value>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>Neue GPU in der Datenbank</value>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>Aktualisierte GPU in der Datenbank</value>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>Neuer Soundsynthesizer in der Datenbank</value>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Aktualisierter Soundsynthesizer in der Datenbank</value>
</data>
<data name="New processor in database" xml:space="preserve">
<value>Neuer Prozessor in der Datenbank</value>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Aktualisierter Prozessor in der Datenbank</value>
</data>
<data name="No news available" xml:space="preserve">
<value>Keine Nachrichten verfügbar</value>
</data>

View File

@@ -510,6 +510,66 @@
<data name="Updated console in collection" xml:space="preserve">
<value>Consola actualizada en la colección</value>
</data>
<data name="New book in database" xml:space="preserve">
<value>Nuevo libro en la base de datos</value>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Libro actualizado en la base de datos</value>
</data>
<data name="New document in database" xml:space="preserve">
<value>Nuevo documento en la base de datos</value>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Documento actualizado en la base de datos</value>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>Nueva revista en la base de datos</value>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Revista actualizada en la base de datos</value>
</data>
<data name="New person in database" xml:space="preserve">
<value>Nueva persona en la base de datos</value>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Persona actualizada en la base de datos</value>
</data>
<data name="New software in database" xml:space="preserve">
<value>Nuevo software en la base de datos</value>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Software actualizado en la base de datos</value>
</data>
<data name="New software version in database" xml:space="preserve">
<value>Nueva versión de software en la base de datos</value>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Versión de software actualizada en la base de datos</value>
</data>
<data name="New software release in database" xml:space="preserve">
<value>Nuevo lanzamiento de software en la base de datos</value>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Lanzamiento de software actualizado en la base de datos</value>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>Nueva GPU en la base de datos</value>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>GPU actualizada en la base de datos</value>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>Nuevo sintetizador de sonido en la base de datos</value>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Sintetizador de sonido actualizado en la base de datos</value>
</data>
<data name="New processor in database" xml:space="preserve">
<value>Nuevo procesador en la base de datos</value>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Procesador actualizado en la base de datos</value>
</data>
<data name="No news available" xml:space="preserve">
<value>No hay noticias disponibles</value>
</data>

View File

@@ -510,6 +510,66 @@
<data name="Updated console in collection" xml:space="preserve">
<value>Console mise à jour dans la collection</value>
</data>
<data name="New book in database" xml:space="preserve">
<value>Nouveau livre dans la base de données</value>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Livre mis à jour dans la base de données</value>
</data>
<data name="New document in database" xml:space="preserve">
<value>Nouveau document dans la base de données</value>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Document mis à jour dans la base de données</value>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>Nouveau magazine dans la base de données</value>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Magazine mis à jour dans la base de données</value>
</data>
<data name="New person in database" xml:space="preserve">
<value>Nouvelle personne dans la base de données</value>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Personne mise à jour dans la base de données</value>
</data>
<data name="New software in database" xml:space="preserve">
<value>Nouveau logiciel dans la base de données</value>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Logiciel mis à jour dans la base de données</value>
</data>
<data name="New software version in database" xml:space="preserve">
<value>Nouvelle version de logiciel dans la base de données</value>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Version de logiciel mise à jour dans la base de données</value>
</data>
<data name="New software release in database" xml:space="preserve">
<value>Nouvelle publication de logiciel dans la base de données</value>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Publication de logiciel mise à jour dans la base de données</value>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>Nouveau GPU dans la base de données</value>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>GPU mis à jour dans la base de données</value>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>Nouveau synthétiseur sonore dans la base de données</value>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Synthétiseur sonore mis à jour dans la base de données</value>
</data>
<data name="New processor in database" xml:space="preserve">
<value>Nouveau processeur dans la base de données</value>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Processeur mis à jour dans la base de données</value>
</data>
<data name="No news available" xml:space="preserve">
<value>Aucune actualité disponible</value>
</data>

View File

@@ -510,6 +510,66 @@
<data name="Updated console in collection" xml:space="preserve">
<value>Consola renovata in collectione</value>
</data>
<data name="New book in database" xml:space="preserve">
<value>Liber novus in datorum basi</value>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Liber renovatus in datorum basi</value>
</data>
<data name="New document in database" xml:space="preserve">
<value>Documentum novum in datorum basi</value>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Documentum renovatum in datorum basi</value>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>Ephemeris nova in datorum basi</value>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Ephemeris renovata in datorum basi</value>
</data>
<data name="New person in database" xml:space="preserve">
<value>Persona nova in datorum basi</value>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Persona renovata in datorum basi</value>
</data>
<data name="New software in database" xml:space="preserve">
<value>Programma novum in datorum basi</value>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Programma renovatum in datorum basi</value>
</data>
<data name="New software version in database" xml:space="preserve">
<value>Versio programmatis nova in datorum basi</value>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Versio programmatis renovata in datorum basi</value>
</data>
<data name="New software release in database" xml:space="preserve">
<value>Editio programmatis nova in datorum basi</value>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Editio programmatis renovata in datorum basi</value>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>GPU novum in datorum basi</value>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>GPU renovatum in datorum basi</value>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>Synthesizer sonorum novus in datorum basi</value>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Synthesizer sonorum renovatus in datorum basi</value>
</data>
<data name="New processor in database" xml:space="preserve">
<value>Processor novus in datorum basi</value>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Processor renovatus in datorum basi</value>
</data>
<data name="No news available" xml:space="preserve">
<value>Nulli nuntii disponibiles</value>
</data>

View File

@@ -510,6 +510,66 @@
<data name="Updated console in collection" xml:space="preserve">
<value>Console atualizado na coleção</value>
</data>
<data name="New book in database" xml:space="preserve">
<value>Novo livro no banco de dados</value>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Livro atualizado no banco de dados</value>
</data>
<data name="New document in database" xml:space="preserve">
<value>Novo documento no banco de dados</value>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Documento atualizado no banco de dados</value>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>Nova revista no banco de dados</value>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Revista atualizada no banco de dados</value>
</data>
<data name="New person in database" xml:space="preserve">
<value>Nova pessoa no banco de dados</value>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Pessoa atualizada no banco de dados</value>
</data>
<data name="New software in database" xml:space="preserve">
<value>Novo software no banco de dados</value>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Software atualizado no banco de dados</value>
</data>
<data name="New software version in database" xml:space="preserve">
<value>Nova versão de software no banco de dados</value>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Versão de software atualizada no banco de dados</value>
</data>
<data name="New software release in database" xml:space="preserve">
<value>Novo lançamento de software no banco de dados</value>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Lançamento de software atualizado no banco de dados</value>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>Nova GPU no banco de dados</value>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>GPU atualizada no banco de dados</value>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>Novo sintetizador de som no banco de dados</value>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Sintetizador de som atualizado no banco de dados</value>
</data>
<data name="New processor in database" xml:space="preserve">
<value>Novo processador no banco de dados</value>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Processador atualizado no banco de dados</value>
</data>
<data name="No news available" xml:space="preserve">
<value>Nenhuma notícia disponível</value>
</data>

View File

@@ -510,6 +510,66 @@
<data name="Updated console in collection" xml:space="preserve">
<value>Updated console in collection</value>
</data>
<data name="New book in database" xml:space="preserve">
<value>New book in database</value>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Updated book in database</value>
</data>
<data name="New document in database" xml:space="preserve">
<value>New document in database</value>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Updated document in database</value>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>New magazine in database</value>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Updated magazine in database</value>
</data>
<data name="New person in database" xml:space="preserve">
<value>New person in database</value>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Updated person in database</value>
</data>
<data name="New software in database" xml:space="preserve">
<value>New software in database</value>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Updated software in database</value>
</data>
<data name="New software version in database" xml:space="preserve">
<value>New software version in database</value>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Updated software version in database</value>
</data>
<data name="New software release in database" xml:space="preserve">
<value>New software release in database</value>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Updated software release in database</value>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>New GPU in database</value>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>Updated GPU in database</value>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>New sound synthesizer in database</value>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Updated sound synthesizer in database</value>
</data>
<data name="New processor in database" xml:space="preserve">
<value>New processor in database</value>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Updated processor in database</value>
</data>
<data name="No news available" xml:space="preserve">
<value>No news available</value>
</data>

View File

@@ -31,7 +31,8 @@ public sealed class NewsDto : BaseDto<int>
{
public NewsDto() {}
public NewsDto(int affectedId, string text, DateTime timestamp, string controller, string itemName, NewsType type)
public NewsDto(long affectedId, string text, DateTime timestamp, string controller, string itemName,
NewsType type, string? name = null)
{
AffectedId = affectedId;
Text = text;
@@ -39,12 +40,13 @@ public sealed class NewsDto : BaseDto<int>
Controller = controller;
ItemName = itemName;
Type = type;
Name = name;
}
[JsonPropertyName("type")]
public NewsType Type { get; set; }
[JsonPropertyName("affected_id")]
public int AffectedId { get; set; }
public long AffectedId { get; set; }
[JsonPropertyName("controller")]
public string Controller { get; set; }
[JsonPropertyName("item_name")]
@@ -53,4 +55,6 @@ public sealed class NewsDto : BaseDto<int>
public string Text { get; set; }
[JsonPropertyName("timestamp")]
public DateTime Timestamp { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; }
}

View File

@@ -40,7 +40,27 @@ public enum NewsType
UpdatedConsoleInDb = 6,
UpdatedComputerInCollection = 7,
UpdatedConsoleInCollection = 8,
NewMoneyDonation = 9
NewMoneyDonation = 9,
NewBookInDb = 10,
UpdatedBookInDb = 11,
NewDocumentInDb = 12,
UpdatedDocumentInDb = 13,
NewMagazineInDb = 14,
UpdatedMagazineInDb = 15,
NewPersonInDb = 16,
UpdatedPersonInDb = 17,
NewSoftwareInDb = 18,
UpdatedSoftwareInDb = 19,
NewSoftwareVersionInDb = 20,
UpdatedSoftwareVersionInDb = 21,
NewSoftwareReleaseInDb = 22,
UpdatedSoftwareReleaseInDb = 23,
NewGpuInDb = 24,
UpdatedGpuInDb = 25,
NewSoundSynthInDb = 26,
UpdatedSoundSynthInDb = 27,
NewProcessorInDb = 28,
UpdatedProcessorInDb = 29
}
public enum StatusType

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,49 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Marechai.Database.Migrations
{
/// <inheritdoc />
public partial class AddNewsNameAndLongAddedId : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<long>(
name: "added_id",
table: "news",
type: "bigint(20)",
nullable: false,
defaultValueSql: "'0'",
oldClrType: typeof(int),
oldType: "int(11)",
oldDefaultValueSql: "'0'");
migrationBuilder.AddColumn<string>(
name: "name",
table: "news",
type: "longtext",
nullable: true)
.Annotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "name",
table: "news");
migrationBuilder.AlterColumn<int>(
name: "added_id",
table: "news",
type: "int(11)",
nullable: false,
defaultValueSql: "'0'",
oldClrType: typeof(long),
oldType: "bigint(20)",
oldDefaultValueSql: "'0'");
}
}
}

View File

@@ -4250,9 +4250,9 @@ namespace Marechai.Database.Migrations
MySqlPropertyBuilderExtensions.UseMySqlIdentityColumn(b.Property<int>("Id"));
b.Property<int>("AddedId")
b.Property<long>("AddedId")
.ValueGeneratedOnAdd()
.HasColumnType("int(11)")
.HasColumnType("bigint(20)")
.HasColumnName("added_id")
.HasDefaultValueSql("'0'");
@@ -4266,6 +4266,10 @@ namespace Marechai.Database.Migrations
.HasColumnType("datetime")
.HasColumnName("date");
b.Property<string>("Name")
.HasColumnType("longtext")
.HasColumnName("name");
b.Property<int>("Type")
.ValueGeneratedOnAdd()
.HasColumnType("int(11)")

View File

@@ -1272,7 +1272,7 @@ public class MarechaiContext : IdentityDbContext<ApplicationUser, ApplicationRol
entity.Property(e => e.AddedId)
.HasColumnName("added_id")
.HasColumnType("int(11)")
.HasColumnType("bigint(20)")
.HasDefaultValueSql("'0'");
entity.Property(e => e.Date).IsRequired().HasColumnName("date").HasColumnType("datetime");
@@ -1281,6 +1281,11 @@ public class MarechaiContext : IdentityDbContext<ApplicationUser, ApplicationRol
.HasColumnName("type")
.HasColumnType("int(11)")
.HasDefaultValue(NewsType.NewComputerInDb);
entity.Property(e => e.Name)
.HasColumnName("name")
.HasColumnType("longtext")
.IsRequired(false);
});
modelBuilder.Entity<PeopleByBook>(entity =>

View File

@@ -34,5 +34,6 @@ public class News : BaseModel<int>
public DateTime Date { get; set; }
public NewsType Type { get; set; }
[DisplayName("Affected ID")]
public int AddedId { get; set; }
public long AddedId { get; set; }
public string? Name { get; set; }
}

View File

@@ -29,6 +29,7 @@ using System.IO;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Marechai.Helpers;
@@ -210,6 +211,15 @@ public class BooksController(MarechaiContext context, IConfiguration configurati
model.Edition = dto.Edition;
model.PreviousId = dto.PreviousId;
model.SourceId = dto.SourceId;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedBookInDb,
Name = dto.Title
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -243,6 +253,16 @@ public class BooksController(MarechaiContext context, IConfiguration configurati
await context.Books.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewBookInDb,
Name = dto.Title
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -23,10 +23,12 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -164,6 +166,15 @@ public class DocumentsController(MarechaiContext context) : ControllerBase
model.SortTitle = dto.SortTitle;
model.Published = dto.Published;
model.CountryId = dto.CountryId;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedDocumentInDb,
Name = dto.Title
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -192,6 +203,16 @@ public class DocumentsController(MarechaiContext context) : ControllerBase
await context.Documents.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewDocumentInDb,
Name = dto.Title
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -23,10 +23,12 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -148,6 +150,17 @@ public class GpusController(MarechaiContext context) : ControllerBase
model.DieSize = dto.DieSize;
model.Transistors = dto.Transistors;
Company company = dto.CompanyId is not null ? await context.Companies.FindAsync(dto.CompanyId) : null;
string newsName = company is not null ? $"{company.Name} {dto.Name}" : dto.Name;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedGpuInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -180,6 +193,19 @@ public class GpusController(MarechaiContext context) : ControllerBase
await context.Gpus.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
Company company = dto.CompanyId is not null ? await context.Companies.FindAsync(dto.CompanyId) : null;
string newsName = company is not null ? $"{company.Name} {dto.Name}" : dto.Name;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewGpuInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -107,6 +107,9 @@ public class MachinesController(MarechaiContext context) : ControllerBase
Date = DateTime.UtcNow
};
Company company = await context.Companies.FindAsync(model.CompanyId);
news.Name = company is not null ? $"{company.Name} {model.Name}" : model.Name;
switch(model.Type)
{
case MachineType.Computer:
@@ -160,6 +163,9 @@ public class MachinesController(MarechaiContext context) : ControllerBase
Date = DateTime.UtcNow
};
Company company = await context.Companies.FindAsync(dto.CompanyId);
news.Name = company is not null ? $"{company.Name} {model.Name}" : model.Name;
switch(model.Type)
{
case MachineType.Computer:

View File

@@ -23,10 +23,12 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -182,6 +184,15 @@ public class MagazinesController(MarechaiContext context) : ControllerBase
model.FirstPublication = dto.FirstPublication;
model.CountryId = dto.CountryId;
model.Issn = dto.Issn;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedMagazineInDb,
Name = dto.Title
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -211,6 +222,16 @@ public class MagazinesController(MarechaiContext context) : ControllerBase
await context.Magazines.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewMagazineInDb,
Name = dto.Title
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -51,7 +51,8 @@ public class NewsController(MarechaiContext context) : ControllerBase
Id = n.Id,
Timestamp = n.Date,
Type = n.Type,
AffectedId = n.AddedId
AffectedId = n.AddedId,
Name = n.Name
})
.ToListAsync();
@@ -61,62 +62,117 @@ public class NewsController(MarechaiContext context) : ControllerBase
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public List<NewsDto> GetNews()
{
List<News> latestNews = context.News.OrderByDescending(t => t.Date).Take(10).ToList();
List<NewsDto> news = [];
var newsWithMachines = context.News.OrderByDescending(t => t.Date)
.Take(10)
.Join(context.Machines.Include(m => m.Company),
n => n.AddedId,
m => m.Id,
(n, m) => new
{
News = n,
Machine = m
})
.ToList();
foreach(var item in newsWithMachines)
foreach(News @new in latestNews)
{
News @new = item.News;
Machine machine = item.Machine;
if(machine is null) continue;
string controller;
string itemName = @new.Name;
switch(@new.Type)
{
case NewsType.NewComputerInDb:
case NewsType.NewConsoleInDb:
case NewsType.NewComputerInCollection:
case NewsType.NewConsoleInCollection:
case NewsType.UpdatedComputerInDb:
case NewsType.UpdatedConsoleInDb:
case NewsType.UpdatedComputerInCollection:
case NewsType.UpdatedConsoleInCollection:
news.Add(new NewsDto
controller = "computers";
if(string.IsNullOrEmpty(itemName))
{
Id = @new.Id,
AffectedId = @new.AddedId,
Timestamp = @new.Date,
Type = @new.Type,
Controller =
@new.Type is NewsType.NewComputerInDb
or NewsType.NewComputerInCollection
or NewsType.UpdatedComputerInDb
or NewsType.UpdatedComputerInCollection
? "computers"
: "consoles",
ItemName = $"{machine.Company.Name} {machine.Name}"
});
Machine machine = context.Machines.Include(m => m.Company)
.FirstOrDefault(m => m.Id == @new.AddedId);
if(machine is not null) itemName = $"{machine.Company?.Name} {machine.Name}";
}
break;
case NewsType.NewConsoleInDb:
case NewsType.NewConsoleInCollection:
case NewsType.UpdatedConsoleInDb:
case NewsType.UpdatedConsoleInCollection:
controller = "consoles";
if(string.IsNullOrEmpty(itemName))
{
Machine console = context.Machines.Include(m => m.Company)
.FirstOrDefault(m => m.Id == @new.AddedId);
if(console is not null) itemName = $"{console.Company?.Name} {console.Name}";
}
break;
case NewsType.NewMoneyDonation:
// TODO
continue;
case NewsType.NewBookInDb or NewsType.UpdatedBookInDb:
controller = "books";
break;
case NewsType.NewDocumentInDb or NewsType.UpdatedDocumentInDb:
controller = "documents";
break;
case NewsType.NewMagazineInDb or NewsType.UpdatedMagazineInDb:
controller = "magazines";
break;
case NewsType.NewPersonInDb or NewsType.UpdatedPersonInDb:
controller = "people";
break;
case NewsType.NewSoftwareInDb or NewsType.UpdatedSoftwareInDb:
controller = "software";
break;
case NewsType.NewSoftwareVersionInDb or NewsType.UpdatedSoftwareVersionInDb:
controller = "software-versions";
break;
case NewsType.NewSoftwareReleaseInDb or NewsType.UpdatedSoftwareReleaseInDb:
controller = "software-releases";
break;
case NewsType.NewGpuInDb or NewsType.UpdatedGpuInDb:
controller = "gpus";
break;
case NewsType.NewSoundSynthInDb or NewsType.UpdatedSoundSynthInDb:
controller = "sound-synths";
break;
case NewsType.NewProcessorInDb or NewsType.UpdatedProcessorInDb:
controller = "processors";
break;
default:
continue;
}
news.Add(new NewsDto
{
Id = @new.Id,
AffectedId = @new.AddedId,
Timestamp = @new.Date,
Type = @new.Type,
Controller = controller,
ItemName = itemName,
Name = @new.Name
});
}
return news;

View File

@@ -28,6 +28,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -291,6 +292,14 @@ public class PeopleController(MarechaiContext context) : ControllerBase
model.Alias = dto.Alias;
model.DisplayName = dto.DisplayName;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedPersonInDb,
Name = dto.DisplayName ?? $"{dto.Name} {dto.Surname}".Trim()
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -325,6 +334,16 @@ public class PeopleController(MarechaiContext context) : ControllerBase
await context.People.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewPersonInDb,
Name = dto.DisplayName ?? $"{dto.Name} {dto.Surname}".Trim()
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -23,10 +23,12 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -201,6 +203,17 @@ public class ProcessorsController(MarechaiContext context) : ControllerBase
model.ThreadsPerCore = dto.ThreadsPerCore;
model.Transistors = dto.Transistors;
Company company = dto.CompanyId is not null ? await context.Companies.FindAsync(dto.CompanyId) : null;
string newsName = company is not null ? $"{company.Name} {dto.Name}" : dto.Name;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedProcessorInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -249,6 +262,19 @@ public class ProcessorsController(MarechaiContext context) : ControllerBase
await context.Processors.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
Company company = dto.CompanyId is not null ? await context.Companies.FindAsync(dto.CompanyId) : null;
string newsName = company is not null ? $"{company.Name} {dto.Name}" : dto.Name;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewProcessorInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -28,6 +28,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -188,6 +189,15 @@ public class SoftwareController(MarechaiContext context) : ControllerBase
model.FamilyId = dto.FamilyId;
model.IsOperatingSystem = dto.IsOperatingSystem;
model.IsGame = dto.IsGame;
await context.News.AddAsync(new News
{
AddedId = (long)model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedSoftwareInDb,
Name = dto.Name
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -215,6 +225,16 @@ public class SoftwareController(MarechaiContext context) : ControllerBase
await context.Softwares.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
await context.News.AddAsync(new News
{
AddedId = (long)model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewSoftwareInDb,
Name = dto.Name
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -23,11 +23,13 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -139,6 +141,17 @@ public class SoftwareReleasesController(MarechaiContext context) : ControllerBas
model.RegionId = dto.RegionId;
model.PublisherId = dto.PublisherId;
model.ReleaseDate = dto.ReleaseDate;
string newsName = await BuildSoftwareReleaseNewsNameAsync(model.SoftwareVersionId, model.PlatformId);
await context.News.AddAsync(new News
{
AddedId = (long)model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedSoftwareReleaseInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -169,6 +182,18 @@ public class SoftwareReleasesController(MarechaiContext context) : ControllerBas
await context.SoftwareReleases.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
string newsName = await BuildSoftwareReleaseNewsNameAsync(dto.SoftwareVersionId, dto.PlatformId);
await context.News.AddAsync(new News
{
AddedId = (long)model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewSoftwareReleaseInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}
@@ -193,4 +218,26 @@ public class SoftwareReleasesController(MarechaiContext context) : ControllerBas
return Ok();
}
async Task<string> BuildSoftwareReleaseNewsNameAsync(ulong versionId, ulong? platformId)
{
string name = "";
SoftwareVersion version = await context.SoftwareVersions.Include(v => v.Software)
.FirstOrDefaultAsync(v => v.Id == versionId);
if(version?.Software is not null)
name = $"{version.Software.Name} {version.VersionString}";
else if(version is not null)
name = version.VersionString;
if(platformId is not null)
{
SoftwarePlatform platform = await context.SoftwarePlatforms.FindAsync(platformId);
if(platform is not null) name = string.IsNullOrEmpty(name) ? platform.Name : $"{name} ({platform.Name})";
}
return name;
}
}

View File

@@ -23,10 +23,12 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -125,6 +127,18 @@ public class SoftwareVersionsController(MarechaiContext context) : ControllerBas
model.PublicVersion = dto.PublicVersion;
model.ParentVersionId = dto.ParentVersionId;
model.LicenseId = dto.LicenseId;
Software software = await context.Softwares.FindAsync(model.SoftwareId);
string newsName = dto.PublicVersion ?? (software is not null ? $"{software.Name} {dto.VersionString}" : dto.VersionString);
await context.News.AddAsync(new News
{
AddedId = (long)model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedSoftwareVersionInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -154,6 +168,19 @@ public class SoftwareVersionsController(MarechaiContext context) : ControllerBas
await context.SoftwareVersions.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
Software software = await context.Softwares.FindAsync(dto.SoftwareId);
string newsName = dto.PublicVersion ?? (software is not null ? $"{software.Name} {dto.VersionString}" : dto.VersionString);
await context.News.AddAsync(new News
{
AddedId = (long)model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewSoftwareVersionInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -23,10 +23,12 @@
// Copyright © 2003-2026 Natalia Portillo
*******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Marechai.Data;
using Marechai.Data.Dtos;
using Marechai.Database.Models;
using Microsoft.AspNetCore.Authorization;
@@ -139,6 +141,17 @@ public class SoundSynthsController(MarechaiContext context) : ControllerBase
model.SquareWave = dto.SquareWave;
model.WhiteNoise = dto.WhiteNoise;
Company company = dto.CompanyId is not null ? await context.Companies.FindAsync(dto.CompanyId) : null;
string newsName = company is not null ? $"{company.Name} {dto.Name}" : dto.Name;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.UpdatedSoundSynthInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return Ok();
@@ -172,6 +185,19 @@ public class SoundSynthsController(MarechaiContext context) : ControllerBase
await context.SoundSynths.AddAsync(model);
await context.SaveChangesWithUserAsync(userId);
Company company = dto.CompanyId is not null ? await context.Companies.FindAsync(dto.CompanyId) : null;
string newsName = company is not null ? $"{company.Name} {dto.Name}" : dto.Name;
await context.News.AddAsync(new News
{
AddedId = model.Id,
Date = DateTime.UtcNow,
Type = NewsType.NewSoundSynthInDb,
Name = newsName
});
await context.SaveChangesWithUserAsync(userId);
return model.Id;
}

View File

@@ -50,13 +50,14 @@
<MudCard Elevation="2" Class="rounded-lg">
<MudCardContent>
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2" Class="mb-2">
<MudIcon Icon="@Icons.Material.Filled.FiberNew" Color="Color.Secondary" Size="Size.Small"/>
<MudIcon Icon="@GetNewsStatusIcon((NewsType)(news.Type ?? 0))" Color="@GetNewsStatusColor((NewsType)(news.Type ?? 0))" Size="Size.Small"/>
<MudIcon Icon="@GetNewsEntityIcon((NewsType)(news.Type ?? 0))" Color="Color.Default" Size="Size.Small"/>
<MudText Typo="Typo.caption" Color="Color.Primary">@news.Timestamp</MudText>
</MudStack>
<MudText Typo="Typo.body1">@GetNewsTypeText((NewsType)(news.Type ?? 0))</MudText>
</MudCardContent>
<MudCardActions>
<MudButton Href="@($"/machine/{news.AffectedId}")" Variant="Variant.Filled" Color="Color.Primary" Size="Size.Small" EndIcon="@Icons.Material.Filled.ArrowForward">@news.ItemName</MudButton>
<MudButton Href="@GetNewsItemUrl(news)" Variant="Variant.Filled" Color="Color.Primary" Size="Size.Small" EndIcon="@Icons.Material.Filled.ArrowForward">@news.ItemName</MudButton>
</MudCardActions>
</MudCard>
}
@@ -73,6 +74,104 @@
NewsType.UpdatedConsoleInDb => L["Updated console in database"],
NewsType.UpdatedComputerInCollection => L["Updated computer in collection"],
NewsType.UpdatedConsoleInCollection => L["Updated console in collection"],
NewsType.NewBookInDb => L["New book in database"],
NewsType.UpdatedBookInDb => L["Updated book in database"],
NewsType.NewDocumentInDb => L["New document in database"],
NewsType.UpdatedDocumentInDb => L["Updated document in database"],
NewsType.NewMagazineInDb => L["New magazine in database"],
NewsType.UpdatedMagazineInDb => L["Updated magazine in database"],
NewsType.NewPersonInDb => L["New person in database"],
NewsType.UpdatedPersonInDb => L["Updated person in database"],
NewsType.NewSoftwareInDb => L["New software in database"],
NewsType.UpdatedSoftwareInDb => L["Updated software in database"],
NewsType.NewSoftwareVersionInDb => L["New software version in database"],
NewsType.UpdatedSoftwareVersionInDb => L["Updated software version in database"],
NewsType.NewSoftwareReleaseInDb => L["New software release in database"],
NewsType.UpdatedSoftwareReleaseInDb => L["Updated software release in database"],
NewsType.NewGpuInDb => L["New GPU in database"],
NewsType.UpdatedGpuInDb => L["Updated GPU in database"],
NewsType.NewSoundSynthInDb => L["New sound synthesizer in database"],
NewsType.UpdatedSoundSynthInDb => L["Updated sound synthesizer in database"],
NewsType.NewProcessorInDb => L["New processor in database"],
NewsType.UpdatedProcessorInDb => L["Updated processor in database"],
_ => string.Empty
};
private static string GetNewsItemUrl(NewsDto news)
{
var type = (NewsType)(news.Type ?? 0);
return type switch
{
NewsType.NewComputerInDb or NewsType.UpdatedComputerInDb
or NewsType.NewComputerInCollection or NewsType.UpdatedComputerInCollection
or NewsType.NewConsoleInDb or NewsType.UpdatedConsoleInDb
or NewsType.NewConsoleInCollection or NewsType.UpdatedConsoleInCollection
=> $"/machine/{news.AffectedId}",
NewsType.NewBookInDb or NewsType.UpdatedBookInDb => $"/book/{news.AffectedId}",
NewsType.NewDocumentInDb or NewsType.UpdatedDocumentInDb
=> $"/document/{news.AffectedId}",
NewsType.NewMagazineInDb or NewsType.UpdatedMagazineInDb
=> $"/magazine/{news.AffectedId}",
NewsType.NewPersonInDb or NewsType.UpdatedPersonInDb
=> $"/person/{news.AffectedId}",
NewsType.NewSoftwareInDb or NewsType.UpdatedSoftwareInDb
=> $"/software/{news.AffectedId}",
NewsType.NewSoftwareVersionInDb or NewsType.UpdatedSoftwareVersionInDb
=> $"/software/{news.AffectedId}",
NewsType.NewSoftwareReleaseInDb or NewsType.UpdatedSoftwareReleaseInDb
=> $"/software/release/{news.AffectedId}",
NewsType.NewGpuInDb or NewsType.UpdatedGpuInDb => $"/gpu/{news.AffectedId}",
NewsType.NewSoundSynthInDb or NewsType.UpdatedSoundSynthInDb
=> $"/soundsynth/{news.AffectedId}",
NewsType.NewProcessorInDb or NewsType.UpdatedProcessorInDb
=> $"/processor/{news.AffectedId}",
_ => "#"
};
}
private static string GetNewsStatusIcon(NewsType type) => type switch
{
NewsType.NewComputerInDb or NewsType.NewConsoleInDb
or NewsType.NewComputerInCollection or NewsType.NewConsoleInCollection
or NewsType.NewBookInDb or NewsType.NewDocumentInDb or NewsType.NewMagazineInDb
or NewsType.NewPersonInDb or NewsType.NewSoftwareInDb or NewsType.NewSoftwareVersionInDb
or NewsType.NewSoftwareReleaseInDb or NewsType.NewGpuInDb or NewsType.NewSoundSynthInDb
or NewsType.NewProcessorInDb
=> Icons.Material.Filled.FiberNew,
_ => Icons.Material.Filled.Update
};
private static Color GetNewsStatusColor(NewsType type) => type switch
{
NewsType.NewComputerInDb or NewsType.NewConsoleInDb
or NewsType.NewComputerInCollection or NewsType.NewConsoleInCollection
or NewsType.NewBookInDb or NewsType.NewDocumentInDb or NewsType.NewMagazineInDb
or NewsType.NewPersonInDb or NewsType.NewSoftwareInDb or NewsType.NewSoftwareVersionInDb
or NewsType.NewSoftwareReleaseInDb or NewsType.NewGpuInDb or NewsType.NewSoundSynthInDb
or NewsType.NewProcessorInDb
=> Color.Secondary,
_ => Color.Info
};
private static string GetNewsEntityIcon(NewsType type) => type switch
{
NewsType.NewComputerInDb or NewsType.UpdatedComputerInDb
or NewsType.NewComputerInCollection or NewsType.UpdatedComputerInCollection
or NewsType.NewConsoleInDb or NewsType.UpdatedConsoleInDb
or NewsType.NewConsoleInCollection or NewsType.UpdatedConsoleInCollection
=> Icons.Material.Filled.Computer,
NewsType.NewBookInDb or NewsType.UpdatedBookInDb => Icons.Material.Filled.MenuBook,
NewsType.NewDocumentInDb or NewsType.UpdatedDocumentInDb => Icons.Material.Filled.Article,
NewsType.NewMagazineInDb or NewsType.UpdatedMagazineInDb => Icons.Material.Filled.AutoStories,
NewsType.NewPersonInDb or NewsType.UpdatedPersonInDb => Icons.Material.Filled.Person,
NewsType.NewSoftwareInDb or NewsType.UpdatedSoftwareInDb
or NewsType.NewSoftwareVersionInDb or NewsType.UpdatedSoftwareVersionInDb
or NewsType.NewSoftwareReleaseInDb or NewsType.UpdatedSoftwareReleaseInDb
=> Icons.Material.Filled.Apps,
NewsType.NewGpuInDb or NewsType.UpdatedGpuInDb => Icons.Material.Filled.Memory,
NewsType.NewSoundSynthInDb or NewsType.UpdatedSoundSynthInDb => Icons.Material.Filled.MusicNote,
NewsType.NewProcessorInDb or NewsType.UpdatedProcessorInDb => Icons.Material.Filled.DeveloperBoard,
_ => Icons.Material.Filled.Newspaper
};
}

View File

@@ -188,4 +188,84 @@
<value>Cancelar</value>
<comment>Cancel delete</comment>
</data>
<data name="New book in database" xml:space="preserve">
<value>Nuevo libro en la base de datos</value>
<comment>New book in database</comment>
</data>
<data name="Updated book in database" xml:space="preserve">
<value>Libro actualizado en la base de datos</value>
<comment>Updated book in database</comment>
</data>
<data name="New document in database" xml:space="preserve">
<value>Nuevo documento en la base de datos</value>
<comment>New document in database</comment>
</data>
<data name="Updated document in database" xml:space="preserve">
<value>Documento actualizado en la base de datos</value>
<comment>Updated document in database</comment>
</data>
<data name="New magazine in database" xml:space="preserve">
<value>Nueva revista en la base de datos</value>
<comment>New magazine in database</comment>
</data>
<data name="Updated magazine in database" xml:space="preserve">
<value>Revista actualizada en la base de datos</value>
<comment>Updated magazine in database</comment>
</data>
<data name="New person in database" xml:space="preserve">
<value>Nueva persona en la base de datos</value>
<comment>New person in database</comment>
</data>
<data name="Updated person in database" xml:space="preserve">
<value>Persona actualizada en la base de datos</value>
<comment>Updated person in database</comment>
</data>
<data name="New software in database" xml:space="preserve">
<value>Nuevo software en la base de datos</value>
<comment>New software in database</comment>
</data>
<data name="Updated software in database" xml:space="preserve">
<value>Software actualizado en la base de datos</value>
<comment>Updated software in database</comment>
</data>
<data name="New software version in database" xml:space="preserve">
<value>Nueva versión de software en la base de datos</value>
<comment>New software version in database</comment>
</data>
<data name="Updated software version in database" xml:space="preserve">
<value>Versión de software actualizada en la base de datos</value>
<comment>Updated software version in database</comment>
</data>
<data name="New software release in database" xml:space="preserve">
<value>Nuevo lanzamiento de software en la base de datos</value>
<comment>New software release in database</comment>
</data>
<data name="Updated software release in database" xml:space="preserve">
<value>Lanzamiento de software actualizado en la base de datos</value>
<comment>Updated software release in database</comment>
</data>
<data name="New GPU in database" xml:space="preserve">
<value>Nueva GPU en la base de datos</value>
<comment>New GPU in database</comment>
</data>
<data name="Updated GPU in database" xml:space="preserve">
<value>GPU actualizada en la base de datos</value>
<comment>Updated GPU in database</comment>
</data>
<data name="New sound synthesizer in database" xml:space="preserve">
<value>Nuevo sintetizador de sonido en la base de datos</value>
<comment>New sound synthesizer in database</comment>
</data>
<data name="Updated sound synthesizer in database" xml:space="preserve">
<value>Sintetizador de sonido actualizado en la base de datos</value>
<comment>Updated sound synthesizer in database</comment>
</data>
<data name="New processor in database" xml:space="preserve">
<value>Nuevo procesador en la base de datos</value>
<comment>New processor in database</comment>
</data>
<data name="Updated processor in database" xml:space="preserve">
<value>Procesador actualizado en la base de datos</value>
<comment>Updated processor in database</comment>
</data>
</root>