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
26 changes: 26 additions & 0 deletions EstateReportingAPI.DataTrasferObjects/CalendarYear.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace EstateReportingAPI.DataTrasferObjects
{
public class CalendarYear
{
public Int32 Year{ get; set; }
}

public class CalendarDate
{
public DateTime Date { get; set; }
public String DayOfWeek{ get; set; }
public Int32 DayOfWeekNumber{ get; set; }
public String DayOfWeekShort{ get; set; }
public String MonthName{ get; set; }
public String MonthNameShort { get; set; }
public Int32 MonthNumber { get; set; }
public Int32 WeekNumber { get; set; }
public String WeekNumberString { get; set; }
public Int32 Year { get; set; }
public String YearWeekNumber { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>

</Project>
7 changes: 7 additions & 0 deletions EstateReportingAPI.sln
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateReportingAPI", "Estat
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EstateReportingAPI.Tests", "EstateReportingAPI.Tests\EstateReportingAPI.Tests.csproj", "{1124CAC0-A2B3-44FF-8B16-C8722D7042A2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EstateReportingAPI.DataTrasferObjects", "EstateReportingAPI.DataTrasferObjects\EstateReportingAPI.DataTrasferObjects.csproj", "{4BEC708B-2A02-486F-8BEF-AD9D6220DD74}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -31,6 +33,10 @@ Global
{1124CAC0-A2B3-44FF-8B16-C8722D7042A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1124CAC0-A2B3-44FF-8B16-C8722D7042A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1124CAC0-A2B3-44FF-8B16-C8722D7042A2}.Release|Any CPU.Build.0 = Release|Any CPU
{4BEC708B-2A02-486F-8BEF-AD9D6220DD74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4BEC708B-2A02-486F-8BEF-AD9D6220DD74}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4BEC708B-2A02-486F-8BEF-AD9D6220DD74}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4BEC708B-2A02-486F-8BEF-AD9D6220DD74}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -39,6 +45,7 @@ Global
{8E6ED1E8-9776-49F3-ADEB-17A03318E136} = {713556C8-BFC0-4AB6-8F13-7631C1C82D07}
{DC3AEC92-739F-45E6-8513-CFAEA826984A} = {C48C544B-7C3B-4AA2-8A37-E49296A86499}
{1124CAC0-A2B3-44FF-8B16-C8722D7042A2} = {C48C544B-7C3B-4AA2-8A37-E49296A86499}
{4BEC708B-2A02-486F-8BEF-AD9D6220DD74} = {713556C8-BFC0-4AB6-8F13-7631C1C82D07}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B2BE269B-F142-45A3-9B75-483227C765A6}
Expand Down
42 changes: 42 additions & 0 deletions EstateReportingAPI/Bootstrapper/MiddlewareRegistry.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,59 @@
namespace EstateReportingAPI.Bootstrapper{
using System.Diagnostics.CodeAnalysis;
using System.Net.Security;
using System.Reflection;
using Common;
using EstateManagement.Database.Contexts;
using Lamar;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Shared.EntityFramework;
using Shared.EntityFramework.ConnectionStringConfiguration;
using Shared.General;
using Shared.Repositories;
using Swashbuckle.AspNetCore.Filters;

public class RepositoryRegistry : ServiceRegistry{
public RepositoryRegistry(){

Boolean useConnectionStringConfig = bool.Parse(ConfigurationReader.GetValue("AppSettings", "UseConnectionStringConfig"));

if (useConnectionStringConfig)
{
String connectionStringConfigurationConnString = ConfigurationReader.GetConnectionString("ConnectionStringConfiguration");
this.AddSingleton<IConnectionStringConfigurationRepository, ConnectionStringConfigurationRepository>();
this.AddTransient(c => { return new ConnectionStringConfigurationContext(connectionStringConfigurationConnString); });

// TODO: Read this from a the database and set
}
else
{
this.AddSingleton<IConnectionStringConfigurationRepository, ConfigurationReaderConnectionStringRepository>();
}

this.AddSingleton<IDbContextFactory<EstateManagementGenericContext>, DbContextFactory<EstateManagementGenericContext>>();

this.AddSingleton<Func<String, EstateManagementGenericContext>>(cont => connectionString =>
{
String databaseEngine =
ConfigurationReader.GetValue("AppSettings", "DatabaseEngine");

return databaseEngine switch
{
"MySql" => new EstateManagementMySqlContext(connectionString),
"SqlServer" => new EstateManagementSqlServerContext(connectionString),
_ => throw new
NotSupportedException($"Unsupported Database Engine {databaseEngine}")
};
});
}
}


[ExcludeFromCodeCoverage]
public class MiddlewareRegistry : ServiceRegistry{
public MiddlewareRegistry(){
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using Microsoft.Data.SqlClient;
using MySqlConnector;
using Shared.General;
using Shared.Repositories;
using System.Data.Common;
using System.Diagnostics.CodeAnalysis;

namespace EstateReportingAPI.Common
{
[ExcludeFromCodeCoverage]
public class ConfigurationReaderConnectionStringRepository : IConnectionStringConfigurationRepository
{
#region Methods

public async Task CreateConnectionString(String externalIdentifier,
String connectionStringIdentifier,
String connectionString,
CancellationToken cancellationToken)
{
throw new NotImplementedException("This is only required to complete the interface");
}

public async Task DeleteConnectionStringConfiguration(String externalIdentifier,
String connectionStringIdentifier,
CancellationToken cancellationToken)
{
throw new NotImplementedException("This is only required to complete the interface");
}

public async Task<String> GetConnectionString(String externalIdentifier,
String connectionStringIdentifier,
CancellationToken cancellationToken)
{
String connectionString = string.Empty;
String databaseName = string.Empty;

String databaseEngine = ConfigurationReader.GetValue("AppSettings", "DatabaseEngine");

databaseName = $"{connectionStringIdentifier}{externalIdentifier}";
connectionString = ConfigurationReader.GetConnectionString(connectionStringIdentifier);

DbConnectionStringBuilder builder = null;

if (databaseEngine == "MySql")
{
builder = new MySqlConnectionStringBuilder(connectionString)
{
Database = databaseName
};
}
else
{
// Default to SQL Server
builder = new SqlConnectionStringBuilder(connectionString)
{
InitialCatalog = databaseName
};
}

return builder.ToString();
}

#endregion
}
}
84 changes: 84 additions & 0 deletions EstateReportingAPI/Controllers/Dimensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
namespace EstateReportingAPI.Controllers
{
using DataTrasferObjects;
using EstateManagement.Database.Contexts;
using EstateManagement.Database.Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Shared.EntityFramework;
using System.Diagnostics.CodeAnalysis;

[ExcludeFromCodeCoverage]
[Route(DimensionsController.ControllerRoute)]
[ApiController]
//[Authorize]
public class DimensionsController : ControllerBase
{
private readonly IDbContextFactory<EstateManagementGenericContext> ContextFactory;

public DimensionsController(IDbContextFactory<EstateManagementGenericContext> contextFactory){
this.ContextFactory = contextFactory;
}

private const String ConnectionStringIdentifier = "EstateReportingReadModel";

#region Others

/// <summary>
/// The controller name
/// </summary>
public const String ControllerName = "dimensions";

/// <summary>
/// The controller route
/// </summary>
private const String ControllerRoute = "api/" + DimensionsController.ControllerName;

#endregion

[HttpGet]
[Route("getcalendaryears")]
public async Task<IActionResult> GetCalendarYears([FromHeader] Guid estateId, CancellationToken cancellationToken){

EstateManagementGenericContext? context = await this.ContextFactory.GetContext(estateId, DimensionsController.ConnectionStringIdentifier, cancellationToken);

List<Int32> years = context.Calendar.Where(c => c.Date <= DateTime.Now.Date).GroupBy(c => c.Year).Select(y => y.Key).ToList();

List<CalendarYear> response = new List<CalendarYear>();

years.ForEach(y => response.Add(new CalendarYear{
Year = y
}));

return this.Ok(response);
}

//[HttpGet]
//public async Task<IActionResult> GetCalendarDates([FromHeader] Guid estateId, [FromQuery] Int32 year, CancellationToken cancellationToken)
//{
// EstateManagementGenericContext? context = await this.ContextFactory.GetContext(estateId, DimensionsController.ConnectionStringIdentifier, cancellationToken);

// List<Calendar> dates= context.Calendar.Where(c => c.Date <= DateTime.Now.Date).ToList();

// List<CalendarDate> response = new List<CalendarDate>();

// dates.ForEach(d => response.Add(new CalendarDate{
// Year = d.Year,
// Date = d.Date,
// DayOfWeek = d.DayOfWeek,
// DayOfWeekNumber = d.DayOfWeekNumber,
// DayOfWeekShort = d.DayOfWeekShort,
// MonthName = d.MonthNameLong,
// MonthNameShort = d.MonthNameShort,
// MonthNumber = d.MonthNumber,
// WeekNumber = d.WeekNumber ?? 0,
// WeekNumberString = d.WeekNumberString,
// YearWeekNumber = d.YearWeekNumber,
// }));

// return this.Ok();
//}
}


}
3 changes: 2 additions & 1 deletion EstateReportingAPI/EstateReportingAPI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="EstateManagement.Database" Version="2023.8.1" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.10" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
Expand Down Expand Up @@ -36,7 +37,7 @@
</ItemGroup>

<ItemGroup>
<Folder Include="Controllers\" />
<ProjectReference Include="..\EstateReportingAPI.DataTrasferObjects\EstateReportingAPI.DataTrasferObjects.csproj" />
</ItemGroup>

<ItemGroup>
Expand Down
1 change: 1 addition & 0 deletions EstateReportingAPI/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ public void ConfigureContainer(ServiceRegistry services)
ConfigurationReader.Initialise(Configuration);

services.IncludeRegistry<MiddlewareRegistry>();
services.IncludeRegistry<RepositoryRegistry>();

Container = new Container(services);
}
Expand Down
7 changes: 6 additions & 1 deletion EstateReportingAPI/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,10 @@
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
"AllowedHosts": "*",
"AppSettings": {
"DatabaseEngine": "SqlServer"
//"DatabaseEngine": "MySql",
}

}