using e_suite.API.Common.models; using e_suite.Database.Core.Models; using eSuite.Core.Miscellaneous; using eSuite.Core.Sequences; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Net.Http.Headers; using System.Text; namespace ESuite.UI.E2E.Helpers { public class APIHelper { private readonly HttpClient httpClient; private readonly ConfigHelper configHelper; private readonly ScenarioContext _scenarioContext; public APIHelper(ScenarioContext scenarioContext) { this.httpClient = new HttpClient(); configHelper = new ConfigHelper(); _scenarioContext = scenarioContext; } public async Task SendGetRequest(string url) { try { HttpResponseMessage response = await httpClient.GetAsync(url); return await response.Content.ReadAsStringAsync(); } catch (Exception ex) { throw new Exception($"Error sending GET request: {ex.Message}"); } } public async Task SendPostRequest(string url, string requestBody) { try { StringContent content = new(requestBody, Encoding.UTF8, "application/json"); return await httpClient.PostAsync(url, content); } catch (Exception ex) { throw new Exception($"Error sending POST request: {ex.Message}"); } } private string _authToken { get; set; } = string.Empty; public void ClearAuthToken() { _authToken = string.Empty; } public async Task GetAuthToken() { if (!string.IsNullOrWhiteSpace(_authToken)) { return _authToken; } var url = $"{configHelper.APIUrl}/api/Authentication/login"; string requestBody = $@" {{ ""email"": ""{configHelper.AdminName}"", ""password"": ""{configHelper.AdminPassword}"", ""securityCode"": """", ""requestTfaRemoval"": false }}"; try { HttpResponseMessage response = await SendPostRequest(url, requestBody); if (response.IsSuccessStatusCode) { var responseContent = await response.Content.ReadAsStringAsync(); _authToken = GetFieldValueFromJSONResponse("token", responseContent); return _authToken; } else { throw new Exception("GetAuthToken Response is: " + response.StatusCode); } } catch (Exception ex) { throw new Exception($"Error getting authentication token: {ex.Message}"); } } public async Task SendAuthenticatedRequest(string url, string token, string requestType = "GET") { try { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); HttpResponseMessage response; switch (requestType) { case "GET": response = await httpClient.GetAsync(url); break; case "POST": response = await httpClient.PostAsync(url, null); if (response.IsSuccessStatusCode) { Console.WriteLine("Response content: " + await response.Content.ReadAsStringAsync()); } else { var body = await response.Content.ReadAsStringAsync(); throw new Exception("Response status code from POST request: " + response.StatusCode + body); } break; default: throw new Exception("Unknown request type"); } return await response.Content.ReadAsStringAsync(); } catch (Exception ex) { throw new Exception($"Error sending authenticated POST request: {ex.Message}"); } finally { httpClient.DefaultRequestHeaders.Authorization = null; } } public async Task SendAuthenticatedRequest(string url, string token, T requestBody = default!, string requestType = "GET") { try { httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); HttpResponseMessage response; switch (requestType) { case "GET": response = await httpClient.GetAsync(url); break; case "POST": var postPayload = System.Text.Json.JsonSerializer.Serialize(requestBody); StringContent postContent = new(postPayload!, Encoding.UTF8, "application/json"); response = await httpClient.PostAsync(url, postContent); AutomationTestManagerHelper.SaveTimingForAction(_scenarioContext); break; case "DELETE": var deletePayload = System.Text.Json.JsonSerializer.Serialize(requestBody); var deleteContent = new StringContent(deletePayload, Encoding.UTF8, "application/json"); var request = new HttpRequestMessage { Method = HttpMethod.Delete, RequestUri = new Uri(url), Content = deleteContent }; response = await httpClient.SendAsync(request); AutomationTestManagerHelper.SaveTimingForAction(_scenarioContext); break; default: throw new Exception("Unknown request type"); } return response; } catch (Exception ex) { throw new Exception($"Error sending authenticated POST request: {ex.Message}"); } finally { httpClient.DefaultRequestHeaders.Authorization = null; } } public static string GetFieldValueFromJSONResponse(string field, dynamic jsonString) { try { dynamic json = JsonConvert.DeserializeObject(jsonString); return json[field]; ; } catch (Exception) { throw new Exception( $"Error appears in process of getting field '{field}' data from JSON string: {jsonString}" ); } } public async Task GetDomains(string url) { string token = await GetAuthToken(); UriBuilder domainsUriBuilder = new($"{url}/api/Domain/domains"); var query = System.Web.HttpUtility.ParseQueryString(domainsUriBuilder.Query); query["SortAscending"] = "false"; query["SortKey"] = "id"; domainsUriBuilder.Query = query.ToString(); string domainsUrl = domainsUriBuilder.ToString(); string getDomainsResponse = await SendAuthenticatedRequest(domainsUrl, token); if (string.IsNullOrEmpty(getDomainsResponse)) { throw new Exception("Could not get response for getting all domains."); } JObject getDomainsJson = JObject.Parse(getDomainsResponse); return getDomainsJson; } public async Task GetUsers(string url) { string token = await GetAuthToken(); UriBuilder usersUriBuilder = new($"{url}/api/User/users"); var query = System.Web.HttpUtility.ParseQueryString(usersUriBuilder.Query); query["SortKey"] = "created"; query["SortAscending"] = "false"; usersUriBuilder.Query = query.ToString(); string usersUrl = usersUriBuilder.ToString(); string getUsersResponse = await SendAuthenticatedRequest(usersUrl, token); if (string.IsNullOrEmpty(getUsersResponse)) { throw new Exception("Could not get response for getting all Users."); } var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None, // Prevent automatic DateTime parsing DateFormatHandling = DateFormatHandling.IsoDateFormat }; JObject getUsers = JsonConvert.DeserializeObject(getUsersResponse, settings)!; return getUsers; } public async Task GetOrganisations(string url) { string token = await GetAuthToken(); UriBuilder usersUriBuilder = new($"{url}/api/Organisations/organisations"); var query = System.Web.HttpUtility.ParseQueryString(usersUriBuilder.Query); query["SortAscending"] = "false"; query["SortKey"] = "id"; usersUriBuilder.Query = query.ToString(); string usersUrl = usersUriBuilder.ToString(); string getUsersResponse = await SendAuthenticatedRequest(usersUrl, token); if (string.IsNullOrEmpty(getUsersResponse)) { throw new Exception("Could not get response for getting all Organisations."); } JObject getUsers = JsonConvert.DeserializeObject(getUsersResponse)!; return getUsers; } public async Task GetRoles(string url) { string token = await GetAuthToken(); UriBuilder rolesUriBuilder = new($"{url}/api/Role/roles"); var query = System.Web.HttpUtility.ParseQueryString(rolesUriBuilder.Query); query["SortAscending"] = "false"; query["SortKey"] = "id"; rolesUriBuilder.Query = query.ToString(); string rolesUrl = rolesUriBuilder.ToString(); string getRolesResponse = await SendAuthenticatedRequest(rolesUrl, token); if (string.IsNullOrEmpty(getRolesResponse)) { throw new Exception("Could not get response for getting all domains."); } JObject getDomainsJson = JObject.Parse(getRolesResponse); return getDomainsJson; } public async Task CreateNewUser(string url, string firstName, string middleName, string lastName, string email, int domainId) { var requestBody = new UserRegistration { FirstName = firstName, MiddleNames = middleName, LastName = lastName, Email = email, DomainId = new eSuite.Core.Miscellaneous.GeneralIdRef { Id = domainId } }; string token = await GetAuthToken(); UriBuilder usersUriBuilder = new($"{url}/api/User/user"); string usersUrl = usersUriBuilder.ToString(); await SendAuthenticatedRequest(usersUrl, token, requestBody, "POST"); } public async Task CreateNewSSOProvider(string url, string name, string clientId, string clientSecret, string validIssuer, string authorizationEndpoint, string tokenEndpoint, bool isPublic, Guid guid) { var requestBody = new CreateSsoProvider() { Name = name, ClientId = clientId, ClientSecret = clientSecret, ValidIssuer = validIssuer, AuthorizationEndpoint = authorizationEndpoint, TokenEndpoint = tokenEndpoint, IsPublic = isPublic, Guid = guid }; string token = await GetAuthToken(); UriBuilder ssoProviderUriBuilder = new($"{url}/api/SsoManager/ssoProvider"); string ssoProviderUrl = ssoProviderUriBuilder.ToString(); await SendAuthenticatedRequest(ssoProviderUrl, token, requestBody, "POST"); } public async Task CreateNewOrganisation(string url, Guid guid, string name, string address, OrganisationStatus status) { var requestBody = new CreateOrganisation() { Guid = guid, Name = name, Address = address, Status = status }; string token = await GetAuthToken(); UriBuilder organisationUriBuilder = new($"{url}/api/Organisations/organisation"); string siteUrl = organisationUriBuilder.ToString(); HttpResponseMessage response = await SendAuthenticatedRequest(siteUrl, token, requestBody, "POST"); return response; } public async Task CreateNewSite(string url, Guid guid, string name, string address, OrganisationStatus status, int organisationId) { var requestBody = new CreateSite() { Name = name, Address = address, Status = status, OrganisationId = new eSuite.Core.Miscellaneous.GeneralIdRef { Id = organisationId }, Guid = guid }; string token = await GetAuthToken(); UriBuilder siteUriBuilder = new($"{url}/api/Site/site"); string siteUrl = siteUriBuilder.ToString(); await SendAuthenticatedRequest(siteUrl, token, requestBody, "POST"); } public async Task CreateNewDomain(string url, Guid guid, string name, string sunriseHostName, string sunriseAppId, string sunriseCategoryId, int? sigmaId) { var requestBody = new CreateDomain() { Guid = guid, Name = name, SunriseHostName = sunriseHostName, SunriseAppId = sunriseAppId, SunriseCategoryId = sunriseCategoryId, SigmaId = sigmaId }; string token = await GetAuthToken(); UriBuilder domainUriBuilder = new($"{url}/api/Domain/domain"); string siteUrl = domainUriBuilder.ToString(); HttpResponseMessage response = await SendAuthenticatedRequest(siteUrl, token, requestBody, "POST"); return response; } public async Task CreateNewRole(string url, string name, Guid guid, bool isSuperUser, bool isAdministrator, int domainId) { var requestBody = new CreateRole { Name = name, Guid = guid, IsSuperUser = isSuperUser, IsAdministrator = isAdministrator, DomainId = new eSuite.Core.Miscellaneous.GeneralIdRef { Id = domainId } }; string token = await GetAuthToken(); UriBuilder roleUriBuilder = new($"{url}/api/Role/role"); string roleUrl = roleUriBuilder.ToString(); await SendAuthenticatedRequest(roleUrl, token, requestBody, "POST"); } public async Task CreateNewSequence(string url, string name, int seed, int increment, string pattern, Rollover rollOver, Guid guid) { var requestBody = new Sequence { Name = name, Seed = seed, Increment = increment, Pattern = pattern, RolloverType = rollOver, GeneralIdRef = new eSuite.Core.Miscellaneous.GeneralIdRef() { Guid = guid } }; string token = await GetAuthToken(); UriBuilder sequenceUriBuilder = new($"{url}/api/Sequences/sequence"); string sequenceUrl = sequenceUriBuilder.ToString(); await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "POST"); } public async Task CreateAdminRoleToLatestDomain(string url, Guid roleGuid, int roleId, Guid userGuid, int userId) { var requestBody = new UserRoleIds { RoleId = new eSuite.Core.Miscellaneous.GeneralIdRef() { Guid = roleGuid, Id = roleId }, UserId = new eSuite.Core.Miscellaneous.GeneralIdRef() { Guid = userGuid, Id = userId } }; string token = await GetAuthToken(); UriBuilder sequenceUriBuilder = new($"{url}/api/Role/roleUsers"); string sequenceUrl = sequenceUriBuilder.ToString(); await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "POST"); } public async Task DeleteUserAPI(string url, Guid userGuid, int userId) { var requestBody = new GeneralIdRef { Guid = userGuid, Id = userId }; string token = await GetAuthToken(); UriBuilder sequenceUriBuilder = new($"{url}/api/User/user"); string sequenceUrl = sequenceUriBuilder.ToString(); string ddd = JsonConvert.SerializeObject(requestBody); var response = await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "DELETE"); var r = await response.Content.ReadAsStringAsync(); var statusCode = response.StatusCode; } public async Task DeleteDomainAPI(string url, Guid userGuid, int userId) { var requestBody = new GeneralIdRef { Guid = userGuid, Id = userId }; string token = await GetAuthToken(); UriBuilder sequenceUriBuilder = new($"{url}/api/Domain/domain"); string sequenceUrl = sequenceUriBuilder.ToString(); string ddd = JsonConvert.SerializeObject(requestBody); var response = await SendAuthenticatedRequest(sequenceUrl, token, requestBody, "DELETE"); var r = await response.Content.ReadAsStringAsync(); var statusCode = response.StatusCode; } public void Dispose() { httpClient.Dispose(); } internal void AssignAdminRoleToUser(string v) { throw new NotImplementedException(); } } }