From da0f22cee4cf9b0773b1282e7aa8d9fcab5e3803 Mon Sep 17 00:00:00 2001 From: chucvuive008 Date: Wed, 8 Jan 2020 17:46:58 -0600 Subject: [PATCH 1/2] completed SimpleOrderSearchApi and SimpleOrderSearchConsole --- .gitignore | 11 ++ README.md | 29 +--- .../SimpleOrderSearchController.cs | 47 ++++++ .../Data/ISimpleOrderSearchService.cs | 14 ++ .../Data/SimpleOrderSearchService.cs | 48 +++++++ SimpleOrderSearchAPI/Helper/Helper.cs | 17 +++ .../Model/GetOrdersResponseMessage.cs | 16 +++ SimpleOrderSearchAPI/Model/Order.cs | 27 ++++ SimpleOrderSearchAPI/Model/PageList.cs | 38 +++++ SimpleOrderSearchAPI/Model/Pagination.cs | 22 +++ SimpleOrderSearchAPI/Model/Params.cs | 28 ++++ SimpleOrderSearchAPI/Program.cs | 26 ++++ .../Properties/launchSettings.json | 30 ++++ SimpleOrderSearchAPI/Resources/orderInfo.json | 136 ++++++++++++++++++ .../SimpleOrderSearchAPI.csproj | 13 ++ .../SimpleOrderSearchAPI.csproj.user | 13 ++ SimpleOrderSearchAPI/Startup.cs | 53 +++++++ .../appsettings.Development.json | 9 ++ SimpleOrderSearchAPI/appsettings.json | 10 ++ SimpleOrderSearchConsole.sln | 36 +++++ SimpleOrderSearchConsole/Program.cs | 135 +++++++++++++++++ .../Proxy/SimpleOrderSearchProxy.cs | 41 ++++++ .../SimpleOrderSearchConsole.csproj | 12 ++ 23 files changed, 784 insertions(+), 27 deletions(-) create mode 100644 .gitignore create mode 100644 SimpleOrderSearchAPI/Controllers/SimpleOrderSearchController.cs create mode 100644 SimpleOrderSearchAPI/Data/ISimpleOrderSearchService.cs create mode 100644 SimpleOrderSearchAPI/Data/SimpleOrderSearchService.cs create mode 100644 SimpleOrderSearchAPI/Helper/Helper.cs create mode 100644 SimpleOrderSearchAPI/Model/GetOrdersResponseMessage.cs create mode 100644 SimpleOrderSearchAPI/Model/Order.cs create mode 100644 SimpleOrderSearchAPI/Model/PageList.cs create mode 100644 SimpleOrderSearchAPI/Model/Pagination.cs create mode 100644 SimpleOrderSearchAPI/Model/Params.cs create mode 100644 SimpleOrderSearchAPI/Program.cs create mode 100644 SimpleOrderSearchAPI/Properties/launchSettings.json create mode 100644 SimpleOrderSearchAPI/Resources/orderInfo.json create mode 100644 SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj create mode 100644 SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj.user create mode 100644 SimpleOrderSearchAPI/Startup.cs create mode 100644 SimpleOrderSearchAPI/appsettings.Development.json create mode 100644 SimpleOrderSearchAPI/appsettings.json create mode 100644 SimpleOrderSearchConsole.sln create mode 100644 SimpleOrderSearchConsole/Program.cs create mode 100644 SimpleOrderSearchConsole/Proxy/SimpleOrderSearchProxy.cs create mode 100644 SimpleOrderSearchConsole/SimpleOrderSearchConsole.csproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..34043c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +bin +obj +.vscode +*.db +.vs/SimpleOrderSearchConsole/v16/.suo +.vs/SimpleOrderSearchConsole/v16/Server/sqlite3/db.lock +.vs/SimpleOrderSearchConsole/config/applicationhost.config +.vs/SimpleOrderSearchConsole/DesignTimeBuild/.dtbcache +.vs/SimpleOrderSearchConsole/v16/Server/sqlite3/storage.ide +.vs/SimpleOrderSearchConsole/v16/Server/sqlite3/storage.ide-shm +.vs/SimpleOrderSearchConsole/v16/Server/sqlite3/storage.ide-wal diff --git a/README.md b/README.md index b68f928..9e97ce8 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,2 @@ -# simpleOrderSearch -simpleOrderSearch - - -I want to assess your ability to create an application and REST API service. It truly is the bare minimum of knowledge necessary to be successful in this position. I don't want you to spend a lot of time on this. You should be able to do this in an hour or so if the job is right for you. - -Order Search - -This programming task consists of building a simple console application to search for orders. Fork this repository and create your application. It should take this input from the user: - -(Order Number || (MSA && Status)) && CompletionDte - -The console application will call a service that you create using C#. I have provided some sample data for the application in the JSON file in the data folder. - - - -The file contains an array whose elements represent orders. The data should be defined as a model in your service. - -The application calling the service can be a console app. You have total freedom to do what you want but make sure it can do these three things: - -• Validate that the user has provided the right criteria to make a search - -• Provide an offset and page value for pagination. - -• Write the outputs of the service call to a console window. - -Create a pull request once you have it working. I will clone your repository, verify that it works, and evaluate it. Please ensure you include any instructions for running that may be required. +Run both of the project SimpleOrderSearchApi and SimpleOrderSearchConsole +Then follow instruction on console terminal. \ No newline at end of file diff --git a/SimpleOrderSearchAPI/Controllers/SimpleOrderSearchController.cs b/SimpleOrderSearchAPI/Controllers/SimpleOrderSearchController.cs new file mode 100644 index 0000000..6412900 --- /dev/null +++ b/SimpleOrderSearchAPI/Controllers/SimpleOrderSearchController.cs @@ -0,0 +1,47 @@ +using System; +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; +using SimpleOrderSearchAPI.Data; +using SimpleOrderSearchAPI.Model; + +namespace SimpleOrderSearchAPI.Controllers +{ + [Route("api/[controller]")] + public class SimpleOrderSearchController : Controller + { + private readonly ISimpleOrderSearchService _service; + public SimpleOrderSearchController(ISimpleOrderSearchService service) + { + _service = service; + } + + [HttpGet] + public IActionResult GetOrders([FromQuery]Params orderParam) + { + try + { + var orders = _service.GetSearchOrders(orderParam); + var pagination = new Pagination + { + CurrentPage = orders.CurrentPage, + ItemPerPage = orders.ItemPerPage, + TotalItems = orders.TotalItem, + TotalPages = orders.TotalPages, + Offset = orders.Offset + }; + var result = new GetOrdersResponseMessage + { + Orders = orders, + Pagination = pagination + }; + return Ok(result); + } + catch (Exception ex) + { + Console.WriteLine(ex); + return BadRequest(); + } + + } + } +} \ No newline at end of file diff --git a/SimpleOrderSearchAPI/Data/ISimpleOrderSearchService.cs b/SimpleOrderSearchAPI/Data/ISimpleOrderSearchService.cs new file mode 100644 index 0000000..6cf3529 --- /dev/null +++ b/SimpleOrderSearchAPI/Data/ISimpleOrderSearchService.cs @@ -0,0 +1,14 @@ +using SimpleOrderSearchAPI.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SimpleOrderSearchAPI.Data +{ + public interface ISimpleOrderSearchService + { + PageList GetSearchOrders(Params param); + + } +} diff --git a/SimpleOrderSearchAPI/Data/SimpleOrderSearchService.cs b/SimpleOrderSearchAPI/Data/SimpleOrderSearchService.cs new file mode 100644 index 0000000..9958aa3 --- /dev/null +++ b/SimpleOrderSearchAPI/Data/SimpleOrderSearchService.cs @@ -0,0 +1,48 @@ +using Newtonsoft.Json; +using SimpleOrderSearchAPI.Model; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace SimpleOrderSearchAPI.Data +{ + public class SimpleOrderSearchService : ISimpleOrderSearchService + { + public PageList GetSearchOrders(Params request) + { + try + { + var orders = GetAllOrders(); + var selectOrders = orders.Where(a => + (a.OrderId == request.OrderId || (a.MSA == request.MSA && a.Status == request.Status)) + && a.CompletionDte == request.CompletionDte) + .Select(a => a).ToList(); + return PageList.CreateAsync(selectOrders, request.PageNumber, request.ItemsPerPage, request.Offset); + } + catch + { + throw; + } + } + + private List GetAllOrders() + { + try + { + var a = Directory.GetCurrentDirectory(); + List orders = new List(); + using (StreamReader file = new StreamReader(Directory.GetCurrentDirectory() + @"/Resources/orderInfo.json")) + { + JsonSerializer serializer = new JsonSerializer(); + orders = (List)serializer.Deserialize(file, typeof(List)); + }; + return orders; + } + catch + { + throw; + } + } + } +} diff --git a/SimpleOrderSearchAPI/Helper/Helper.cs b/SimpleOrderSearchAPI/Helper/Helper.cs new file mode 100644 index 0000000..8bc34f8 --- /dev/null +++ b/SimpleOrderSearchAPI/Helper/Helper.cs @@ -0,0 +1,17 @@ +using Microsoft.AspNetCore.Http; +using SimpleOrderSearchAPI.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SimpleOrderSearchAPI.Helper +{ + public static class Helper + { + public static void AddPagination(this HttpResponse response, List orders, Params param) + { + + } + } +} diff --git a/SimpleOrderSearchAPI/Model/GetOrdersResponseMessage.cs b/SimpleOrderSearchAPI/Model/GetOrdersResponseMessage.cs new file mode 100644 index 0000000..9b041f2 --- /dev/null +++ b/SimpleOrderSearchAPI/Model/GetOrdersResponseMessage.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SimpleOrderSearchAPI.Model +{ + public class GetOrdersResponseMessage + { + [JsonProperty("orders")] + public List Orders { get; set; } + [JsonProperty("pagination")] + public Pagination Pagination { get; set; } + } +} diff --git a/SimpleOrderSearchAPI/Model/Order.cs b/SimpleOrderSearchAPI/Model/Order.cs new file mode 100644 index 0000000..ba59875 --- /dev/null +++ b/SimpleOrderSearchAPI/Model/Order.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using System; + +namespace SimpleOrderSearchAPI.Model +{ + public class Order + { + [JsonProperty("OrderID")] + public int OrderId { get; set; } + [JsonProperty("ShipperID")] + public int ShipperID { get; set; } + [JsonProperty("DriverID")] + public int DriverID { get; set; } + [JsonProperty("CompletionDte")] + public DateTime CompletionDte { get; set; } + [JsonProperty("Status")] + public int Status { get; set; } + [JsonProperty("Code")] + public string Code { get; set; } + [JsonProperty("MSA")] + public int MSA { get; set; } + [JsonProperty("Duration")] + public string Duration { get; set; } + [JsonProperty("OfferType")] + public int OfferType { get; set; } + } +} diff --git a/SimpleOrderSearchAPI/Model/PageList.cs b/SimpleOrderSearchAPI/Model/PageList.cs new file mode 100644 index 0000000..3b25c1a --- /dev/null +++ b/SimpleOrderSearchAPI/Model/PageList.cs @@ -0,0 +1,38 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SimpleOrderSearchAPI.Model +{ + public class PageList : List + { + [JsonProperty("currentPage")] + public int CurrentPage { get; set; } = 1; + [JsonProperty("itemPerPage")] + public int ItemPerPage { get; set; } = 2; + [JsonProperty("totalItems")] + public int TotalItem { get; set; } + [JsonProperty("totalPages")] + public int TotalPages { get; set; } + [JsonProperty("offset")] + public int Offset { get; set; } + + public PageList(List items, int count, int pageNumber, int pageSize, int offset) + { + TotalItem = count; + ItemPerPage = pageSize; + Offset = offset; + CurrentPage = pageNumber; + TotalPages = (int)Math.Ceiling(count / (double)pageSize); + this.AddRange(items); + } + public static PageList CreateAsync(List source, int pageNumber, int pageSize, int offset) + { + var count = (source.Count() - offset) < 0 ? 0 : source.Count() - offset; + var items = source.Skip((pageNumber - 1) * pageSize + offset).Take(pageSize).ToList(); + return new PageList(items, count, pageNumber, pageSize, offset); + } + } +} diff --git a/SimpleOrderSearchAPI/Model/Pagination.cs b/SimpleOrderSearchAPI/Model/Pagination.cs new file mode 100644 index 0000000..5801c74 --- /dev/null +++ b/SimpleOrderSearchAPI/Model/Pagination.cs @@ -0,0 +1,22 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SimpleOrderSearchAPI.Model +{ + public class Pagination + { + [JsonProperty("currentPage")] + public int CurrentPage { get; set; } = 1; + [JsonProperty("itemPerPage")] + public int ItemPerPage { get; set; } = 2; + [JsonProperty("totalItems")] + public int TotalItems { get; set; } + [JsonProperty("totalPages")] + public int TotalPages { get; set; } + [JsonProperty("offset")] + public int Offset { get; set; } + } +} diff --git a/SimpleOrderSearchAPI/Model/Params.cs b/SimpleOrderSearchAPI/Model/Params.cs new file mode 100644 index 0000000..503b095 --- /dev/null +++ b/SimpleOrderSearchAPI/Model/Params.cs @@ -0,0 +1,28 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace SimpleOrderSearchAPI.Model +{ + public class Params + { + [JsonProperty("offset")] + public int Offset { get; set; } = 0; + [JsonProperty("pageNumber")] + public int PageNumber { get; set; } = 1; + [JsonProperty("orderId")] + public int OrderId { get; set; } + [JsonProperty("msa")] + public int MSA { get; set; } + [JsonProperty("status")] + public int Status { get; set; } + [JsonProperty("totalItem")] + public int TotalItem { get; set; } + [JsonProperty("completionDte")] + public DateTime CompletionDte { get; set; } + [JsonProperty("itemsPerPage")] + public int ItemsPerPage { get; set; } = 2; + } +} diff --git a/SimpleOrderSearchAPI/Program.cs b/SimpleOrderSearchAPI/Program.cs new file mode 100644 index 0000000..b3965d4 --- /dev/null +++ b/SimpleOrderSearchAPI/Program.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace SimpleOrderSearchAPI +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} diff --git a/SimpleOrderSearchAPI/Properties/launchSettings.json b/SimpleOrderSearchAPI/Properties/launchSettings.json new file mode 100644 index 0000000..7d76b9c --- /dev/null +++ b/SimpleOrderSearchAPI/Properties/launchSettings.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55768", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "SimpleOrderSearchAPI": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/SimpleOrderSearchAPI/Resources/orderInfo.json b/SimpleOrderSearchAPI/Resources/orderInfo.json new file mode 100644 index 0000000..e9a6a59 --- /dev/null +++ b/SimpleOrderSearchAPI/Resources/orderInfo.json @@ -0,0 +1,136 @@ +[ + { + "OrderID": 36, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-12T05:10:00", + "Status": 10, + "Code": "R4C877FF", + "MSA": 1, + "Duration": "92.00", + "OfferType": 1 + + }, + { + "OrderID": 37, + "ShipperID": 4, + "DriverID": 243, + "CompletionDte": "2018-02-15T05:10:00", + "Status": 10, + "Code": "R47077FF", + "MSA": 1, + "Duration": "43.00", + "OfferType": 1 + }, + { + "OrderID": 38, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R6453FF", + "MSA": 2, + "Duration": "120.00", + "OfferType": 1 + }, + { + "OrderID": 39, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R4C877DS", + "MSA": 4, + "Duration": "15.00", + "OfferType": 1 + }, + { + "OrderID": 40, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R4C9999F", + "MSA": 1, + "Duration": "111.00", + "OfferType": 1 + }, + { + "OrderID": 41, + "ShipperID": 67, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R4C87S32", + "MSA": 1, + "Duration": "54.00", + "OfferType": 1 + }, + { + "OrderID": 42, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R4C87123", + "MSA": 1, + "Duration": "92.00", + "OfferType": 1 + }, + { + "OrderID": 43, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R42G77FF", + "MSA": 1, + "Duration": "40.00", + "OfferType": 1 + }, + { + "OrderID": 44, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 10, + "Code": "R4002WFF", + "MSA": 1, + "Duration": "92.00", + "OfferType": 2 + }, + { + "OrderID": 45, + "ShipperID": 4, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 20, + "Code": "R400KHFF", + "MSA": 3, + "Duration": "23.00", + "OfferType": 1 + }, + { + "OrderID": 46, + "ShipperID": 24, + "DriverID": 35, + "CompletionDte": "2018-01-31T05:10:00", + "Status": 61, + "Code": "R4C437FF", + "MSA": 1, + "Duration": "92.00", + "OfferType": 1 + }, + { + "OrderID": 47, + "ShipperID": 121, + "DriverID": 35, + "CompletionDte": "2018-03-1T05:10:00", + "Status": 10, + "Code": "R422AQF", + "MSA": 1, + "Duration": "66.00", + "OfferType": 2 + } + +] \ No newline at end of file diff --git a/SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj b/SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj new file mode 100644 index 0000000..8219e5a --- /dev/null +++ b/SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj @@ -0,0 +1,13 @@ + + + + netcoreapp3.1 + + + + + + + + + diff --git a/SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj.user b/SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj.user new file mode 100644 index 0000000..71ab916 --- /dev/null +++ b/SimpleOrderSearchAPI/SimpleOrderSearchAPI.csproj.user @@ -0,0 +1,13 @@ + + + + MvcControllerEmptyScaffolder + root/Controller + 600 + True + False + True + + False + + \ No newline at end of file diff --git a/SimpleOrderSearchAPI/Startup.cs b/SimpleOrderSearchAPI/Startup.cs new file mode 100644 index 0000000..333db8a --- /dev/null +++ b/SimpleOrderSearchAPI/Startup.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using SimpleOrderSearchAPI.Data; + +namespace SimpleOrderSearchAPI +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddScoped(); + services.AddControllers(); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseHttpsRedirection(); + + app.UseRouting(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + } + } +} diff --git a/SimpleOrderSearchAPI/appsettings.Development.json b/SimpleOrderSearchAPI/appsettings.Development.json new file mode 100644 index 0000000..8983e0f --- /dev/null +++ b/SimpleOrderSearchAPI/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/SimpleOrderSearchAPI/appsettings.json b/SimpleOrderSearchAPI/appsettings.json new file mode 100644 index 0000000..d9d9a9b --- /dev/null +++ b/SimpleOrderSearchAPI/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/SimpleOrderSearchConsole.sln b/SimpleOrderSearchConsole.sln new file mode 100644 index 0000000..85dac2f --- /dev/null +++ b/SimpleOrderSearchConsole.sln @@ -0,0 +1,36 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29613.14 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleOrderSearchConsole", "SimpleOrderSearchConsole\SimpleOrderSearchConsole.csproj", "{9C1CBA52-D3FE-4516-B7B3-D5B7E66A2E15}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SimpleOrderSearchAPI", "SimpleOrderSearchAPI\SimpleOrderSearchAPI.csproj", "{CC0D105E-3FDD-4711-AB02-B90B3ECF726D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9BED3A30-0628-494A-86A4-47D5096B578F}" + ProjectSection(SolutionItems) = preProject + .gitignore = .gitignore + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9C1CBA52-D3FE-4516-B7B3-D5B7E66A2E15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C1CBA52-D3FE-4516-B7B3-D5B7E66A2E15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C1CBA52-D3FE-4516-B7B3-D5B7E66A2E15}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C1CBA52-D3FE-4516-B7B3-D5B7E66A2E15}.Release|Any CPU.Build.0 = Release|Any CPU + {CC0D105E-3FDD-4711-AB02-B90B3ECF726D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CC0D105E-3FDD-4711-AB02-B90B3ECF726D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CC0D105E-3FDD-4711-AB02-B90B3ECF726D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CC0D105E-3FDD-4711-AB02-B90B3ECF726D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DD4739D1-3F48-44A8-A8B8-53A8BD4319A4} + EndGlobalSection +EndGlobal diff --git a/SimpleOrderSearchConsole/Program.cs b/SimpleOrderSearchConsole/Program.cs new file mode 100644 index 0000000..06617fb --- /dev/null +++ b/SimpleOrderSearchConsole/Program.cs @@ -0,0 +1,135 @@ +using Newtonsoft.Json; +using SimpleOrderSearchAPI.Model; +using SimpleOrderSearchConsole.Proxy; +using System; +using System.Threading.Tasks; + +namespace SimpleOrderSearchConsole +{ + class Program + { + public static int GetInputNumber(string text) + { + var invalidInput = true; + int number = 0; + while(invalidInput) + { + Console.WriteLine(text); + try + { + number = int.Parse(Console.ReadLine()); + invalidInput = false; + } + catch + { + Console.WriteLine("Invalid input. Please enter again"); + } + } + return number; + } + + public static Params GetSearchParam() + { + bool invalidInput = true; + var param = new Params(); + + Console.WriteLine("Please provide us your order Id and completion date time or MSA number, status number, and completion date time, so we can search for your order"); + while (invalidInput) + { + + Console.WriteLine("Please enter 1 to search by order id, 2 to search by MSA number and Status number"); + var choice = Console.ReadLine(); + if (choice == "1") + { + param.OrderId = GetInputNumber("What is your orderId? please enter your order id number here."); + invalidInput = false; + } + else if (choice == "2") + { + param.MSA = GetInputNumber("What is your MSA? please enter MSA number here."); + param.Status = GetInputNumber("What is your status number? please enter your status number here."); + invalidInput = false; + } + else + { + Console.WriteLine("Invalid input. Please enter again"); + } + } + invalidInput = true; + while (invalidInput) + { + Console.WriteLine("What is your Completion date time? please enter a valid date time here."); + try + { + param.CompletionDte = DateTime.Parse(Console.ReadLine()); + invalidInput = false; + } + catch + { + Console.WriteLine("Invalid input. Please enter again"); + } + } + return param; + } + + public static async Task Choice(Params param) + { + var proxy = new SimpleOrderSearchProxy(); + + var result = await proxy.GetOrder(param); + Console.WriteLine("This is your orders"); + Console.WriteLine(JsonConvert.SerializeObject(result.Orders)); + Console.WriteLine($"current page: {result.Pagination.CurrentPage} , total pages: {result.Pagination.TotalPages}, total items: {result.Pagination.TotalItems} , Item per page: {result.Pagination.ItemPerPage}"); + Console.WriteLine("Please choose following option"); + Console.WriteLine("enter 1 : choose page number"); + Console.WriteLine("enter 2 : choose a new number items per page"); + Console.WriteLine("enter 3 : search for new orders"); + Console.WriteLine("enter 4 : exist"); + } + + static async Task Main(string[] args) + { + bool exist = false; + bool invalidInput = true; + var param = GetSearchParam(); + var proxy = new SimpleOrderSearchProxy(); + + var result = await proxy.GetOrder(param); + Console.WriteLine("This is your orders"); + Console.WriteLine(JsonConvert.SerializeObject(result.Orders)); + Console.WriteLine($"current page: {result.Pagination.CurrentPage} , total pages: {result.Pagination.TotalPages}, total items: {result.Pagination.TotalItems} , Item per page: {result.Pagination.ItemPerPage}"); + Console.WriteLine("Please choose following option"); + Console.WriteLine("enter 1 : choose page number"); + Console.WriteLine("enter 2 : choose a new number items per page"); + Console.WriteLine("enter 3 : search for new orders"); + Console.WriteLine("enter 4 : exist"); + + while(invalidInput) + { + var choice = Console.ReadLine(); + switch (choice) + { + case "1": + param.PageNumber = GetInputNumber("Please enter the page number"); + await Choice(param); + break; + case "2": + param.ItemsPerPage = GetInputNumber("Please enter number items you want to display each page."); + await Choice(param); + break; + case "3": + param = GetSearchParam(); + await Choice(param); + break; + case "4": + invalidInput = false; + break; + default: + Console.WriteLine("Invalid Input please try again"); + break; + } + } + + } + } +} diff --git a/SimpleOrderSearchConsole/Proxy/SimpleOrderSearchProxy.cs b/SimpleOrderSearchConsole/Proxy/SimpleOrderSearchProxy.cs new file mode 100644 index 0000000..ea1532b --- /dev/null +++ b/SimpleOrderSearchConsole/Proxy/SimpleOrderSearchProxy.cs @@ -0,0 +1,41 @@ +using Newtonsoft.Json; +using SimpleOrderSearchAPI.Model; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace SimpleOrderSearchConsole.Proxy +{ + public class SimpleOrderSearchProxy + { + public const string endpoint = "http://localhost:55768/api/SimpleOrderSearch"; + private HttpClient _client; + + public SimpleOrderSearchProxy() + { + _client = new HttpClient(); + } + + public async Task GetOrder(Params request) + { + UriBuilder builder = new UriBuilder(endpoint); + builder.Query = BuildQuery(request); + var response = await _client.GetAsync(builder.Uri); + if(response.IsSuccessStatusCode) + { + var content = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(content); + } + return null; + + } + + private string BuildQuery(Params parameters) + { + string query = parameters.CompletionDte != null ? $"completionDte={parameters.CompletionDte}&" : string.Empty; + return $"{query}offset={parameters.Offset}&pageNumber={parameters.PageNumber}&msa={parameters.MSA}&status={parameters.Status}&itemsPerPage={parameters.ItemsPerPage}&orderId={parameters.OrderId}"; + } + } +} diff --git a/SimpleOrderSearchConsole/SimpleOrderSearchConsole.csproj b/SimpleOrderSearchConsole/SimpleOrderSearchConsole.csproj new file mode 100644 index 0000000..1e88e7d --- /dev/null +++ b/SimpleOrderSearchConsole/SimpleOrderSearchConsole.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp3.1 + + + + + + + From 222bf151c0f40ce02777a57207c48c034bd6668e Mon Sep 17 00:00:00 2001 From: chucvuive008 Date: Wed, 8 Jan 2020 18:01:09 -0600 Subject: [PATCH 2/2] make changes for result display on terminal --- SimpleOrderSearchConsole/Program.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/SimpleOrderSearchConsole/Program.cs b/SimpleOrderSearchConsole/Program.cs index 06617fb..68acc0e 100644 --- a/SimpleOrderSearchConsole/Program.cs +++ b/SimpleOrderSearchConsole/Program.cs @@ -78,7 +78,14 @@ public static async Task Choice(Params param) var result = await proxy.GetOrder(param); Console.WriteLine("This is your orders"); - Console.WriteLine(JsonConvert.SerializeObject(result.Orders)); + if(result.Orders.Count == 0) + { + Console.WriteLine("no order is found"); + } + foreach (var order in result.Orders) + { + Console.WriteLine(JsonConvert.SerializeObject(order)); + } Console.WriteLine($"current page: {result.Pagination.CurrentPage} , total pages: {result.Pagination.TotalPages}, total items: {result.Pagination.TotalItems} , Item per page: {result.Pagination.ItemPerPage}"); Console.WriteLine("Please choose following option"); Console.WriteLine("enter 1 : choose page number"); @@ -96,7 +103,15 @@ static async Task Main(string[] args) var result = await proxy.GetOrder(param); Console.WriteLine("This is your orders"); - Console.WriteLine(JsonConvert.SerializeObject(result.Orders)); + if (result.Orders.Count == 0) + { + Console.WriteLine("no order is found"); + } + foreach (var order in result.Orders) + { + Console.WriteLine(JsonConvert.SerializeObject(order)); + } + Console.WriteLine($"current page: {result.Pagination.CurrentPage} , total pages: {result.Pagination.TotalPages}, total items: {result.Pagination.TotalItems} , Item per page: {result.Pagination.ItemPerPage}"); Console.WriteLine("Please choose following option"); Console.WriteLine("enter 1 : choose page number");