From f7b2e3ecbcb27bb3fdf2156cb77bac6b7cb9c7e6 Mon Sep 17 00:00:00 2001 From: Hadi Khazaee Asl Date: Fri, 18 Jul 2025 04:25:17 +0330 Subject: [PATCH] last ... --- Constants/XApiAccountEndpoint.cs | 4 +- Interfaces/IXIdentityProvider.cs | 23 ++- Partial/XIdentityProvider+Open.cs | 269 ++++++++++++++++++++++++------ 3 files changed, 241 insertions(+), 55 deletions(-) diff --git a/Constants/XApiAccountEndpoint.cs b/Constants/XApiAccountEndpoint.cs index 3879764..e9819f3 100644 --- a/Constants/XApiAccountEndpoint.cs +++ b/Constants/XApiAccountEndpoint.cs @@ -198,8 +198,8 @@ namespace xIdentityService.Constants // #region Open Actions ... - [StringValue("Account/GetUserInfo")] - GetUserInfo, + [StringValue("Open")] + Open, #endregion } } \ No newline at end of file diff --git a/Interfaces/IXIdentityProvider.cs b/Interfaces/IXIdentityProvider.cs index e9c160f..ffceec9 100644 --- a/Interfaces/IXIdentityProvider.cs +++ b/Interfaces/IXIdentityProvider.cs @@ -285,12 +285,33 @@ namespace xIdentityService.Interfaces // #region Open Actions ... + // + Task OpenGet( + XOpenActionInnerDto model + ); + + // Task GetUserInfo( XDeviceDto device, string userSelectByParam ); - Task GetUserInfo(XOpenActionInnerDto dto); Task GetUserInfo( + XOpenActionInnerDto dto + ); + Task GetUserInfo( + string token, + string request + ); + + // + Task> GetUserInfos( + XDeviceDto device, + string ids + ); + Task> GetUserInfos( + XOpenActionInnerDto dto + ); + Task> GetUserInfos( string token, string request ); diff --git a/Partial/XIdentityProvider+Open.cs b/Partial/XIdentityProvider+Open.cs index f4697d9..99261af 100644 --- a/Partial/XIdentityProvider+Open.cs +++ b/Partial/XIdentityProvider+Open.cs @@ -15,6 +15,114 @@ namespace xIdentityService.Providers { public partial class XIdentityProvider { + // + #region OpenGet ... + public async Task OpenGet( + XOpenActionInnerDto model + ) + { + // + // Validate Args ... + await validationProvider + .GroupValidationBuilder() + .AddNotNull(model) + .AddNotEmpty(model.Token) + .AddNotEmpty(model.Payload) + .ValidateGroupAsync(); + + // + var result = await OpenGet( + token: model.Token, + actionRequest: model.Payload + ); + + // + return result; + } + public async Task OpenGet( + string token, + string actionRequest + ) + { + // + // Validate Args ... + await validationProvider + .GroupValidationBuilder() + .AddNotEmpty(token) + .AddNotEmpty(actionRequest) + .ValidateGroupAsync(); + + // + // Retrieve Rest Client ... + var client = GetRestClient(); + + // + // Prepare Rest Request ... + var request = GetRestRequet( + XApiAccountEndpoint.Open, + headers: new Dictionary + { + { XAuthentication.TOKEN, token} + }, + queryStrings: new Dictionary + { + { XParam.XRequest.GetStringValue(), actionRequest } + } + ); + + // + // Run Request and Retrieve Response ... + var response = await RunRestRequestByResponse( + client, + request, + XHttpMethod.GET + ); + + // + // Now we Have to Validate the recieved response ... + + // + // Read token from Headers ... + var responseToken = response.Response.Headers + .First(h => h.Name == XAuthentication.TOKEN).Value.ToString(); + if (responseToken.IsNullOrEmpty()) + { + XException.ActionFailed.Throw(); + } + + // + // Decript Recieve Response ... + var responseJson = SecurityProvider.Decrypt(response.Model); + if (responseJson.IsNullOrEmpty()) + { + XException.ActionFailed.Throw(); + } + + // + var result = new XOpenActionInnerDto + { + Token = responseToken, + Payload = responseJson + }; + + // + // Retrieve Model and Validate it ... + var responseModel = responseJson.FromJSON(); + if (responseModel.IsNull() || + responseModel.Payload.IsNullOrEmpty() || + responseToken != responseModel.Checksum || + responseModel.Timestamp.FromTimestamp().IsExPired()) + { + XException.ActionFailed.Throw(); + } + + // + return result; + } + #endregion + + // + #region GetUserInfo ... public async Task GetUserInfo( XDeviceDto device, string userSelectByParam @@ -32,7 +140,7 @@ namespace xIdentityService.Providers Device = device, Payload = userSelectByParam, Action = XOpenActions.GetUserInfo, - Timestamp = DateTime.UtcNow.AddMinutes(5).ToTimestamp() + Timestamp = DateTime.UtcNow.AddMinutes(5).ToTimestamp().ToString() }; if (!opaModel.Validate()) { @@ -56,7 +164,9 @@ namespace xIdentityService.Providers ); } - public async Task GetUserInfo(XOpenActionInnerDto dto) + public async Task GetUserInfo( + XOpenActionInnerDto dto + ) { // return await GetUserInfo( @@ -76,68 +186,123 @@ namespace xIdentityService.Providers validationProvider.NotEmpty(request); // - // Retrieve Rest Client ... - var client = GetRestClient(); - - // - // Prepare Rest Request ... - var requestU = GetRestRequet( - XApiAccountEndpoint.GetUserInfo, - headers: new Dictionary - { - { XAuthentication.TOKEN, token} - }, - queryStrings: new Dictionary - { - { XParam.XRequest.GetStringValue(), request } - } + // Retrieve and Validate Response ... + var response = await OpenGet( + token: token, + actionRequest: request ); - - // - var response = await RunRestRequestByResponse( - client, - requestU, - XHttpMethod.GET - ); - - // - // Now we Have to Validate the recieved response ... - - // - // Read token from Headers ... - - // - var responseToken = response.Response.Headers.First(h => h.Name == XAuthentication.TOKEN).ToString(); - if (responseToken.IsNullOrEmpty()) + if (response.IsNull() || + response.Token.IsNullOrEmpty() || + response.Payload.IsNullOrEmpty()) { XException.ActionFailed.Throw(); } // - var responseJson = SecurityProvider.Decrypt(response.Model); - if (responseJson.IsNullOrEmpty()) + // Now we Have to Converts Repose Payload to Result Model ... + // Note that the respose Model's payload here is Decrypted and + // actually is Json Representation of Result Model ... + var result = response.Payload.FromJSON(); + if (result.IsNull()) { XException.ActionFailed.Throw(); } - // - // Retrieve Model and Validate it ... - var responseModel = responseJson.FromJSON(); - if (responseModel.IsNull() || - responseModel.Payload.IsNullOrEmpty() || - // !responseModel.Device.IsSameAs(device) || - responseToken != responseModel.Checksum || - responseModel.Timestamp.FromTimestamp().IsExPired()) - { - XException.ActionFailed.Throw(); - } - - // - // Try to Retrieve Model ... - var result = responseModel.Payload.FromJSON(); - // return result; } + #endregion + + // + #region GetUserInfos ... + public async Task> GetUserInfos( + XDeviceDto device, + string ids + ) + { + // + // Validate Args ... + validationProvider.NotNull(device); + validationProvider.NotEmpty(ids); + + // + // Prepare Open Action Model ... + var opaModel = new XOpenActionRequestDto + { + Payload = ids, + Device = device, + Action = XOpenActions.GetUserInfos, + Timestamp = DateTime.UtcNow.AddMinutes(5).ToTimestamp().ToString() + }; + if (!opaModel.Validate()) + { + XException.InvalidArgs.Throw(); + } + + // + // Fill Checksum Filed ... + var token = opaModel.ToOpenActionToken(); + opaModel.Checksum = token; + + // + // Prepare Request ... + var opaJson = opaModel.ToJson(); + var requestString = SecurityProvider.Encrypt(opaJson); + + // + return await GetUserInfos( + token: token, + request: requestString + ); + } + + public async Task> GetUserInfos( + XOpenActionInnerDto dto + ) + { + // + return await GetUserInfos( + token: dto.Token, + request: dto.Payload + ); + } + + public async Task> GetUserInfos( + string token, + string request + ) + { + // + // Validate Args ... + validationProvider.NotEmpty(token); + validationProvider.NotEmpty(request); + + // + // Retrieve and Validate Response ... + var response = await OpenGet( + token: token, + actionRequest: request + ); + if (response.IsNull() || + response.Token.IsNullOrEmpty() || + response.Payload.IsNullOrEmpty()) + { + XException.ActionFailed.Throw(); + } + + // + // Now we Have to Converts Repose Payload to Result Model ... + // Note that the respose Model's payload here is Decrypted and + // actually is Json Representation of Result Model ... + var result = response.Payload.FromJSON>(); + if (result.IsNull()) + { + XException.ActionFailed.Throw(); + } + + // + return result; + } + #endregion } } \ No newline at end of file