Organizations
Workspaces, convites por email e gerenciamento de membros.
Visao geral
O modulo de Organizations (ou Workspaces) permite que usuarios criem espacos de trabalho, convidem membros por email e gerenciem roles dentro da organizacao. E a base para qualquer SaaS multi-usuario.
Rotas da API
| Metodo | Rota | Descricao |
|---|---|---|
| POST | /api/organizations | Criar organizacao |
| GET | /api/organizations | Listar organizacoes do usuario |
| GET | /api/organizations/:orgId | Detalhes da organizacao |
| PUT | /api/organizations/:orgId | Atualizar organizacao |
| DELETE | /api/organizations/:orgId | Deletar organizacao (owner) |
| POST | /api/organizations/:orgId/invite | Convidar membro por email |
| POST | /api/organizations/invite/:token/accept | Aceitar convite |
| GET | /api/organizations/:orgId/members | Listar membros |
| DELETE | /api/organizations/:orgId/members/:id | Remover membro |
| PUT | /api/organizations/:orgId/members/:id/role | Alterar role do membro |
Fluxo de convite
- Owner/admin chama
POST /api/organizations/:orgId/invitecom{ email, role } - Um token de convite e gerado
- Um link e criado:
http://localhost:3000/invite/<token> - O email e enviado ao convidado (via SMTP se configurado)
- O convidado clica no link e chama
POST /api/organizations/invite/:token/accept - O usuario e adicionado como membro da organizacao
Roles de organizacao
| Role | Permissoes |
|---|---|
| owner | Controle total. Pode deletar a org, mudar roles de membros, convidar. |
| admin | Pode convidar e remover membros, gerenciar recursos. |
| member | Acesso basico aos recursos da organizacao. |
Schema do banco
Se Prisma estiver habilitado, adicione estes models ao schema.prisma:
model Organization {
id String @id @default(cuid())
name String
slug String @unique
description String?
members OrgMember[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@map("organizations")
}
model OrgMember {
id String @id @default(cuid())
userId String
email String
role String @default("member")
organizationId String
organization Organization @relation(fields: [organizationId], references: [id])
joinedAt DateTime @default(now())
@@unique([userId, organizationId])
@@map("org_members")
}
model OrgInvite {
id String @id @default(cuid())
email String
role String @default("member")
token String @unique
organizationId String
invitedBy String
expiresAt DateTime
acceptedAt DateTime?
@@map("org_invites")
}
Variavel de ambiente
# Base URL para gerar links de convite
APP_URL=http://localhost:3000