feat(auth): garantir usuarios padrao no start do container\n\n- Torna o seed idempotente por padrao (SEED_ENSURE_ONLY=true) sem resetar senhas existentes.\n- Executa

> web@0.1.0 auth:seed /home/renan/sistema-de-chamados
> node scripts/seed-auth.mjs

 Usuario garantido (sem reset de senha): admin@sistema.dev
 Usuario garantido (sem reset de senha): cliente.demo@sistema.dev
 Usuario garantido (sem reset de senha): mariana.andrade@atlasengenharia.com.br
 Usuario garantido (sem reset de senha): fernanda.lima@omnisaude.com.br
 Usuario garantido (sem reset de senha): joao.ramos@atlasengenharia.com.br
 Usuario garantido (sem reset de senha): aline.rezende@atlasengenharia.com.br
 Usuario garantido (sem reset de senha): ricardo.matos@omnisaude.com.br
 Usuario garantido (sem reset de senha): luciana.prado@omnisaude.com.br
 Usuario garantido (sem reset de senha): gabriel.oliveira@rever.com.br
 Usuario garantido (sem reset de senha): george.araujo@rever.com.br
 Usuario garantido (sem reset de senha): hugo.soares@rever.com.br
 Usuario garantido (sem reset de senha): julio@rever.com.br
 Usuario garantido (sem reset de senha): lorena@rever.com.br
 Usuario garantido (sem reset de senha): renan.pac@paulicon.com.br
 Usuario garantido (sem reset de senha): thiago.medeiros@rever.com.br
 Usuario garantido (sem reset de senha): weslei@rever.com.br apos  no stack.yml.\n- Garante admin e demais usuarios definidos sem acao manual, mesmo após reset do app.
This commit is contained in:
Esdras Renan 2025-10-09 16:34:59 -03:00
parent 43ef2bc239
commit 4e87911269
2 changed files with 60 additions and 63 deletions

View file

@ -5,6 +5,10 @@ import { hashPassword } from "better-auth/crypto"
const { PrismaClient } = pkg const { PrismaClient } = pkg
const prisma = new PrismaClient() const prisma = new PrismaClient()
// Em produção, evitar sobrescrever senhas a cada deploy.
// Por padrão, apenas GARANTE que o usuário e a conta existam (sem resetar senha).
const ensureOnly = (process.env.SEED_ENSURE_ONLY ?? "true").toLowerCase() === "true"
const tenantId = process.env.SEED_USER_TENANT ?? "tenant-atlas" const tenantId = process.env.SEED_USER_TENANT ?? "tenant-atlas"
const singleUserFromEnv = process.env.SEED_USER_EMAIL const singleUserFromEnv = process.env.SEED_USER_EMAIL
@ -132,17 +136,36 @@ const defaultUsers = singleUserFromEnv ?? [
}, },
] ]
async function upsertAuthUser({ email, password, name, role, tenantId: userTenant }) { async function ensureCredentialAccount(userId, email, hashedPassword, updatePassword) {
const existing = await prisma.authAccount.findFirst({
where: { userId, providerId: "credential", accountId: email },
})
if (existing) {
if (updatePassword) {
await prisma.authAccount.update({
where: { id: existing.id },
data: { password: hashedPassword },
})
}
return existing
}
return prisma.authAccount.create({
data: {
userId,
providerId: "credential",
accountId: email,
password: hashedPassword,
},
})
}
async function ensureAuthUser({ email, password, name, role, tenantId: userTenant }) {
const hashedPassword = await hashPassword(password) const hashedPassword = await hashPassword(password)
const user = await prisma.authUser.upsert({ const existing = await prisma.authUser.findUnique({ where: { email } })
where: { email }, if (!existing) {
update: { const user = await prisma.authUser.create({
name, data: {
role,
tenantId: userTenant,
},
create: {
email, email,
name, name,
role, role,
@ -155,58 +178,31 @@ async function upsertAuthUser({ email, password, name, role, tenantId: userTenan
}, },
}, },
}, },
include: { include: { accounts: true },
accounts: true,
},
}) })
console.log(`✅ Usuario criado: ${user.email}`)
await prisma.authAccount.updateMany({
where: {
userId: user.id,
accountId: email,
},
data: {
providerId: "credential",
},
})
let account = await prisma.authAccount.findFirst({
where: {
userId: user.id,
providerId: "credential",
accountId: email,
},
})
if (account) {
account = await prisma.authAccount.update({
where: { id: account.id },
data: {
password: hashedPassword,
},
})
} else {
account = await prisma.authAccount.create({
data: {
userId: user.id,
providerId: "credential",
accountId: email,
password: hashedPassword,
},
})
}
console.log(`✅ Usuario seed criado/atualizado: ${user.email}`)
console.log(` ID: ${user.id}`) console.log(` ID: ${user.id}`)
console.log(` Role: ${user.role}`) console.log(` Role: ${user.role}`)
console.log(` Tenant: ${user.tenantId ?? "(nenhum)"}`) console.log(` Tenant: ${user.tenantId ?? "(nenhum)"}`)
console.log(` Provider: ${account?.providerId ?? "-"}`)
console.log(` Senha provisoria: ${password}`) console.log(` Senha provisoria: ${password}`)
return
}
// Usuário já existe
if (!ensureOnly) {
await prisma.authUser.update({
where: { id: existing.id },
data: { name, role, tenantId: userTenant },
})
}
await ensureCredentialAccount(existing.id, email, hashedPassword, !ensureOnly)
console.log(`✅ Usuario garantido${ensureOnly ? " (sem reset de senha)" : " (atualizado)"}: ${email}`)
} }
async function main() { async function main() {
for (const user of defaultUsers) { for (const user of defaultUsers) {
await upsertAuthUser(user) await ensureAuthUser(user)
} }
} }

View file

@ -9,6 +9,7 @@ services:
bash -lc "corepack enable \ bash -lc "corepack enable \
&& corepack prepare pnpm@9 --activate \ && corepack prepare pnpm@9 --activate \
&& pnpm exec prisma migrate deploy \ && pnpm exec prisma migrate deploy \
&& pnpm auth:seed \
&& pnpm start -p 3000" && pnpm start -p 3000"
volumes: volumes:
- /srv/apps/sistema:/app - /srv/apps/sistema:/app