Table of Contents

FLOW-CDE-001 — Creazione di una cartella su CDE esterno (Autodesk ACC) — dominio Cde

Flusso end-to-end di scrittura verso un Common Data Environment (CDE) esterno. Il dominio Cde di InfocadServer è un connettore di integrazione documentale: non persiste su Oracle ma dialoga, via .NET Remoting → HTTP REST, con un microservizio esterno (cdeUrl, assembly ACCDtoNetServ) che a sua volta pilota Autodesk ACC / Autodesk Construction Cloud (hub, project, folder, bucket S3, OAuth2 3-legged). L'operazione WRITE rappresentativa documentata è CreateFolder (creazione di una cartella in un progetto ACC), l'unica scrittura completamente implementata lungo tutta la catena CdeController → CdeBLBase → AccBL → REST PUT.

  • Flow ID: FLOW-CDE-001
  • Repository: InfocadServer (Cde{Controllers,Interface,BL,DAL,SharedObjects}, C#) + InfocadWeb (BIMCenterWeb, C#, punto di consumo dei metodi Cde)
  • Confidence complessiva: SUPPORTED — catena codice CdeController → (Remoting IConn) → CdeBLBase → AccBL → HTTP PUT VERIFIED sui sorgenti; la persistenza finale avviene in un servizio esterno fuori scope (Autodesk ACC via cdeUrl), non ispezionabile qui; nessun trigger UI/servizio in InfocadWeb invoca attualmente una WRITE Cde (solo letture sono cablate).

⚠️ has_standalone_write = false. Il dominio Cde non ha un percorso di scrittura autonomo cablato end-to-end da UI: in InfocadWeb solo i metodi di lettura del CdeController (GetHubs, GetProjects, GetProject, GetFolderContent, FinishLogin, GetClientID) risultano invocati. I metodi di scrittura (CreateFolder, ModifyFolder, UploadObject, CompleteUpdateAsync) esistono e sono completi lato server, ma privi di chiamante UI/servizio nel repository. Documento qui CreateFolder come operazione WRITE rappresentativa e più vicina, dichiarando esplicitamente che il path è completo dal controller in giù ma non ha un entry point interattivo attivo.


Obiettivo di business

Consentire a Infocad (modulo BIM/CDE) di creare una cartella all'interno di un progetto ospitato su un Common Data Environment esterno (Autodesk ACC), come parte della gestione documentale BIM (strutturazione delle cartelle di progetto in cui caricare/versionare modelli e file). L'operazione non tocca il database Oracle di Infocad: l'artefatto persistito è la cartella lato Autodesk ACC, e il risultato torna come Dictionary<string, OAUTH2TokenResponse> (esito + eventuale rinnovo token).

Attori

  • Utente BIM/CDE (in prospettiva): opererebbe dal BIMCenterWeb dopo il login OAuth2 al CDE (BIMLoginCde.ascx). Nota: nell'attuale codice web il comando "Nuova Cartella" del tree crea una directory su file system BIM via BIMController.CreateDirectory (BIMLoginCde.ascx.cs:594-595), non una cartella ACC — quindi la CreateFolder del dominio Cde resta senza trigger UI.
  • CdeController (proxy in-process, Descor.CDE.CdeControllers) — facciata dei metodi Cde.
  • CdeBLBase (server, ospitato via .NET Remoting come Cde_BL.rem) — dispatcher per cdeType.
  • AccBL — client REST tipizzato (stile NSwag) verso il microservizio cdeUrl.
  • Microservizio CDE esterno (cdeUrl, ACCDtoNetServ) e Autodesk ACC — fuori da questi repo.

Trigger

Chiamata programmatica al metodo CdeController.CreateFolder(cdeType, folder, projectId, parentFolderID, refreshToken) (CdeController.cs:29). Non esiste un trigger interattivo (postback/evento UI) attivo nel repository che lo invochi; il consumo Cde cablato in BIMCenterWeb è limitato ai metodi di lettura.

Frontend entry point

  • Shell/consumo Cde: InfocadWeb/WebMachine/CASSANDRA/BIMCenterWeb/UserControls/BIMLoginCde.ascx(.cs) — istanzia new CdeController() (:815,1128,1338,1373) e chiama solo letture (GetHubs :837, GetProjects :933, GetProject :1144, GetFolderContent :1192, FinishLogin :1351).
  • Pagina: BIMCenterWeb/WindowPages/BimRootCde.aspx(.cs).
  • Entry point WRITE (non cablato): CdeController.CreateFolder — invocabile ma senza chiamante UI.

Sequenza principale (main sequence) — CreateFolder

  1. Il chiamante invoca CdeController.CreateFolder("Acc", folder, projectId, parentFolderID, refreshToken) (CdeController.cs:29).
  2. Il controller inoltra al DAO tramite l'interfaccia IConn: ((IConn)this.DAO).CreateFolder(cdeType, folder, projectId, parentFolderID, refreshToken) (CdeController.cs:31).
    • this.DAO è stato risolto nel costruttore da DaoActivate(enControllers.Ctrl_Cde) (CdeController.cs:19, Ctrl_Base.cs:22-25).
  3. DAOFactory.CreateDAO(Ctrl_Cde) restituisce un proxy .NET Remoting: Activator.GetObject(typeof(IConn), CHANNEL "://" SERVERADDRESS "/" "Cde_BL.rem") (DAOFactory.cs:18, nome servizio da CdeDictionary.resxCde_BL.rem).
  4. Sul server, Cde_BL.rem è l'oggetto Descor.CDE.CdeBL.CdeBLBase, registrato in Business/Start.vb:1043 (RegisterWellKnownServiceType(..., "Cde_BL.rem", SingleCall)).
  5. CdeBLBase.CreateFolder (CdeBLBase.cs:83):
    • se _httpClient è null, legge BaseUrl da ConfigurationManager.AppSettings["cdeUrl"] e crea un HttpClient (:85-89);
    • se cdeType == "Acc" istanzia new AccBL(BaseUrl, _httpClient) e chiama conBl.CreateFolder(folder, projectId, parentFolderID, parentFolderID, refreshToken, CancellationToken.None) (:94-95), risolvendo il Task con .Result (:96);
    • altrimenti ritorna null ("CDE technology non implementata").
  6. AccBL.CreateFolder (AccBL.cs:315):
    • valida projectId != null e hub != null (:317-321);
    • costruisce l'URL {cdeUrl}/Folder/{hub}/projects/{projectId}/folder/create?folder=...&parentFolderID=...&refreshToken=... con escaping (:323-339);
    • prepara una richiesta HTTP PUT con body vuoto application/json e Accept: application/json (:347-349);
    • invoca client_.SendAsync(request_, ...) verso il microservizio cdeUrl (:358).
  7. Microservizio esterno cdeUrl / Autodesk ACC (fuori scope): crea la cartella nel progetto ACC e risponde. Su HTTP 200, AccBL deserializza il corpo in IDictionary<string, OAUTH2TokenResponse> (:372-379); su status diverso solleva ApiException (:381-385).
  8. Il risultato risale invariato: AccBLCdeBLBase (cast a Dictionary<string, OAUTH2TokenResponse>, CdeBLBase.cs:97) → CdeController → chiamante. Errori loggati con Descor.Infrastructure.LogManager.ExceptionLogger.LogException(ex) e ritorno null (CdeBLBase.cs:104-108).

API / service

  • Trasporto interno: .NET Remoting (canale SettingsManager.CHANNEL su SERVERADDRESS), endpoint well-known Cde_BL.remCdeBLBase (Business/Start.vb:1043). Nessun WCF/SOAP per questo dominio.
  • Trasporto esterno: HTTP REST verso cdeUrl. Endpoint della WRITE documentata: PUT {cdeUrl}/Folder/{hub}/projects/{projectId}/folder/create?folder&parentFolderID&refreshToken (AccBL.cs:324,348).
  • Altri endpoint di scrittura del client AccBL (definiti, non cablati a UI): PATCH .../folder/modify (ModifyFolder, :414,446), POST (UploadObject, :943 / CompleteUpdateAsync, :1053).

Backend

  • Facciata/controller: Descor.CDE.CdeControllers.CdeController (CdeController.cs) — thin delegator su IConn.
  • Contratto: Descor.CDE.CdeInterface.IConn (IConn.cs) — regioni Item/Folder/OAuth/Project.
  • DAO/BL remoto: Descor.CDE.CdeBL.CdeBLBase (CdeBLBase.cs) — dispatch per cdeType == "Acc".
  • Client REST: Descor.CDE.CdeBL.AccBL (AccBL.cs, ~1866 righe, generato in stile NSwag).
  • DAL Oracle: Descor.CDE.CdeDAL.Cde_DAL (CdeDAL/OracleODP/Cde_DAL.cs) — stub vuoto (regione IConn senza implementazione, metodo segnaposto GetName → "Federico !"). CdeDALFactory ha solo metodi commentati. Nessun accesso a Oracle nel dominio Cde.
  • Shared objects: FolderCdeBim (Id/Name/HubId/ProjectId) e ItemCdeBim (DTO leggeri).

Query / stored procedure

Passo Meccanismo Chiamata da
Creazione cartella su CDE esterno HTTP PUT {cdeUrl}/Folder/{hub}/projects/{projectId}/folder/create AccBL.cs:324,348,358
Nessuna stored procedure Oracle
  • Nessuna Execute*StoredProcedure / OracleCommand / DataLayer nei progetti Cde* (grep negativo su InfocadServer/Cde*).
  • Nessuna stored procedure con prefisso/infix CDE associata al dominio nel catalogo DB (database-catalog.json); l'unico match SEQ_BIM_CDE è una sequence del dominio BIM, non usata dal codice Cde.

Tabelle lette (read)

  • Nessuna tabella Oracle letta dal dominio Cde. Le "letture" sono chiamate REST GET verso cdeUrl (hub/progetti/contenuto cartelle), che restituiscono dati ospitati su Autodesk ACC.

Tabelle modificate (write)

  • Nessuna tabella Oracle. La scrittura crea una cartella su Autodesk ACC (risorsa esterna), tramite PUT .../folder/create. Persistenza fuori dal perimetro DB di Infocad.

Validazione

  • Lato AccBL: ArgumentNullException su projectId/hub mancanti (AccBL.cs:317-321); gli altri parametri (folder, parentFolderID, refreshToken) sono aggiunti in query string solo se non null (:327-338).
  • Lato CdeBLBase: guardia su cdeType == "Acc" (altri valori → null, :99-101); try/catch globale con logging (:104-108).
  • Lato trasporto: HTTP status ≠ 200 → ApiException (AccBL.cs:381-385); risposta null → ApiException "Response was null" (:375-377).
  • Autorizzazione: affidata al refreshToken OAuth2 (3-legged, flusso Get3LToken/FinishLogin); nessun grant Infocad/tenancy applicato lato Cde.

Side effects

  • Creazione di una cartella nel progetto ACC (effetto esterno, non transazionale rispetto a Infocad).
  • Possibile rinnovo del token OAuth2: il valore di ritorno è un Dictionary<string, OAUTH2TokenResponse> (il microservizio può restituire token aggiornati insieme all'esito).
  • Logging eccezioni su Descor.Infrastructure.LogManager.ExceptionLogger in caso di errore.
  • Nessun evento observable, nessun refresh cache DB (assenti in questo dominio).

Percorsi alternativi / di errore

  • Altre WRITE dello stesso pattern (definite, non cablate a UI): ModifyFolder (PATCH .../folder/modify, AccBL.cs:405), UploadObject (POST, :910), CompleteUpdateAsync (POST, :1000 — finalizza upload/versione di un item su bucket S3).
  • cdeType != "Acc" → ritorno null ("Not implemented CDE Technology"), nessuna chiamata esterna.
  • Errore HTTP/deserializzazioneApiException in AccBL, catturata in CdeBLBase → log + null. (Eccezione: UploadObject rilancia l'eccezione, CdeBLBase.cs:427.)
  • cdeUrl non configurato / servizio down → fallimento HttpClient, gestito come eccezione.
  • Assenza di trigger UI: il comando "Nuova Cartella" del tree BIM chiama BIMController.CreateDirectory (file system), non Cde.CreateFolder (BIMLoginCde.ascx.cs:594-595).

Diagramma di sequenza

sequenceDiagram
    actor Caller as Chiamante (nessun trigger UI attivo)
    participant Ctrl as CdeController.CreateFolder
    participant Proxy as Proxy Remoting (IConn / Cde_BL.rem)
    participant BL as CdeBLBase.CreateFolder (server)
    participant Acc as AccBL.CreateFolder (client REST)
    participant Svc as Microservizio cdeUrl (ACCDtoNetServ)
    participant ACC as Autodesk ACC (esterno)

    Caller->>Ctrl: CreateFolder("Acc", folder, projectId, parentFolderID, refreshToken)
    Ctrl->>Proxy: ((IConn)DAO).CreateFolder(...)
    Proxy->>BL: (Remoting) CreateFolder(...)
    alt cdeType == "Acc"
        BL->>Acc: new AccBL(cdeUrl, httpClient).CreateFolder(...)
        Acc->>Svc: PUT /Folder/{hub}/projects/{projectId}/folder/create?folder&parentFolderID&refreshToken
        Svc->>ACC: crea cartella nel progetto ACC
        ACC-->>Svc: esito
        Svc-->>Acc: 200 + Dictionary<string,OAUTH2TokenResponse>
        Acc-->>BL: IDictionary risultato
        BL-->>Ctrl: Dictionary risultato
    else cdeType != "Acc" / errore
        BL-->>Ctrl: null (log eccezione)
    end
    Ctrl-->>Caller: Dictionary<string,OAUTH2TokenResponse> | null

Matrice di tracciabilità (file:riga)

Livello Artefatto Evidenza (file:riga)
Consumo web (solo READ) BIMLoginCde.ascx.cs istanzia CdeController, chiama letture BIMLoginCde.ascx.cs:815,837,933,1128,1144,1192,1338,1351,1373
UI "Nuova Cartella" ≠ Cde crea directory FS via BIMController.CreateDirectory BIMLoginCde.ascx.cs:594-595
Facciata controller CdeController.CreateFolder((IConn)DAO).CreateFolder CdeController.cs:19,29,31
Risoluzione DAO Ctrl_Base.DaoActivateDAOFactory.CreateDAO (Remoting Cde_BL.rem) Ctrl_Base.cs:22-25; DAOFactory.cs:18; CdeDictionary.resx:121
Contratto IConn.CreateFolder (regione Folder) IConn.cs:30
Registrazione server CdeBLBase come Cde_BL.rem (Remoting) Business/Start.vb:1043
BL dispatcher CdeBLBase.CreateFolder (cdeType Acc → AccBL) CdeBLBase.cs:83,87,94-97,104-108
Client REST AccBL.CreateFolder (URL + PUT + SendAsync) AccBL.cs:315,317-321,323-339,347-349,358,372-385
DAL Oracle Cde_DAL stub vuoto (nessun accesso DB) Cde_DAL.cs:17-43
Config esterno cdeUrl da AppSettings CdeBLBase.cs:34,56,87

Reverse trace (dal client REST ai chiamanti)

  • AccBL.CreateFolder ← unico chiamante CdeBLBase.CreateFolder (CdeBLBase.cs:94).
  • CdeBLBase.CreateFolder ← esposto via Remoting come Cde_BL.rem; unico proxy client CdeController.CreateFolder (CdeController.cs:31).
  • CdeController.CreateFoldernessun chiamante in InfocadServer/InfocadWeb (grep negativo). I CdeController istanziati in BIMLoginCde.ascx.cs invocano solo metodi di lettura.
  • Forward e reverse concordano sul meccanismo della catena (CdeController → Remoting → CdeBLBase → AccBL → PUT); il reverse evidenzia però che manca un entry point che avvii la WRITE → nessun CONFLICTING, ma path non attivato lato consumo.
  • Il dominio Cde è un connettore CDE, non un dominio dati Oracle: l'unico backend è REST verso cdeUrl/Autodesk ACC; il progetto CdeDAL è uno stub non implementato.
  • Tutta la selezione di tecnologia è governata da cdeType (attualmente solo "Acc" è gestito; gli altri ritornano null/"Not implemented").
  • Autenticazione via OAuth2 3-legged (metodi Get3LToken, FinishLogin, GetClientID, RefreshToken); i metodi propagano refreshToken e possono restituire token rinnovati.
  • Convenzione di ritorno: Dictionary<string, OAUTH2TokenResponse> come envelope esito+token.

Evidenza (file:line)

Punti chiave (codice): CdeController.cs:14,17-19,29,31; Ctrl_Base.cs:14-25; DAOFactory.cs:12-18; CdeDictionary.resx:121 (Cde_BL.rem); IConn.cs:12,30; Business/Start.vb:1043 (registrazione Remoting CdeBLBase); CdeBLBase.cs:19,34,52-64,83-108; AccBL.cs:20,315-399 (in particolare :317-321 guardie, :324 URL, :348 PUT, :358 SendAsync, :372-385 gestione risposta); Cde_DAL.cs:17-43 (stub).

Punti chiave (consumo web): BIMLoginCde.ascx.cs:17-18 (using), :815,837,933,1128,1144,1192,1338,1351,1373 (solo READ), :594-595 (NewFolder → BIMController.CreateDirectory, non Cde).

Punti chiave (negativi / catalogo): grep Execute*StoredProcedure|OracleCommand|DataLayer su InfocadServer/Cde*0 hit; database-catalog.json → nessuna SP di dominio CDE (solo SEQ_BIM_CDE, sequence BIM).

Confidence

  • VERIFIED: catena di codice CdeController.CreateFolder → (IConn Remoting) → CdeBLBase.CreateFolder → AccBL.CreateFolder → HTTP PUT, registrazione Remoting Cde_BL.rem, assenza di accesso Oracle nel dominio (stub Cde_DAL, grep negativo).
  • SUPPORTED: mappatura endpoint PUT .../folder/create → creazione cartella su Autodesk ACC (dedotta da URL/verbo e naming ACCDtoNetServ); comportamento del microservizio cdeUrl.
  • INFERRED: semantica di business ACC (hub/project/folder, ruolo dei token restituiti) e assenza definitiva di un chiamante WRITE (basata sui repo disponibili; potrebbe esistere in client non inclusi).

Open questions

  • Esiste, in un client/servizio non presente in questi repo (es. app desktop BIM, altro microservizio), un trigger reale di CreateFolder/UploadObject? Nei repo forniti non risulta.
  • Contenuto e contratto del microservizio cdeUrl (ACCDtoNetServ): mapping esatto verso le API Autodesk Data Management/ACC, gestione errori e formato di OAUTH2TokenResponse.
  • Dove è configurato cdeUrl in ambiente reale (nessun web.config/app.config con la chiave trovato nei percorsi ispezionati) e quale host/porta usa il canale Remoting SERVERADDRESS.
  • Il progetto CdeDAL è previsto per una futura persistenza Oracle (log/anagrafica cartelle-CDE) o resterà uno stub? Attualmente non implementato.
  • Perché il comando UI "Nuova Cartella" usa il file system BIM anziché Cde.CreateFolder: scelta progettuale, work-in-progress o integrazione ACC non ancora rilasciata?