@@ -1446,6 +1446,29 @@ function isInvalidUtf8Error (err) {
14461446 return message . includes ( 'invalid byte sequence for encoding "UTF8"' ) || message . includes ( '0x00' )
14471447}
14481448
1449+ function isUniqueConstraintError ( err ) {
1450+ if ( ! err ) {
1451+ return false
1452+ }
1453+ if ( err . code === 'P2002' ) {
1454+ return true
1455+ }
1456+ const message = err . message || ''
1457+ return message . includes ( 'Unique constraint failed' )
1458+ }
1459+
1460+ function logUniqueConstraintSkip ( memberItem , err ) {
1461+ const identifier = compactObject ( {
1462+ userId : memberItem ?. userId ,
1463+ handle : memberItem ?. handle ,
1464+ handleLower : memberItem ?. handleLower
1465+ } )
1466+ logWarn ( 'Skipping member due to unique constraint violation' , {
1467+ ...identifier ,
1468+ target : err ?. meta ?. target
1469+ } )
1470+ }
1471+
14491472async function createMembersIndividually ( memberItems ) {
14501473 for ( const memberItem of memberItems ) {
14511474 try {
@@ -1457,6 +1480,10 @@ async function createMembersIndividually (memberItems) {
14571480 timeout : TRANSACTION_TIMEOUT_MS
14581481 } ) )
14591482 } catch ( err ) {
1483+ if ( isUniqueConstraintError ( err ) ) {
1484+ logUniqueConstraintSkip ( memberItem , err )
1485+ continue
1486+ }
14601487 if ( isInvalidUtf8Error ( err ) ) {
14611488 console . warn ( `Skipping member ${ memberItem . userId || memberItem . handleLower || 'unknown' } due to invalid UTF-8 data` )
14621489 continue
@@ -1495,6 +1522,11 @@ async function createMembers (memberItems) {
14951522 await createMembersIndividually ( memberItems )
14961523 return
14971524 }
1525+ if ( isUniqueConstraintError ( err ) ) {
1526+ console . warn ( 'Batch insert failed due to unique constraint violation. Falling back to per-member inserts.' )
1527+ await createMembersIndividually ( memberItems )
1528+ return
1529+ }
14981530 throw err
14991531 }
15001532}
0 commit comments