Kapitola 07 / 09
ENSK

SmartExchange · .NET 10 · Chapter 07

Intaker and Web API integration

Rovnaký Reader → Resolver → Client → SQL adapter slúži obom aplikáciám. Aplikačná zostáva iba stavba query a riadenie operácie.

Shared code · Intaker + Web APIReviewed · 2026-10-27

Už zapojené v kóde Intakera

MicroApp.Core.Intaker · OnMessageAxtionExportXlsx.cs
// OnMessageAxtionExportXlsx · current source excerpts
authorizationMapping = ExportAuthorizationResourceCatalog.GetMapping(
    importTemplateSheet.IntakeSheet);

var reader = new LegacySqlAuthorizationGrantAdapter(
    (System.Data.Common.DbConnection)kata.Db.Connection, msg.Header.Product);
IAuthorizationContextResolver resolver =
    new SmartExchangeAuthorizationContextResolver(reader);
var principal = await resolver.ResolveAsync(
    new(userId, msg.Header.Product, authorizationMapping.ResourceKind));

authorizationPlan = await exportAuthorizationClient.PlanResourcesAsync(new(
    requestId, principal,
    new AuthorizationResource { Kind = authorizationMapping.ResourceKind },
    "export"));

// After PrepareQueryForExport; before filters, paging and Execute:
exportQueryBuilder.ApplyAuthorizationPlan(
    authorizationPlan, authorizationMapping,
    new SqlKataAuthorizationQueryAdapter());

MicroApplication.AuthorizeExports je prepínač aplikácie, aktuálne predvolene true. Handler vyžaduje ActionBy a používa databázu vybranú pre Header.Product. Loguje request/decision IDs a AlwaysDenied odmietne ešte pred vykonaním query.

ExportAuthorizationResourceCatalog.GetMapping(intakeSheet) nájde CRM entitu a GUID kľúč, potom zavolá spoločnú factory/registry. Aktuálny kód používa Company na nájdenie CRM assembly; nemá switch vzťahov pre jednotlivé entity. ExportQueryBuilder.ApplyAuthorizationPlan() iba zavolá adapter.Apply().

Jedna integrácia pre oba resources

Proposed Web API integration · shared code; trusted operation parameters
// resourceKind, action, policyVersion and rootIdColumn are server-owned.
// The database connection must match the authenticated product instance.
var reader = new LegacySqlAuthorizationGrantAdapter(connection, product);
var resolver = new SmartExchangeAuthorizationContextResolver(reader);
var principal = await resolver.ResolveAsync(
    new(userId, product, resourceKind), cancellationToken);
var plan = await policyClient.PlanResourcesAsync(new(
    requestId, principal,
    new AuthorizationResource { Kind = resourceKind, PolicyVersion = policyVersion },
    action), cancellationToken);
var mapping = AuthorizationSqlMappingFactory.Create(
    resourceKind, action,
    new AuthorizationSqlAttribute(rootIdColumn, AuthorizationSqlValueType.Guid),
    SmartExchangeAuthorizationRelationshipRegistry.GetRelationships(resourceKind));
query = queryAdapter.Apply(query, plan, mapping);
// Then count/page/execute; never ignore an authorization failure.
Parameter operáciePerson exportInterestedParty export
resourceKind / actionPerson / exportInterestedParty / export
rootIdColumnPerson.IdInterestedParty.Id
Demo policy verziapresentation-demopresentation-demo
Vzťah určený spoločnými metadátamicompanyIds → CompanyprojectIds → Project

Intaker už vyberá resource z template a plánuje export. API dodá vlastný query alias a action. Ani jeden nepotrebuje samostatný Person/InterestedParty autorizačný kód. Demo policies nie sú nasadené; reálna aplikácia dnes predvolene používa policy verziu default.

Konkrétny záznam: zostávajúca spoločná práca

Cerbos CheckResources je dostupné a Project Scope policy sme cez neho overili. Naše IAuthorizationPolicyClient zatiaľ ponúka iba PlanResources; spoločný CheckResources kontrakt a klientská metóda chýbajú.

Spoločný resource-attribute provider musí načítať dôveryhodné fakty, napríklad projectIds pre InterestedParty alebo companyIds pre Person. Najprv určime atribúty podľa resource; neskôr ich môžeme zúžiť podľa action pre jednoduchšie read/update/delete query. Provider je navrhnutý, nie implementovaný.

Hranica pokrytia: dnešný export POC filtruje root riadky. Samostatne neautorizuje každú súvisiacu entitu/stĺpec pridaný cez template. To potrebuje ďalší explicitný návrh a overenie.