Miembros de a granel y miembros del equipo, una transacción por registro

FeatureSecurityService
Se descapó
29 de agosto de 2026 a las 20:16 UTC
Autor
Kamo
Compromit
0e87cad

Las dos pantallas a granel necesitan crear una hoja de cálculo de personas en una sola presentación e informar sobre cada uno de ellos individualmente. Eso no se pudo construir sobre la endpoints, por lo que el oleoducto de creación se mueve fuera del controlador. MiembroCreationService ahora es el dueño, marcado REQUIRES-NEW. Por lo tanto, cada registro se compromete o retrocede sobre sí mismo, que es toda la premisa de la pantalla: a Fallo en récord 7 deja 1-6 creado, y sólo las filas que fallaron se quedaron en el página a corregir. Si el bucle se hubiera quedado en el controlador, el representante de Spring lo haría. no haber visto la llamada (autoinvocación), cada disco habría compartido uno transacción, y el primer fracaso atrapado lo habría marcado sólo con retroceso y Descartó a los miembros que ya habían tenido éxito en su momento. MemberBulkCreator dirige el lote y NO es deliberadamente transaccional para el la misma razón: una transacción exterior sería envenenada exactamente con las excepciones que existe para absorber. También rechaza un correo electrónico o nombre de usuario repetido dentro de uno sumisión, que de lo contrario surgiría como "ya un miembro" y enviaría al administrador buscar a un miembro esta misma petición había creado un segundo antes, y vuelven a publicar esas afirmaciones cuando una pelea falla por alguna otra razón. Ambos endpoints de un solo registro ahora se delegan en el mismo servicio, por lo que la ruta a granel ejecuta una secuencia idéntica: reutilizar el Usuario que coincida con el correo electrónico personal (ganadas más antiguas insensibles, rechazar una membresía duplicada con 409, crear a través de MemberService, espejo en la seguridadProvider org, volver a materializar los derechos, entonces enviar la verificación y los correos electrónicos WELCOME. Otros dos cambios caen de esto: Mesorado de usuarioGenerator rellena un nombre de usuario en blanco, en el orden que el producto preguntó para... primero.last, f.last, first.l, first.m.last, luego el mismo cuatro numerado. Es pliegues acentos, respeta la columna de 20 caracteres, nunca termina en un separador y Nunca mene un mango reservado. La disponibilidad es sondeada globalmente, porque el inicio de sesión resuelve LOWER(u.username) en toda la tabla antes de mirar cualquier org. Nombre de usuarioDisponibilidadRepositorio es SecurityService-local para que este barco sin un bache de versión compartible; el buscador compartido es exacto y tira directamente una vez que dos filas choquen. Se rechaza ahora un nombre de usuario de tipo mano que choca sólo por caso crear un segundo usuario. Ese par es irrecuperable: ambas cuentas se convierten ambiguo en la forma de inicio de sesión y encontrarByUsername lanza para cada uno de ellos A partir de entonces. El formulario de un solo registro siempre envía un nombre de usuario que ya tiene validados, para que nada retroceda allí. ******************* aprende ExtractOrgId, que es extractusId's hermano y faltaba sólo porque los dos controladores que lo usan son anteriores a la patrón. Cuatro entradas de referencia van con él.

Todos los cambios

Como lo que ves enviaste?

Cada una de estas actualizaciones aterriza en su espacio de trabajo automáticamente. Empieza gratis y verlo crecer semana tras semana.

Arranzar gratis para siempreVer Precios