- Shipped
- 29 agosto 2026 alle ore 20:16 UTC
- Author
- Kamo
- Commit
- 0e87cad
I due schermi di massa-add devono creare un foglio di calcolo delle persone in una sola presentazione e riferire su ciascuno di loro individualmente. Questo non potrebbe essere costruito sull'esistente endpoints, quindi la pipeline di creazione si allontana dal controller. MemberCreationService ora lo possiede, contrassegnato REQUIRES NEW. Ogni record quindi commette o rotola da solo, che è l'intera premessa dello schermo: un guasto al record 7 foglie 1-6 creato, e solo le righe che non sono riusciti a rimanere sul pagina da correggere. Se l'anello fosse rimasto nel controller, il proxy di primavera sarebbe non hanno visto la chiamata (autoinvocazione), ogni record avrebbe condiviso uno transazione, e il primo fallimento catturato avrebbe segnato solo rollback e scartato i membri che erano già riusciti a commettere tempo. MemberBulkCreator gestisce il lotto e non è deliberatamente transazionale per stesso motivo -- una transazione esterna sarebbe avvelenata da esattamente le eccezioni che esiste per assorbire. Si rifiuta anche un email o un nome utente ripetuto all'interno di uno presentazione, che altrimenti supererebbe come "già un membro" e inviare l'amministratore alla ricerca di un membro questa stessa richiesta aveva creato un secondo prima, e esso rilascia quelle affermazioni di nuovo quando una riga fallisce per qualche altro motivo. Entrambi gli endpoint a singolo record ora delegano allo stesso servizio, quindi il percorso di rinfuse esegue una sequenza identica: riutilizzare l'Utente corrispondente all'e-mail personale (caso-insensibile, vittorie più antiche), rifiutare un doppiaggio con 409, creare attraverso MemberService, specchio nella sicurezzaProvider org, rimaterializzare i diritti, poi inviare la verifica e le e-mail WELCOME. Altri due cambiamenti ne derivano: MemberUsernameGenerator riempie in un nome utente vuoto, nell'ordine il prodotto richiesto per -- primo.last, f.last, first.l, first.m.last, poi gli stessi quattro numerati. Si'. ripiega accenti, rispetta la colonna 20 caratteri, mai termina su un separatore e non minge mai una maniglia riservata. La disponibilità è probed globalmente, perché il login risolve LOWER (u.username) su tutta la tabella prima di guardare qualsiasi org. UsernameAvailabilityRepository è SecurityService-local quindi questa navi senza un paraurti della versione di biblioteca condivisa; il ricercatore condiviso è esatto-caso e lancia dritto una volta che due file si scontrano. Un nome utente di tipo mano che collide solo per caso è ora rifiutato piuttosto che creare un secondo utente. Quella coppia è irrecuperabile: entrambi i conti diventano ambiguo alla forma di firma e trovareByUsername getta per ciascuno di loro dopo. Il modulo single-record invia sempre un nome utente che ha già convalidato, quindi niente regredisce lì. E' il momento giusto. impara l'estrattoOrgId, che è l'estratto sibling e mancava solo perché i due controller che lo utilizzano predate modello. Quattro voci base vanno con esso.