mirror of
https://github.com/fsolla/teqo.git
synced 2026-11-15 10:43:07 +00:00
Qualquer pessoa visível ganha/perde Assessora, Lidera e Aliada em pela lista: a primeira cidade cria a entidade (conta staff sem credenciais utilizáveis / liderança / dobradinha), a última remove da tabela com confirmação destrutiva (manifest: votos+convites da liderança, conta+ autorias+assessorado da assessora; dobradinha sem diálogo). Saída destrutiva por escopo: assessor encerra Lidera/Aliada com a capacidade inteira na carteira; Assessora segue coordenação/candidato. Escritas person-centric por contactId com extração dos deltas B34/B37 e da cascata de conta (deleteCampaignUserAccount, nextFreeStubCampaignEmail, matchers de conflito) — sem twin. commitGuard/commitWithNullOwner/ extraFormFields como opt-ins no RelationChipCell. Corrige bug latente C116 (célula Assessora nunca salvava — contactId faltava no FormData). Sem migration. Int: 28, unit: 6, e2e: +2.
21 lines
844 B
TypeScript
21 lines
844 B
TypeScript
import 'server-only'
|
|
|
|
/**
|
|
* C128 — shared leadership identity-conflict matcher. Was private to
|
|
* `actions/leadership.ts` (create path); the person lifecycle
|
|
* (`setPersonLeadershipMunicipalitiesRecord`) creates leaderships too, and the
|
|
* `contact` unique violation must map to the same safe message in both
|
|
* surfaces. Lives outside the 'use server' module because a plain const cannot
|
|
* be re-exported from one (Next.js allows only async function exports there).
|
|
*/
|
|
|
|
export const isUniqueLeadershipConflict = (error: unknown): boolean => {
|
|
const message = error instanceof Error ? error.message : String(error)
|
|
if (/leadership_contact|duplicate key/i.test(message)) {
|
|
return true
|
|
}
|
|
|
|
if (!(error instanceof Error) || error.name !== 'ValidationError') return false
|
|
|
|
return /contact(?:_id)?/i.test(JSON.stringify(error))
|
|
}
|