diff --git a/BinaryDad.AacpsBusAlert.Services/BinaryDad.AacpsBusAlert.Services.csproj b/BinaryDad.AacpsBusAlert.Services/BinaryDad.AacpsBusAlert.Services.csproj index 2703565..992d1fc 100644 --- a/BinaryDad.AacpsBusAlert.Services/BinaryDad.AacpsBusAlert.Services.csproj +++ b/BinaryDad.AacpsBusAlert.Services/BinaryDad.AacpsBusAlert.Services.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -6,6 +6,16 @@ enable + + + + + + + PreserveNewest + + + diff --git a/BinaryDad.AacpsBusAlert.Services/BusRouteService.cs b/BinaryDad.AacpsBusAlert.Services/BusRouteService/HtmlScrapeBusRouteService.cs similarity index 90% rename from BinaryDad.AacpsBusAlert.Services/BusRouteService.cs rename to BinaryDad.AacpsBusAlert.Services/BusRouteService/HtmlScrapeBusRouteService.cs index b69eb34..3e1c7ef 100644 --- a/BinaryDad.AacpsBusAlert.Services/BusRouteService.cs +++ b/BinaryDad.AacpsBusAlert.Services/BusRouteService/HtmlScrapeBusRouteService.cs @@ -4,11 +4,11 @@ using System.Text.RegularExpressions; namespace BinaryDad.AacpsBusAlert.Services { - public class BusRouteService + public class HtmlScrapeBusRouteService : IBusRouteService { private readonly HttpClient httpClient; - public BusRouteService(IHttpClientFactory httpClientFactory) + public HtmlScrapeBusRouteService(IHttpClientFactory httpClientFactory) { httpClient = httpClientFactory.CreateClient(); } diff --git a/BinaryDad.AacpsBusAlert.Services/BusRouteService/IBusRouteService.cs b/BinaryDad.AacpsBusAlert.Services/BusRouteService/IBusRouteService.cs new file mode 100644 index 0000000..d7d093f --- /dev/null +++ b/BinaryDad.AacpsBusAlert.Services/BusRouteService/IBusRouteService.cs @@ -0,0 +1,7 @@ +namespace BinaryDad.AacpsBusAlert.Services +{ + public interface IBusRouteService + { + Task> GetBusRoutesAsync(); + } +} \ No newline at end of file diff --git a/BinaryDad.AacpsBusAlert.Services/UserService/IUserService.cs b/BinaryDad.AacpsBusAlert.Services/UserService/IUserService.cs new file mode 100644 index 0000000..e39c7ec --- /dev/null +++ b/BinaryDad.AacpsBusAlert.Services/UserService/IUserService.cs @@ -0,0 +1,8 @@ +namespace BinaryDad.AacpsBusAlert.Services +{ + public interface IUserService + { + ICollection GetUsers(); + User GetUser(Guid id); + } +} diff --git a/BinaryDad.AacpsBusAlert.Services/UserService/JsonUserService.cs b/BinaryDad.AacpsBusAlert.Services/UserService/JsonUserService.cs new file mode 100644 index 0000000..881ef32 --- /dev/null +++ b/BinaryDad.AacpsBusAlert.Services/UserService/JsonUserService.cs @@ -0,0 +1,21 @@ +using Newtonsoft.Json; + +namespace BinaryDad.AacpsBusAlert.Services +{ + public class JsonUserService : IUserService + { + public ICollection GetUsers() + { + var path = Path.Combine(AppContext.BaseDirectory, "users.json"); + + var usersJson = File.ReadAllText(path); + + return JsonConvert.DeserializeObject>(usersJson); + } + + public User GetUser(Guid id) + { + return GetUsers().First(u => u.Id == id); + } + } +} diff --git a/BinaryDad.AacpsBusAlert.Services/users.json b/BinaryDad.AacpsBusAlert.Services/users.json new file mode 100644 index 0000000..7c96273 --- /dev/null +++ b/BinaryDad.AacpsBusAlert.Services/users.json @@ -0,0 +1,18 @@ +[ + { + "Id": "b43f4f45-0f7b-4976-849d-8ad4b271199c", + "Email": "ryan@binarydad.com", + "Routes": [ + { + "Id": "bfed1017-be53-42f9-bb46-ddbf27d4270f", + "BusNumber": 203, + "Label": "Con's bus'" + }, + { + "Id": "bfed1017-be53-42f9-bb46-ddbf27d4270f", + "BusNumber": 365, + "Label": "Cam's bus'" + } + ] + } +] \ No newline at end of file diff --git a/BinaryDad.AacpsBusAlert.Web/Controllers/ApiController.cs b/BinaryDad.AacpsBusAlert.Web/Controllers/ApiController.cs index c990536..a0f12c0 100644 --- a/BinaryDad.AacpsBusAlert.Web/Controllers/ApiController.cs +++ b/BinaryDad.AacpsBusAlert.Web/Controllers/ApiController.cs @@ -6,9 +6,9 @@ namespace BinaryDad.AacpsBusAlert.Web.Controllers [Route("api")] public class ApiController : Controller { - private readonly BusRouteService busRouteService; + private readonly IBusRouteService busRouteService; - public ApiController(BusRouteService busRouteService) + public ApiController(IBusRouteService busRouteService) { this.busRouteService = busRouteService; } diff --git a/BinaryDad.AacpsBusAlert.Web/Controllers/HomeController.cs b/BinaryDad.AacpsBusAlert.Web/Controllers/HomeController.cs index fa63a24..c79c58f 100644 --- a/BinaryDad.AacpsBusAlert.Web/Controllers/HomeController.cs +++ b/BinaryDad.AacpsBusAlert.Web/Controllers/HomeController.cs @@ -9,24 +9,33 @@ namespace BinaryDad.AacpsBusAlert.Web.Controllers public class HomeController : Controller { private readonly ILogger logger; - private readonly BusRouteService busRouteService; + private readonly IBusRouteService busRouteService; + private readonly IUserService userService; - public HomeController(ILogger logger, BusRouteService busRouteService) + public HomeController(ILogger logger, IBusRouteService busRouteService, IUserService userService) { this.logger = logger; this.busRouteService = busRouteService; + this.userService = userService; } public async Task Index() { - var userRoutes = new[] { 203, 365, 277, 269, 274 }; + var user = userService.GetUser(Guid.Parse("b43f4f45-0f7b-4976-849d-8ad4b271199c")); //var busRoutes = await CacheHelper.GetAsync("BusRoutes", () => busRouteService.GetBusRoutesAsync()); var busRoutes = await busRouteService.GetBusRoutesAsync(); + var userRouteIds = user.Routes.Select(r => r.BusNumber).ToList(); - var matchedBusRoutes = busRoutes.Join(userRoutes, r => r.BusNumber, u => u, (r, u) => r).ToList(); + var matchedBusRoutes = busRoutes.Join(userRouteIds, r => r.BusNumber, u => u, (r, u) => r).ToList(); - return View(matchedBusRoutes); + var summary = new SummaryViewModel + { + User = user, + Routes = matchedBusRoutes + }; + + return View(summary); } public IActionResult Privacy() diff --git a/BinaryDad.AacpsBusAlert.Web/Models/SummaryViewModel.cs b/BinaryDad.AacpsBusAlert.Web/Models/SummaryViewModel.cs new file mode 100644 index 0000000..0ed797c --- /dev/null +++ b/BinaryDad.AacpsBusAlert.Web/Models/SummaryViewModel.cs @@ -0,0 +1,8 @@ +namespace BinaryDad.AacpsBusAlert.Web.Models +{ + public class SummaryViewModel + { + public User User { get; set; } + public ICollection Routes { get; set; } + } +} diff --git a/BinaryDad.AacpsBusAlert.Web/Program.cs b/BinaryDad.AacpsBusAlert.Web/Program.cs index ab3e354..66db338 100644 --- a/BinaryDad.AacpsBusAlert.Web/Program.cs +++ b/BinaryDad.AacpsBusAlert.Web/Program.cs @@ -1,10 +1,12 @@ + using BinaryDad.AacpsBusAlert.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); -builder.Services.AddTransient(); +builder.Services.AddSingleton(); +builder.Services.AddSingleton(); builder.Services.AddHttpClient(); var app = builder.Build(); diff --git a/BinaryDad.AacpsBusAlert.Web/Views/Home/Index.cshtml b/BinaryDad.AacpsBusAlert.Web/Views/Home/Index.cshtml index 64237be..d535325 100644 --- a/BinaryDad.AacpsBusAlert.Web/Views/Home/Index.cshtml +++ b/BinaryDad.AacpsBusAlert.Web/Views/Home/Index.cshtml @@ -1,16 +1,38 @@ -@model ICollection +@model SummaryViewModel @{ - ViewData["Title"] = "Home Page"; - var busRoutes = Model.OrderBy(r => r.BusNumber); + var busRoutes = Model.Routes.OrderBy(r => r.BusNumber).ToList(); + var hasDelays = busRoutes.Any(); + + var userBusRouteList = string.Join(", ", Model.User.Routes + .Select(r => r.BusNumber) + .OrderBy(r => r)); } -@foreach (var busRoute in busRoutes) +@if (hasDelays) { -
-

@busRoute.BusNumber - @busRoute.Schools

-

@busRoute.Impact

-

@busRoute.Schedules

+
+

Uh oh

+ We have @busRoutes.Count delays
-} \ No newline at end of file +} +else +{ +
+

Good news!

+ No delays today! +
+} + +My Buses: @userBusRouteList + +
    + @foreach (var busRoute in busRoutes) + { +
  • + @busRoute.BusNumber - @busRoute.Schools +

    @busRoute.Impact @busRoute.Schedules

    +
  • + } +
diff --git a/BinaryDad.AacpsBusAlert.Web/Views/Home/Privacy.cshtml b/BinaryDad.AacpsBusAlert.Web/Views/Home/Privacy.cshtml deleted file mode 100644 index af4fb19..0000000 --- a/BinaryDad.AacpsBusAlert.Web/Views/Home/Privacy.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@{ - ViewData["Title"] = "Privacy Policy"; -} -

@ViewData["Title"]

- -

Use this page to detail your site's privacy policy.

diff --git a/BinaryDad.AacpsBusAlert.Web/wwwroot/css/site.css b/BinaryDad.AacpsBusAlert.Web/wwwroot/css/site.css index f27e5ad..edece24 100644 --- a/BinaryDad.AacpsBusAlert.Web/wwwroot/css/site.css +++ b/BinaryDad.AacpsBusAlert.Web/wwwroot/css/site.css @@ -1,18 +1,24 @@ html { - font-size: 14px; + font-size: 14px; } @media (min-width: 768px) { - html { - font-size: 16px; - } + html { + font-size: 16px; + } } html { - position: relative; - min-height: 100%; + position: relative; + min-height: 100%; } body { - margin-bottom: 60px; -} \ No newline at end of file + margin-bottom: 60px; +} + +#route-list { + margin: 20px 0 0; + padding: 0; + list-style-type: none; +}