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
2 changes: 1 addition & 1 deletion .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ jobs:
- name: Build
run: dotnet build --no-restore
- name: Test
run: dotnet test --no-build --verbosity normal
run: dotnet test --no-build --verbosity normal
7 changes: 3 additions & 4 deletions Controllers/TJController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,13 @@ record TJRequest(int Period, int Year, int Duration);
[ApiController]
public class TJController : ControllerBase
{
[HttpGet("{period:int}/{year:int}/{duration:int}")]
public IActionResult TJ(int period, int year, int duration)
[HttpGet("{period:int}/{year:int}/{duration:int?}")]
public IActionResult TJ(int period, int year, int duration = 0)
{
TJRequest req = new(period, year, duration);
return GenerateResponse(req);
}


private bool ValidateRequest(TJRequest req, out ObjectResult error)
{
error = BadRequest(new ErrorMessage("This shouldn't appear! Aamuja."));
Expand Down Expand Up @@ -52,7 +51,7 @@ private ObjectResult GenerateResponse(TJRequest req)
// Assume it's the 21 century
year += 2000;

TJ tj = TJGenerator.GenerateTJ(req.Period == 1, year, req.Duration);
TJ tj = TJGenerator.GenerateTJ(req.Period, year, req.Duration);
return Ok(tj);
}
}
6 changes: 4 additions & 2 deletions Models/TJ.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
namespace TJ_API.Models;

public record TJ(
int Days,
double Days,
double Weeks,
double Months,
double Seconds
double Seconds,
long StartDate,
long ReturnDate
);
69 changes: 53 additions & 16 deletions Services/TJGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,30 +1,67 @@
using TJ_API.Models;
using TJ_API.Services;

namespace TJ_API.Services;

public static class TJGenerator
{
public static TJ GenerateTJ(bool firstPeriod, int year, int duration)
/// <summary>
/// Arrival patches mapped with their starting dates.
/// </summary>
private static readonly Dictionary<string, DateTime> StartingDates = new()
{
DateTime beginningDate;
if (firstPeriod)
{
// Assume first period starts January 6th
beginningDate = new(year, 1, 6);
}
else
{
// Assume second period starts July 7th
beginningDate = new(year, 7, 7);
}
{"1/2016", Utility.GenerateFinnishDate(2016, 1, 4)},
{"2/2016", Utility.GenerateFinnishDate(2016, 7, 4)},
{"1/2017", Utility.GenerateFinnishDate(2017, 1, 2)},
{"2/2017", Utility.GenerateFinnishDate(2017, 7, 3)},
{"1/2018", Utility.GenerateFinnishDate(2018, 1, 8)},
{"2/2018", Utility.GenerateFinnishDate(2018, 7, 9)},
{"1/2019", Utility.GenerateFinnishDate(2019, 1, 7)},
{"2/2019", Utility.GenerateFinnishDate(2019, 7, 8)},
{"1/2020", Utility.GenerateFinnishDate(2020, 1, 6)},
{"2/2020", Utility.GenerateFinnishDate(2020, 7, 6)},
{"1/2021", Utility.GenerateFinnishDate(2021, 1, 4)},
{"2/2021", Utility.GenerateFinnishDate(2021, 7, 5)},
{"1/2022", Utility.GenerateFinnishDate(2022, 1, 3)},
{"2/2022", Utility.GenerateFinnishDate(2022, 7, 4)},
{"1/2023", Utility.GenerateFinnishDate(2023, 1, 2)},
{"2/2023", Utility.GenerateFinnishDate(2023, 7, 3)},
{"1/2024", Utility.GenerateFinnishDate(2024, 1, 8)},
{"2/2024", Utility.GenerateFinnishDate(2024, 7, 8)},
{"1/2025", Utility.GenerateFinnishDate(2025, 1, 6)},
{"2/2025", Utility.GenerateFinnishDate(2025, 7, 7)},
{"1/2026", Utility.GenerateFinnishDate(2026, 1, 5)},
{"2/2026", Utility.GenerateFinnishDate(2026, 7, 6)},
};

private static string GenerateArrivalPatch(int period, int year)
{
return $"{period}/{year}";
}

public static TJ GenerateTJ(int period, int year, int duration)
{
if (!StartingDates.TryGetValue(GenerateArrivalPatch(period, year), out DateTime beginningDate))
if (period == 1)
{
// Assume first period starts January 6th
beginningDate = new(year, 1, 6);
}
else
{
// Assume second period starts July 7th
beginningDate = new(year, 7, 7);
}
DateTime endingDate = beginningDate.AddDays(duration);
TimeSpan tjSpan = endingDate - DateTime.Now;

return new TJ(
Days: tjSpan.Days,
Weeks: Math.Round((double)tjSpan.Days / 7f, 2),
Months: Math.Round((double)tjSpan.Days / 30f, 2),
Seconds: Math.Ceiling(tjSpan.TotalSeconds)
Days: Math.Round(tjSpan.TotalDays, 2),
Weeks: Math.Round(tjSpan.TotalDays / 7f, 2),
Months: Math.Round(tjSpan.TotalDays / 30f, 2),
Seconds: Math.Round(tjSpan.TotalSeconds, 1),
StartDate: Utility.GetUnixTimestamp(beginningDate),
ReturnDate: Utility.GetUnixTimestamp(endingDate)
);
}
}
19 changes: 19 additions & 0 deletions Services/Utility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@ namespace TJ_API.Services;

public static class Utility
{
private static readonly TimeZoneInfo FinnishTimeZone = TimeZoneInfo.FindSystemTimeZoneById("FLE Standard Time");

/// <summary>
/// Generates a DateTime with the Finnish timezone
/// </summary>
public static DateTime GenerateFinnishDate(int year, int month, int day)
{
DateTime date = new(year, month, day);
return TimeZoneInfo.ConvertTimeFromUtc(date, FinnishTimeZone);
}

/// <summary>
/// Calculates the length of an integer.
/// Ex. 12345 -> 5
Expand All @@ -11,4 +22,12 @@ public static int IntegerLength(int num)
int abs = (num == int.MinValue) ? int.MaxValue : Math.Abs(num);
return (num == 0) ? 1 : (int)Math.Floor(Math.Log10(abs)) + 1;
}

/// <summary>
/// Converts given DateTime into a Unix timestamp long integer
/// </summary>
public static long GetUnixTimestamp(DateTime date)
{
return ((DateTimeOffset)date).ToUnixTimeSeconds();
}
}