Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions DotNet/Shared/Application/Models/Tenant/FacilityModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ public class FacilityModel

[JsonPropertyName("timeZone")]
public string TimeZone { get; set; } = string.Empty;

[JsonPropertyName("isDeleted")]
public bool? IsDeleted { get; set; }

[JsonPropertyName("scheduledReports")]
public TenantScheduledReportConfig ScheduledReports { get; set; } = new TenantScheduledReportConfig();
Expand Down
132 changes: 104 additions & 28 deletions DotNet/Tenant/Business/Managers/FacilityManager.cs

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions DotNet/Tenant/Business/Models/FacilitySearchModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,7 @@ public class FacilitySearchModel
public string? FacilityName { get; set; }
public Guid? Id { get; set; }
public bool? FacilityNameContains { get; set; }

public bool? IsDeleted { get; set; }
}
}
54 changes: 36 additions & 18 deletions DotNet/Tenant/Business/Queries/FacilityQueries.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@ namespace LantanaGroup.Link.Tenant.Business.Queries
public interface IFacilityQueries
{
Task<FacilityModel?> GetAsync(Guid id, CancellationToken cancellationToken = default);
Task<FacilityModel?> GetAsync(string facilityId, string? facilityName = null, CancellationToken cancellationToken = default);

Task<FacilityModel?> GetAsync(string facilityId, string? facilityName = null,
CancellationToken cancellationToken = default);

Task<List<FacilityModel>> SearchAsync(FacilitySearchModel model, CancellationToken cancellationToken = default);
Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(FacilitySearchModel model, string sortBy = "FacilityName", SortOrder sortOrder = SortOrder.Descending, int pageSize = 10, int pageNumber = 1, CancellationToken cancellationToken = default);

Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(FacilitySearchModel model,
string sortBy = "FacilityName", SortOrder sortOrder = SortOrder.Descending, int pageSize = 10,
int pageNumber = 1, bool includeDeleted = false, CancellationToken cancellationToken = default);
Comment thread
arianamihailescu marked this conversation as resolved.
}

public class FacilityQueries : IFacilityQueries
Expand All @@ -32,48 +38,59 @@ public FacilityQueries(TenantDbContext context, IEntityRepository<Facility> repo

public async Task<FacilityModel?> GetAsync(Guid id, CancellationToken cancellationToken = default)
{
return (await SearchAsync(new FacilitySearchModel { Id = id }, cancellationToken)).SingleOrDefault();
return (await SearchAsync(new FacilitySearchModel { Id = id }, cancellationToken)).SingleOrDefault();
}

public async Task<FacilityModel?> GetAsync(string facilityId, string? facilityName = null, CancellationToken cancellationToken = default)
public async Task<FacilityModel?> GetAsync(string facilityId, string? facilityName = null,
CancellationToken cancellationToken = default)
{
return (await SearchAsync(new FacilitySearchModel { FacilityId = facilityId, FacilityName = facilityName }, cancellationToken)).SingleOrDefault();
return (await SearchAsync(new FacilitySearchModel { FacilityId = facilityId, FacilityName = facilityName },
cancellationToken)).SingleOrDefault();
}

public async Task<List<FacilityModel>> SearchAsync(FacilitySearchModel model, CancellationToken cancellationToken = default)
public async Task<List<FacilityModel>> SearchAsync(FacilitySearchModel model,
CancellationToken cancellationToken = default)
{
var result = await PagedSearchAsync(model, pageSize: int.MaxValue, cancellationToken: cancellationToken);
return result.Records;
}

public async Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(FacilitySearchModel model, string sortBy = "FacilityId", SortOrder sortOrder = SortOrder.Descending, int pageSize = 10, int pageNumber = 1, CancellationToken cancellationToken = default)
public async Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(
FacilitySearchModel model,
string sortBy = "FacilityId",
SortOrder sortOrder = SortOrder.Descending,
int pageSize = 10,
int pageNumber = 1,
bool includeDeleted = false,
CancellationToken cancellationToken = default)
{
var query = _context.Facilities.AsNoTracking()
.AsQueryable();
var query = _context.Facilities.AsNoTracking().AsQueryable();

query = query.Where(f => includeDeleted || !f.IsDeleted);

if (!string.IsNullOrEmpty(model.FacilityId))
{
query = query.Where(log => log.FacilityId == model.FacilityId);
query = query.Where(f => f.FacilityId == model.FacilityId);
}

if (!string.IsNullOrEmpty(model.FacilityName))
{
if (model.FacilityNameContains == true)
{
query = query.Where(log => log.FacilityName.Contains(model.FacilityName));
query = query.Where(f => f.FacilityName.Contains(model.FacilityName));
}
else
{
query = query.Where(log => log.FacilityName == model.FacilityName);
query = query.Where(f => f.FacilityName == model.FacilityName);
}
}

if (model.Id != null)
{
query = query.Where(log => log.Id == model.Id);
query = query.Where(f => f.Id == model.Id);
}

var totalRecords = await query.CountAsync(cancellationToken);
var total = await query.CountAsync(cancellationToken);

query = sortOrder switch
{
Expand All @@ -82,8 +99,6 @@ public async Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(FacilitySear
_ => query
};

var total = await query.CountAsync();

var facilities = await query
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
Expand All @@ -93,6 +108,7 @@ public async Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(FacilitySear
FacilityId = f.FacilityId,
FacilityName = f.FacilityName,
TimeZone = f.TimeZone,
IsDeleted = f.IsDeleted,
ScheduledReports = new TenantScheduledReportConfig
{
Daily = f.ScheduledReports.Daily,
Expand All @@ -114,6 +130,7 @@ public async Task<PagedConfigModel<FacilityModel>> PagedSearchAsync(FacilitySear
};
}


private Expression<Func<T, object>> SetSortBy<T>(string? sortBy)
{
var type = typeof(T);
Expand All @@ -122,7 +139,8 @@ private Expression<Func<T, object>> SetSortBy<T>(string? sortBy)

if (!string.IsNullOrEmpty(inputSortBy))
{
var prop = type.GetProperty(inputSortBy, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
var prop = type.GetProperty(inputSortBy,
BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
if (prop != null)
{
sortKey = prop.Name;
Expand All @@ -135,4 +153,4 @@ private Expression<Func<T, object>> SetSortBy<T>(string? sortBy)
return Expression.Lambda<Func<T, object>>(converted, parameter);
}
}
}
}
50 changes: 46 additions & 4 deletions DotNet/Tenant/Controllers/FacilityController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,15 @@ public FacilityController(ILogger<FacilityController> logger,
/// <param name="sortOrder"></param>
/// <param name="pageSize"></param>
/// <param name="pageNumber"></param>
/// <param name="includeDeleted"></param>
/// <returns></returns>
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(PagedConfigModel<FacilityModel>))]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpGet(Name = "GetFacilities")]
public async Task<ActionResult<PagedConfigModel<FacilityModel>>> GetFacilities(string? facilityId,
string? facilityName, string? sortBy, SortOrder? sortOrder, int pageSize = 10, int pageNumber = 1,
string? facilityName, string? sortBy, SortOrder? sortOrder, int pageSize = 10, int pageNumber = 1,
bool includeDeleted = false,
CancellationToken cancellationToken = default)
{
facilityId = facilityId?.Sanitize();
Expand All @@ -127,7 +129,7 @@ public async Task<ActionResult<PagedConfigModel<FacilityModel>>> GetFacilities(s
using Activity? activity = ServiceActivitySource.Instance.StartActivity("Get Facilities");

var searchModel = new FacilitySearchModel { FacilityId = facilityId, FacilityName = facilityName };
var pagedFacilityConfigModelDto = await _facilityQueries.PagedSearchAsync(searchModel, sortBy, sortOrder.Value, pageSize, pageNumber, cancellationToken);
var pagedFacilityConfigModelDto = await _facilityQueries.PagedSearchAsync(searchModel, sortBy, sortOrder.Value, pageSize, pageNumber, includeDeleted, cancellationToken);

if (pagedFacilityConfigModelDto.Records.Count == 0)
{
Expand All @@ -145,7 +147,7 @@ public async Task<ActionResult<PagedConfigModel<FacilityModel>>> GetFacilities(s
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
[HttpGet("list")]
public async Task<IActionResult> GetFacilityList([FromQuery] string? search)
public async Task<IActionResult> GetFacilityList([FromQuery] string? search, bool includeDeleted = false)
{
try
{
Expand All @@ -154,6 +156,10 @@ public async Task<IActionResult> GetFacilityList([FromQuery] string? search)
{
searchModel.FacilityName = search;
searchModel.FacilityNameContains = true;
if (!includeDeleted)
{
searchModel.IsDeleted = false;
}
}

var facilities = await _facilityQueries.SearchAsync(searchModel, HttpContext.RequestAborted);
Expand Down Expand Up @@ -377,9 +383,45 @@ public async Task<IActionResult> DeleteFacility(string facilityId, CancellationT

return NoContent();
}

[HttpDelete("soft/{facilityId}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> SoftDeleteFacility(string facilityId, CancellationToken cancellationToken)
{
facilityId = facilityId?.Sanitize();

var existingModel = await _facilityQueries.GetAsync(facilityId, null, cancellationToken);
if (existingModel == null)
return BadRequest($"Facility with Id: {facilityId} Not Found");

try
{
await _facilityManager.SoftDeleteAsync(facilityId, cancellationToken);
}
catch (ApplicationException ex)
{
return BadRequest(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception encountered in FacilityController.SoftDeleteFacility");
return Problem("An error occurred while soft deleting the facility", null, 500);
}

using (ServiceActivitySource.Instance.StartActivity("Soft Delete Jobs for Facility"))
{
// Optional: you might want to disable scheduled jobs instead of deleting
await _scheduleService.DeleteJobsForFacility(facilityId, cancellationToken: cancellationToken);
}

return NoContent();
}

/// <summary>
/// Generat
/// Generate
/// </summary>
/// <param name="facilityId"></param>
/// <param name="request"></param>
Expand Down
4 changes: 3 additions & 1 deletion DotNet/Tenant/Data/Entities/Facility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace LantanaGroup.Link.Tenant.Entities;

public partial class Facility
public class Facility
{
[Key]
public Guid Id { get; set; }
Expand All @@ -18,6 +18,8 @@ public partial class Facility
[Required]
public string TimeZone { get; set; }

public bool IsDeleted { get; set; }

public DateTime CreateDate { get; set; }

public DateTime? ModifyDate { get; set; }
Expand Down
Loading
Loading