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:
parent
43ef2bc239
commit
4e87911269
2 changed files with 60 additions and 63 deletions
|
|
@ -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,81 +136,73 @@ 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,
|
email,
|
||||||
tenantId: userTenant,
|
name,
|
||||||
},
|
role,
|
||||||
create: {
|
tenantId: userTenant,
|
||||||
email,
|
accounts: {
|
||||||
name,
|
create: {
|
||||||
role,
|
providerId: "credential",
|
||||||
tenantId: userTenant,
|
accountId: email,
|
||||||
accounts: {
|
password: hashedPassword,
|
||||||
create: {
|
},
|
||||||
providerId: "credential",
|
|
||||||
accountId: email,
|
|
||||||
password: hashedPassword,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
include: { accounts: true },
|
||||||
include: {
|
|
||||||
accounts: true,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
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 {
|
console.log(`✅ Usuario criado: ${user.email}`)
|
||||||
account = await prisma.authAccount.create({
|
console.log(` ID: ${user.id}`)
|
||||||
data: {
|
console.log(` Role: ${user.role}`)
|
||||||
userId: user.id,
|
console.log(` Tenant: ${user.tenantId ?? "(nenhum)"}`)
|
||||||
providerId: "credential",
|
console.log(` Senha provisoria: ${password}`)
|
||||||
accountId: email,
|
return
|
||||||
password: hashedPassword,
|
}
|
||||||
},
|
|
||||||
|
// Usuário já existe
|
||||||
|
if (!ensureOnly) {
|
||||||
|
await prisma.authUser.update({
|
||||||
|
where: { id: existing.id },
|
||||||
|
data: { name, role, tenantId: userTenant },
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(`✅ Usuario seed criado/atualizado: ${user.email}`)
|
await ensureCredentialAccount(existing.id, email, hashedPassword, !ensureOnly)
|
||||||
console.log(` ID: ${user.id}`)
|
console.log(`✅ Usuario garantido${ensureOnly ? " (sem reset de senha)" : " (atualizado)"}: ${email}`)
|
||||||
console.log(` Role: ${user.role}`)
|
|
||||||
console.log(` Tenant: ${user.tenantId ?? "(nenhum)"}`)
|
|
||||||
console.log(` Provider: ${account?.providerId ?? "-"}`)
|
|
||||||
console.log(` Senha provisoria: ${password}`)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
for (const user of defaultUsers) {
|
for (const user of defaultUsers) {
|
||||||
await upsertAuthUser(user)
|
await ensureAuthUser(user)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue