Get Availability and extension for all users
This commit is contained in:
@@ -12,6 +12,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CPATapi.Client", "src\CPATa
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CPATapi.Client.Tests", "test\CPATapi.Client.Tests\CPATapi.Client.Tests.csproj", "{17F37791-4F68-46D5-8CF5-5F1736F6776E}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CPATapi.Client.Tests", "test\CPATapi.Client.Tests\CPATapi.Client.Tests.csproj", "{17F37791-4F68-46D5-8CF5-5F1736F6776E}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CPATapi.Server.Tests", "test\CPATapi.Server.Tests\CPATapi.Server.Tests.csproj", "{72486DC9-2C7D-409B-9E14-6D90F67B92CC}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -30,6 +32,10 @@ Global
|
|||||||
{17F37791-4F68-46D5-8CF5-5F1736F6776E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{17F37791-4F68-46D5-8CF5-5F1736F6776E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{17F37791-4F68-46D5-8CF5-5F1736F6776E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{17F37791-4F68-46D5-8CF5-5F1736F6776E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{17F37791-4F68-46D5-8CF5-5F1736F6776E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{17F37791-4F68-46D5-8CF5-5F1736F6776E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{72486DC9-2C7D-409B-9E14-6D90F67B92CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{72486DC9-2C7D-409B-9E14-6D90F67B92CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{72486DC9-2C7D-409B-9E14-6D90F67B92CC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{72486DC9-2C7D-409B-9E14-6D90F67B92CC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -30,4 +30,8 @@
|
|||||||
<Folder Include="wwwroot\" />
|
<Folder Include="wwwroot\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<InternalsVisibleTo Include="CPATapi.Server.Tests" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -11,19 +11,24 @@ namespace CPATapi.Server.Controllers;
|
|||||||
public class AvailabilityController(IZeitConsensRepository zeitConsens) : ControllerBase
|
public class AvailabilityController(IZeitConsensRepository zeitConsens) : ControllerBase
|
||||||
{
|
{
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("users")]
|
[Route("")]
|
||||||
[ProducesResponseType<IEnumerable<string>>(StatusCodes.Status200OK)]
|
[ProducesResponseType<IEnumerable<Availability>>(StatusCodes.Status200OK)]
|
||||||
public async Task<IActionResult> GetUsers()
|
public async Task<IActionResult> GetUsers()
|
||||||
{
|
{
|
||||||
return Ok(await zeitConsens.GetUsersAsync());
|
return Ok(await zeitConsens.GetUsersAvailabilityAsync(DateTime.Now.Date, DateTime.Now.AddDays(1).Date));
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("{user}")]
|
[Route("{user}")]
|
||||||
[ProducesResponseType<Availability>(StatusCodes.Status200OK)]
|
[ProducesResponseType<Availability>(StatusCodes.Status200OK)]
|
||||||
|
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||||
public async Task<IActionResult> GetAvailability(string user)
|
public async Task<IActionResult> GetAvailability(string user)
|
||||||
{
|
{
|
||||||
var stampCount = (await zeitConsens.GetStampsAsync(user, DateTime.Now.Date, DateTime.Now.AddDays(1).Date)).Count();
|
var availability = await zeitConsens.GetUserAvailabilityAsync(user, DateTime.Now.Date, DateTime.Now.AddDays(1).Date);
|
||||||
return Ok(new Availability { User = user, LoggedIn = stampCount % 2 != 0 });
|
if (availability == null)
|
||||||
|
{
|
||||||
|
return NotFound();
|
||||||
|
}
|
||||||
|
return Ok(availability);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ namespace CPATapi.Server.Interfaces;
|
|||||||
|
|
||||||
public interface IZeitConsensRepository : IRepository
|
public interface IZeitConsensRepository : IRepository
|
||||||
{
|
{
|
||||||
Task<IEnumerable<string>> GetUsersAsync();
|
Task<IEnumerable<Availability>> GetUsersAvailabilityAsync(DateTime from, DateTime to);
|
||||||
Task<IEnumerable<Stamp>> GetStampsAsync(string user, DateTime from, DateTime to);
|
Task<Availability?> GetUserAvailabilityAsync(string user, DateTime from, DateTime to);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations.Schema;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
namespace CPATapi.Server.Models;
|
namespace CPATapi.Server.Models;
|
||||||
@@ -5,7 +6,9 @@ namespace CPATapi.Server.Models;
|
|||||||
public class Availability
|
public class Availability
|
||||||
{
|
{
|
||||||
[JsonPropertyName("user")]
|
[JsonPropertyName("user")]
|
||||||
public string User { get; set; }
|
public required string MA_USER_NAME { get; set; }
|
||||||
[JsonPropertyName("loggedIn")]
|
[JsonPropertyName("loggedIn")]
|
||||||
public bool LoggedIn { get; set; }
|
public bool LOGGED_IN { get; set; }
|
||||||
|
[JsonPropertyName("extension")]
|
||||||
|
public string? US_EXTENSION { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
namespace CPATapi.Server.Models;
|
|
||||||
|
|
||||||
public class Stamp
|
|
||||||
{
|
|
||||||
public int MA_NR { get; set; }
|
|
||||||
public DateTime BU_BU { get; set; }
|
|
||||||
}
|
|
||||||
@@ -6,29 +6,36 @@ namespace CPATapi.Server.Repository;
|
|||||||
|
|
||||||
internal class ZeitConsensRepository(IConfiguration config) : Repository(config), IZeitConsensRepository
|
internal class ZeitConsensRepository(IConfiguration config) : Repository(config), IZeitConsensRepository
|
||||||
{
|
{
|
||||||
public async Task<IEnumerable<string>> GetUsersAsync()
|
private const string SelectStampsQuery = """
|
||||||
|
SELECT
|
||||||
|
ma.MA_USER_NAME
|
||||||
|
,bu.LOGGED_IN
|
||||||
|
,us.US_EXTENSION
|
||||||
|
FROM dbo.MA_DATEN ma
|
||||||
|
INNER JOIN projectmanagement.dbo.CP_USER us on us.US_LOGINNAME = ma.MA_USER_NAME
|
||||||
|
OUTER APPLY (
|
||||||
|
SELECT count(*) % 2 AS LOGGED_IN
|
||||||
|
FROM dbo.BU
|
||||||
|
WHERE bu.BU_MA_NR = ma.MA_NR
|
||||||
|
AND
|
||||||
|
BU_BU >= @from AND BU_BU < @to
|
||||||
|
) bu
|
||||||
|
WHERE
|
||||||
|
ma.MA_USER_AKTIV = 1
|
||||||
|
""";
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Availability>> GetUsersAvailabilityAsync(DateTime from, DateTime to)
|
||||||
{
|
{
|
||||||
await using var con = await OpenAsync("ZeitConsens");
|
await using var con = await OpenAsync("ZeitConsens");
|
||||||
return await con.QueryAsync<string>("""
|
return await con.QueryAsync<Availability>(SelectStampsQuery, new { from, to });
|
||||||
SELECT DISTINCT MA_USER_NAME
|
|
||||||
FROM dbo.MA_DATEN
|
|
||||||
WHERE MA_USER_NAME IS NOT NULL AND MA_USER_AKTIV = 1
|
|
||||||
ORDER BY MA_USER_NAME
|
|
||||||
""");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Stamp>> GetStampsAsync(string user, DateTime from, DateTime to)
|
public async Task<Availability?> GetUserAvailabilityAsync(string user, DateTime from, DateTime to)
|
||||||
{
|
{
|
||||||
await using var con = await OpenAsync("ZeitConsens");
|
await using var con = await OpenAsync("ZeitConsens");
|
||||||
return await con.QueryAsync<Stamp>("""
|
return await con.QueryFirstOrDefaultAsync<Availability>($"""
|
||||||
SELECT
|
{SelectStampsQuery}
|
||||||
MA_NR
|
AND ma.MA_USER_NAME = @user
|
||||||
,BU_BU
|
|
||||||
FROM dbo.BU
|
|
||||||
INNER JOIN dbo.MA_DATEN on MA_NR = BU_MA_NR
|
|
||||||
WHERE
|
|
||||||
MA_USER_NAME = @user AND
|
|
||||||
BU_BU >= @from AND BU_BU < @to
|
|
||||||
""", new { user, from, to });
|
""", new { user, from, to });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<IsPackable>false</IsPackable>
|
||||||
|
<UserSecretsId>a7b40068-a2f6-4c63-bbd9-0fd346908fb0</UserSecretsId>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="coverlet.collector" Version="6.0.4" />
|
||||||
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
|
||||||
|
<PackageReference Include="NUnit" Version="4.3.2" />
|
||||||
|
<PackageReference Include="NUnit.Analyzers" Version="4.7.0" />
|
||||||
|
<PackageReference Include="NUnit3TestAdapter" Version="5.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\CPATapi.Server\CPATapi.Server.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Using Include="NUnit.Framework" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using CPATapi.Server.Repository;
|
||||||
|
|
||||||
|
namespace CPATapi.Server.Tests;
|
||||||
|
|
||||||
|
public class ZeitConsensRepositoryTest
|
||||||
|
{
|
||||||
|
[OneTimeSetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
// the type specified here is just so the secrets library can
|
||||||
|
// find the UserSecretId we added in the csproj file
|
||||||
|
var builder = new ConfigurationBuilder().AddUserSecrets<ZeitConsensRepositoryTest>();
|
||||||
|
|
||||||
|
_configuration = builder.Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IConfigurationRoot _configuration { get; set; }
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task TestGetUsersAvailabilityAsync()
|
||||||
|
{
|
||||||
|
var zcRepo = new ZeitConsensRepository(_configuration);
|
||||||
|
var availability= (await zcRepo.GetUsersAvailabilityAsync(DateTime.Now.Date, DateTime.Now.AddDays(1).Date)).ToList();
|
||||||
|
Assert.That(availability, Is.Not.Empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task TestGetUserAvailabilityAsync()
|
||||||
|
{
|
||||||
|
var zcRepo = new ZeitConsensRepository(_configuration);
|
||||||
|
var availability = await zcRepo.GetUserAvailabilityAsync("CPATRD", DateTime.Now.Date, DateTime.Now.AddDays(1).Date);
|
||||||
|
Assert.That(availability, Is.Not.Null);
|
||||||
|
Assert.That(availability.MA_USER_NAME, Is.EqualTo("CPATRD"));
|
||||||
|
Assert.That(availability.US_EXTENSION, Is.EqualTo("203"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user