diff --git a/src/DbContextLib/HeartTrackContext.cs b/src/DbContextLib/HeartTrackContext.cs index dba0072..3e94ae9 100644 --- a/src/DbContextLib/HeartTrackContext.cs +++ b/src/DbContextLib/HeartTrackContext.cs @@ -206,19 +206,22 @@ namespace DbContextLib .HasMany(at => at.Statistics) .WithOne(s => s.Athlete) .HasForeignKey(s => s.AthleteId) - .IsRequired(false); + .IsRequired(false) + .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasMany(at => at.Activities) .WithOne(a => a.Athlete) .HasForeignKey(a => a.AthleteId) - .IsRequired(false); + .IsRequired(false) + .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasMany(a => a.HeartRates) .WithOne(h => h.Activity) .HasForeignKey(h => h.ActivityId) - .IsRequired(); + .IsRequired() + .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity() .HasMany(d => d.Activities) diff --git a/src/EFMappers/AthleteMappeur.cs b/src/EFMappers/AthleteMappeur.cs index 81fa42b..ef779f1 100644 --- a/src/EFMappers/AthleteMappeur.cs +++ b/src/EFMappers/AthleteMappeur.cs @@ -30,8 +30,8 @@ public static class UserMappeur Action link = (athleteEntity, model) => { model.Role = athleteEntity.IsCoach ? new Coach() : new Athlete(); - model.DataSources.Add(athleteEntity.DataSource.ToModel()); - model.Activities.AddRange(athleteEntity.Activities.ToModels()); + if (athleteEntity.DataSource != null) model.DataSources.Add(athleteEntity.DataSource.ToModel()); + if (athleteEntity.Activities != null) model.Activities.AddRange(athleteEntity.Activities.ToModels()); //model.Image = athleteEntity.Image.ToModel(); }; diff --git a/src/HeartTrackAPI/Controllers/ActivityController.cs b/src/HeartTrackAPI/Controllers/ActivityController.cs index f78fdb5..04a6210 100644 --- a/src/HeartTrackAPI/Controllers/ActivityController.cs +++ b/src/HeartTrackAPI/Controllers/ActivityController.cs @@ -121,12 +121,24 @@ public class ActivityController : Controller [HttpGet("{id}")] public async Task> GetActivity(int id) { - var activity = await _activityService.GetActivityByIdAsync(id); - if (activity == null) + try { - return NotFound(); + _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetActivity), id); + + var activity = await _activityService.GetActivityByIdAsync(id); + if (activity == null) + { + _logger.LogError("Activity with id {id} not found", id); + + return NotFound($"Activity with id {id} not found"); + } + return Ok(activity.ToDto()); + } + catch (Exception e) + { + _logger.LogError(e, "Error while getting activity by id {id}", id); + return Problem(); } - return Ok(activity.ToDto()); } [HttpPut("{id}")] @@ -145,15 +157,44 @@ public class ActivityController : Controller return NoContent(); } + /// + /// Supprime une activity spécifique. + /// + /// L'identifiant de l'activity à supprimer. + /// Action result. + /// Activity supprimé avec succès. + /// Activity non trouvé. + /// Erreur interne du serveur. [HttpDelete("{id}")] + [ProducesResponseType(200)] + [ProducesResponseType(404)] + [ProducesResponseType(500)] public async Task DeleteActivity(int id) { - var result = await _activityService.DeleteActivity(id); - if (!result) + try { - return NotFound(); + _logger.LogInformation("Executing {Action} with parameters: {Parameters} for {Id}", nameof(DeleteActivity), null,id); + + + var activity = await _activityService.GetActivityByIdAsync(id); + if (activity == null) + { + _logger.LogError("Activity with id {id} not found", id); + return NotFound($"Activity with id {id} not found"); + } + var isDeleted = await _activityService.DeleteActivity(id); + if(!isDeleted) + { + _logger.LogError("Error while deleting activity with id {id}", id); + return Problem("Error while deleting activity"); + } + return Ok(); + } + catch (Exception e) + { + _logger.LogError(e, "Error while deleting activity"); + return Problem(); } - return NoContent(); } /* diff --git a/src/HeartTrackAPI/Controllers/UsersController.cs b/src/HeartTrackAPI/Controllers/UsersController.cs index 6780d6c..cd9f0b6 100644 --- a/src/HeartTrackAPI/Controllers/UsersController.cs +++ b/src/HeartTrackAPI/Controllers/UsersController.cs @@ -398,7 +398,7 @@ public class UsersController : Controller return BadRequest("To many object is asked the max is : " + totalCount); } _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetActivitiesByUser), pageRequest); - var activities = await _activityService.GetActivitiesByUser(userId, pageRequest.Index, pageRequest.Count, ActivityOrderCriteria.None, pageRequest.Descending ?? false); + var activities = await _activityService.GetActivitiesByUser(userId, pageRequest.Index, pageRequest.Count, Enum.TryParse(pageRequest.OrderingPropertyName, out ActivityOrderCriteria result) ? result : ActivityOrderCriteria.None, pageRequest.Descending ?? false); if(activities == null) { return NotFound("No activities found"); diff --git a/src/Model2Entities/ActivityRepository.cs b/src/Model2Entities/ActivityRepository.cs index 9d9f6a5..d3ba2da 100644 --- a/src/Model2Entities/ActivityRepository.cs +++ b/src/Model2Entities/ActivityRepository.cs @@ -37,7 +37,8 @@ public partial class DbDataManager : IDataManager { _logger.LogInformation($"GetActivityByIdAsync with id {id}", id); - var activity = _dataManager.DbContext.ActivitiesSet.IncludeStandardProperties().GetItemsWithFilterAndOrdering(b => b.IdActivity == id, 0, 1, ActivityOrderCriteria.None, false).First().ToModel(); + var activityEntity = await _dataManager.DbContext.ActivitiesSet.IncludeStandardProperties().SingleOrDefaultAsync(a => a.IdActivity == id); + var activity = activityEntity != null ? activityEntity.ToModel() : null; if (activity != null) _logger.LogInformation($"Retrieved activity with ID {id}"); diff --git a/src/Model2Entities/Extension.cs b/src/Model2Entities/Extension.cs index 6838b1d..d7341ec 100644 --- a/src/Model2Entities/Extension.cs +++ b/src/Model2Entities/Extension.cs @@ -102,7 +102,7 @@ public static class Extensions public static IQueryable IncludeStandardProperties(this IQueryable query) { return query.Include(a => a.DataSource) - .Include(a => a.Activities) + .Include(a => a.Activities).ThenInclude(ac => ac.HeartRates).Include(ac => ac.Activities).ThenInclude(ac => ac.DataSource) .Include(a => a.Image); } // public static Activity ToModel(this ActivityEntity entity) diff --git a/src/Model2Entities/UserRepository.cs b/src/Model2Entities/UserRepository.cs index f4ec148..7e866a3 100644 --- a/src/Model2Entities/UserRepository.cs +++ b/src/Model2Entities/UserRepository.cs @@ -109,10 +109,9 @@ public partial class DbDataManager { _logger.LogInformation("GetNbItems"); - var nbItems = _dataManager.DbContext.AthletesSet.Count(); + var nbItems = await _dataManager.DbContext.AthletesSet.CountAsync(); _logger.LogInformation($"Retrieved {nbItems} users"); return await Task.FromResult(nbItems); - } public async Task> GetAllAthletes(int index, int count, AthleteOrderCriteria? criteria,