Fix backend↔database mismatches found verifying against Fuchs_Database

Verified every [dbo].[...] object the backend calls against the SSDT project.
Two real mismatches fixed (both would fail at runtime):

- Banking search (bam/btl mode=s) called a non-existent
  [dbo].[fds__getBankingtransactions_list2] and dropped @tgtdate. The actual
  proc (and the legacy call) is [dbo].[fds__getBankingtransfers_list2]
  (@tgtdate,@mode,@search,@authuser) — corrected name + parameters.
- Widget generic branch called a phantom [dbo].[fds__getWidget] that never
  existed (legacy only had my/one; the dashboard only requests wdg/my, wdg/one).
  The default branch now returns 404 instead of hitting a missing proc.

(The 'fuchs__admin_logdebug' reference is only in a commented-out line.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-05 15:03:51 +02:00
parent 10ecdfa2e4
commit a00ec1da3b
2 changed files with 12 additions and 14 deletions
@@ -81,11 +81,13 @@ public partial class IntranetController
string mode = Form("mode").ToLower(); string mode = Form("mode").ToLower();
if (mode == "s" && Form("tgt").Contains(':')) if (mode == "s" && Form("tgt").Contains(':'))
{ {
// Search mode: @tgtdate is unused by the proc but required by its signature.
var pl = StdParamlist( var pl = StdParamlist(
SQL_VarChar("@mode", Form("mode")), SQL_Date("@tgtdate", DBNull.Value),
SQL_VarChar("@mode", Form("mode").ne("m")),
SQL_VarChar("@search", Form("tgt"))); SQL_VarChar("@search", Form("tgt")));
var dset = await getSQLDataSet_async( var dset = await getSQLDataSet_async(
"EXECUTE [dbo].[fds__getBankingtransactions_list2] @mode, @search, @authuser;", "EXECUTE [dbo].[fds__getBankingtransfers_list2] @tgtdate, @mode, @search, @authuser;",
_intranet.Intranet__SQLConnectionString, pl, _intranet.Intranet__SQLConnectionString, pl,
tablenames: new[] { "admin", "bank" }, tablenames: new[] { "admin", "bank" },
Security: DbSec, options: SqlOpt(fn, id, code)); Security: DbSec, options: SqlOpt(fn, id, code));
+7 -11
View File
@@ -97,19 +97,15 @@ public class FuchsWidgetService : IWidgetService
return await BuildWidgetResponse(userAccountId, dbSec, shortName, wdg); return await BuildWidgetResponse(userAccountId, dbSec, shortName, wdg);
} }
// ── Generic widget by id ────────────────────────────────────────────────── // ── Unknown widget id ──────────────────────────────────────────────────────
private async Task<IActionResult> HandleWidgetGeneric(string widgetId, string userAccountId, // The dashboard only requests "my" and "one"; there is no generic widget
// source in the schema (the legacy code had no such procedure either).
private Task<IActionResult> HandleWidgetGeneric(string widgetId, string userAccountId,
DatabaseSecurity dbSec) DatabaseSecurity dbSec)
{ {
var pl = Params(userAccountId, SQL_VarChar("@widget", widgetId, dbNull_IfEmpty: true)); _ = dbSec;
var dset = await getSQLDataSet_async( _logger.LogWarning("GetWidgetAsync: unknown widget id '{WidgetId}' requested by user={User}", widgetId, userAccountId);
"EXECUTE [dbo].[fds__getWidget] @widget, @authuser;", return Task.FromResult<IActionResult>(new NotFoundResult());
Conn, pl, tablenames: new[] { "admin", "data" }, Security: dbSec);
return await JSONAsync(new
{
admin = dset.Table("admin").FirstRow.toObjectDictionary(),
data = dset.Tables("data").toArrayofObjectDictionaries()
});
} }
// ── Widget renderer dispatcher ──────────────────────────────────────────── // ── Widget renderer dispatcher ────────────────────────────────────────────