diff --git a/API_SQLuedo/API/Controllers/InquiriesController.cs b/API_SQLuedo/API/Controllers/InquiriesController.cs new file mode 100644 index 0000000..688c379 --- /dev/null +++ b/API_SQLuedo/API/Controllers/InquiriesController.cs @@ -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)); + } + } +} \ No newline at end of file diff --git a/API_SQLuedo/API/Controllers/UserController.cs b/API_SQLuedo/API/Controllers/UserController.cs index 1708d72..2440372 100644 --- a/API_SQLuedo/API/Controllers/UserController.cs +++ b/API_SQLuedo/API/Controllers/UserController.cs @@ -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)); + } } } diff --git a/API_SQLuedo/API/Program.cs b/API_SQLuedo/API/Program.cs index ce122da..a8e96f7 100644 --- a/API_SQLuedo/API/Program.cs +++ b/API_SQLuedo/API/Program.cs @@ -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(); +builder.Services.AddScoped(); builder.Services.AddDbContext(); +builder.Services.AddAuthorization(); +builder.Services.AddIdentityApiEndpoints() + .AddEntityFrameworkStores(); +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(); + app.Run(); diff --git a/API_SQLuedo/DbContextLib/DbContextLib.csproj b/API_SQLuedo/DbContextLib/DbContextLib.csproj index 38862a9..4611898 100644 --- a/API_SQLuedo/DbContextLib/DbContextLib.csproj +++ b/API_SQLuedo/DbContextLib/DbContextLib.csproj @@ -8,6 +8,7 @@ + all diff --git a/API_SQLuedo/DbContextLib/UserDbContext.cs b/API_SQLuedo/DbContextLib/UserDbContext.cs index c8d8a4f..9e5d5ba 100644 --- a/API_SQLuedo/DbContextLib/UserDbContext.cs +++ b/API_SQLuedo/DbContextLib/UserDbContext.cs @@ -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 { public DbSet Users { get; set; } public DbSet BlackList { get; set; } diff --git a/API_SQLuedo/Services/IDataService.cs b/API_SQLuedo/Services/IDataService.cs index 2919cc7..a0c1a57 100644 --- a/API_SQLuedo/Services/IDataService.cs +++ b/API_SQLuedo/Services/IDataService.cs @@ -1,4 +1,5 @@ -using Model.DTO; +using Model.Business; +using Model.DTO; namespace Services { @@ -7,7 +8,10 @@ namespace Services public IEnumerable GetUsers(int page, int number); public UserDTO GetUserById(int id); public UserDTO GetUserByUsername(string username); - public IEnumerable 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 GetInquiries(int page, int number); } } diff --git a/API_SQLuedo/Services/UserDataService.cs b/API_SQLuedo/Services/UserDataService.cs index c3206d9..ce82782 100644 --- a/API_SQLuedo/Services/UserDataService.cs +++ b/API_SQLuedo/Services/UserDataService.cs @@ -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 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 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 GetInquiries(int page, int number) + { + throw new NotImplementedException(); + } } }