ajout d'une nouvelle branch pour corriger un problème de dépendance forte entre la partie WebService et EF ainsi que l'exclusion de la primary key dans la methode UpdateItem #28

Merged
victor.gaborit merged 1 commits from correctionLienWebServiceEF into crud/security 1 year ago

@ -28,14 +28,14 @@ namespace API.Controllers
[HttpGet("users/{page}/{number}")] [HttpGet("users/{page}/{number}")]
public async Task<IActionResult> GetUsers(int page, int number) public async Task<IActionResult> GetUsers(int page, int number)
{ {
var nbUser = (await _dataService.UserService.GetUsers(page, number)).ToList().Count(); var nbUser = (await _dataService.UserService.GetItems(page, number)).ToList().Count();
if(nbUser == 0) if(nbUser == 0)
{ {
_logger.LogError("[ERREUR] Aucun utilisateur trouvé."); _logger.LogError("[ERREUR] Aucun utilisateur trouvé.");
return StatusCode(204); return StatusCode(204);
} }
_logger.LogInformation("[INFORMATION] {nb} Utilisateur(s) trouvé(s)", nbUser); _logger.LogInformation("[INFORMATION] {nb} Utilisateur(s) trouvé(s)", nbUser);
return Ok(_dataService.UserService.GetItems<UserEntity>(page, number)); return Ok(_dataService.UserService.GetItems(page, number));
} }
[HttpGet("user/id/{id}")] [HttpGet("user/id/{id}")]
@ -44,8 +44,8 @@ namespace API.Controllers
try try
{ {
_logger.LogInformation("[INFORMATION] Utilisateur avec l'id {id} a été trouvé.", id); _logger.LogInformation("[INFORMATION] Utilisateur avec l'id {id} a été trouvé.", id);
return Ok(_dataService.UserService.GetItems<UserEntity>(1, 1, UserProperty.Id.ToString(),id)); return Ok(_dataService.UserService.GetItems(1, 1, UserProperty.Id.ToString(),id));
} catch (ArgumentException) } catch (KeyNotFoundException)
{ {
_logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id); _logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id);
return NotFound(); return NotFound();
@ -58,7 +58,7 @@ namespace API.Controllers
try try
{ {
_logger.LogInformation("[INFORMATION] Utilisateur avec l'username {username} a été trouvé.", username); _logger.LogInformation("[INFORMATION] Utilisateur avec l'username {username} a été trouvé.", username);
return Ok(_dataService.UserService.GetItems<UserEntity>(1, 1,UserProperty.Username.ToString(), username)); return Ok(_dataService.UserService.GetItems(1, 1,UserProperty.Username.ToString(), username));
}catch (ArgumentException) }catch (ArgumentException)
{ {
_logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'username {username}.", username); _logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'username {username}.", username);
@ -70,11 +70,11 @@ namespace API.Controllers
[HttpDelete] [HttpDelete]
public async Task<IActionResult> DeleteUser(int id) public async Task<IActionResult> DeleteUser(int id)
{ {
var success = await _dataService.UserService.DeleteItem<UserEntity>(id); var success = await _dataService.UserService.DeleteItem(id);
if(success) if(success)
{ {
_logger.LogInformation("[INFORMATION] L'utilisateur avec l'id {id} a été supprimé.", id); _logger.LogInformation("[INFORMATION] L'utilisateur avec l'id {id} a été supprimé.", id);
return Ok(_dataService.UserService.DeleteItem<UserEntity>(id)); return Ok(_dataService.UserService.DeleteItem(id));
} else } else
{ {
_logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id); _logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id);
@ -92,7 +92,7 @@ namespace API.Controllers
} }
_logger.LogInformation("[INFORMATION] Un utilisateur a été créé : username - {username}, password - {password}, email - {email}, isAdmin - {isAdmin}", dto.Username, dto.Password, dto.Email, dto.IsAdmin); _logger.LogInformation("[INFORMATION] Un utilisateur a été créé : username - {username}, password - {password}, email - {email}, isAdmin - {isAdmin}", dto.Username, dto.Password, dto.Email, dto.IsAdmin);
return Created(nameof(GetUsers), _dataService.UserService.AddItem(dto.FromDTOToModel().FromModelToEntity())); return Created(nameof(GetUsers), _dataService.UserService.AddItem(dto));
} }
[HttpPut] [HttpPut]
@ -111,7 +111,7 @@ namespace API.Controllers
if(userDTO != null) if(userDTO != null)
{ {
_logger.LogInformation("[INFORMATION] La mise à jour de l'utilisateur avec l'id {id} a été effectuée", id); _logger.LogInformation("[INFORMATION] La mise à jour de l'utilisateur avec l'id {id} a été effectuée", id);
return Ok(_dataService.UserService.UpdateItem<UserEntity, UserDTO>(id, userDTO)); return Ok(_dataService.UserService.UpdateItem<UserDTO>(id, userDTO));
} }
_logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id); _logger.LogError("[ERREUR] Aucun utilisateur trouvé avec l'id {id}.", id);
return NotFound(); return NotFound();

@ -12,7 +12,7 @@ using System.Runtime.InteropServices.ObjectiveC;
namespace ModelToEntity namespace ModelToEntity
{ {
public class DbDataManager : IUserDataService<User> public class DbDataManager : IUserDataService<User?>
{ {
public async Task<User> GetUserById(int id) public async Task<User> GetUserById(int id)
{ {
@ -161,37 +161,34 @@ namespace ModelToEntity
throw new NotImplementedException(); throw new NotImplementedException();
} }
public async Task<T?> AddItem<T>(T? item) where T : class public async Task<User?> AddItem(User? item)
{ {
using (var context = new UserDbContext()) using (var context = new UserDbContext())
{ {
return await context.CreateItemAsync(item); return (await context.CreateItemAsync(item.FromModelToEntity())).FromEntityToModel() ;
} }
} }
public async Task<bool> DeleteItem<T>(int id) where T : class public async Task<bool> DeleteItem(int id)
{ {
using(var context = new UserDbContext()) using(var context = new UserDbContext())
{ {
return await context.DeleteItemAsync<T>(id); return await context.DeleteItemAsync<UserEntity>(id);
} }
} }
public async Task<T?> UpdateItem<T, TDto>(int? id, TDto? newItem) public async Task<User?> UpdateItem<TDto>(int? id, TDto? newItem) where TDto : class
where T : class
where TDto : class
{ {
using(var context = new UserDbContext()) using(var context = new UserDbContext())
{ {
return await context.UpdateItemAsync<T, TDto>(id, newItem); return (await context.UpdateItemAsync<UserEntity, TDto>(id, newItem)).FromEntityToModel();
} }
} }
public async Task<IEnumerable<T?>> GetItems<T>(int index, int count, string? orderingPropertyName = null, object? valueProperty = null) where T : class public async Task<IEnumerable<User?>> GetItems(int index, int count, string? orderingPropertyName = null, object? valueProperty = null)
{ {
using (var context = new UserDbContext()) using (var context = new UserDbContext())
{ {
return await context.GetItemsWithFilter<T>(index, count, orderingPropertyName, valueProperty); return (await context.GetItemsWithFilter<UserEntity>(index, count, orderingPropertyName, valueProperty)).Select(item => item.FromEntityToModel());
} }
} }
} }

@ -56,9 +56,11 @@ namespace ModelToEntity
{ {
throw new ArgumentException("Impossible de trouver l'entité", nameof(id)); throw new ArgumentException("Impossible de trouver l'entité", nameof(id));
} }
var primaryKey = context.Model.FindEntityType(typeof(T)).FindPrimaryKey();
var primaryKeyPropertyName = primaryKey.Properties.Select(x => x.Name).Single();
var propertiesToUpdate = typeof(TDto).GetProperties() var propertiesToUpdate = typeof(TDto).GetProperties()
.Where(p => p.CanRead && p.CanWrite); .Where(p => p.CanRead && p.CanWrite && p.Name != primaryKeyPropertyName);
foreach (var property in propertiesToUpdate) foreach (var property in propertiesToUpdate)
{ {
@ -72,7 +74,7 @@ namespace ModelToEntity
return Task.FromResult<T?>(entity); return Task.FromResult<T?>(entity);
} }
internal static Task<IEnumerable<T?>> GetItemsWithFilter<T>(this DbContext context, internal static Task<IEnumerable<T?>> GetItemsWithFilter<T>(this DbContext context,
int index, int count, string? orderingPropertyName = null, object valueProperty = null) where T : class int index, int count, string? orderingPropertyName = null, object? valueProperty = null) where T : class
{ {
IQueryable<T> query = context.Set<T>(); IQueryable<T> query = context.Set<T>();
@ -96,6 +98,7 @@ namespace ModelToEntity
} }
} }
} }
return Task.FromResult<IEnumerable<T?>>(new List<T?> { default(T) });
} }
var items = query.Skip(index).Take(count).ToList(); var items = query.Skip(index).Take(count).ToList();
return Task.FromResult<IEnumerable<T?>>(items); return Task.FromResult<IEnumerable<T?>>(items);

@ -56,28 +56,36 @@ namespace Services
return newUserEntity.FromModelToDTO(); return newUserEntity.FromModelToDTO();
} }
public async Task<T?> AddItem<T>(T? item) where T : class public async Task<UserDTO?> AddItem(UserDTO? item)
{ {
var newItem = dataServiceEF.AddItem(item); var newItem = await dataServiceEF.AddItem(item.FromDTOToModel());
return await newItem; return newItem.FromModelToDTO();
} }
public Task<bool> DeleteItem<T>(int id) where T : class public Task<bool> DeleteItem(int id)
{ {
var succes = dataServiceEF.DeleteItem<T>(id); var succes = dataServiceEF.DeleteItem(id);
return succes; return succes;
} }
public Task<T> UpdateItem<T, TDto>(int? id, TDto? newItem) where T : class where TDto : class public async Task<UserDTO> UpdateItem<TDto>(int? id, TDto? newItem) where TDto : class
{ {
var item = dataServiceEF.UpdateItem<T, TDto>(id, newItem); var item = await dataServiceEF.UpdateItem<TDto>(id, newItem);
return item; return item.FromModelToDTO();
} }
public Task<IEnumerable<T?>> GetItems<T>(int index, int count, string? orderingPropertyName = null, object? valueProperty = null) where T : class public async Task<IEnumerable<UserDTO?>> GetItems(int index, int count, string? orderingPropertyName = null, object? valueProperty = null)
{ {
var items = dataServiceEF.GetItems<T>(index, count, orderingPropertyName, valueProperty); try
return items; {
var items = await dataServiceEF.GetItems(index, count, orderingPropertyName, valueProperty);
return items.Select(item => item.FromModelToDTO());
}
catch (KeyNotFoundException ex)
{
throw;
}
} }
public Task<IEnumerable<ParagraphDTO>> GetParagraphs(int page, int number) public Task<IEnumerable<ParagraphDTO>> GetParagraphs(int page, int number)

@ -2,9 +2,9 @@
{ {
public interface IGenericService<T> where T : class public interface IGenericService<T> where T : class
{ {
public Task<T?> AddItem<T>(T? item) where T : class; public Task<T?> AddItem(T? item);
public Task<bool> DeleteItem<T>(int id) where T : class; public Task<bool> DeleteItem(int id);
public Task<T> UpdateItem<T, TDto>(int? id, TDto? newItem) where T : class where TDto : class; public Task<T> UpdateItem<TDto>(int? id, TDto? newItem) where TDto : class;
public Task<IEnumerable<T>> GetItems<T>(int index, int count, string? orderingPropertyName = null, object? valueProperty = null) where T : class; public Task<IEnumerable<T>> GetItems(int index, int count, string? orderingPropertyName = null, object? valueProperty = null);
} }
} }

Loading…
Cancel
Save