Get Availability and extension for all users
This commit is contained in:
@@ -30,4 +30,8 @@
|
||||
<Folder Include="wwwroot\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<InternalsVisibleTo Include="CPATapi.Server.Tests" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -11,19 +11,24 @@ namespace CPATapi.Server.Controllers;
|
||||
public class AvailabilityController(IZeitConsensRepository zeitConsens) : ControllerBase
|
||||
{
|
||||
[HttpGet]
|
||||
[Route("users")]
|
||||
[ProducesResponseType<IEnumerable<string>>(StatusCodes.Status200OK)]
|
||||
[Route("")]
|
||||
[ProducesResponseType<IEnumerable<Availability>>(StatusCodes.Status200OK)]
|
||||
public async Task<IActionResult> GetUsers()
|
||||
{
|
||||
return Ok(await zeitConsens.GetUsersAsync());
|
||||
return Ok(await zeitConsens.GetUsersAvailabilityAsync(DateTime.Now.Date, DateTime.Now.AddDays(1).Date));
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{user}")]
|
||||
[ProducesResponseType<Availability>(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public async Task<IActionResult> GetAvailability(string user)
|
||||
{
|
||||
var stampCount = (await zeitConsens.GetStampsAsync(user, DateTime.Now.Date, DateTime.Now.AddDays(1).Date)).Count();
|
||||
return Ok(new Availability { User = user, LoggedIn = stampCount % 2 != 0 });
|
||||
var availability = await zeitConsens.GetUserAvailabilityAsync(user, DateTime.Now.Date, DateTime.Now.AddDays(1).Date);
|
||||
if (availability == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
return Ok(availability);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,6 @@ namespace CPATapi.Server.Interfaces;
|
||||
|
||||
public interface IZeitConsensRepository : IRepository
|
||||
{
|
||||
Task<IEnumerable<string>> GetUsersAsync();
|
||||
Task<IEnumerable<Stamp>> GetStampsAsync(string user, DateTime from, DateTime to);
|
||||
Task<IEnumerable<Availability>> GetUsersAvailabilityAsync(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;
|
||||
|
||||
namespace CPATapi.Server.Models;
|
||||
@@ -5,7 +6,9 @@ namespace CPATapi.Server.Models;
|
||||
public class Availability
|
||||
{
|
||||
[JsonPropertyName("user")]
|
||||
public string User { get; set; }
|
||||
public required string MA_USER_NAME { get; set; }
|
||||
[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
|
||||
{
|
||||
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");
|
||||
return await con.QueryAsync<string>("""
|
||||
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
|
||||
""");
|
||||
return await con.QueryAsync<Availability>(SelectStampsQuery, new { from, to });
|
||||
}
|
||||
|
||||
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");
|
||||
return await con.QueryAsync<Stamp>("""
|
||||
SELECT
|
||||
MA_NR
|
||||
,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
|
||||
return await con.QueryFirstOrDefaultAsync<Availability>($"""
|
||||
{SelectStampsQuery}
|
||||
AND ma.MA_USER_NAME = @user
|
||||
""", new { user, from, to });
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user