chore: reorganize project structure and ensure default queues
This commit is contained in:
parent
854887f499
commit
1cccb852a5
201 changed files with 417 additions and 838 deletions
139
scripts/seed-agents.mjs
Normal file
139
scripts/seed-agents.mjs
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
import "dotenv/config"
|
||||
import pkg from "@prisma/client"
|
||||
import { hashPassword } from "better-auth/crypto"
|
||||
import { ConvexHttpClient } from "convex/browser"
|
||||
|
||||
const { PrismaClient } = pkg
|
||||
const prisma = new PrismaClient()
|
||||
|
||||
const USERS = [
|
||||
{ name: "Administrador", email: "admin@sistema.dev", role: "admin" },
|
||||
{ name: "Gabriel Oliveira", email: "gabriel.oliveira@rever.com.br", role: "agent" },
|
||||
{ name: "George Araujo", email: "george.araujo@rever.com.br", role: "agent" },
|
||||
{ name: "Hugo Soares", email: "hugo.soares@rever.com.br", role: "agent" },
|
||||
{ name: "Julio Cesar", email: "julio@rever.com.br", role: "agent" },
|
||||
{ name: "Lorena Magalhães", email: "lorena@rever.com.br", role: "agent" },
|
||||
{ name: "Rever", email: "renan.pac@paulicon.com.br", role: "agent" },
|
||||
{ name: "Telão", email: "suporte@rever.com.br", role: "agent" },
|
||||
{ name: "Thiago Medeiros", email: "thiago.medeiros@rever.com.br", role: "agent" },
|
||||
{ name: "Weslei Magalhães", email: "weslei@rever.com.br", role: "agent" },
|
||||
]
|
||||
|
||||
const TENANT_ID = process.env.SEED_TENANT_ID ?? "tenant-atlas"
|
||||
const DEFAULT_AGENT_PASSWORD = process.env.SEED_AGENT_PASSWORD ?? "agent123"
|
||||
const DEFAULT_ADMIN_PASSWORD = process.env.SEED_ADMIN_PASSWORD ?? "admin123"
|
||||
const CONVEX_URL = process.env.NEXT_PUBLIC_CONVEX_URL
|
||||
|
||||
async function syncConvexUsers(users) {
|
||||
if (!CONVEX_URL) {
|
||||
console.warn("NEXT_PUBLIC_CONVEX_URL não definido; sincronização com Convex ignorada.")
|
||||
return
|
||||
}
|
||||
|
||||
const client = new ConvexHttpClient(CONVEX_URL)
|
||||
for (const user of users) {
|
||||
try {
|
||||
await client.mutation("users:ensureUser", {
|
||||
tenantId: TENANT_ID,
|
||||
email: user.email,
|
||||
name: user.name,
|
||||
role: user.role.toUpperCase(),
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(`Falha ao sincronizar usuário ${user.email} com Convex`, error)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const emails = USERS.map((user) => user.email.toLowerCase())
|
||||
|
||||
const existing = await prisma.authUser.findMany({
|
||||
where: {
|
||||
email: {
|
||||
notIn: emails,
|
||||
},
|
||||
},
|
||||
select: { id: true },
|
||||
})
|
||||
|
||||
if (existing.length > 0) {
|
||||
const ids = existing.map((user) => user.id)
|
||||
await prisma.authSession.deleteMany({ where: { userId: { in: ids } } })
|
||||
await prisma.authAccount.deleteMany({ where: { userId: { in: ids } } })
|
||||
await prisma.authUser.deleteMany({ where: { id: { in: ids } } })
|
||||
}
|
||||
|
||||
const seededUsers = []
|
||||
|
||||
for (const definition of USERS) {
|
||||
const email = definition.email.toLowerCase()
|
||||
const role = definition.role ?? "agent"
|
||||
const password = definition.password ?? (role === "admin" ? DEFAULT_ADMIN_PASSWORD : DEFAULT_AGENT_PASSWORD)
|
||||
const hashedPassword = await hashPassword(password)
|
||||
|
||||
const user = await prisma.authUser.upsert({
|
||||
where: { email },
|
||||
update: {
|
||||
name: definition.name,
|
||||
role,
|
||||
tenantId: TENANT_ID,
|
||||
emailVerified: true,
|
||||
},
|
||||
create: {
|
||||
email,
|
||||
name: definition.name,
|
||||
role,
|
||||
tenantId: TENANT_ID,
|
||||
emailVerified: true,
|
||||
accounts: {
|
||||
create: {
|
||||
providerId: "credential",
|
||||
accountId: email,
|
||||
password: hashedPassword,
|
||||
},
|
||||
},
|
||||
},
|
||||
include: { accounts: true },
|
||||
})
|
||||
|
||||
const credentialAccount = user.accounts.find(
|
||||
(account) => account.providerId === "credential" && account.accountId === email,
|
||||
)
|
||||
|
||||
if (credentialAccount) {
|
||||
await prisma.authAccount.update({
|
||||
where: { id: credentialAccount.id },
|
||||
data: { password: hashedPassword },
|
||||
})
|
||||
} else {
|
||||
await prisma.authAccount.create({
|
||||
data: {
|
||||
userId: user.id,
|
||||
providerId: "credential",
|
||||
accountId: email,
|
||||
password: hashedPassword,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
seededUsers.push({ id: user.id, name: definition.name, email, role })
|
||||
console.log(`✅ Usuário sincronizado: ${definition.name} <${email}> (${role})`)
|
||||
}
|
||||
|
||||
await syncConvexUsers(seededUsers)
|
||||
|
||||
console.log("")
|
||||
console.log(`Senha padrão agentes: ${DEFAULT_AGENT_PASSWORD}`)
|
||||
console.log(`Senha padrão administrador: ${DEFAULT_ADMIN_PASSWORD}`)
|
||||
console.log(`Total de usuários ativos: ${seededUsers.length}`)
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((error) => {
|
||||
console.error("Erro ao processar agentes", error)
|
||||
process.exitCode = 1
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect()
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue