using cwebplusApp.Shared.Models; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Globalization; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace cwebplusApp.Shared.Services { // REST interface responsible to submit lost or found reports and get the available master data. public class BicycleRestService : IBicycleRestService { private static readonly string VERSION = "v1"; private HttpClient httpClient; private IConfiguration configuration; private OnlineStatusProvider onlineStatusProvider; private ReportRepositoryService reportRepositoryService; private ReportDataProvider reportDataProvider; public BicycleRestService(ReportRepositoryService _reportRepositoryService, OnlineStatusProvider _onlineStatusProvider, ReportDataProvider _reportDataProvider) { this.reportRepositoryService = _reportRepositoryService; this.onlineStatusProvider = _onlineStatusProvider; this.reportDataProvider = _reportDataProvider; } public void Initialize(IConfiguration _configuration) { this.configuration = _configuration; string hostBaseUrl = configuration.GetValue("host_base_url"); if (!String.IsNullOrEmpty(hostBaseUrl)) { this.httpClient = new HttpClient { BaseAddress = new Uri(hostBaseUrl) }; } } public async Task> GetColors() { if (httpClient != null) { string subResourceUrl = configuration.GetValue("subresource_url_colors"); if (!String.IsNullOrEmpty(subResourceUrl)) { HttpResponseMessage httpResult = await httpClient.GetAsync(string.Format(subResourceUrl, VERSION, CultureInfo.CurrentCulture.TwoLetterISOLanguageName)); if (httpResult.StatusCode == System.Net.HttpStatusCode.OK) { ColorItem[] colors = JsonConvert.DeserializeObject(await httpResult.Content.ReadAsStringAsync()); return new List(colors); } throw new HttpRequestException("HTTP error " + httpResult.StatusCode); } } throw new HttpRequestException("HTTP client not initialized!"); } public async Task> GetBicycleTypes() { if (httpClient != null) { string subResourceUrl = configuration.GetValue("subresource_url_types"); if (!String.IsNullOrEmpty(subResourceUrl)) { HttpResponseMessage httpResult = await httpClient.GetAsync(string.Format(subResourceUrl, VERSION, CultureInfo.CurrentCulture.TwoLetterISOLanguageName)); if (httpResult.StatusCode == System.Net.HttpStatusCode.OK) { BicycleType[] bicycleTypes = JsonConvert.DeserializeObject(await httpResult.Content.ReadAsStringAsync()); return new List(bicycleTypes); } throw new HttpRequestException("HTTP error " + httpResult.StatusCode); } } throw new HttpRequestException("HTTP client not initialized!"); } public async Task> GetBrands() { if (httpClient != null) { string subResourceUrl = configuration.GetValue("subresource_url_brands"); if (!String.IsNullOrEmpty(subResourceUrl)) { HttpResponseMessage httpResult = await httpClient.GetAsync(string.Format(subResourceUrl, VERSION, CultureInfo.CurrentCulture.TwoLetterISOLanguageName)); if (httpResult.StatusCode == System.Net.HttpStatusCode.OK) { Brand[] brands = JsonConvert.DeserializeObject(await httpResult.Content.ReadAsStringAsync()); return new List(brands); } throw new HttpRequestException("HTTP error " + httpResult.StatusCode); } } throw new HttpRequestException("HTTP client not initialized!"); } public async Task SendFoundReport(Report report) { string subResourceUrl = configuration.GetValue("subresource_url_foundreport"); return await SendReport(report, subResourceUrl, new FoundReportRepositoryItem((FoundReport)report, 0)); } public async Task SendFoundReport(FoundReportRepositoryItem reportRepositoryItem) { string subResourceUrl = configuration.GetValue("subresource_url_foundreport"); return await SendReport(reportRepositoryItem.Report, subResourceUrl, reportRepositoryItem); } public async Task SendMissingReport(Report report) { string subResourceUrl = configuration.GetValue("subresource_url_missingreport"); return await SendReport(report, subResourceUrl, new MissingReportRepositoryItem((MissingReport)report, 0)); } public async Task SendMissingReport(MissingReportRepositoryItem reportRepositoryItem) { string subResourceUrl = configuration.GetValue("subresource_url_missingreport"); return await SendReport(reportRepositoryItem.Report, subResourceUrl, reportRepositoryItem); } public async Task TrySendPendingReports() { int sent = 0; if (onlineStatusProvider.Online) { sent = await TrySendFoundPendingReports(); sent += await TrySendMissingPendingReports(); } return sent; } public async Task TrySendFoundPendingReports() { int sent = 0; List pendingFoundReports = await reportRepositoryService.GetPendingFoundReports(); foreach (FoundReportRepositoryItem item in pendingFoundReports) { try { ReportResponse response = await SendFoundReport(item); if (HttpStatusCode.OK == response.StatusCode) { sent++; } } catch (Exception) { continue; } } return sent; } public async Task TrySendMissingPendingReports() { int sent = 0; List pendingMissingReports = await reportRepositoryService.GetPendingMissingReports(); foreach (MissingReportRepositoryItem item in pendingMissingReports) { try { ReportResponse response = await SendMissingReport(item); if (HttpStatusCode.OK == response.StatusCode) { sent++; } } catch (Exception) { continue; } } return sent; } protected async Task SendReport(Report report, string subResourceUrl, ReportRepositoryItem reportRepositoryItem) { ReportResponse response = null; if (onlineStatusProvider.Online && ReportRepositoryItem.State.PENDING.Equals(reportRepositoryItem.Status)) { if (httpClient != null) { if (!String.IsNullOrEmpty(subResourceUrl)) { string reportJson = JsonConvert.SerializeObject(report); HttpContent content = new StringContent(reportJson, Encoding.UTF8, "application/json"); HttpResponseMessage httpResult = await httpClient.PostAsync(string.Format(subResourceUrl, VERSION, CultureInfo.CurrentCulture.TwoLetterISOLanguageName), content); string msg = await httpResult.Content.ReadAsStringAsync(); response = JsonConvert.DeserializeObject(msg); response.StatusCode = httpResult.StatusCode; if (HttpStatusCode.OK == response.StatusCode) { reportRepositoryItem.ServerRefNbr = response.Data[0]; reportRepositoryItem.Status = ReportRepositoryItem.State.TRANSMITTED; await reportRepositoryService.SaveReport(reportRepositoryItem); } return response; } } throw new HttpRequestException("HTTP client not initialized!"); } await reportRepositoryService.SaveReport(reportRepositoryItem); return response; } } }