Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.0-preview.5.22303.8" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using System.Globalization;
using BindTryParseAPI.Models;
using Microsoft.AspNetCore.Mvc;

namespace BindTryParseAPI.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

private readonly ILogger<WeatherForecastController> _logger;

public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}

[HttpGet]
public IActionResult Get([FromQuery] Culture? culture)
{
var weatherForecasts = Enumerable
.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.Select(wf => new WeatherForecastViewModel
{
Date = wf.Date.ToString(new CultureInfo(culture?.DisplayName ?? "en-US")),
TemperatureC = wf.TemperatureC,
TemperatureF = wf.TemperatureF,
Summary = wf.Summary
});

return Ok(weatherForecasts);
}

[HttpGet]
[Route("GetByRange")]
public IActionResult Range([FromQuery] DateRange? range)
{
var weatherForecasts = Enumerable
.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.Where(wf => DateOnly.FromDateTime(wf.Date) >= (range?.From ?? DateOnly.MinValue) && DateOnly.FromDateTime(wf.Date) <= (range?.To ?? DateOnly.MaxValue))
.Select(wf => new WeatherForecastViewModel
{
Date = wf.Date.ToString(),
TemperatureC = wf.TemperatureC,
TemperatureF = wf.TemperatureF,
Summary = wf.Summary
});

return Ok(weatherForecasts);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace BindTryParseAPI.Models
{
public class Culture
{
public string? DisplayName { get; }

public Culture(string displayName)
{
if (string.IsNullOrEmpty(displayName))
throw new ArgumentNullException(nameof(displayName));

DisplayName = displayName;
}

public static bool TryParse(string? value, out Culture? result)
{
if (value is null)
{
result = default;
return false;
}

result = new Culture(value);
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
namespace BindTryParseAPI.Models
{
public class DateRange
{
public DateOnly? From { get; }
public DateOnly? To { get; }

public DateRange(string from, string to)
{
if (string.IsNullOrEmpty(from))
throw new ArgumentNullException(nameof(from));
if (string.IsNullOrEmpty(to))
throw new ArgumentNullException(nameof(to));

From = DateOnly.Parse(from);
To = DateOnly.Parse(to);
}

public static bool TryParse(string? value, IFormatProvider? provider, out DateRange? result)
{
if (string.IsNullOrEmpty(value) || value.Split('-').Length != 2)
{
result = default;
return false;
}

var range = value.Split('-');
result = new DateRange(range[0], range[1]);
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace BindTryParseAPI.Models
{
public class WeatherForecast
{
public DateTime Date { get; set; }

public int TemperatureC { get; set; }

public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

public string? Summary { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace BindTryParseAPI.Models
{
public class WeatherForecastViewModel
{
public string? Date { get; set; }

public int TemperatureC { get; set; }

public int TemperatureF { get; set; }

public string? Summary { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseAuthorization();

app.MapControllers();

app.Run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace BindTryParseAPI
{
public class WeatherForecast
{
public DateTime Date { get; set; }

public int TemperatureC { get; set; }

public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

public string? Summary { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System.Diagnostics;
using BindTryParseMVC.Models;
using Microsoft.AspNetCore.Mvc;

namespace BindTryParseMVC.Controllers
{
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;

public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}

public IActionResult Index()
{
return View();
}

public IActionResult Privacy()
{
return View();
}

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using System.Globalization;
using BindTryParseMVC.Models;
using Microsoft.AspNetCore.Mvc;

namespace BindTryParseMVC.Controllers
{
public class WeatherForecastController : Controller
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

/// <summary>
/// /WeatherForecast?culture=en-GB
/// </summary>
/// <param name="culture"></param>
/// <returns></returns>
public IActionResult Index(Culture? culture)
{
var weatherForecasts = Enumerable
.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.Select(wf => new WeatherForecastViewModel
{
Date = wf.Date.ToString(new CultureInfo(culture?.DisplayName ?? "en-US")),
TemperatureC = wf.TemperatureC,
TemperatureF = wf.TemperatureF,
Summary = wf.Summary
});

return View(weatherForecasts);
}

/// <summary>
/// /WeatherForecast/Range?range=07/12/2022-07/14/2022
/// </summary>
/// <param name="range"></param>
/// <returns></returns>
public IActionResult Range(DateRange? range)
{
var weatherForecasts = Enumerable
.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.Where(wf => DateOnly.FromDateTime(wf.Date) >= (range?.From ?? DateOnly.MinValue) && DateOnly.FromDateTime(wf.Date) <= (range?.To ?? DateOnly.MaxValue))
.Select(wf => new WeatherForecastViewModel
{
Date = wf.Date.ToString(),
TemperatureC = wf.TemperatureC,
TemperatureF = wf.TemperatureF,
Summary = wf.Summary
});

return View(weatherForecasts);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
namespace BindTryParseMVC.Models
{
public class Culture
{
public string? DisplayName { get; }

public Culture(string displayName)
{
if (string.IsNullOrEmpty(displayName))
throw new ArgumentNullException(nameof(displayName));

DisplayName = displayName;
}

public static bool TryParse(string? value, out Culture? result)
{
if (value is null)
{
result = default;
return false;
}

result = new Culture(value);
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
namespace BindTryParseMVC.Models
{
public class DateRange
{
public DateOnly? From { get; }
public DateOnly? To { get; }

public DateRange(string from, string to)
{
if (string.IsNullOrEmpty(from))
throw new ArgumentNullException(nameof(from));
if (string.IsNullOrEmpty(to))
throw new ArgumentNullException(nameof(to));

From = DateOnly.Parse(from);
To = DateOnly.Parse(to);
}

public static bool TryParse(string? value, IFormatProvider? provider, out DateRange? result)
{
if (string.IsNullOrEmpty(value) || value.Split('-').Length != 2)
{
result = default;
return false;
}

var range = value.Split('-');
result = new DateRange(range[0], range[1]);
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace BindTryParseMVC.Models
{
public class ErrorViewModel
{
public string? RequestId { get; set; }

public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}
Loading