Modernize and Dockerize server

This commit is contained in:
2026-03-19 13:35:53 +01:00
parent 76a2bf0e88
commit 766ed86999
21 changed files with 364 additions and 161 deletions
@@ -1,40 +1,29 @@
using CPATapi.Server.Interfaces;
using CPATapi.Server.Models;
using Microsoft.AspNetCore.Mvc;
using Dapper;
using Microsoft.Data.SqlClient;
namespace CPATapi.Server.Controllers
{
[Route("[controller]")]
[ApiController]
public class AvailabilityController(IConfiguration config) : ControllerBase
{
[HttpGet, Route("users")]
public async Task<IEnumerable<string>> GetUsers()
{
await using var con = new SqlConnection(config["Db:ConnectionStringZc"]);
await con.OpenAsync();
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
""");
}
namespace CPATapi.Server.Controllers;
[HttpGet, Route("{user}")]
public async Task<object> GetAvailability(string user)
{
await using var con = new SqlConnection(config["Db:ConnectionStringZc"]);
await con.OpenAsync();
var stampCount = (await con.QueryAsync("""
SELECT *
FROM dbo.BU
INNER JOIN dbo.MA_DATEN on MA_NR = BU_MA_NR
WHERE
MA_USER_NAME = @user AND
BU_BU >= @date AND BU_BU < @tomorrow
""", new { user, date = DateTime.Now.Date, tomorrow = DateTime.Now.AddDays(1).Date })).Count();
return new { user, loggedIn = stampCount % 2 != 0 };
}
[Route("[controller]")]
[ApiController]
public class AvailabilityController(IZeitConsensRepository zeitConsens) : ControllerBase
{
[HttpGet]
[Route("users")]
[ProducesResponseType<IEnumerable<string>>(StatusCodes.Status200OK)]
public async Task<IActionResult> GetUsers()
{
return Ok(await zeitConsens.GetUsersAsync());
}
[HttpGet]
[Route("{user}")]
[ProducesResponseType<Availability>(StatusCodes.Status200OK)]
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 });
}
}
@@ -1,37 +1,30 @@
using CPATapi.Server.Interfaces;
using CPATapi.Server.Models;
using Dapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
namespace CPATapi.Server.Controllers
namespace CPATapi.Server.Controllers;
[Route("[controller]")]
[ApiController]
public class CallerIdController(ITapiDirectoryRepository tapiDirectory) : ControllerBase
{
[Route("[controller]")]
[ApiController]
public class CallerIdController(IConfiguration config) : ControllerBase
[HttpGet]
[Route("{number}")]
[ProducesResponseType<TapiContact>(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> CallerIdAsync([FromRoute] string number)
{
[HttpGet, Route("{number}")]
public async Task<TapiContact> CallerIdAsync([FromRoute] string number)
if (number.Length >= 5)
{
if (number.Length >= 5)
{
var minMatch = number[^5..];
number = "%" + minMatch;
}
await using var con = new SqlConnection(config["Db:ConnectionString"]);
await con.OpenAsync();
var result = await con.QueryFirstOrDefaultAsync<TapiContact>("""
SELECT
TD_ID,
TD_NAME,
TD_NUMBER,
TD_NUMBER_TAPI,
TD_MEDIUM
FROM dbo.CP_TAPI_DIRECTORY
WHERE TD_NUMBER_TAPI LIKE @number
""", new {number});
return result;
var minMatch = number[^5..];
number = "%" + minMatch;
}
var result = await tapiDirectory.SearchByNumberAsync(number);
if (result != null)
{
return Ok(result);
}
return NotFound();
}
}
@@ -1,33 +1,21 @@
using CPATapi.Server.Interfaces;
using CPATapi.Server.Models;
using Dapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
namespace CPATapi.Server.Controllers
namespace CPATapi.Server.Controllers;
[ApiController]
[Route("[controller]")]
public class ContactController(ILogger<ContactController> logger, ITapiDirectoryRepository tapiDirectory) : ControllerBase
{
[ApiController]
[Route("[controller]")]
public class ContactController(ILogger<ContactController> logger, IConfiguration config) : ControllerBase
private readonly ILogger<ContactController> _logger = logger;
[HttpGet]
[Produces("application/json")]
[ProducesResponseType<IEnumerable<TapiContact>>(StatusCodes.Status200OK)]
public async Task<IActionResult> GetAsync()
{
private readonly ILogger<ContactController> _logger = logger;
[HttpGet]
public async Task<IEnumerable<TapiContact>> GetAsync()
{
await using var con = new SqlConnection(config["Db:ConnectionString"]);
await con.OpenAsync();
var contacts = await con.QueryAsync<TapiContact>("""
SELECT
TD_ID,
TD_NAME,
TD_NUMBER,
TD_NUMBER_TAPI,
TD_MEDIUM
FROM dbo.CP_TAPI_DIRECTORY
""");
return contacts;
}
return Ok(await tapiDirectory.GetAllAsync());
}
}
@@ -1,58 +1,25 @@
using System.Text;
using System.Text.RegularExpressions;
using CPATapi.Server.Interfaces;
using CPATapi.Server.Models;
using Dapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
namespace CPATapi.Server.Controllers
namespace CPATapi.Server.Controllers;
[Route("[controller]")]
[ApiController]
public class SearchController(ITapiDirectoryRepository tapiDirectory) : ControllerBase
{
[Route("[controller]")]
[ApiController]
public class SearchController(IConfiguration config) : ControllerBase
[HttpGet]
[ProducesResponseType<IEnumerable<TapiContact>>(StatusCodes.Status200OK)]
public async Task<IActionResult> SearchAsync([FromQuery] string query)
{
[HttpGet]
public async Task<IEnumerable<TapiContact>> SearchAsync([FromQuery] string query)
if (query == null)
{
if (query == null)
{
return new List<TapiContact>();
}
var args = Regex.Split(query, "\\s").Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).ToArray();
if (args.Length == 0)
{
return new List<TapiContact>();
}
await using var con = new SqlConnection(config["Db:ConnectionString"]);
await con.OpenAsync();
var sql = new StringBuilder("""
SELECT TOP 10
TD_ID,
TD_NAME,
TD_NUMBER,
TD_NUMBER_TAPI,
TD_MEDIUM
FROM dbo.CP_TAPI_DIRECTORY
WHERE
""");
var first = true;
var dp = new DynamicParameters();
for (var i = 1; i <= args.Length; i++)
{
if (!first)
{
sql.AppendLine("AND");
}
first = false;
sql.AppendLine($"(TD_NAME LIKE @s{i} OR");
sql.AppendLine($" TD_NUMBER_TAPI LIKE @s{i})");
dp.Add($"s{i}", $"%{args[i-1]}%");
}
return await con.QueryAsync<TapiContact>(sql.ToString(), dp);
return Ok(new List<TapiContact>());
}
var args = Regex.Split(query, "\\s").Where(s => !string.IsNullOrWhiteSpace(s)).Select(s => s.Trim()).ToArray();
return Ok(await tapiDirectory.SearchAsync(args));
}
}