From 90b00ed3289e2c1980e577eb0b9b1c273980c24f Mon Sep 17 00:00:00 2001 From: anperederi Date: Fri, 15 Mar 2024 15:34:08 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Test=20new=20mappers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/APIMappers/ActivityMapper.cs | 2 +- src/APIMappers/UserMappeur.cs | 6 ++- src/DbContextLib/HeartTrackContext.cs | 7 ++- src/EFMappers/ActivityMapper.cs | 53 ++++++++++++++++---- src/EFMappers/DataSource.cs | 0 src/EFMappers/HeartRateMapper.cs | 61 ++++++++++++++++++++++++ src/Model/Activity.cs | 30 +++++++++++- src/Model/DataSource.cs | 34 +++++++++++++ src/Model/HeartRate.cs | 30 ++++++++++++ src/Model/User.cs | 2 + src/Model2Entities/Extension.cs | 51 +++++++++++++++++++- src/Shared/Extension.cs | 8 ++-- src/Tests/ConsoleTestEFMapper/Program.cs | 28 +++++------ 13 files changed, 276 insertions(+), 36 deletions(-) create mode 100644 src/EFMappers/DataSource.cs create mode 100644 src/EFMappers/HeartRateMapper.cs create mode 100644 src/Model/DataSource.cs create mode 100644 src/Model/HeartRate.cs diff --git a/src/APIMappers/ActivityMapper.cs b/src/APIMappers/ActivityMapper.cs index 6013e57..7500af3 100644 --- a/src/APIMappers/ActivityMapper.cs +++ b/src/APIMappers/ActivityMapper.cs @@ -26,7 +26,7 @@ public static class ActivityMapper Minimum = activity.Minimum, AverageTemperature = activity.AverageTemperature, HasAutoPause = activity.HasAutoPause - }); + }, (activityDto, activity) => activityDto.heartRates = activity.); } public static Activity ToModel(this ActivityDto activityDto) diff --git a/src/APIMappers/UserMappeur.cs b/src/APIMappers/UserMappeur.cs index 48a8cda..266a3d0 100644 --- a/src/APIMappers/UserMappeur.cs +++ b/src/APIMappers/UserMappeur.cs @@ -24,7 +24,8 @@ public static class UserMappeur Weight = user.Weight, DateOfBirth = user.DateOfBirth, IsCoach = user.Role is Coach - }); + }, + (userDto, user) => userDto.Id = user.Id); } @@ -45,7 +46,8 @@ public static class UserMappeur DateOfBirth = userDto.DateOfBirth, Role = userDto.IsCoach ? new Coach() : new Athlete() - }); + }, + (user, userDto) => user.Id = userDto.Id); } } \ No newline at end of file diff --git a/src/DbContextLib/HeartTrackContext.cs b/src/DbContextLib/HeartTrackContext.cs index 1ce7564..a1d849c 100644 --- a/src/DbContextLib/HeartTrackContext.cs +++ b/src/DbContextLib/HeartTrackContext.cs @@ -211,8 +211,7 @@ namespace DbContextLib modelBuilder.Entity() .HasMany(a => a.HeartRates) .WithOne(h => h.Activity) - .HasForeignKey(h => h.ActivityId) - .IsRequired(); + .HasForeignKey(h => h.ActivityId); modelBuilder.Entity() .HasMany(d => d.Activities) @@ -221,10 +220,10 @@ namespace DbContextLib .IsRequired(); modelBuilder.Entity() - .HasMany(ds => ds.Activities) + .HasMany(ds => ds.Athletes) .WithOne(at => at.DataSource) .HasForeignKey(at => at.DataSourceId) - .IsRequired(false); + .IsRequired(); // modelBuilder.Entity() // .HasMany(fer => fer.Followers) diff --git a/src/EFMappers/ActivityMapper.cs b/src/EFMappers/ActivityMapper.cs index 81c94c5..a7e2af7 100644 --- a/src/EFMappers/ActivityMapper.cs +++ b/src/EFMappers/ActivityMapper.cs @@ -31,9 +31,9 @@ public static class ActivityMapper entity.Maximum, entity.Minimum, entity.AverageTemperature, - entity.HasAutoPause)); + entity.HasAutoPause) // ! regarder a ce que le model est bien les relation comme l'EF - // ), (activity, entity) => activity.Id = entity.IdActivity); + , (activity, entity) => activity.heartRates = entity.HeartRates.Select(hr => hr.ToModel()).ToList()); } // dictionnaire; @@ -41,8 +41,8 @@ public static class ActivityMapper public static ActivityEntity? ToEntity(this Activity model) { - // return model.ToEntity(); - return model.ToU(_mapper, activityEntity => new ActivityEntity + + Func create = activity => new ActivityEntity { IdActivity = model.Id, Type = model.Type, @@ -58,14 +58,51 @@ public static class ActivityMapper Minimum = model.Minimum, AverageTemperature = model.AverageTemperature, HasAutoPause = model.HasAutoPause - } + }; + + Action link = (activity, entity) => + { +entity.HeartRates = +// Juste faire un mappeur pour les heartRate et du coup du fait cette appel +// activity.heartRates.Select(hr => hr.ToEntity()).ToList(); +activity.heartRates.Select(hr => new HeartRateEntity + { + + IdHeartRate = hr.Id, + Altitude = hr.Altitude, + Time = hr.Time, + Temperature = hr.Temperature, + Bpm = hr.Bpm, + Longitude = hr.Longitude, + Latitude = hr.Latitude, + ActivityId = entity.IdActivity + }).ToList(); + entity.DataSource = activity.DataSource + // entity.DataSource = activity.DataSource.ToEntity(); + // entity.Athlete = activity.Athlete.ToEntity(); + }; + + + // return model.ToEntity(); + return model.ToU(_mapper, create, ); // ! regarder a ce que le model est bien les relation comme l'EF - ); + + /*(activity, entity) => entity.HeartRates = activity.heartRates.Select(hr => new HeartRateEntity + { + IdHeartRate = hr.Id, + Altitude = hr.Altitude, + Time = hr.Time, + Temperature = hr.Temperature, + Bpm = hr.Bpm, + Longitude = hr.Longitude, + Latitude = hr.Latitude, + ActivityId = entity.IdActivity + }).ToList()*/ } - public static IEnumerable ToModels(this IEnumerable entities) + public static IEnumerable ToModels(this IEnumerable entities) => entities.Select(a => a.ToModel()); - public static IEnumerable ToEntities(this IEnumerable models) + public static IEnumerable ToEntities(this IEnumerable models) => models.Select(a => a.ToEntity()); } \ No newline at end of file diff --git a/src/EFMappers/DataSource.cs b/src/EFMappers/DataSource.cs new file mode 100644 index 0000000..e69de29 diff --git a/src/EFMappers/HeartRateMapper.cs b/src/EFMappers/HeartRateMapper.cs new file mode 100644 index 0000000..94a0087 --- /dev/null +++ b/src/EFMappers/HeartRateMapper.cs @@ -0,0 +1,61 @@ +using Entities; +using Model; +using Shared; + +namespace EFMappers; + +public static class HeartRateMapper +{ + private static GenericMapper _mapper = new GenericMapper(); + // ! RESET + // ? Quand on fait appel au reset ? + // * Apres des saves changing ou rollback. + public static void Reset() + { + _mapper.Reset(); + } + public static HeartRate ToModel(this HeartRateEntity entity) + { + // return entity.ToModel(); + return entity.ToT(_mapper, heartRate => new HeartRate ( + entity.IdHeartRate, + entity.Altitude, + entity.Time, + entity.Temperature, + entity.Bpm, + entity.Longitude, + entity.Latitude, + entity.ActivityId + ) + // ! regarder a ce que le model est bien les relation comme l'EF + , (heartRate, entity) => heartRate.ActivityId = entity.ActivityId); + + } + // dictionnaire; + + + public static HeartRateEntity? ToEntity(this HeartRate model) + { + // return model.ToEntity(); + return model.ToU(_mapper, heartRateEntity => new HeartRateEntity + { + IdHeartRate = model.Id, + Altitude = model.Altitude, + Time = model.Time, + Temperature = model.Temperature, + Bpm = model.Bpm, + Longitude = model.Longitude, + Latitude = model.Latitude, + ActivityId = model.ActivityId + } + , (heartRate, entity) => entity.ActivityId = heartRate.ActivityId + // ! regarder a ce que le model est bien les relation comme l'EF + ); + } + + public static IEnumerable ToModels(this IEnumerable entities) + => entities.Select(hr => hr.ToModel()); + + public static IEnumerable ToEntities(this IEnumerable models) + => models.Select(hr => hr.ToEntity()); +} \ No newline at end of file diff --git a/src/Model/Activity.cs b/src/Model/Activity.cs index cef25b7..211ff2e 100644 --- a/src/Model/Activity.cs +++ b/src/Model/Activity.cs @@ -32,7 +32,34 @@ public class Activity public float AverageTemperature { get; set; } public bool HasAutoPause { get; set; } - public HashSet Users { get; private set; } = new HashSet(); + // ! pk ??! pas dans le model + // public HashSet Users { get; private set; } = new HashSet(); + public List heartRates { get; set; } = new List(); + public User User { get; set; } + public DataSource DataSource { get; set; } + + public Activity(int idActivity ,string? type, DateTime date, DateTime startTime, DateTime endTime, + int effort, float variability, float variance, float standardDeviation, + float average, int maximum, int minimum, float averageTemperature, bool hasAutoPause, List heartRates, User user, DataSource dataSource) + { + Id = idActivity; + Type = type; + Date = date; + StartTime = startTime; + EndTime = endTime; + Effort = effort; + Variability = variability; + Variance = variance; + StandardDeviation = standardDeviation; + Average = average; + Maximum = maximum; + Minimum = minimum; + AverageTemperature = averageTemperature; + HasAutoPause = hasAutoPause; + this.heartRates = heartRates; + User = user; + DataSource = dataSource; + } public Activity(int idActivity ,string? type, DateTime date, DateTime startTime, DateTime endTime, int effort, float variability, float variance, float standardDeviation, float average, int maximum, int minimum, float averageTemperature, bool hasAutoPause) @@ -51,6 +78,7 @@ public class Activity Minimum = minimum; AverageTemperature = averageTemperature; HasAutoPause = hasAutoPause; + this.heartRates = heartRates; } public Activity(){} diff --git a/src/Model/DataSource.cs b/src/Model/DataSource.cs new file mode 100644 index 0000000..bc3d2b8 --- /dev/null +++ b/src/Model/DataSource.cs @@ -0,0 +1,34 @@ +using Model; + +public class DataSource +{ + public int Id { get; set; } + public string Type { get; set; } + public string Model { get; set; } + public float Precision { get; set; } + public ICollection Activities { get; set; } = new List(); + public ICollection Athletes { get; set; } = new List(); + public DataSource(int id, string type, string model, float precision, ICollection activities, ICollection athletes) + { + Id = id; + Type = type; + Model = model; + Precision = precision; + Activities = activities; + Athletes = athletes; + } + public DataSource(){} + + public DataSource(int id, string type, string model, float precision) + { + Id = id; + Type = type; + Model = model; + Precision = precision; + } + + public override string ToString() + { + return $"DataSource #{Id}: {Type} {Model} with a precision of {Precision}"; + } +} \ No newline at end of file diff --git a/src/Model/HeartRate.cs b/src/Model/HeartRate.cs new file mode 100644 index 0000000..0ca61b3 --- /dev/null +++ b/src/Model/HeartRate.cs @@ -0,0 +1,30 @@ +namespace Model; + +public class HeartRate { + public int Id { get; set; } + public double Altitude { get; set; } + public TimeOnly Time { get; set; } + public float Temperature { get; set; } + public int Bpm { get; set; } + public float Longitude { get; set; } + public float Latitude { get; set; } + public int ActivityId { get; set; } + public HeartRate(int id, double altitude, TimeOnly time, float temperature, int bpm, float longitude, float latitude, int activityId) + { + Id = id; + Altitude = altitude; + Time = time; + Temperature = temperature; + Bpm = bpm; + Longitude = longitude; + Latitude = latitude; + ActivityId = activityId; + } + public HeartRate(){} + + public override string ToString() + { + return $"HeartRate #{Id}: {Bpm} bpm at {Time:HH:mm:ss} with a temperature of {Temperature}°C" + + $" and an altitude of {Altitude}m at {Longitude}°E and {Latitude}°N"; + } +} \ No newline at end of file diff --git a/src/Model/User.cs b/src/Model/User.cs index 0991ca5..9a8e06f 100644 --- a/src/Model/User.cs +++ b/src/Model/User.cs @@ -16,6 +16,8 @@ public class User public Role Role { get; set; } protected List Notifications { get; set; } = new List(); + + protected List Activities { get; set; } = new List(); public List Users { get; set; } = new List(); diff --git a/src/Model2Entities/Extension.cs b/src/Model2Entities/Extension.cs index 3cde249..a5eab0a 100644 --- a/src/Model2Entities/Extension.cs +++ b/src/Model2Entities/Extension.cs @@ -7,24 +7,71 @@ namespace Model2Entities; public static class Extensions { - internal static async Task AddItem(this HeartTrackContext context, T? item) where T :class + // internal static async Task AddItem(this HeartTrackContext context, T? item) where T :class + // { + // if(item == null || context.Set().Contains(item)) + // { + // return await Task.FromResult(null); + // } + // var entry = context.Set().Add(item); + // try { + // await context.SaveChangesAsync(); + // } + // catch (Exception ex) + // { + // Console.WriteLine($"{ex.Message}, {ex.InnerException}, {ex.StackTrace}"); + // } + + // return await Task.FromResult(entry.Entity); + // } + + internal static async Task AddItem(this HeartTrackContext context, T? item) where T : class { if(item == null || context.Set().Contains(item)) { return await Task.FromResult(null); } var entry = context.Set().Add(item); + // Si l'élément est une activité, nous devons gérer les fréquences cardiaques associées + if (item is Activity activity) + { + foreach (var heartRate in activity.heartRates) + { + // Ajouter chaque fréquence cardiaque associée à l'activité + context.Set().Add(heartRate); + } + } + try { await context.SaveChangesAsync(); } catch (Exception ex) { - Console.WriteLine(ex.Message, ex.InnerException, ex.StackTrace); + Console.WriteLine($"{ex.Message}, {ex.InnerException}, {ex.StackTrace}"); } return await Task.FromResult(entry.Entity); } + + // public static async Task UpdateItem(this HeartTrackContext context, int? id, T? newItem, Action updateAction) where T : class where U: class + // { + // var existingT = await context.Set().FindAsync(id); + // if (existingT != null && newItem != null) + // { + // // Appliquer les mises à jour sur l'objet existant en utilisant l'action passée en paramètre + // updateAction(newItem, existingT); + + // // Marquer l'objet comme modifié dans le contexte + // context.Update(existingT); + + // // Enregistrer les modifications dans la base de données + // await context.SaveChangesAsync(); + // return existingT; + // } + // return default(U); + // } + internal static async Task DeleteItem(this HeartTrackContext context, int? id) where T:class { var item = await context.Set().FindAsync(id); diff --git a/src/Shared/Extension.cs b/src/Shared/Extension.cs index 6301ad7..52ce0e9 100644 --- a/src/Shared/Extension.cs +++ b/src/Shared/Extension.cs @@ -2,7 +2,7 @@ namespace Shared; public static class Extensions { - public static U ToU(this T t, GenericMapper mapper, Func func) where U :class where T :class + public static U ToU(this T t, GenericMapper mapper, Func func, Action action) where U :class where T :class { var u = mapper.GetU(t); if (u != null) { @@ -10,11 +10,11 @@ public static class Extensions } u = func(t); mapper.Add(t, u); - // action(t, u); + action(t, u); return u; } // , Action action - public static T ToT(this U u, GenericMapper mapper, Func func) where U :class where T :class + public static T ToT(this U u, GenericMapper mapper, Func func, Action action) where U :class where T :class { var t = mapper.GetT(u); if (t != null) { @@ -22,7 +22,7 @@ public static class Extensions } t = func(u); mapper.Add(t, u); - // action(t, u); + action(t, u); return t; } } \ No newline at end of file diff --git a/src/Tests/ConsoleTestEFMapper/Program.cs b/src/Tests/ConsoleTestEFMapper/Program.cs index ed539b6..d70a5b7 100644 --- a/src/Tests/ConsoleTestEFMapper/Program.cs +++ b/src/Tests/ConsoleTestEFMapper/Program.cs @@ -41,23 +41,23 @@ namespace Model2Entities } Console.WriteLine(); - // // Test de la méthode AddActivity - // Console.WriteLine("Testing AddActivity method..."); - // var newActivity = new Activity(10, "New Activity", new DateTime(2021, 10, 10), new DateTime(10, 10, 10, 10, 10, 10), new DateTime(10, 10, 10, 12, 12, 12), 5, 5, 5, 5, 5, 5, 5, 5, false); - // var addedActivity = await activityRepository.AddActivity(newActivity); - // if (addedActivity != null) - // { - // Console.WriteLine($"New activity added successfully: ID: {addedActivity.Id}, Name: {addedActivity.Type}, Date: {addedActivity.Date}, Start Time: {addedActivity.StartTime}, End Time: {addedActivity.EndTime}"); - // } - // else - // { - // Console.WriteLine("Failed to add new activity."); - // } - // Console.WriteLine(); + // Test de la méthode AddActivity + Console.WriteLine("Testing AddActivity method..."); + var newActivity = new Activity(10, "New Activity", new DateTime(2021, 10, 10), new DateTime(10, 10, 10, 10, 10, 10), new DateTime(10, 10, 10, 12, 12, 12), 5, 5, 5, 5, 5, 5, 5, 5, false, new List(new HeartRate[] { new HeartRate(10, 10D, new TimeOnly(10, 10, 10), 10f, 10, 10f, 10f, 10) })); + var addedActivity = await activityRepository.AddActivity(newActivity); + if (addedActivity != null) + { + Console.WriteLine($"New activity added successfully: ID: {addedActivity.Id}, Name: {addedActivity.Type}, Date: {addedActivity.Date}, Start Time: {addedActivity.StartTime}, End Time: {addedActivity.EndTime}"); + } + else + { + Console.WriteLine("Failed to add new activity."); + } + Console.WriteLine(); // Test de la méthode UpdateActivity Console.WriteLine("Testing UpdateActivity method..."); - var updatedActivity = await activityRepository.UpdateActivity(10, new Activity(10, "Updated Activity", new DateTime(2021, 10, 10), new DateTime(10, 10, 10, 10, 10, 10), new DateTime(10, 10, 10, 12, 12, 12), 5, 5, 5, 5, 5, 5, 5, 5, false)); + var updatedActivity = await activityRepository.UpdateActivity(11, new Activity(10, "Updated Activity", new DateTime(2021, 10, 10), new DateTime(10, 10, 10, 10, 10, 10), new DateTime(10, 10, 10, 12, 12, 12), 5, 5, 5, 5, 5, 5, 5, 5, false, new List(new HeartRate[] { new HeartRate(10, 10D, new TimeOnly(10, 10, 10), 10f, 10, 10f, 10f, 10) }))); if (updatedActivity != null) { Console.WriteLine($"Activity updated successfully: ID: {updatedActivity.Id}, Name: {updatedActivity.Type}, Date: {updatedActivity.Date}, Start Time: {updatedActivity.StartTime}, End Time: {updatedActivity.EndTime}");