From ad9694f85dff7db520a013133f9f6dcbb5f2b2f3 Mon Sep 17 00:00:00 2001 From: dibakor Date: Tue, 7 Jul 2026 12:15:19 +0600 Subject: [PATCH] update mobile response base format --- .../Integrations/IntegrationAuthRequest.cs | 8 ++ .../Integrations/IntegrationAuthResponse.cs | 7 ++ .../Responses/MobileApp/AppUserResponse.cs | 6 +- .../Responses/ResponseBase.cs | 16 +++- .../Mobile/MobileAuthController.cs | 87 +++++++------------ 5 files changed, 62 insertions(+), 62 deletions(-) diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/Integrations/IntegrationAuthRequest.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/Integrations/IntegrationAuthRequest.cs index 6958975..643f40d 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/Integrations/IntegrationAuthRequest.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Requests/Integrations/IntegrationAuthRequest.cs @@ -1,5 +1,6 @@ using OnlineSalesAutoCrop.CoreAPI.Models.Objects.Systems; using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Common; +using System.ComponentModel.DataAnnotations; namespace OnlineSalesAutoCrop.CoreAPI.Models.Requests.Integrations; @@ -11,23 +12,30 @@ public class IntegrationLoginRequest : AuthLoginRequest public class IntegrationRefreshTokenRequest { + [Required] public string RefreshToken { get; set; } } public class InsertRefreshTokenRequest : RefreshToken { + [Required] public string RefreshToken { get; set; } } public class RevokedRefreshTokenRequest { + [Required] public string RefreshToken { get; set; } + [Required] public int UserId { get; set; } } public class GenerateRefreshTokenRequest { + [Required] public int UserId { get; set; } + [Required] public string IpAddress { get; set; } + [Required] public string RawRefreshToken { get; set; } } \ No newline at end of file diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/Integrations/IntegrationAuthResponse.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/Integrations/IntegrationAuthResponse.cs index 41e1a73..27c4adb 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/Integrations/IntegrationAuthResponse.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/Integrations/IntegrationAuthResponse.cs @@ -11,12 +11,19 @@ public class IntegrationLoginResponse : ResponseBase public DateTime AccessTokenExpiry { get; set; } } + public class IntegrationRrefreshTokenResponse : ResponseBase { public string AccessToken { get; set; } = string.Empty; public string RefreshToken { get; set; } = string.Empty; } +public class MobileRrefreshTokenResponse +{ + public string AccessToken { get; set; } = string.Empty; + public string RefreshToken { get; set; } = string.Empty; +} + public class RefreshTokenResponse : ResponseBase { public int UserId { get; set; } diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/AppUserResponse.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/AppUserResponse.cs index e5fe919..ca6222a 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/AppUserResponse.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/MobileApp/AppUserResponse.cs @@ -4,7 +4,7 @@ using System; namespace OnlineSalesAutoCrop.CoreAPI.Models.Responses.MobileApp; -public class AppAuthUserResponse : ResponseBase +public class AppAuthUserResponse { public int UserId { get; set; } public string LoginId { get; set; } @@ -26,14 +26,14 @@ public class AppAuthUserResponse : ResponseBase } -public class AuthLogoutResponse : ResponseBase +public class AuthLogoutResponse { public int UserId { get; set; } public string LoginId { get; set; } public bool IsSuccess { get; set; } } -public class AppChangePasswordResponse : ResponseBase +public class AppChangePasswordResponse { public int UserId { get; set; } public string LoginId { get; set; } diff --git a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/ResponseBase.cs b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/ResponseBase.cs index 69d355b..e830304 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/ResponseBase.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI.Models/Responses/ResponseBase.cs @@ -12,7 +12,21 @@ namespace OnlineSalesAutoCrop.CoreAPI.Models.Responses public List ReturnMessage { get; set; } = []; } - public abstract class TotalRowsResponseBase : ResponseBase + public class MobileResponseBase + { + public int ReturnStatus { get; set; } + public List ReturnMessage { get; set; } = []; + public T? Data { get; set; } + + public static MobileResponseBase Success(T data, string message = "Success") => + new() { ReturnStatus = 200, ReturnMessage = [message], Data = data }; + + public static MobileResponseBase Failure(string message, int status = 400 ) => + new() { ReturnStatus = status, ReturnMessage = [message], Data = default }; + } + + + public abstract class TotalRowsResponseBase : ResponseBase { public int TotalRows { get; set; } } diff --git a/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileAuthController.cs b/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileAuthController.cs index d2a291b..35bb635 100644 --- a/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileAuthController.cs +++ b/Api/OnlineSalesAutoCrop.CoreAPI/Controllers/Mobile/MobileAuthController.cs @@ -12,6 +12,7 @@ using OnlineSalesAutoCrop.CoreAPI.Models.Objects.Systems; using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Common; using OnlineSalesAutoCrop.CoreAPI.Models.Requests.Integrations; using OnlineSalesAutoCrop.CoreAPI.Models.Requests.MobileApp; +using OnlineSalesAutoCrop.CoreAPI.Models.Responses; using OnlineSalesAutoCrop.CoreAPI.Models.Responses.Integrations; using OnlineSalesAutoCrop.CoreAPI.Models.Responses.MobileApp; using OnlineSalesAutoCrop.CoreAPI.Models.Responses.Systems; @@ -74,16 +75,14 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers if (string.IsNullOrEmpty(request.LoginId)) { - loginReponse.ReturnStatus = StatusCodes.Status417ExpectationFailed; - loginReponse.ReturnMessage.Add("Login ID is required."); - return StatusCode(StatusCodes.Status417ExpectationFailed, loginReponse); + string message = "Login ID is required."; + return BadRequest(MobileResponseBase.Failure(message, StatusCodes.Status417ExpectationFailed)); } if (string.IsNullOrEmpty(request.Password)) { - loginReponse.ReturnStatus = StatusCodes.Status417ExpectationFailed; - loginReponse.ReturnMessage.Add("Password is required."); - return StatusCode(StatusCodes.Status417ExpectationFailed, loginReponse); + string message = "Password is required."; + return BadRequest(MobileResponseBase.Failure(message, StatusCodes.Status417ExpectationFailed)); } @@ -104,38 +103,29 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers if (loginReponse == null || loginReponse.UserId == 0) { - loginReponse.LoginStatus = EnumLoginStatus.Error; - loginReponse.ReturnStatus = StatusCodes.Status403Forbidden; - loginReponse.ReturnMessage.Add(checkPwd ? "Login ID/Password is invalid." : "You are not Authorized to login into the System"); - return StatusCode(StatusCodes.Status417ExpectationFailed, loginReponse); + string message = "Login ID/Password is invalid.\" : \"You are not Authorized to login into the System."; + return Unauthorized(MobileResponseBase.Failure(message, StatusCodes.Status403Forbidden)); } + if (loginReponse.LoginStatus == EnumLoginStatus.Unsuccessful) { - loginReponse.LoginStatus = loginReponse.LoginStatus; - loginReponse.ReturnStatus = StatusCodes.Status403Forbidden; - loginReponse.ReturnMessage.Add(checkPwd ? $"Login ID/Password is invalid for {request.LoginId}." : "You are not Authorized to login into the System"); - return StatusCode(StatusCodes.Status417ExpectationFailed, loginReponse); + string message = checkPwd ? $"Login ID/Password is invalid for {request.LoginId}." : "You are not Authorized to login into the System"; + return Unauthorized(MobileResponseBase.Failure(message, StatusCodes.Status403Forbidden)); } - if (loginReponse.IsLocked) { - loginReponse.LoginStatus = loginReponse.LoginStatus; - loginReponse.ReturnStatus = StatusCodes.Status403Forbidden; - loginReponse.ReturnMessage.Add($"Your Account is locked . Please try again after few minutes"); - return StatusCode(StatusCodes.Status417ExpectationFailed, loginReponse); + string message =$"Your Account is locked . Please try again after few minutes"; + return Unauthorized(MobileResponseBase.Failure(message, StatusCodes.Status403Forbidden)); } if (!loginReponse.IsAuthorized ) { - loginReponse.LoginStatus = loginReponse.LoginStatus; - loginReponse.ReturnStatus = StatusCodes.Status403Forbidden; - loginReponse.ReturnMessage.Add("You are not Authorized to Login into the System, Please contact with System Administrator."); - return StatusCode(StatusCodes.Status417ExpectationFailed, loginReponse); + string message = $"You are not Authorized to Login into the System, Please contact with System Administrator."; + return Unauthorized(MobileResponseBase.Failure(message, StatusCodes.Status403Forbidden)); } - loginReponse.ReturnStatus = StatusCodes.Status200OK; string pwdSecretKey = GlobalFunctions.ConvertFromBase64String(_appSettings.PwdSecretKey); string userPwd = Ease.NetCore.Utility.Global.CipherFunctions.EncryptByAES(privateKey: pwdSecretKey, publicKey: pwdSecretKey, data: request.Password); byte[] key = Encoding.ASCII.GetBytes(_appSettings.JwtCryptoKey); @@ -168,29 +158,25 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers //because cookie can not store more than 4KB data and we are storing this token in cookie for authentication if (userToken.Length >= 4096) //4Kb { - loginReponse.LoginStatus = loginReponse.LoginStatus; - loginReponse.ReturnStatus = StatusCodes.Status431RequestHeaderFieldsTooLarge; - loginReponse.ReturnMessage.Add("Authentication Token is too large for cookie."); - return StatusCode(StatusCodes.Status431RequestHeaderFieldsTooLarge, loginReponse); + string message = $"Authentication Token is too large for cookie."; + return StatusCode(StatusCodes.Status431RequestHeaderFieldsTooLarge, MobileResponseBase.Failure(message, StatusCodes.Status431RequestHeaderFieldsTooLarge)); } - loginReponse.ReturnStatus = loginReponse.ReturnStatus; - loginReponse.ReturnMessage = loginReponse.ReturnMessage; + loginReponse.LoginId = loginReponse.LoginId; loginReponse.AccessToken = userToken; loginReponse.RefreshToken = refreshToken.RefreshToken; loginReponse.AccessTokenExpiryTime = DateTime.UtcNow.AddHours(12); loginReponse.RefreshTokenExpiryTime = refreshToken.ExpireTime; - return StatusCode(StatusCodes.Status200OK, loginReponse); + return Ok(MobileResponseBase.Success(loginReponse)); } catch (Exception ex) { string msg = $"{request?.LoginId}~{ipAddress}"; _logger.LogError(exception: ex, message: msg); - loginReponse.ReturnStatus = StatusCodes.Status500InternalServerError; - loginReponse.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError, loginReponse); + string mesgae= ex.InnerException != null ? ex.InnerException.Message : ex.Message; + return StatusCode(StatusCodes.Status500InternalServerError, MobileResponseBase.Failure(mesgae, StatusCodes.Status500InternalServerError)); } } @@ -206,10 +192,10 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers [HttpPost("RefreshToken")] [AllowAnonymous] [IgnoreAntiforgeryToken] - [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IntegrationLoginResponse))] + [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(MobileRrefreshTokenResponse))] public async Task GetRefreshToken([FromBody] IntegrationRefreshTokenRequest request) { - IntegrationRrefreshTokenResponse response = new(); + MobileRrefreshTokenResponse response = new(); try { var userRefreshToken = await _refreshTokenService.GetUserByRefreshTokenAsync(request.RefreshToken); @@ -217,9 +203,7 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers { string msg = $"Refresh Token is not active: {request?.RefreshToken}"; _logger.LogError(message: msg); - response.ReturnStatus = StatusCodes.Status401Unauthorized; - response.ReturnMessage.Add(msg); - return StatusCode(StatusCodes.Status401Unauthorized, response); + return Unauthorized( MobileResponseBase.Failure(msg, StatusCodes.Status401Unauthorized)); } byte[] key = Encoding.ASCII.GetBytes(_appSettings.JwtCryptoKey); @@ -246,16 +230,13 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers response.AccessToken = userToken; response.RefreshToken = refreshToken; - return StatusCode(StatusCodes.Status200OK, response); - + return Ok(MobileResponseBase.Success(response)); } catch (Exception ex) { string msg = $"{request?.RefreshToken}"; _logger.LogError(exception: ex, message: msg); - response.ReturnStatus = StatusCodes.Status500InternalServerError; - response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError, response); + return StatusCode(StatusCodes.Status500InternalServerError, MobileResponseBase.Failure(ex.InnerException != null ? ex.InnerException.Message : ex.Message, StatusCodes.Status500InternalServerError)); } } @@ -279,19 +260,14 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers { string ipAddress = Request.HttpContext.GetIpAddress(); response = await _service.LogoutAsync(request, ipAddress); - - response.ReturnStatus = StatusCodes.Status200OK; - response.ReturnMessage.Add("Successfully Logout"); - return StatusCode(StatusCodes.Status200OK, response); + return Ok(MobileResponseBase.Success(response, "Successfully Logout")); } catch (Exception ex) { string msg = $"Exception occur on logout {request?.LoginId}"; _logger.LogError(exception: ex, message: msg); - response.ReturnStatus = StatusCodes.Status500InternalServerError; - response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError, response); + return StatusCode(StatusCodes.Status500InternalServerError, MobileResponseBase.Failure(ex.InnerException != null ? ex.InnerException.Message : ex.Message, StatusCodes.Status500InternalServerError)); } } @@ -315,19 +291,14 @@ namespace OnlineSalesAutoCrop.CoreAPI.Controllers { string ipAddress = Request.HttpContext.GetIpAddress(); response = await _service.ChangePasswordAsync(request, ipAddress); - - response.ReturnStatus = StatusCodes.Status200OK; - response.ReturnMessage.Add("Successfully Changed the Password"); - return StatusCode(StatusCodes.Status200OK, response); + return Ok(MobileResponseBase.Success(response, "Successfully Changed the Password")); } catch (Exception ex) { string msg = $"Exception occur on logout {request?.LoginId}"; _logger.LogError(exception: ex, message: msg); - response.ReturnStatus = StatusCodes.Status500InternalServerError; - response.ReturnMessage.Add(ex.InnerException != null ? ex.InnerException.Message : ex.Message); - return StatusCode(StatusCodes.Status500InternalServerError, response); + return StatusCode(StatusCodes.Status500InternalServerError, MobileResponseBase.Failure(ex.InnerException != null ? ex.InnerException.Message : ex.Message, StatusCodes.Status500InternalServerError)); } } }