Implémentation des différentes méthodes CRUD pour la classe User, Création d'un InquiriesController pour pouvoir manipuler la classe Inquiry plus tard. Ajout du système d'authentification pour améliorer la sécurité de l'API

pull/23/head
BuildTools 1 year ago
parent 8b4c11e842
commit 2d8afac3bc

@ -0,0 +1,26 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Model.DTO;
using Services;
namespace API.Controllers
{
[Route("api/[controller]")]
[Authorize]
[ApiController]
public class InquiriesController : Controller
{
private IDataService _inquiryDataService;
public InquiriesController(IDataService inquiryDataService)
{
_inquiryDataService = inquiryDataService;
}
[HttpGet("inquiries/{page}/{number}")]
public IActionResult GetInquiries(int page, int number)
{
return Ok(_inquiryDataService.GetInquiries(page, number));
}
}
}

@ -1,4 +1,5 @@
using DbContextLib;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Model.DTO;
@ -7,6 +8,7 @@ using Services;
namespace API.Controllers
{
[Route("api/[controller]")]
[Authorize]
[ApiController]
public class UserController : Controller
{
@ -22,5 +24,35 @@ namespace API.Controllers
{
return Ok(_userDataService.GetUsers(page, number));
}
[HttpGet("user/{id}")]
public IActionResult GetUserById(int id)
{
return Ok(_userDataService.GetUserById(id));
}
[HttpGet("user/{username}")]
public IActionResult GetUserByUsername(string username)
{
return Ok(_userDataService.GetUserByUsername(username));
}
[HttpDelete]
public IActionResult DeleteUser(int id)
{
return Ok(_userDataService.DeleteUser(id));
}
[HttpPost]
public IActionResult UpdateUser(int id, UserDTO user)
{
return Ok(_userDataService.UpdateUser(id, user));
}
[HttpPut]
public IActionResult CreateUser(string username, string password, string email, bool isAdmin)
{
return Ok(_userDataService.CreateUser(username, password, email, isAdmin));
}
}
}

@ -1,5 +1,7 @@
using DbContextLib;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.OpenApi.Models;
using Services;
var builder = WebApplication.CreateBuilder(args);
@ -10,8 +12,38 @@ builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddScoped<IDataService, UserDataService>();
builder.Services.AddScoped<IDataService, InquiryDataService>();
builder.Services.AddDbContext<DbContext, UserDbContext>();
builder.Services.AddAuthorization();
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<UserDbContext>();
builder.Services.AddSwaggerGen(option =>
{
option.SwaggerDoc("v1", new OpenApiInfo { Title = "Demo API", Version = "v1" });
option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Description = "Please enter a valid token",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = "Bearer"
});
option.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type=ReferenceType.SecurityScheme,
Id="Bearer"
}
},
new string[]{}
}
});
});
var app = builder.Build();
@ -28,4 +60,6 @@ app.UseAuthorization();
app.MapControllers();
app.MapIdentityApi<IdentityUser>();
app.Run();

@ -8,6 +8,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="8.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.1">
<PrivateAssets>all</PrivateAssets>

@ -1,11 +1,13 @@
using Entities.SQLudeoDB;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
using Microsoft.EntityFrameworkCore;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Identity;
namespace DbContextLib
{
public class UserDbContext : DbContext
public class UserDbContext : IdentityDbContext<IdentityUser>
{
public DbSet<UserEntity> Users { get; set; }
public DbSet<BlackListEntity> BlackList { get; set; }

@ -1,4 +1,5 @@
using Model.DTO;
using Model.Business;
using Model.DTO;
namespace Services
{
@ -7,7 +8,10 @@ namespace Services
public IEnumerable<UserDTO> GetUsers(int page, int number);
public UserDTO GetUserById(int id);
public UserDTO GetUserByUsername(string username);
public IEnumerable<InquiryDTO> GetInquiries();
public bool DeleteUser(int id);
public UserDTO UpdateUser(int id, UserDTO user);
public UserDTO CreateUser(string username, string password, string email, bool isAdmin);
public IEnumerable<InquiryDTO> GetInquiries(int page, int number);
}
}

@ -7,35 +7,92 @@ using System.Text;
using System.Threading.Tasks;
using Model.Mappers;
using Model.Business;
using Microsoft.EntityFrameworkCore;
namespace Services
{
public class UserDataService : IDataService
public class InquiryDataService : IDataService
{
private UserDbContext DbContext { get; set; }
public UserDataService(UserDbContext context)
public InquiryDataService(UserDbContext context)
{
DbContext = context;
context.Database.EnsureCreated();
}
public IEnumerable<InquiryDTO> GetInquiries()
{
throw new NotImplementedException();
}
public UserDTO GetUserById(int id)
{
throw new NotImplementedException();
var userEntity = DbContext.Users.FirstOrDefault(u => u.Id == id);
if (userEntity == null)
{
throw new ArgumentException("Impossible de trouver l'utilisateur", nameof(id));
}
return userEntity.FromEntityToModel().FromModelToDTO();
}
public UserDTO GetUserByUsername(string username)
{
throw new NotImplementedException();
var userEntity = DbContext.Users.FirstOrDefault(u => u.Username == username);
if (userEntity == null)
{
throw new ArgumentException("Impossible de trouver l'utilisateur", nameof(username));
}
return userEntity.FromEntityToModel().FromModelToDTO();
}
public IEnumerable<UserDTO> GetUsers(int page, int number)
{
return DbContext.Users.Skip((page - 1) * number).Take(number).ToList().Select(u => u.FromEntityToModel().FromModelToDTO());
}
public bool DeleteUser(int id)
{
var userEntity = DbContext.Users.FirstOrDefault(u => u.Id == id);
if (userEntity == null)
{
return false;
}
DbContext.Users.Remove(userEntity);
DbContext.SaveChanges();
return true;
}
public UserDTO UpdateUser(int id, UserDTO user)
{
var updatingUser = GetUserById(id);
if(updatingUser == null)
{
throw new ArgumentException("Impossible de trouver l'utilisateur", nameof(id));
}
updatingUser.Username = user.Username;
updatingUser.Password = user.Password;
updatingUser.Email = user.Email;
updatingUser.IsAdmin = user.IsAdmin;
var updatedUser = updatingUser.FromDTOToModel().FromModelToEntity();
// Permet d'indiquer en Db que l'entité a été modifiée.
DbContext.Entry(updatedUser).State = EntityState.Modified;
return updatedUser.FromEntityToModel().FromModelToDTO();
}
public UserDTO CreateUser(string username, string password, string email, bool isAdmin)
{
var newUserEntity = new UserDTO
{
Username = username,
Password = password,
Email = email,
IsAdmin = isAdmin
};
DbContext.Users.Add(newUserEntity.FromDTOToModel().FromModelToEntity());
DbContext.SaveChanges();
return newUserEntity;
}
public IEnumerable<InquiryDTO> GetInquiries(int page, int number)
{
throw new NotImplementedException();
}
}
}

Loading…
Cancel
Save