rama creada apartir de master en j

This commit is contained in:
jrojas
2026-06-26 10:29:23 +02:00
parent 319fd3dfb0
commit c1517fda87
2810 changed files with 1927392 additions and 25392 deletions
@@ -18,16 +18,23 @@ using System.Text.RegularExpressions;
namespace adas_core.Infrastructure.Repositories;
/// <summary>
/// Repository implementation for managing DisplayConfig entities in MongoDB.
/// Provides CRUD operations and specialized queries for display configurations.
/// </summary>
public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayConfigRepository
{
private readonly ApiSettings _apiSettings;
private readonly ILogger<DisplayConfigRepository> _logger;
private readonly IUnitRepository _unitRepository;
/// <summary>
/// Initializes a new instance of the DisplayConfigRepository.
/// </summary>
/// <param name="database">The MongoDB database instance.</param>
/// <param name="apiSettings">API settings containing collection names configuration.</param>
/// <param name="logger">Logger for repository operations.</param>
/// <param name="unitRepository">Repository for unit-related operations.</param>
public DisplayConfigRepository(
IMongoDatabase database,
ApiSettings apiSettings,
@@ -39,17 +46,31 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
_unitRepository = unitRepository;
}
/// <summary>
/// Gets the name of the collection for display configurations.
/// </summary>
/// <returns>The collection name from API settings.</returns>
public override string GetCollectionName()
{
return _apiSettings.DisplaysConfig;
}
/// <summary>
/// Retrieves all display configurations from the database.
/// </summary>
/// <returns>A list of all DisplayConfig entities.</returns>
public async Task<List<DisplayConfig>> GetAll()
{
var result = await Collection.Find(Builders<DisplayConfig>.Filter.Empty).ToListAsync();
return result;
}
/// <summary>
/// Retrieves paginated display configurations with optional filtering.
/// </summary>
/// <param name="filter">The pagination and filtering parameters.</param>
/// <returns>A fluent queryable for DisplayConfigSummary results.</returns>
/// <exception cref="BadRequestException">Thrown when the text filter exceeds 100 characters.</exception>
public IFindFluent<DisplayConfig, DisplayConfigSummary> GetAllPaginated(PaginationFilter filter)
{
var filterBuilder = Builders<DisplayConfig>.Filter;
@@ -90,6 +111,11 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return CreateFindFluentMinimal(filters, sort);
}
/// <summary>
/// Retrieves all display configurations of a specific type.
/// </summary>
/// <param name="type">The display type to filter by.</param>
/// <returns>A list of DisplayConfig entities matching the specified type.</returns>
public async Task<List<DisplayConfig>> GetByType(DisplayConfigEnums.DisplayType type)
{
var filter = Builders<DisplayConfig>.Filter.Eq(p => p.Type, type);
@@ -97,6 +123,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result;
}
/// <summary>
/// Retrieves a display configuration by its ID with related configurations populated.
/// Performs aggregation to include CardConfig, DetailConfig, ChartConfig, and rotating layout data.
/// </summary>
/// <param name="id">The ObjectId of the display configuration to retrieve.</param>
/// <returns>The DisplayConfig with related data, or null if not found.</returns>
public async Task<DisplayConfig?> GetById(ObjectId id)
{
try
@@ -193,6 +225,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Retrieves the default display configuration for a given type.
/// Default configurations are identified by having "Default" as the hospital name.
/// </summary>
/// <param name="type">The display type to search for.</param>
/// <returns>The default DisplayConfig for the specified type, or null if not found.</returns>
public async Task<DisplayConfig?> GetDefault(DisplayConfigEnums.DisplayType type)
{
var filter = Builders<DisplayConfig>.Filter.And(
@@ -204,6 +242,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result.FirstOrDefault();
}
/// <summary>
/// Inserts a new display configuration and returns the inserted document.
/// </summary>
/// <param name="config">The DisplayConfig to insert.</param>
/// The inserted DisplayConfig, or null if insertion fails.
/// <returns></returns>
public async Task<DisplayConfig?> InsertOneAsyncAndReturn(DisplayConfig config)
{
try
@@ -218,6 +262,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the smart display configuration for a specific display.
/// </summary>
/// <param name="displayConfigId">The ObjectId of the display configuration to update.</param>
/// <param name="newDisplayConfig">The new SmartDisplay configuration to apply.</param>
/// <returns>The updated SmartDisplay configuration, or null if update fails.</returns>
public async Task<SmartDisplay?> UpdateSmartDisplay(ObjectId displayConfigId, SmartDisplay? newDisplayConfig)
{
try
@@ -258,6 +308,13 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the color configuration for a specific display.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to update.</param>
/// <param name="colorConfig">The new ColorConfig to apply.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
/// <exception cref="Exception">Throws an exception if MongoDB update fails.</exception>
public async Task<bool> UpdateConfigColor(ObjectId objectIdConfigDisplay, ColorConfig colorConfig)
{
var filter = Builders<DisplayConfig>.Filter.Eq("Id", objectIdConfigDisplay);
@@ -298,6 +355,13 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the header configuration for a specific display.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to update.</param>
/// <param name="headerConfig">The new HeaderConfig to apply.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
/// <exception cref="Exception">Throws an exception if MongoDB update fails.</exception>
public async Task<bool> UpdateHeaderConfig(ObjectId objectIdConfigDisplay, HeaderConfig headerConfig)
{
var filter = Builders<DisplayConfig>.Filter.Eq("Id", objectIdConfigDisplay);
@@ -348,6 +412,13 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the home banner configuration for a specific display.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to update.</param>
/// <param name="bannerItems">The list of banner items to set.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
/// <exception cref="Exception">Throws an exception if MongoDB update fails.</exception>
public async Task<bool> UpdateSetHomeBanner(ObjectId objectIdConfigDisplay, List<BannerItem> bannerItems)
{
var filter = Builders<DisplayConfig>.Filter.Eq("Id", objectIdConfigDisplay);
@@ -367,6 +438,13 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the base configuration for a specific display.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to update.</param>
/// <param name="baseConfig">The base DisplayConfig with updated values.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
/// <exception cref="Exception">Throws an exception if MongoDB update fails.</exception>
public async Task<bool> UpdateBaseConfig(ObjectId objectIdConfigDisplay, DisplayConfig baseConfig)
{
var filter = Builders<DisplayConfig>.Filter.Eq("Id", objectIdConfigDisplay);
@@ -390,6 +468,13 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the nurse display configuration with additional observation fields.
/// </summary>
/// <param name="displayConfigId">The ObjectId of the display configuration to update.</param>
/// <param name="newDisplayConfig">The new DisplayNurseDto configuration to apply.</param>
/// <param name="nurseObs">List of observation names to mark as "last".</param>
/// <returns>The updated DisplayNurse configuration, or null if update fails.</returns>
public async Task<DisplayNurse?> UpdateDisplayNurse(ObjectId displayConfigId, DisplayNurseDto? newDisplayConfig,
List<string> nurseObs)
{
@@ -446,6 +531,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Updates the hospital name for a specific display configuration.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to update.</param>
/// <param name="name">The new hospital name.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
public async Task<bool> UpdateDisplayConfigHospitalName(ObjectId objectIdConfigDisplay, string name)
{
var filter = Builders<DisplayConfig>.Filter.Eq(c => c.Id, objectIdConfigDisplay);
@@ -466,6 +557,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return true;
}
/// <summary>
/// Updates the field list for a specific display configuration.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to update.</param>
/// <param name="fields">The new list of fields to set.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
public async Task<bool> UpdateFieldList(ObjectId objectIdConfigDisplay, List<Field> fields)
{
var filter = Builders<DisplayConfig>.Filter.Eq(x => x.Id, objectIdConfigDisplay);
@@ -475,6 +572,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result.ModifiedCount > 0;
}
/// <summary>
/// Gets the default display configuration for a unit based on its ID and display type.
/// </summary>
/// <param name="unitId">The ObjectId of the unit.</param>
/// <param name="displayType">The type of display configuration to retrieve.</param>
/// <returns>The default DisplayConfig for the unit, or null if not found.</returns>
public async Task<DisplayConfig?> GetDefaultByUnitIdAndType(ObjectId unitId,
DisplayConfigEnums.DisplayType displayType)
{
@@ -494,11 +597,20 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Deletes a display configuration by its ID.
/// </summary>
/// <param name="objectIdConfigDisplay">The ObjectId of the display configuration to delete.</param>
/// <returns>The deleted DisplayConfig, or null if not found.</returns>
public async Task<DisplayConfig?> DeleteDisplayConfig(ObjectId objectIdConfigDisplay)
{
return await DeleteAsync(objectIdConfigDisplay);
}
/// <summary>
/// Retrieves all display configurations in compact format (minimal response).
/// </summary>
/// <returns>A list of DisplayConfigMinimalResponse containing Id, Hospital, and Type.</returns>
public Task<List<DisplayConfigMinimalResponse>> GetAllCompact()
{
var filter = Builders<DisplayConfig>.Filter.Empty;
@@ -512,6 +624,11 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}).ToListAsync();
}
/// <summary>
/// Retrieves all display configuration IDs associated with a specific card configuration.
/// </summary>
/// <param name="cardConfigId">The ObjectId of the card configuration.</param>
/// <returns>A list of ObjectIds for display configurations using the specified card config.</returns>
public async Task<List<ObjectId>> GetAllByCardConfigId(ObjectId cardConfigId)
{
var filter = Builders<DisplayConfig>.Filter.Eq(d => d.CardConfigId, cardConfigId);
@@ -522,12 +639,18 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result;
}
/// <summary>
/// Retrieves all display configuration IDs associated with a card config, including rotating layouts.
/// </summary>
/// <param name="cardConfigId">The ObjectId of the card configuration.</param>
/// <returns>A list of ObjectIds for display configurations using the specified card config in main or rotating layout.</returns>
public async Task<List<ObjectId>> GetAllByCardConfigIdAndRotating(ObjectId cardConfigId)
{
var mainFilter = Builders<DisplayConfig>.Filter.Eq(d => d.CardConfigId, cardConfigId);
var rotatingFilter = Builders<DisplayConfig>.Filter.ElemMatch(
"cardRotatingLayout",
"cardRotatingLayout",
Builders<BsonDocument>.Filter.Eq("dataId", cardConfigId)
);
@@ -540,6 +663,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result;
}
/// <summary>
/// Updates the card configuration ID for a specific display.
/// </summary>
/// <param name="displayConfigId">The ObjectId of the display configuration to update.</param>
/// <param name="resultId">The new card configuration ID to set.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
public async Task<bool> UpdateCardConfigId(ObjectId? displayConfigId, ObjectId? resultId)
{
var filter = Builders<DisplayConfig>.Filter.Eq(x => x.Id, displayConfigId);
@@ -549,6 +678,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result.ModifiedCount > 0;
}
/// <summary>
/// Adds a new chart configuration ID to a smart display's chart config list.
/// </summary>
/// <param name="displayConfigId">The ObjectId of the display configuration to update.</param>
/// <param name="newChartIdToAdd">The new chart configuration ID to add.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
public async Task<bool> AddChartId(ObjectId? displayConfigId, ObjectId newChartIdToAdd)
{
var filter = Builders<DisplayConfig>.Filter.Eq(x => x.Id, displayConfigId);
@@ -559,6 +694,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result.ModifiedCount > 0;
}
/// <summary>
/// Removes a deleted chart configuration ID from all display configurations.
/// </summary>
/// <param name="deletedId">The ObjectId of the chart configuration that was deleted.</param>
/// <returns>The MongoDB UpdateResult indicating the number of modified documents.</returns>
/// <exception cref="Exception">Throws an exception if MongoDB operation fails.</exception>
public async Task<UpdateResult> UpdateDeletedChartConfig(ObjectId deletedId)
{
try
@@ -576,11 +717,23 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Gets a chart configuration by ID. This method is not implemented.
/// </summary>
/// <param name="objectIdConfigChart">The ObjectId of the chart configuration.</param>
/// <returns>Always throws NotImplementedException.</returns>
/// <exception cref="NotImplementedException">This method is not implemented.</exception>
public Task<ChartConfig> GetChartConfig(ObjectId objectIdConfigChart)
{
throw new NotImplementedException();
}
/// <summary>
/// Updates the detail configuration ID for a specific display.
/// </summary>
/// <param name="displayConfigId">The ObjectId of the display configuration to update.</param>
/// <param name="resultId">The new detail configuration ID to set.</param>
/// <returns>True if the update was successful; otherwise, false.</returns>
public async Task<bool> UpdateDetailConfigId(ObjectId? displayConfigId, ObjectId? resultId)
{
var filter = Builders<DisplayConfig>.Filter.Eq(x => x.Id, displayConfigId);
@@ -590,6 +743,11 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result.ModifiedCount > 0;
}
/// <summary>
/// Retrieves all display configuration IDs associated with a specific detail configuration.
/// </summary>
/// <param name="baseConfigId">The ObjectId of the detail configuration.</param>
/// <returns>A list of ObjectIds for display configurations using the specified detail config.</returns>
public async Task<List<ObjectId>> GetAllByCardDetailConfigId(ObjectId baseConfigId)
{
var filter = Builders<DisplayConfig>.Filter.Eq(d => d.DetailConfigId, baseConfigId);
@@ -601,6 +759,15 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
return result;
}
/// <summary>
/// Performs initial data load by creating default configurations for each display type if they don't exist.
/// </summary>
/// <remarks>
/// This method runs on application startup to ensure default configurations exist for:
/// - DisplayNurse
/// - SmartDisplay
/// - StandarDisplay
/// </remarks>
public sealed override async Task InsertInitialLoad()
{
// 1. Obtener todos los valores y castear al tipo IEnumerable<DisplayType>
@@ -655,6 +822,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
// Si alguno no existe crearlos
}
/// <summary>
/// Extracts observation field names from a DisplayNurseDto configuration.
/// </summary>
/// <param name="newDisplayConfig">The DisplayNurseDto configuration to extract fields from.</param>
/// <param name="nurseObs">List of observation names to mark as "last" priority.</param>
/// <returns>A list of Field objects with extracted observation names.</returns>
private List<Field> ExtractObservationFields(DisplayNurseDto newDisplayConfig, List<string> nurseObs)
{
var fieldSet = new HashSet<string>();
@@ -680,6 +853,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
.ToList();
}
/// <summary>
/// Fills a hash set with observation names extracted from JSON using regex.
/// </summary>
/// <param name="newDisplayConfig">The JSON string to search for observation names.</param>
/// <param name="regex">The regex pattern to match observation name arrays.</param>
/// <param name="fieldSet">The hash set to populate with field names.</param>
private void FillHashSet(string newDisplayConfig, Regex regex, HashSet<string> fieldSet)
{
var matches = regex.Matches(newDisplayConfig);
@@ -693,6 +872,11 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Recursively extracts observation names from cell configurations.
/// </summary>
/// <param name="cells">The list of cells to extract from.</param>
/// <param name="fieldSet">The hash set to populate with field names.</param>
private void ExtractFromCells(List<Cell>? cells, HashSet<string> fieldSet)
{
if (cells is null)
@@ -711,6 +895,11 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Recursively extracts observation names from detail cell configurations.
/// </summary>
/// <param name="cells">The list of detail cells to extract from.</param>
/// <param name="fieldSet">The hash set to populate with field names.</param>
private void ExtractFromDetailsCells(List<CellDetails>? cells, HashSet<string> fieldSet)
{
if (cells is null)
@@ -729,6 +918,12 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
}
}
/// <summary>
/// Creates a minimal fluent query for paginated display configs with optional filters.
/// </summary>
/// <param name="filters">List of filter definitions to apply.</param>
/// <param name="sort">Sort definition for the query results.</param>
/// <returns>A fluent queryable for DisplayConfigSummary.</returns>
private IFindFluent<DisplayConfig, DisplayConfigSummary> CreateFindFluentMinimal(
List<FilterDefinition<DisplayConfig>> filters,
SortDefinition<DisplayConfig> sort)
@@ -748,6 +943,11 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
});
}
/// <summary>
/// Generates update definitions from a base DisplayConfig.
/// </summary>
/// <param name="baseConfig">The base DisplayConfig with values to update.</param>
/// <returns>A tuple containing list of update definitions and list of field names.</returns>
private (List<UpdateDefinition<DisplayConfig>> Updates, List<string> Fields) GetBaseUpdateDefinition(
DisplayConfig baseConfig)
{
@@ -772,4 +972,6 @@ public class DisplayConfigRepository : MongoRepository<DisplayConfig>, IDisplayC
updateDefinition.Add(Builders<DisplayConfig>.Update.Set(c => c.HeaderConfig, baseConfig.HeaderConfig));
return (updateDefinition, fieldList);
}
}
}
#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member