From cc276d4a171d47e4379aa03b8a0b873ed9cc1ae3 Mon Sep 17 00:00:00 2001 From: Kham Date: Wed, 1 Sep 2021 16:03:05 +1000 Subject: [PATCH] add lastmodified and lastmodifiedid to table also add code for modified and create --- .../Authorization/JwtMiddleware.cs | 6 +- .../Authorization/JwtUtils.cs | 36 ++++++-- .../Controllers/AdminUserController.cs | 10 ++- .../Controllers/ConcessionTypeController.cs | 4 + .../ConcessionValidationController.cs | 11 ++- .../Controllers/ValidationPointController.cs | 12 +-- CarParkValidationAPI/Entities/ApiException.cs | 21 +++++ .../Helpers/ErrorHandlerMiddleware.cs | 42 +++++++--- CarParkValidationAPI/Interface/IAdminUser.cs | 15 ++-- .../Interface/IConcessionType.cs | 17 ++-- .../Interface/IConcessionValidation.cs | 1 + CarParkValidationAPI/Interface/IJwtUtils.cs | 2 +- .../Interface/IValidationPoint.cs | 17 ++-- CarParkValidationAPI/Models/AdminUser.cs | 2 + CarParkValidationAPI/Models/ConcessionType.cs | 2 + .../Models/ConcessionValidation.cs | 5 ++ .../Models/ValidationPoint.cs | 5 +- .../Repository/AdminUserFakeRepository.cs | 8 +- .../Repository/AdminUserRepository.cs | 83 ++++++++++--------- .../Repository/ConcessionTypeRepository.cs | 14 +++- .../ConcessionValidationRepository.cs | 21 ++++- .../Repository/LookupCodeRepository.cs | 2 + .../ValidationPointFackRepository.cs | 7 +- .../Repository/ValidationPointRepository.cs | 15 +++- CarParkValidationAPI/Startup.cs | 12 +-- 25 files changed, 255 insertions(+), 115 deletions(-) create mode 100644 CarParkValidationAPI/Entities/ApiException.cs diff --git a/CarParkValidationAPI/Authorization/JwtMiddleware.cs b/CarParkValidationAPI/Authorization/JwtMiddleware.cs index 8607a0a..df7e1ff 100644 --- a/CarParkValidationAPI/Authorization/JwtMiddleware.cs +++ b/CarParkValidationAPI/Authorization/JwtMiddleware.cs @@ -21,13 +21,13 @@ namespace CarParkValidationAPI.Authorization public async Task Invoke(HttpContext context, IUserService userService, IJwtUtils jwtUtils) { var token = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ").Last(); - var userId = jwtUtils.ValidateJwtToken(token); - if (userId != null) + var user = jwtUtils.ValidateJwtToken(token); + if (user != null) { // attach user to context on successful jwt validation //here to put in the real user //TODO if you want to add information for User - // context.Items["User"] = userService.GetById(userId.Value); + context.Items["User"] = user; } await _next(context); diff --git a/CarParkValidationAPI/Authorization/JwtUtils.cs b/CarParkValidationAPI/Authorization/JwtUtils.cs index 8850fc5..842140b 100644 --- a/CarParkValidationAPI/Authorization/JwtUtils.cs +++ b/CarParkValidationAPI/Authorization/JwtUtils.cs @@ -30,7 +30,9 @@ namespace CarParkValidationAPI.Authorization var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(new[] { - new Claim("id", user.Id.ToString()) + new Claim("id", user.Id.ToString()), + new Claim("subject", user.Username) + //add more if we need it } ), @@ -40,8 +42,8 @@ namespace CarParkValidationAPI.Authorization var token = tokenHandler.CreateToken(tokenDescriptor); return tokenHandler.WriteToken(token); } - - public int? ValidateJwtToken(string token) + // get back id and username. in subject + public User? ValidateJwtToken(string token) { if (token == null) return null; @@ -61,10 +63,34 @@ namespace CarParkValidationAPI.Authorization }, out SecurityToken validatedToken); var jwtToken = (JwtSecurityToken)validatedToken; - var userId = int.Parse(jwtToken.Claims.First(x => x.Type == "id").Value); + // var userId = int.Parse(jwtToken.Claims.First(x => x.Type == "id").Value); //old + int userId = 0; + string username = ""; + Claim claim; + for (int i = 0; i< jwtToken.Claims.Count(); i++) + { + claim = jwtToken.Claims.ElementAt(i); + if (claim.Type == "id") + { + userId = int.Parse(claim.Value); + } + else if (claim.Type == "subject") + { + username = claim.Value; + } + + if (!string.IsNullOrEmpty(username) && userId > 0) + { + break; + } + } + + User user = new User(); + user.Id = userId; + user.Username = username; // return user id from JWT token if validation successful - return userId; + return user; } catch { diff --git a/CarParkValidationAPI/Controllers/AdminUserController.cs b/CarParkValidationAPI/Controllers/AdminUserController.cs index dc17d3d..16d8c4a 100644 --- a/CarParkValidationAPI/Controllers/AdminUserController.cs +++ b/CarParkValidationAPI/Controllers/AdminUserController.cs @@ -21,6 +21,10 @@ namespace CarParkValidationAPI.Controllers [HttpPost] public async Task AdminUser([FromBody] AdminUserDto model) { + var currentUser = (User)HttpContext.Items["User"]; + if (null == currentUser) + return Unauthorized(new { message = "Unauthorized" }); + _adminUser.SetCurrentUser(currentUser.Username); var response = await _adminUser.SaveAdminUserAsync(model); return Ok(response); } @@ -47,12 +51,10 @@ namespace CarParkValidationAPI.Controllers [HttpDelete("{id:int}")] public async Task DeleteAdminUser(int id) { - /* - // only admins can access other user records var currentUser = (User)HttpContext.Items["User"]; - if (id != currentUser.Id && currentUser.Role != Role.Admin) + if (null == currentUser) return Unauthorized(new { message = "Unauthorized" }); - */ + _adminUser.SetCurrentUser(currentUser.Username); var retval = await _adminUser.DeleteAdminUserAsync(id); return Ok(retval); } diff --git a/CarParkValidationAPI/Controllers/ConcessionTypeController.cs b/CarParkValidationAPI/Controllers/ConcessionTypeController.cs index efa567e..eaa02da 100644 --- a/CarParkValidationAPI/Controllers/ConcessionTypeController.cs +++ b/CarParkValidationAPI/Controllers/ConcessionTypeController.cs @@ -22,6 +22,10 @@ namespace CarParkValidationAPI.Controllers [HttpPost] public async Task ConcessionType([FromBody] ConcessionTypeDto model) { + var currentUser = (User)HttpContext.Items["User"]; + if (null == currentUser) + return Unauthorized(new { message = "Unauthorized" }); + _concessionType.SetCurrentUser(currentUser.Username); var response = await _concessionType.SaveConcessionTypeAsync(model); return Ok(response); } diff --git a/CarParkValidationAPI/Controllers/ConcessionValidationController.cs b/CarParkValidationAPI/Controllers/ConcessionValidationController.cs index b39d9f7..b483dc3 100644 --- a/CarParkValidationAPI/Controllers/ConcessionValidationController.cs +++ b/CarParkValidationAPI/Controllers/ConcessionValidationController.cs @@ -23,6 +23,7 @@ namespace CarParkValidationAPI.Controllers public ConcessionValidationController(IConcessionValidation concessionValidation, ConcessionValidationReportRepository concesionReportReport) { + _concessionValidationReport = concesionReportReport; _concessionValidation = concessionValidation; } @@ -31,6 +32,10 @@ namespace CarParkValidationAPI.Controllers [HttpPost] public async Task ConcessionValidation([FromBody] ConcessionValidationDto model) { + var currentUser = (User)HttpContext.Items["User"]; + if (null == currentUser) + return Unauthorized(new { message = "Unauthorized" }); + _concessionValidation.SetCurrentUser(currentUser.Username); var response = await _concessionValidation.SaveConcessionValidationAsync(model); return Ok(response); } @@ -72,12 +77,12 @@ namespace CarParkValidationAPI.Controllers [HttpDelete("{id:int}")] public async Task DeleteConcessionValidation(int id) { - /* + // only admins can access other user records var currentUser = (User)HttpContext.Items["User"]; - if (id != currentUser.Id && currentUser.Role != Role.Admin) + //if (id != currentUser.Id && currentUser.Role != Role.Admin) return Unauthorized(new { message = "Unauthorized" }); - */ + // var retval = await _concessionValidation.DeleteConcessionValidationAsync(id); return Ok(retval); } diff --git a/CarParkValidationAPI/Controllers/ValidationPointController.cs b/CarParkValidationAPI/Controllers/ValidationPointController.cs index ff87217..4a5c4f1 100644 --- a/CarParkValidationAPI/Controllers/ValidationPointController.cs +++ b/CarParkValidationAPI/Controllers/ValidationPointController.cs @@ -23,14 +23,17 @@ namespace CarParkValidationAPI.Controllers [HttpPost] public async Task ValidationPoint([FromBody] ValidationPointDto model) { + var currentUser = (User)HttpContext.Items["User"]; + if (null == currentUser) + return Unauthorized(new { message = "Unauthorized" }); + _validationPoint.SetCurrentUser(currentUser.Username); var response = await _validationPoint.SaveValidationPointAsync(model); return Ok(response); } - [HttpGet] public async Task ValidationPoint(bool onlyActive=true) - { + { var retval = await _validationPoint.LoadValidationPointAsync(onlyActive); return Ok(retval); } @@ -50,12 +53,11 @@ namespace CarParkValidationAPI.Controllers [HttpDelete("{id:int}")] public async Task DeleteConcessionType(int id) { - /* // only admins can access other user records var currentUser = (User)HttpContext.Items["User"]; - if (id != currentUser.Id && currentUser.Role != Role.Admin) + if (null == currentUser) return Unauthorized(new { message = "Unauthorized" }); - */ + _validationPoint.SetCurrentUser(currentUser.Username); var retval = await _validationPoint.DeleteValidationPointAsync(id); return Ok(retval); } diff --git a/CarParkValidationAPI/Entities/ApiException.cs b/CarParkValidationAPI/Entities/ApiException.cs new file mode 100644 index 0000000..720648a --- /dev/null +++ b/CarParkValidationAPI/Entities/ApiException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace CarParkValidationAPI.Entities +{ + public class ApiException + { + public ApiException(int statusCode, string message = null, string details = null) + { + StatusCode = statusCode; + Message = message; + Details = details; + } + + public int StatusCode { get; set; } + public string Message { get; set; } + public string Details { get; set; } + } +} diff --git a/CarParkValidationAPI/Helpers/ErrorHandlerMiddleware.cs b/CarParkValidationAPI/Helpers/ErrorHandlerMiddleware.cs index 0dcdefb..12a3ad2 100644 --- a/CarParkValidationAPI/Helpers/ErrorHandlerMiddleware.cs +++ b/CarParkValidationAPI/Helpers/ErrorHandlerMiddleware.cs @@ -1,4 +1,7 @@ +using CarParkValidationAPI.Entities; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Net; @@ -10,30 +13,35 @@ namespace CarParkValidationAPI.Helpers public class ErrorHandlerMiddleware { private readonly RequestDelegate _next; + private readonly ILogger _logger; + private readonly IHostEnvironment _env; - public ErrorHandlerMiddleware(RequestDelegate next) + public ErrorHandlerMiddleware(RequestDelegate next, + ILogger logger, IHostEnvironment env) { _next = next; + _logger = logger; + _env = env; } - public async Task Invoke(HttpContext context) { try { await _next(context); } - catch (Exception error) + catch (Exception ex) { var response = context.Response; response.ContentType = "application/json"; - - switch(error) + _logger.LogError(ex, ex.Message); + /* + switch (ex) { - // case Exception e: + // case Exception e: // // custom application error // response.StatusCode = (int)HttpStatusCode.BadRequest; // break; - case KeyNotFoundException e: + case KeyNotFoundException: // not found error response.StatusCode = (int)HttpStatusCode.NotFound; break; @@ -41,10 +49,24 @@ namespace CarParkValidationAPI.Helpers // unhandled error response.StatusCode = (int)HttpStatusCode.InternalServerError; break; - } + } */ + response.StatusCode = ex switch + { + // case Exception e: + // // custom application error + // response.StatusCode = (int)HttpStatusCode.BadRequest; + // break; + KeyNotFoundException => (int)HttpStatusCode.NotFound,// not found error + _ => (int)HttpStatusCode.InternalServerError,// unhandled error + }; + //response.StatusCode = (int)HttpStatusCode.InternalServerError; + var res = _env.IsDevelopment() ? + new ApiException(response.StatusCode, ex.Message, ex.StackTrace?.ToString()) + : new ApiException(response.StatusCode, "Internal Server Error"); - var result = JsonSerializer.Serialize(new { message = error?.Message }); - await response.WriteAsync(result); + var options = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; + var json = JsonSerializer.Serialize(res, options); + await response.WriteAsync(json); } } } diff --git a/CarParkValidationAPI/Interface/IAdminUser.cs b/CarParkValidationAPI/Interface/IAdminUser.cs index 80a2ff0..35c23d1 100644 --- a/CarParkValidationAPI/Interface/IAdminUser.cs +++ b/CarParkValidationAPI/Interface/IAdminUser.cs @@ -4,15 +4,16 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; - + namespace CarParkValidationAPI.Interface { - public interface IAdminUser + public interface IAdminUser { - Task>> LoadAdminUserAsync(bool OnlyActive); - Task> SaveAdminUserAsync(AdminUserDto item); - Task> LoadAdminUserByIdAsync(int id); - Task> DeleteAdminUserAsync(int id); - } + Task>> LoadAdminUserAsync(bool OnlyActive); + Task> SaveAdminUserAsync(AdminUserDto item); + Task> LoadAdminUserByIdAsync(int id); + Task> DeleteAdminUserAsync(int id); + void SetCurrentUser(string username); + } } diff --git a/CarParkValidationAPI/Interface/IConcessionType.cs b/CarParkValidationAPI/Interface/IConcessionType.cs index 557bd2a..e3f2a02 100644 --- a/CarParkValidationAPI/Interface/IConcessionType.cs +++ b/CarParkValidationAPI/Interface/IConcessionType.cs @@ -4,15 +4,16 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; - + namespace CarParkValidationAPI.Interface { - public interface IConcessionType - { - Task>> LoadConcessionTypeAsync(bool OnlyActive); - Task> SaveConcessionTypeAsync(ConcessionTypeDto item); - Task> LoadConcessionTypeByIdAsync(int id); - Task> DeleteConcessionTypeAsync(int id); - } + public interface IConcessionType + { + Task>> LoadConcessionTypeAsync(bool OnlyActive); + Task> SaveConcessionTypeAsync(ConcessionTypeDto item); + Task> LoadConcessionTypeByIdAsync(int id); + Task> DeleteConcessionTypeAsync(int id); + void SetCurrentUser(string username); + } } diff --git a/CarParkValidationAPI/Interface/IConcessionValidation.cs b/CarParkValidationAPI/Interface/IConcessionValidation.cs index a147fc5..dd81f90 100644 --- a/CarParkValidationAPI/Interface/IConcessionValidation.cs +++ b/CarParkValidationAPI/Interface/IConcessionValidation.cs @@ -17,5 +17,6 @@ namespace CarParkValidationAPI.Interface Task> LoadConcessionValidationByIdAsync(int id); Task> DeleteConcessionValidationAsync(int id); Task> GetReport(DateTime fromDate, DateTime toDate); + void SetCurrentUser(string username); } } diff --git a/CarParkValidationAPI/Interface/IJwtUtils.cs b/CarParkValidationAPI/Interface/IJwtUtils.cs index c899db0..93bd463 100644 --- a/CarParkValidationAPI/Interface/IJwtUtils.cs +++ b/CarParkValidationAPI/Interface/IJwtUtils.cs @@ -11,6 +11,6 @@ namespace CarParkValidationAPI.Interface public interface IJwtUtils { public string GenerateJwtToken(User user); - public int? ValidateJwtToken(string token); + public User? ValidateJwtToken(string token); } } diff --git a/CarParkValidationAPI/Interface/IValidationPoint.cs b/CarParkValidationAPI/Interface/IValidationPoint.cs index 594fb68..68671e0 100644 --- a/CarParkValidationAPI/Interface/IValidationPoint.cs +++ b/CarParkValidationAPI/Interface/IValidationPoint.cs @@ -4,15 +4,16 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; - + namespace CarParkValidationAPI.Interface { - public interface IValidationPoint - { - Task>> LoadValidationPointAsync(bool OnlyActive); - Task> SaveValidationPointAsync(ValidationPointDto item); - Task> LoadValidationPointByIdAsync(int id); - Task> DeleteValidationPointAsync(int id); - } + public interface IValidationPoint + { + Task>> LoadValidationPointAsync(bool OnlyActive); + Task> SaveValidationPointAsync(ValidationPointDto item); + Task> LoadValidationPointByIdAsync(int id); + Task> DeleteValidationPointAsync(int id); + void SetCurrentUser(string username); + } } diff --git a/CarParkValidationAPI/Models/AdminUser.cs b/CarParkValidationAPI/Models/AdminUser.cs index 2118aad..f1db3be 100644 --- a/CarParkValidationAPI/Models/AdminUser.cs +++ b/CarParkValidationAPI/Models/AdminUser.cs @@ -56,6 +56,8 @@ namespace CarParkValidationAPI.Models public bool Active { get; set; } public AdminRole RoleType { get; set; } + public DateTime? LastModified { get; set; } + public string? LastModifiedId { get; set; } #endregion } } diff --git a/CarParkValidationAPI/Models/ConcessionType.cs b/CarParkValidationAPI/Models/ConcessionType.cs index 29a1ccb..762473b 100644 --- a/CarParkValidationAPI/Models/ConcessionType.cs +++ b/CarParkValidationAPI/Models/ConcessionType.cs @@ -21,6 +21,8 @@ namespace CarParkValidationAPI.Models public string ConcessionDisplay { get; set; } public bool Active { get; set; } + public DateTime? LastModified { get; set; } + public string? LastModifiedId { get; set; } #endregion } } diff --git a/CarParkValidationAPI/Models/ConcessionValidation.cs b/CarParkValidationAPI/Models/ConcessionValidation.cs index 0dec228..2eed864 100644 --- a/CarParkValidationAPI/Models/ConcessionValidation.cs +++ b/CarParkValidationAPI/Models/ConcessionValidation.cs @@ -45,6 +45,11 @@ namespace CarParkValidationAPI.Models public string StaffFirstName { get; set; } public string StaffLastName { get; set; } public string StaffEmail { get; set; } + public DateTime? CreatedDate { get; set; } + public string? CreatedId { get; set; } + public DateTime? LastModified { get; set; } + public string? LastModifiedId{ get; set; } + #endregion } } diff --git a/CarParkValidationAPI/Models/ValidationPoint.cs b/CarParkValidationAPI/Models/ValidationPoint.cs index 8e23cf6..d9a3915 100644 --- a/CarParkValidationAPI/Models/ValidationPoint.cs +++ b/CarParkValidationAPI/Models/ValidationPoint.cs @@ -19,7 +19,8 @@ namespace CarParkValidationAPI.Models public string DisplayName { get; set; } public bool Active { get; set; } - - + + public DateTime? LastModified { get; set; } + public string? LastModifiedId { get; set; } } } diff --git a/CarParkValidationAPI/Repository/AdminUserFakeRepository.cs b/CarParkValidationAPI/Repository/AdminUserFakeRepository.cs index 66c686d..2074509 100644 --- a/CarParkValidationAPI/Repository/AdminUserFakeRepository.cs +++ b/CarParkValidationAPI/Repository/AdminUserFakeRepository.cs @@ -18,6 +18,7 @@ namespace CarParkValidationAPI.Repository public class AdminUserFakeRepository : IAdminUser { private DataContext _context; + private string _currentUser = ""; List _resultList = new List(); private readonly AppSettings _appSettings; @@ -31,7 +32,11 @@ namespace CarParkValidationAPI.Repository _appSettings = appSettings.Value; } - private AdminUserDto FillAdminUserDto(AdminUser model) + public void SetCurrentUser(string username) + { + _currentUser = username; + } + private AdminUserDto FillAdminUserDto(AdminUser model) { AdminUserDto dto = new AdminUserDto(); dto.Id = model.UserID; @@ -46,7 +51,6 @@ namespace CarParkValidationAPI.Repository private AdminUser FillAdminUser(AdminUserDto dto, AdminUser model) { - model.UserID = dto.Id; model.Name = dto.Name; model.RoleType = dto.RoleType; diff --git a/CarParkValidationAPI/Repository/AdminUserRepository.cs b/CarParkValidationAPI/Repository/AdminUserRepository.cs index 94dcafa..b1a2346 100644 --- a/CarParkValidationAPI/Repository/AdminUserRepository.cs +++ b/CarParkValidationAPI/Repository/AdminUserRepository.cs @@ -15,24 +15,27 @@ using System; namespace CarParkValidationAPI.Repository { - public class AdminUserRepository : IAdminUser + public class AdminUserRepository : IAdminUser { - private DataContext _context; - + private DataContext _context; + private string _currentUser = ""; private readonly AppSettings _appSettings; - public AdminUserRepository( - DataContext context, + public AdminUserRepository( + DataContext context, - IOptions appSettings) - { - _context = context; - _appSettings = appSettings.Value; - } - - private AdminUserDto FillAdminUserDto(AdminUser model) - { + IOptions appSettings) + { + _context = context; + _appSettings = appSettings.Value; + } + public void SetCurrentUser(string username) + { + _currentUser = username; + } + private AdminUserDto FillAdminUserDto(AdminUser model) + { AdminUserDto dto = new AdminUserDto(); dto.Id = model.UserID; dto.Name = model.Name; @@ -42,7 +45,7 @@ namespace CarParkValidationAPI.Repository dto.AddedBy = model.AddedBy; dto.AddedOn = model.AddedOn; return dto; - } + } private AdminUser FillAdminUser(AdminUserDto dto, AdminUser model) { @@ -58,7 +61,7 @@ namespace CarParkValidationAPI.Repository } public async Task>> LoadAdminUserAsync(bool onlyActive) - { + { List resultList = new List(); int statuscode = 0; string error = ""; @@ -71,10 +74,10 @@ namespace CarParkValidationAPI.Repository AdminUser user; for (int i = 0; i < list.Count; i++) { - user = list[i]; + user = list[i]; dto = FillAdminUserDto(user); resultList.Add(dto); - + } statuscode = 1; } @@ -98,22 +101,22 @@ namespace CarParkValidationAPI.Repository int statuscode = 0; string error = ""; try - { + { if (id > 0) - { + { AdminUser model = await _context.AdminUsers.FindAsync(id); result = FillAdminUserDto(model); statuscode = 1; - } - } + } + } catch (Exception ex) - { + { error = ex.ToString(); statuscode = 0; throw ex; - } - - return new ResultModel() + } + + return new ResultModel() { Data = result, StatusCode = statuscode, @@ -126,16 +129,18 @@ namespace CarParkValidationAPI.Repository int statuscode = 0; string error = ""; try - { + { AdminUser model; if (item.Id > 0) - { + { model = await _context.AdminUsers.FindAsync(item.Id); model = FillAdminUser(item, model); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; await _context.SaveChangesAsync(); - } + } else - { + { model = new AdminUser(); model = FillAdminUser(item, model); _context.AdminUsers.Add(model); @@ -143,15 +148,15 @@ namespace CarParkValidationAPI.Repository } result = 1; statuscode = 1; - } + } catch (Exception ex) - { + { result = -1; error = ex.ToString(); statuscode = 0; throw ex; - } - + } + return new ResultModel() { Data = result, @@ -159,7 +164,7 @@ namespace CarParkValidationAPI.Repository Message = error }; } - + public async Task> DeleteAdminUserAsync(int id) { bool result = true; @@ -169,9 +174,11 @@ namespace CarParkValidationAPI.Repository { if (id > 0) { - AdminUser model = await _context.AdminUsers.FindAsync(id); - model.Active = false; - await _context.SaveChangesAsync(); + AdminUser model = await _context.AdminUsers.FindAsync(id); + model.Active = false; + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; + await _context.SaveChangesAsync(); statuscode = 1; } } @@ -182,7 +189,7 @@ namespace CarParkValidationAPI.Repository result = false; throw ex; } - + return new ResultModel() { Data = result, diff --git a/CarParkValidationAPI/Repository/ConcessionTypeRepository.cs b/CarParkValidationAPI/Repository/ConcessionTypeRepository.cs index b046dae..e37a3cc 100644 --- a/CarParkValidationAPI/Repository/ConcessionTypeRepository.cs +++ b/CarParkValidationAPI/Repository/ConcessionTypeRepository.cs @@ -18,8 +18,8 @@ namespace CarParkValidationAPI.Repository public class ConcessionTypeRepository : IConcessionType { private DataContext _context; - - private readonly AppSettings _appSettings; + private string _currentUser = ""; + private readonly AppSettings _appSettings; public ConcessionTypeRepository( DataContext context, @@ -29,7 +29,10 @@ namespace CarParkValidationAPI.Repository _context = context; _appSettings = appSettings.Value; } - + public void SetCurrentUser(string username) + { + _currentUser = username; + } private ConcessionTypeDto FillConcessionTypeDto(ConcessionType model) { ConcessionTypeDto dto = new ConcessionTypeDto(); @@ -63,6 +66,7 @@ namespace CarParkValidationAPI.Repository Active = x.Active }).ToListAsync(); statuscode = 1; + result.Sort((x, y) => x.Description.CompareTo(y.Description)); } catch (Exception ex) { @@ -118,6 +122,8 @@ namespace CarParkValidationAPI.Repository { model = await _context.ConcessionTypes.FindAsync(item.Id); model = FillConcessionType(item, model); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; await _context.SaveChangesAsync(); result = item.Id; } @@ -125,6 +131,8 @@ namespace CarParkValidationAPI.Repository { model = new ConcessionType(); model = FillConcessionType(item, model); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; _context.ConcessionTypes.Add(model); var id = await _context.SaveChangesAsync(); result = id; diff --git a/CarParkValidationAPI/Repository/ConcessionValidationRepository.cs b/CarParkValidationAPI/Repository/ConcessionValidationRepository.cs index 112115b..9e2e581 100644 --- a/CarParkValidationAPI/Repository/ConcessionValidationRepository.cs +++ b/CarParkValidationAPI/Repository/ConcessionValidationRepository.cs @@ -18,7 +18,7 @@ namespace CarParkValidationAPI.Repository public class ConcessionValidationRepository : IConcessionValidation { private DataContext _context; - + private string _currentUser = ""; private readonly AppSettings _appSettings; public ConcessionValidationRepository( @@ -29,6 +29,10 @@ namespace CarParkValidationAPI.Repository _appSettings = appSettings.Value; } + public void SetCurrentUser(string username) + { + _currentUser = username; + } private ConcessionValidationDto FillConcessionValidationDto(ConcessionValidation model) { ConcessionValidationDto dto = new ConcessionValidationDto(); @@ -167,7 +171,7 @@ namespace CarParkValidationAPI.Repository { var anyRecord = await _context.SelectCheckConcessionValidationAsync(currentDate.ToLocalTime().Date, concessionCard, staffLinkNo); - if (anyRecord.Count > 0) + if (anyRecord.Count > 1) { result = -1; } @@ -267,6 +271,7 @@ namespace CarParkValidationAPI.Repository int result = default(int); int statuscode = 0; string error = ""; + //_currentUser = item.StafflinkNo; try { ConcessionValidation model; @@ -274,12 +279,18 @@ namespace CarParkValidationAPI.Repository { model = await _context.ConcessionValidations.FindAsync(item.Id); model = FillConcessionValidation(item, model); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; result = await _context.SaveChangesAsync(); } else { model = new ConcessionValidation(); model = FillConcessionValidation(item, model); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; + model.CreatedDate = DateTime.Now; + model.CreatedId = _currentUser; _context.ConcessionValidations.Add(model); result = await _context.SaveChangesAsync(); } @@ -312,8 +323,10 @@ namespace CarParkValidationAPI.Repository if (id > 0) { ConcessionValidation model = await _context.ConcessionValidations.FindAsync(id); - // model.Active = false; - _context.ConcessionValidations.Remove(model); + model.Active = false; + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; + //_context.ConcessionValidations.Remove(model); await _context.SaveChangesAsync(); statuscode = 1; } diff --git a/CarParkValidationAPI/Repository/LookupCodeRepository.cs b/CarParkValidationAPI/Repository/LookupCodeRepository.cs index cfaf303..8b7eb8c 100644 --- a/CarParkValidationAPI/Repository/LookupCodeRepository.cs +++ b/CarParkValidationAPI/Repository/LookupCodeRepository.cs @@ -45,6 +45,7 @@ namespace CarParkValidationAPI.Repository }).ToListAsync(); statuscode = 1; + result.Sort((x,y) => x.Description.CompareTo(y.Description)); } catch (Exception ex) { @@ -72,6 +73,7 @@ namespace CarParkValidationAPI.Repository Id = x.ValidationPointID, Description = x.Description }).ToListAsync(); + result.Sort((x, y) => x.Description.CompareTo(y.Description)); statuscode = 1; } catch (Exception ex) diff --git a/CarParkValidationAPI/Repository/ValidationPointFackRepository.cs b/CarParkValidationAPI/Repository/ValidationPointFackRepository.cs index fcc344b..7e1fa79 100644 --- a/CarParkValidationAPI/Repository/ValidationPointFackRepository.cs +++ b/CarParkValidationAPI/Repository/ValidationPointFackRepository.cs @@ -16,7 +16,7 @@ namespace CarParkValidationAPI.Repository private DataContext _context; private readonly AppSettings _appSettings; - + private string _currentUser = ""; private List _list = new List(); public ValidationPointFakeRepository( @@ -27,7 +27,10 @@ namespace CarParkValidationAPI.Repository _context = context; _appSettings = appSettings.Value; } - + public void SetCurrentUser(string username) + { + _currentUser = username; + } private ValidationPointDto FillValidationDto(ValidationPoint item) { ValidationPointDto dto = new ValidationPointDto(); diff --git a/CarParkValidationAPI/Repository/ValidationPointRepository.cs b/CarParkValidationAPI/Repository/ValidationPointRepository.cs index f1a6299..5e7561b 100644 --- a/CarParkValidationAPI/Repository/ValidationPointRepository.cs +++ b/CarParkValidationAPI/Repository/ValidationPointRepository.cs @@ -16,7 +16,7 @@ namespace CarParkValidationAPI.Repository private DataContext _context; private readonly AppSettings _appSettings; - + private string _currentUser = ""; private List _list = new List(); public ValidationPointRepository( @@ -27,7 +27,10 @@ namespace CarParkValidationAPI.Repository _context = context; _appSettings = appSettings.Value; } - + public void SetCurrentUser(string username) + { + _currentUser = username; + } private ValidationPointDto FillValidationDto(ValidationPoint item) { ValidationPointDto dto = new ValidationPointDto(); @@ -38,7 +41,7 @@ namespace CarParkValidationAPI.Repository return dto; } - private ValidationPoint FillValidationModel(ValidationPointDto item, ValidationPoint model) { + private ValidationPoint FillValidationModel(ValidationPointDto item, ValidationPoint model) { model.Active = item.Active; model.Description = item.Description; @@ -61,7 +64,7 @@ namespace CarParkValidationAPI.Repository dto = FillValidationDto(it[i]); _list.Add(dto); } - + _list.Sort((x, y) => x.Description.CompareTo(y.Description)); statuscode = 1; } @@ -116,12 +119,16 @@ namespace CarParkValidationAPI.Repository { model = await _context.Validations.FindAsync(item.Id); model = FillValidationModel(item, model); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; await _context.SaveChangesAsync(); result = item.Id; } else //new record { model = new ValidationPoint(); + model.LastModified = DateTime.Now; + model.LastModifiedId = _currentUser; model = FillValidationModel(item, model); _context.Validations.Add(model); var id = await _context.SaveChangesAsync(); diff --git a/CarParkValidationAPI/Startup.cs b/CarParkValidationAPI/Startup.cs index 99dc7a1..7ddb5f6 100644 --- a/CarParkValidationAPI/Startup.cs +++ b/CarParkValidationAPI/Startup.cs @@ -1,6 +1,7 @@ using CarParkValidationAPI.Authorization; using CarParkValidationAPI.Datas; using CarParkValidationAPI.Entities; +using CarParkValidationAPI.Helpers; using CarParkValidationAPI.Interface; using CarParkValidationAPI.Models; using CarParkValidationAPI.Repository; @@ -97,15 +98,15 @@ namespace CarParkValidationAPI // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext context) { - + /* if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); - } + */ + app.UseMiddleware(); // use this exception app.UseSwagger(); - app.UseSwaggerUI(c => { c.DocExpansion(Swashbuckle.AspNetCore.SwaggerUI.DocExpansion.None); @@ -133,9 +134,8 @@ namespace CarParkValidationAPI /* if add angular under wwwroot then two line below needed*/ /***************************/ - // app.UseDefaultFiles(); //it will use index.html <------------------ - // app.UseStaticFiles(); //it for angular <------------------------- - + // app.UseDefaultFiles(); //it will use index.html <------------------ + // app.UseStaticFiles(); //it for angular <------------------------- /***************************/ app.UseEndpoints(endpoints =>