Add ModelToEntities Class without Update methode

merging_EF-API
Antoine PEREDERII 1 year ago
parent a258313f37
commit 70137ee08d

@ -1,13 +0,0 @@
using Dto;
using Model;
namespace ApiMappeur;
public static class ActivityMappeur
{
public static ActivityDto ToDto(this Activity activity)
{
throw new NotImplementedException();
}
}

@ -0,0 +1,80 @@
using Entities;
using Model;
using Shared;
namespace EFMappers;
public static class ActivityMapper
{
private static GenericMapper<Activity, ActivityEntity> _mapper = new GenericMapper<Activity, ActivityEntity>();
public static Activity? GetModel(ActivityEntity entity) =>
_mapper.GetT(entity);
public static ActivityEntity? GetEntity(Activity model) =>
_mapper.GetU(model);
public static void Add(Activity model, ActivityEntity entity)
{
var tuple = new Tuple<Activity, ActivityEntity>(model, entity);
_mapper.Add(model, entity);
}
// ! RESET
// ? Quand on fait appel au reset ?
// * Apres des saves changing ou rollback.
public static void Reset()
{
_mapper.Reset();
}
public static Activity? ToModel(this ActivityEntity entity)
{
// return entity.ToModel();
return entity.ToT(_mapper, activity => new Activity (
entity.IdActivity,
entity.Type,
new DateTime(entity.Date.Year, entity.Date.Month, entity.Date.Day),
new DateTime().Add(entity.StartTime.ToTimeSpan()),
new DateTime().Add(entity.EndTime.ToTimeSpan()),
entity.EffortFelt,
entity.Variability,
entity.Variance,
entity.StandardDeviation,
entity.Average,
entity.Maximum,
entity.Minimum,
entity.AverageTemperature,
entity.HasAutoPause));
// ! regarder a ce que le model est bien les relation comme l'EF
// ), (activity, entity) => activity.Id = entity.IdActivity);
}
// dictionnaire;
public static ActivityEntity? ToEntity(this Activity model)
{
// return model.ToEntity();
return model.ToU(_mapper, activityEntity => new ActivityEntity
{
IdActivity = model.Id,
Type = model.Type,
Date = DateOnly.FromDateTime(model.Date),
StartTime = TimeOnly.FromDateTime(model.StartTime),
EndTime = TimeOnly.FromDateTime(model.EndTime),
EffortFelt = model.Effort,
Variability = model.Variability,
Variance = model.Variance,
StandardDeviation = model.StandardDeviation,
Average = model.Average,
Maximum = model.Maximum,
Minimum = model.Minimum,
AverageTemperature = model.AverageTemperature,
HasAutoPause = model.HasAutoPause
}
// ! regarder a ce que le model est bien les relation comme l'EF
);
}
public static IEnumerable<Activity> ToModels(this IEnumerable<ActivityEntity> entities)
=> entities.Select(a => a.ToModel());
public static IEnumerable<ActivityEntity> ToEntities(this IEnumerable<Activity> models)
=> models.Select(a => a.ToEntity());
}

@ -22,7 +22,6 @@ public static class UserMappeur
DateOfBirth = user.DateOfBirth, DateOfBirth = user.DateOfBirth,
IsCoach = user.Role is Coach IsCoach = user.Role is Coach
}; };
} }
public static User ToModel(this UserDto userDto) public static User ToModel(this UserDto userDto)

@ -7,8 +7,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Dto\Dto.csproj" />
<ProjectReference Include="..\Model\Model.csproj" /> <ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\Entities\Entities.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -29,8 +29,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestsXUnit", "Tests\TestsAP
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "Model\Model.csproj", "{30AB7FAA-6072-40B6-A15E-9188B59144F9}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "Model\Model.csproj", "{30AB7FAA-6072-40B6-A15E-9188B59144F9}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiMappeur", "ApiMappeur\ApiMappeur.csproj", "{CB142F6B-0FF1-45B3-AB46-6F8DCD096C20}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestApi", "Tests\TestsAPI\UnitTestApi\UnitTestApi.csproj", "{E515C8B6-6282-4D8B-8523-7B3A13E4AF58}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestApi", "Tests\TestsAPI\UnitTestApi\UnitTestApi.csproj", "{E515C8B6-6282-4D8B-8523-7B3A13E4AF58}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestsEntities", "Tests\UnitTestsEntities\UnitTestsEntities.csproj", "{31FA8E5E-D642-4C43-A2B2-02B9832B2CEC}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestsEntities", "Tests\UnitTestsEntities\UnitTestsEntities.csproj", "{31FA8E5E-D642-4C43-A2B2-02B9832B2CEC}"
@ -39,6 +37,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model2Entities", "Model2Ent
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StubAPI", "StubAPI\StubAPI.csproj", "{C9BD0310-DC18-4356-B8A7-2B6959AF7813}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StubAPI", "StubAPI\StubAPI.csproj", "{C9BD0310-DC18-4356-B8A7-2B6959AF7813}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleTestEFMapper", "Tests\ConsoleTestEFMapper\ConsoleTestEFMapper.csproj", "{73EA27F2-9F0C-443F-A5EE-2960C983A422}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EFMappers", "EFMappers\EFMappers.csproj", "{9397795D-F482-44C4-8443-A20AC26671AA}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@ -116,6 +118,22 @@ Global
{C9BD0310-DC18-4356-B8A7-2B6959AF7813}.Debug|Any CPU.Build.0 = Debug|Any CPU {C9BD0310-DC18-4356-B8A7-2B6959AF7813}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9BD0310-DC18-4356-B8A7-2B6959AF7813}.Release|Any CPU.ActiveCfg = Release|Any CPU {C9BD0310-DC18-4356-B8A7-2B6959AF7813}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9BD0310-DC18-4356-B8A7-2B6959AF7813}.Release|Any CPU.Build.0 = Release|Any CPU {C9BD0310-DC18-4356-B8A7-2B6959AF7813}.Release|Any CPU.Build.0 = Release|Any CPU
{06DBE9E4-6AA5-4D09-8544-D3ED91E2D980}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{06DBE9E4-6AA5-4D09-8544-D3ED91E2D980}.Debug|Any CPU.Build.0 = Debug|Any CPU
{06DBE9E4-6AA5-4D09-8544-D3ED91E2D980}.Release|Any CPU.ActiveCfg = Release|Any CPU
{06DBE9E4-6AA5-4D09-8544-D3ED91E2D980}.Release|Any CPU.Build.0 = Release|Any CPU
{73EA27F2-9F0C-443F-A5EE-2960C983A422}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{73EA27F2-9F0C-443F-A5EE-2960C983A422}.Debug|Any CPU.Build.0 = Debug|Any CPU
{73EA27F2-9F0C-443F-A5EE-2960C983A422}.Release|Any CPU.ActiveCfg = Release|Any CPU
{73EA27F2-9F0C-443F-A5EE-2960C983A422}.Release|Any CPU.Build.0 = Release|Any CPU
{C9C9F2A5-9132-4067-B240-B299D2FCF4E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9C9F2A5-9132-4067-B240-B299D2FCF4E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9C9F2A5-9132-4067-B240-B299D2FCF4E9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9C9F2A5-9132-4067-B240-B299D2FCF4E9}.Release|Any CPU.Build.0 = Release|Any CPU
{9397795D-F482-44C4-8443-A20AC26671AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9397795D-F482-44C4-8443-A20AC26671AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9397795D-F482-44C4-8443-A20AC26671AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9397795D-F482-44C4-8443-A20AC26671AA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(NestedProjects) = preSolution GlobalSection(NestedProjects) = preSolution
{477D2129-A6C9-4FF8-8BE9-5E9E8E5282F8} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} {477D2129-A6C9-4FF8-8BE9-5E9E8E5282F8} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18}
@ -125,5 +143,6 @@ Global
{44C367DC-5FE0-4CF2-9E76-A0282E931853} = {30FC2BE9-7397-445A-84AD-043CE70F4281} {44C367DC-5FE0-4CF2-9E76-A0282E931853} = {30FC2BE9-7397-445A-84AD-043CE70F4281}
{E515C8B6-6282-4D8B-8523-7B3A13E4AF58} = {30FC2BE9-7397-445A-84AD-043CE70F4281} {E515C8B6-6282-4D8B-8523-7B3A13E4AF58} = {30FC2BE9-7397-445A-84AD-043CE70F4281}
{31FA8E5E-D642-4C43-A2B2-02B9832B2CEC} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18} {31FA8E5E-D642-4C43-A2B2-02B9832B2CEC} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18}
{73EA27F2-9F0C-443F-A5EE-2960C983A422} = {2B227C67-3BEC-4A83-BDA0-F3918FBC0D18}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

@ -1,4 +1,3 @@
using ApiMappeur;
using Dto; using Dto;
using HeartTrackAPI.Request; using HeartTrackAPI.Request;
using HeartTrackAPI.Responce; using HeartTrackAPI.Responce;
@ -37,8 +36,9 @@ public class ActivityController : Controller
} }
_logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetActivities), pageRequest); _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(GetActivities), pageRequest);
var activities = await _activityService.GetActivities(pageRequest.Index, pageRequest.Count, ActivityOrderCriteria.None, pageRequest.Descending ?? false); var activities = await _activityService.GetActivities(pageRequest.Index, pageRequest.Count, ActivityOrderCriteria.None, pageRequest.Descending ?? false);
var pageResponse = new PageResponse<ActivityDto>(pageRequest.Index, pageRequest.Count, totalCount, activities.Select(a => a.ToDto())); // var pageResponse = new PageResponse<ActivityDto>(pageRequest.Index, pageRequest.Count, totalCount, activities.Select(a => a.ToDto()));
return Ok(pageResponse); // return Ok(pageResponse);
return Ok();
} }
catch (Exception e) catch (Exception e)
{ {

@ -1,4 +1,3 @@
using ApiMappeur;
using Dto; using Dto;
using HeartTrackAPI.Request; using HeartTrackAPI.Request;
using HeartTrackAPI.Responce; using HeartTrackAPI.Responce;
@ -40,8 +39,9 @@ public class UsersController : Controller
_logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(Get), null); _logger.LogInformation("Executing {Action} with parameters: {Parameters}", nameof(Get), null);
var athletes = await _userService.GetUsers(request.Index, request.Count, Enum.TryParse(request.OrderingPropertyName, out AthleteOrderCriteria result) ? result : AthleteOrderCriteria.None, request.Descending ?? false); var athletes = await _userService.GetUsers(request.Index, request.Count, Enum.TryParse(request.OrderingPropertyName, out AthleteOrderCriteria result) ? result : AthleteOrderCriteria.None, request.Descending ?? false);
var pageResponse = new PageResponse<UserDto>(request.Index, request.Count, totalCount, athletes.Select(a => a.ToDto())); // var pageResponse = new PageResponse<UserDto>(request.Index, request.Count, totalCount, athletes.Select(a => a.ToDto()));
return Ok(pageResponse); // return Ok(pageResponse);
return Ok();
} }
catch (Exception e) catch (Exception e)
{ {
@ -65,7 +65,8 @@ public class UsersController : Controller
_logger.LogError("Athlete with id {id} not found", id); _logger.LogError("Athlete with id {id} not found", id);
return NotFound($"Athlete with id {id} not found"); return NotFound($"Athlete with id {id} not found");
} }
return Ok(athlete.ToDto()); // return Ok(athlete.ToDto());
return Ok();
} }
catch (Exception e) catch (Exception e)
{ {
@ -108,13 +109,14 @@ public class UsersController : Controller
_logger.LogError("Athlete with id {id} not found", id); _logger.LogError("Athlete with id {id} not found", id);
return NotFound($"Athlete with id {id} not found"); return NotFound($"Athlete with id {id} not found");
} }
var updatedAthlete = await _userService.UpdateItem(id, user.ToModel()); // var updatedAthlete = await _userService.UpdateItem(id, user.ToModel());
if(updatedAthlete == null) // if(updatedAthlete == null)
{ // {
_logger.LogError("Error while updating athlete with id {id}", id); // _logger.LogError("Error while updating athlete with id {id}", id);
return StatusCode(500); // return StatusCode(500);
} // }
return Ok(updatedAthlete.ToDto()); // return Ok(updatedAthlete.ToDto());
return Ok();
} }
catch (Exception e) catch (Exception e)

@ -13,7 +13,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ApiMappeur\ApiMappeur.csproj" />
<ProjectReference Include="..\Dto\Dto.csproj" /> <ProjectReference Include="..\Dto\Dto.csproj" />
<ProjectReference Include="..\Model\Model.csproj" /> <ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\Shared\Shared.csproj" /> <ProjectReference Include="..\Shared\Shared.csproj" />
@ -21,7 +20,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Newtonsoft.Json" Version="13.0.1" > <Reference Include="Newtonsoft.Json" Version="13.0.1">
<HintPath>..\..\..\..\..\.nuget\packages\newtonsoft.json\13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll</HintPath> <HintPath>..\..\..\..\..\.nuget\packages\newtonsoft.json\13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>

@ -1,49 +1,125 @@
using Model; using Model;
using Model.Repository; using Model.Repository;
using Shared; using Shared;
using Model.Manager;
using Microsoft.Extensions.Logging;
using Entities;
using EFMappers;
using Microsoft.EntityFrameworkCore;
namespace Model2Entities; namespace Model2Entities;
public partial class DbDataManager public partial class DbDataManager : IDataManager
{ {
public class ActivityRepository : IActivityRepository public class ActivityRepository : IActivityRepository
{ {
private readonly DbDataManager _dataManager; private readonly DbDataManager _dataManager;
private readonly ILogger<ActivityRepository> _logger = new Logger<ActivityRepository>(new LoggerFactory());
// logger et tests sur tout et mapper
public ActivityRepository(DbDataManager dataManager) public ActivityRepository(DbDataManager dataManager)
{ {
_dataManager = dataManager; _dataManager = dataManager;
// _logger = logger;
} }
public async Task<IEnumerable<Activity>> GetActivities(int index, int count, ActivityOrderCriteria criteria, bool descending = false) public async Task<IEnumerable<Activity>> GetActivities(int index, int count, ActivityOrderCriteria criteria, bool descending = false)
{ {
throw new NotImplementedException(); _logger.LogInformation($"GetActivities with index {index} and count {count}", index, count);
_logger.LogInformation($"GetActivities with criteria {criteria} and descending {descending}", criteria, descending);
var activities = _dataManager.DbContext.ActivitiesSet.GetItemsWithFilterAndOrdering(b => true, index, count, criteria, descending).ToModels();
_logger.LogInformation($"Retrieved {activities.Count()} activities");
return await Task.FromResult(activities);
} }
public async Task<Activity?> GetActivityByIdAsync(int id) public async Task<Activity?> GetActivityByIdAsync(int id)
{ {
throw new NotImplementedException(); _logger.LogInformation($"GetActivityByIdAsync with id {id}", id);
// ! By None don't pass the filter
var activity = _dataManager.DbContext.ActivitiesSet.GetItemsWithFilterAndOrdering(b => b.IdActivity == id, 0, 1, ActivityOrderCriteria.ByType, false).First().ToModel();
if (activity != null)
_logger.LogInformation($"Retrieved activity with ID {id}");
else
_logger.LogWarning($"No activity found with ID {id}");
return await Task.FromResult(activity);
} }
public async Task<Activity?> AddActivity(Activity activity) public async Task<Activity?> AddActivity(Activity activity)
{ {
throw new NotImplementedException(); try
{
_logger.LogInformation("Adding new activity");
var addedActivity = (await _dataManager.DbContext.AddItem(activity.ToEntity())).ToModel();
if (addedActivity != null)
_logger.LogInformation($"Added activity with ID {addedActivity.Id}");
else
_logger.LogError("Failed to add activity");
return await Task.FromResult(addedActivity);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error occurred while adding activity");
throw;
}
} }
public async Task<Activity?> UpdateActivity(int id, Activity activity) public async Task<Activity?> UpdateActivity(int id, Activity activity)
{ {
throw new NotImplementedException(); try
{
return activity;
// _logger.LogInformation($"Updating activity with ID {id}");
// var updatedActivity = await _dataManager.DbContext.ActivitiesSet.UpdateItem<ActivityEntity>(_dataManager.DbContext,(await GetActivityByIdAsync(id)).ToEntity(), activity.ToEntity());
// if (updatedActivity != null)
// _logger.LogInformation($"Updated activity with ID {id}");
// else
// _logger.LogError($"Failed to update activity with ID {id}");
// return await Task.FromResult(updatedActivity.ToModel());
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error occurred while updating activity with ID {id}");
throw;
}
} }
public async Task<bool> DeleteActivity(int id) public async Task<bool> DeleteActivity(int id)
{ {
throw new NotImplementedException(); try
{
_logger.LogInformation($"Deleting activity with ID {id}");
var isDeleted = await _dataManager.DbContext.DeleteItem<ActivityEntity>(id);
if (isDeleted)
_logger.LogInformation($"Deleted activity with ID {id}");
else
_logger.LogWarning($"No activity found with ID {id}");
return await Task.FromResult(isDeleted);
}
catch (Exception ex)
{
_logger.LogError(ex, $"Error occurred while deleting activity with ID {id}");
throw;
}
} }
public async Task<int> GetNbItems() public async Task<int> GetNbItems()
{ {
throw new NotImplementedException(); try
{
_logger.LogInformation("Getting the total number of activities");
var count = await _dataManager.DbContext.ActivitiesSet.CountAsync();
_logger.LogInformation($"Total number of activities: {count}");
return await Task.FromResult(count);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error occurred while getting the total number of activities");
throw;
}
} }
} }
} }

@ -1,4 +1,6 @@
using DbContextLib; using DbContextLib;
using EFMappers;
using Microsoft.EntityFrameworkCore;
using Model.Manager; using Model.Manager;
using Model.Repository; using Model.Repository;
@ -11,12 +13,14 @@ public partial class DbDataManager: IDataManager
protected HeartTrackContext DbContext { get; } protected HeartTrackContext DbContext { get; }
// mettre si pb lors d'une requete si rollback ou pas
public DbDataManager(HeartTrackContext dbContext) public DbDataManager(HeartTrackContext dbContext)
{ {
DbContext = dbContext; DbContext = dbContext;
ActivityRepo = new ActivityRepository(this); ActivityRepo = new ActivityRepository(this);
UserRepo = new UserRepository(this); UserRepo = new UserRepository(this);
ActivityMapper.Reset();
// Faire pour les autres reset() des autres mappers
} }
public DbDataManager() public DbDataManager()

@ -1,13 +1,169 @@
using DbContextLib;
using Entities;
using Model;
namespace Model2Entities;
public static class Extensions
{
internal static Task<T?> AddItem<T>(this HeartTrackContext context, T? item) where T :class
{
if(item == null || context.Set<T>().Contains(item))
{
return Task.FromResult<T?>(default(T));
}
context.Set<T>().Add(item);
context.SaveChangesAsync();
return Task.FromResult<T?>(item);
}
internal static Task<bool> DeleteItem<T>(this HeartTrackContext context, int? id) where T:class
{
var item = context.Set<T>().Find(id);
if(item == null)
{
return Task.FromResult(false);
}
context.Set<T>().Remove(item);
context.SaveChangesAsync();
return Task.FromResult(true);
}
internal static async Task<T?> UpdateItem<T>(this IList<T> collection, T? oldItem, T? newItem) where T : class
{
// if(oldItem == null || newItem == null) return default(T);
// if(!collection.Contains(oldItem))
// {
// return default(T);
// }
// collection.Remove(oldItem!);
// await collection.AddItem(newItem!);
// return newItem;
return await Task.FromResult<T?>(default(T));
}
public static IEnumerable<T> GetItemsWithFilterAndOrdering<T>(this IEnumerable<T> list, Func<T, bool> filter, int index, int count, Enum? orderCriterium, bool descending = false ) where T : class
{
var filteredList = list.Where(filter);
if(orderCriterium != null)
{
filteredList = filteredList.OrderByCriteria(orderCriterium, descending);
}
return filteredList
.Skip(index * count)
.Take(count);
}
public static IOrderedEnumerable<T> OrderByCriteria<T>(this IEnumerable<T> list, Enum orderCriterium, bool descending = false ) where T : class
{
var orderCriteriumString = orderCriterium.ToString();
if (orderCriteriumString.StartsWith("By"))
{
orderCriteriumString = orderCriteriumString.Substring(2);
}
var propertyInfo = typeof(T).GetProperty(orderCriteriumString);
if (propertyInfo == null)
{
throw new ArgumentException($"No property {orderCriterium} in type {typeof(T)}");
}
return descending ? list.OrderByDescending(x => propertyInfo.GetValue(x)) : list.OrderBy(x => propertyInfo.GetValue(x));
}
// public static Activity ToModel(this ActivityEntity entity)
// {
// return new Activity (
// entity.IdActivity,
// entity.Type,
// new DateTime(entity.Date.Year, entity.Date.Month, entity.Date.Day),
// new DateTime().Add(entity.StartTime.ToTimeSpan()), // Utilisation de ToTimeSpan() pour obtenir la composante temps sans la date
// new DateTime().Add(entity.EndTime.ToTimeSpan()),
// entity.EffortFelt,
// entity.Variability,
// entity.Variance,
// entity.StandardDeviation,
// entity.Average,
// entity.Maximum,
// entity.Minimum,
// entity.AverageTemperature,
// entity.HasAutoPause
// );
// }
// public static ActivityEntity ToEntity(this Activity model)
// {
// return new ActivityEntity
// {
// IdActivity = model.Id,
// Type = model.Type,
// Date = DateOnly.FromDateTime(model.Date),
// StartTime = TimeOnly.FromDateTime(model.StartTime),
// EndTime = TimeOnly.FromDateTime(model.EndTime),
// EffortFelt = model.Effort,
// Variability = model.Variability,
// Variance = model.Variance,
// StandardDeviation = model.StandardDeviation,
// Average = model.Average,
// Maximum = model.Maximum,
// Minimum = model.Minimum,
// AverageTemperature = model.AverageTemperature,
// HasAutoPause = model.HasAutoPause
// };
// }
// public static IEnumerable<Activity> ToModels(this IEnumerable<ActivityEntity> entities)
// => entities.Select(a => a.ToModel());
// public static IEnumerable<ActivityEntity> ToEntities(this IEnumerable<Activity> models)
// => models.Select(a => a.ToEntity());
}
// using System; // using System;
// using Entities; // using Entities;
// using Models; // using Models;
// using System.Collections.Generic; // Add missing namespace
// namespace Model2Entities // namespace Model2Entities
// { // {
// public static class Extension<Tentity> // public static class Extension
// {
// public static TEntity ToEntity<T, TEntity>(this T model)
// where TEntity : new()
// {
// return new TEntity
// {
// Id = model.Id,
// Title = model.Title,
// Author = model.Author,
// Isbn = model.Isbn
// };
// }
// public static IEnumerable<TEntity> ToEntities<T, TEntity>(this IEnumerable<T> models) // Add missing type parameter
// where TEntity : new() // Add constraint for TEntity
// {
// return models.Select(m => m.ToEntity<T, TEntity>());
// }
// public static T ToModel<T, TEntity>(this TEntity myTEntity) // Add missing type parameter
// where T : new() // Add constraint for T
// {
// return new T(myTEntity.Id, myTEntity.Title, myTEntity.Author, myTEntity.Isbn);
// }
// public static IEnumerable<T> ToModels(this IEnumerable<TEntity> TsEntities)
// => TsEntities.Select(e => e.ToModel());
// }
// { // {
// public static TEntity ToEntity(this Book model) // public static T ToEntity(this T model)
// => new BookEntity // => new TEntity
// { // {
// Id = model.Id, // Id = model.Id,
// Title = model.Title, // Title = model.Title,
@ -15,13 +171,13 @@
// Isbn = model.Isbn // Isbn = model.Isbn
// }; // };
// public static IEnumerable<TEntity> ToEntities(this IEnumerable<Book> models) // public static IEnumerable<T> ToEntities(this IEnumerable<T> models)
// => models.Select(m => m.ToEntity()); // => models.Select(m => m.ToEntity());
// public static Book ToModel(this TEntity myBookEntity) // public static T ToModel(this T myTEntity)
// => new Book(myBookEntity.Id, myBookEntity.Title, myBookEntity.Author, myBookEntity.Isbn); // => new T(myTEntity.Id, myTEntity.Title, myTEntity.Author, myTEntity.Isbn);
// public static IEnumerable<Book> ToModels(this IEnumerable<BookEntity> booksEntities) // public static IEnumerable<T> ToModels(this IEnumerable<TEntity> TsEntities)
// => booksEntities.Select(e => e.ToModel()); // => TsEntities.Select(e => e.ToModel());
// } // }
// } // }

@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\DbContextLib\DbContextLib.csproj" /> <ProjectReference Include="..\DbContextLib\DbContextLib.csproj" />
<ProjectReference Include="..\Model\Model.csproj" /> <ProjectReference Include="..\Model\Model.csproj" />
<ProjectReference Include="..\EFMappers\EFMappers.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

@ -3,7 +3,6 @@ namespace Shared;
public enum ActivityOrderCriteria public enum ActivityOrderCriteria
{ {
None, None,
ByName,
ByType, ByType,
ByDate, ByDate,
ByDuration, ByDuration,

@ -0,0 +1,10 @@
namespace Shared;
public enum DataSourceOrderCriteria
{
None,
ByName,
ByDate,
ByType,
ByContent
}

@ -0,0 +1,28 @@
namespace Shared;
public static class Extensions
{
public static U? ToU<T, U>(this T t, GenericMapper<T, U> mapper, Func<T, U> func) where U :class where T :class
{
var u = mapper.GetU(t);
if (u != null) {
return u;
}
u = func(t);
mapper.Add(t, u);
// action(t, u);
return u;
}
// , Action<T, U> action
public static T? ToT<T,U>(this U u, GenericMapper<T, U> mapper, Func<U, T> func) where U :class where T :class
{
var t = mapper.GetT(u);
if (t != null) {
return t;
}
t = func(u);
mapper.Add(t, u);
// action(t, u);
return t;
}
}

@ -0,0 +1,34 @@
namespace Shared;
public class GenericMapper<T,U> where T : class where U : class
{
private HashSet<Tuple<T,U>> mapper = new HashSet<Tuple<T,U>>();
public T? GetT(U u)
{
var found = mapper.Where(t => ReferenceEquals(t.Item2, u));
if (found.Count() != 1)
{
return null;
}
return found.First().Item1;
}
public U? GetU(T t)
{
var found = mapper.Where(t => ReferenceEquals(t.Item1, t));
if (found.Count() != 1)
{
return null;
}
return found.First().Item2;
}
public void Add(T model, U entity)
{
var tuple = new Tuple<T, U>(model, entity);
mapper.Add(tuple);
}
public void Reset()
{
mapper.Clear();
}
}

@ -0,0 +1,10 @@
namespace Shared;
public enum HeartRateOrderCriteria
{
None,
ByDate,
ByValue,
ByActivity,
ByUser
}

@ -0,0 +1,11 @@
namespace Shared;
public enum NotificationOrderCriteria
{
None,
ByDate,
ByType,
BySender,
ByReceiver,
ByContent
}

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Dto\Dto.csproj" /> <ProjectReference Include="..\Dto\Dto.csproj" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>

@ -0,0 +1,10 @@
namespace Shared;
public enum StatisticOrderCriteria
{
None,
ByDate,
ByType,
ByValue,
ByUser
}

@ -0,0 +1,12 @@
namespace Shared;
public enum TrainingOrderCriteria
{
None,
ByDate,
ByType,
ByDuration,
ByDistance,
ByCalories,
ByUser
}

@ -1,6 +0,0 @@
namespace SharedEF;
public class Activity
{
}

@ -1,6 +0,0 @@
namespace SharedEF;
public interface IActivityRepository : IGenericRepository<Activity>
{
}

@ -1,7 +0,0 @@
namespace SharedEF;
public interface IDataManager
{
IUserRepository UserRepo { get; }
IActivityRepository ActivityRepo { get; }
}

@ -1,12 +0,0 @@
namespace SharedEF;
public interface IGenericRepository<T>
{
Task<IEnumerable<T>> GetItems(int index, int count, string? orderingProperty = null, bool descending = false);
Task<T?> GetItemById(int id);
Task<T?> UpdateItem(int oldItem, T newItem);
Task<T?> AddItem(T item);
Task<bool> DeleteItem(int item);
Task<int> GetNbItems();
}

@ -1,6 +0,0 @@
namespace SharedEF;
public interface IUserRepository: IGenericRepository<User>
{
public Task<IEnumerable<User>> GetUsers(int index, int count, AthleteOrderCriteria? criteria , bool descending = false);
}

@ -1,9 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

@ -1,6 +0,0 @@
namespace SharedEF;
public class User
{
}

@ -1,4 +1,4 @@
using Shared; // using Shared;
namespace // namespace

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\..\Model2Entities\Model2Entities.csproj" />
<ProjectReference Include="..\..\Shared\Shared.csproj" />
<ProjectReference Include="..\..\StubbedContextLib\StubbedContextLib.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.2">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

@ -0,0 +1,88 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Model;
using Shared;
using StubbedContextLib;
using static Model2Entities.DbDataManager;
namespace Model2Entities
{
class Program
{
static async Task Main(string[] args)
{
// Instanciation de DbDataManager et ActivityRepository
var dataManager = new DbDataManager(new TrainingStubbedContext());
var logger = new Logger<ActivityRepository>(new LoggerFactory());
var activityRepository = new ActivityRepository(dataManager);
// Test de la méthode GetActivities
Console.WriteLine("Testing GetActivities method...");
var activities = await activityRepository.GetActivities(0, 10, ActivityOrderCriteria.ByType, true);
foreach (var activity in activities)
{
Console.WriteLine($"Activity ID: {activity.Id}, Name: {activity.Type}, Date: {activity.Date}, Start Time: {activity.StartTime}, End Time: {activity.EndTime}");
}
Console.WriteLine();
// Test de la méthode GetActivityByIdAsync
Console.WriteLine("Testing GetActivityByIdAsync method...");
var activityById = await activityRepository.GetActivityByIdAsync(2);
if (activityById != null)
{
Console.WriteLine($"Activity found: ID: {activityById.Id}, Name: {activityById.Type}, Date: {activityById.Date}, Start Time: {activityById.StartTime}, End Time: {activityById.EndTime}");
}
else
{
Console.WriteLine("No activity found with the specified ID.");
}
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 UpdateActivity
// Console.WriteLine("Testing UpdateActivity method...");
// var updatedActivity = await activityRepository.UpdateActivity(6, new Activity { Id = 6, Name = "Updated Activity" });
// if (updatedActivity != null)
// {
// Console.WriteLine($"Activity updated successfully: ID: {updatedActivity.Id}, Name: {updatedActivity.Name}");
// }
// else
// {
// Console.WriteLine("Failed to update activity.");
// }
// Console.WriteLine();
// Test de la méthode DeleteActivity
Console.WriteLine("Testing DeleteActivity method...");
var isDeleted = await activityRepository.DeleteActivity(1);
if (isDeleted)
{
Console.WriteLine("Activity deleted successfully.");
} else
{
Console.WriteLine("Failed to delete activity.");
}
// Test de la méthode GetNbItems
Console.WriteLine("Testing GetNbItems method...");
var itemCount = await activityRepository.GetNbItems();
Console.WriteLine($"Total number of activities: {itemCount}");
}
}
}

@ -21,23 +21,23 @@ class Program
NotificationTests(db); NotificationTests(db);
// StatisticTests(db); StatisticTests(db);
// TrainingTests(db); TrainingTests(db);
// AddUpdateDeleteAthlete(db); AddUpdateDeleteAthlete(db);
// AddUpdateDeleteActivity(db); AddUpdateDeleteActivity(db);
// AddUpdateDeleteDataSource(db); AddUpdateDeleteDataSource(db);
// AddUpdateDeleteHeartRate(db); AddUpdateDeleteHeartRate(db);
// AddUpdateDeleteNotification(db); AddUpdateDeleteNotification(db);
// AddUpdateDeleteStatistic(db); AddUpdateDeleteStatistic(db);
// AddUpdateDeleteTraining(db); AddUpdateDeleteTraining(db);
} }
} }
catch (Exception ex) catch (Exception ex)

Loading…
Cancel
Save