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
Cdedi InfocadServer è un connettore di integrazione documentale: non persiste su Oracle ma dialoga, via .NET Remoting → HTTP REST, con un microservizio esterno (cdeUrl, assemblyACCDtoNetServ) 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 catenaCdeController → 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 PUTVERIFIED sui sorgenti; la persistenza finale avviene in un servizio esterno fuori scope (Autodesk ACC viacdeUrl), 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 quiCreateFoldercome 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
BIMCenterWebdopo 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 viaBIMController.CreateDirectory(BIMLoginCde.ascx.cs:594-595), non una cartella ACC — quindi laCreateFolderdel dominio Cde resta senza trigger UI. CdeController(proxy in-process,Descor.CDE.CdeControllers) — facciata dei metodi Cde.CdeBLBase(server, ospitato via .NET Remoting comeCde_BL.rem) — dispatcher percdeType.AccBL— client REST tipizzato (stile NSwag) verso il microserviziocdeUrl.- 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)— istanzianew 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
- Il chiamante invoca
CdeController.CreateFolder("Acc", folder, projectId, parentFolderID, refreshToken)(CdeController.cs:29). - 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 daDaoActivate(enControllers.Ctrl_Cde)(CdeController.cs:19,Ctrl_Base.cs:22-25).
DAOFactory.CreateDAO(Ctrl_Cde)restituisce un proxy .NET Remoting:Activator.GetObject(typeof(IConn), CHANNEL "://" SERVERADDRESS "/" "Cde_BL.rem")(DAOFactory.cs:18, nome servizio daCdeDictionary.resx→Cde_BL.rem).- Sul server,
Cde_BL.remè l'oggettoDescor.CDE.CdeBL.CdeBLBase, registrato inBusiness/Start.vb:1043(RegisterWellKnownServiceType(..., "Cde_BL.rem", SingleCall)). CdeBLBase.CreateFolder(CdeBLBase.cs:83):- se
_httpClientè null, leggeBaseUrldaConfigurationManager.AppSettings["cdeUrl"]e crea unHttpClient(:85-89); - se
cdeType == "Acc"istanzianew AccBL(BaseUrl, _httpClient)e chiamaconBl.CreateFolder(folder, projectId, parentFolderID, parentFolderID, refreshToken, CancellationToken.None)(:94-95), risolvendo ilTaskcon.Result(:96); - altrimenti ritorna
null("CDE technology non implementata").
- se
AccBL.CreateFolder(AccBL.cs:315):- valida
projectId != nullehub != null(:317-321); - costruisce l'URL
{cdeUrl}/Folder/{hub}/projects/{projectId}/folder/create?folder=...&parentFolderID=...&refreshToken=...con escaping (:323-339); - prepara una richiesta HTTP
PUTcon body vuotoapplication/jsoneAccept: application/json(:347-349); - invoca
client_.SendAsync(request_, ...)verso il microserviziocdeUrl(:358).
- valida
- Microservizio esterno
cdeUrl/ Autodesk ACC (fuori scope): crea la cartella nel progetto ACC e risponde. Su HTTP 200,AccBLdeserializza il corpo inIDictionary<string, OAUTH2TokenResponse>(:372-379); su status diverso sollevaApiException(:381-385). - Il risultato risale invariato:
AccBL→CdeBLBase(cast aDictionary<string, OAUTH2TokenResponse>,CdeBLBase.cs:97) →CdeController→ chiamante. Errori loggati conDescor.Infrastructure.LogManager.ExceptionLogger.LogException(ex)e ritornonull(CdeBLBase.cs:104-108).
API / service
- Trasporto interno: .NET Remoting (canale
SettingsManager.CHANNELsuSERVERADDRESS), endpoint well-knownCde_BL.rem→CdeBLBase(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 suIConn. - Contratto:
Descor.CDE.CdeInterface.IConn(IConn.cs) — regioni Item/Folder/OAuth/Project. - DAO/BL remoto:
Descor.CDE.CdeBL.CdeBLBase(CdeBLBase.cs) — dispatch percdeType == "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 (regioneIConnsenza implementazione, metodo segnapostoGetName→ "Federico !").CdeDALFactoryha solo metodi commentati. Nessun accesso a Oracle nel dominio Cde. - Shared objects:
FolderCdeBim(Id/Name/HubId/ProjectId) eItemCdeBim(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/DataLayernei progettiCde*(grep negativo suInfocadServer/Cde*). - Nessuna stored procedure con prefisso/infix
CDEassociata al dominio nel catalogo DB (database-catalog.json); l'unico matchSEQ_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:ArgumentNullExceptionsuprojectId/hubmancanti (AccBL.cs:317-321); gli altri parametri (folder, parentFolderID, refreshToken) sono aggiunti in query string solo se non null (:327-338). - Lato
CdeBLBase: guardia sucdeType == "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
refreshTokenOAuth2 (3-legged, flussoGet3LToken/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.ExceptionLoggerin 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"→ ritornonull("Not implemented CDE Technology"), nessuna chiamata esterna.- Errore HTTP/deserializzazione →
ApiExceptioninAccBL, catturata inCdeBLBase→ log +null. (Eccezione:UploadObjectrilancia l'eccezione,CdeBLBase.cs:427.) cdeUrlnon configurato / servizio down → fallimentoHttpClient, gestito come eccezione.- Assenza di trigger UI: il comando "Nuova Cartella" del tree BIM chiama
BIMController.CreateDirectory(file system), nonCde.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.DaoActivate → DAOFactory.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 chiamanteCdeBLBase.CreateFolder(CdeBLBase.cs:94).CdeBLBase.CreateFolder← esposto via Remoting comeCde_BL.rem; unico proxy clientCdeController.CreateFolder(CdeController.cs:31).CdeController.CreateFolder← nessun chiamante in InfocadServer/InfocadWeb (grep negativo). ICdeControlleristanziati inBIMLoginCde.ascx.csinvocano 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.
Regole correlate (related rules)
- Il dominio
Cdeè un connettore CDE, non un dominio dati Oracle: l'unico backend è REST versocdeUrl/Autodesk ACC; il progettoCdeDALè uno stub non implementato. - Tutta la selezione di tecnologia è governata da
cdeType(attualmente solo"Acc"è gestito; gli altri ritornanonull/"Not implemented"). - Autenticazione via OAuth2 3-legged (metodi
Get3LToken,FinishLogin,GetClientID,RefreshToken); i metodi propaganorefreshTokene 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 RemotingCde_BL.rem, assenza di accesso Oracle nel dominio (stubCde_DAL, grep negativo). - SUPPORTED: mappatura endpoint
PUT .../folder/create→ creazione cartella su Autodesk ACC (dedotta da URL/verbo e namingACCDtoNetServ); comportamento del microserviziocdeUrl. - 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 diOAUTH2TokenResponse. - Dove è configurato
cdeUrlin ambiente reale (nessunweb.config/app.configcon la chiave trovato nei percorsi ispezionati) e quale host/porta usa il canale RemotingSERVERADDRESS. - 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?