> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devmob.app.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Membership

> Vínculo entre usuário, organização e role — define a participação e papel do usuário.

**Membership** representa a atribuição de uma role a um usuário. Para roles de organização e de ambiente, a Membership também define a organização ativa dessa atribuição. Para roles internas de BackOffice, a organização fica ausente.

## Campos

| Campo            | Tipo               | Descrição                                                    |
| ---------------- | ------------------ | ------------------------------------------------------------ |
| `membershipId`   | `UUID`             | Identificador único                                          |
| `userId`         | `UUID`             | Referência ao usuário                                        |
| `organizationId` | `UUID?`            | Referência à organização; `null` apenas para role `INTERNAL` |
| `roleId`         | `UUID`             | Referência à role                                            |
| `status`         | `MembershipStatus` | Status do vínculo de acesso                                  |
| `revokedAt`      | `DateTime?`        | Data em que o vínculo foi revogado                           |
| `revokedBy`      | `UUID?`            | Usuário que revogou o vínculo, quando aplicável              |
| `createdBy`      | `UUID?`            | Usuário que criou o registro, quando aplicável               |
| `createdAt`      | `DateTime`         | Data de criação                                              |
| `updatedBy`      | `UUID?`            | Usuário que fez a última atualização, quando aplicável       |
| `updatedAt`      | `DateTime`         | Data da última atualização                                   |

## Relacionamentos

* Relaciona-se com [User](/data-modelling/identity/user)
* Relaciona-se com [Organization](/data-modelling/tenant/organization) *(opcional — ausente em roles internas)*
* Relaciona-se com [Role](/data-modelling/authorization/role)
* Pode ser referenciada por [Employee](/data-modelling/tenant/employee), quando a Organization pertence a uma Company.

## Regras de Negócio

* `INTERNAL` usa Membership sem organização e concede acesso interno de BackOffice.
* `ENVIRONMENT` usa Membership com organização preenchida, mesmo que a Role seja global.
* `ORGANIZATION` usa Membership com a mesma organização da Role.
* Um usuário pode pertencer a múltiplas organizações com roles diferentes, e acumular mais de uma role na mesma organização.
* O mesmo usuário não deve ter duas Memberships `ACTIVE` para o mesmo par `organizationId` + `roleId`. Para roles `INTERNAL`, a unicidade considera `organizationId = null`.
* Surge no aceite de um [Invite](/data-modelling/tenant/invite) do tipo `MEMBER`.
* Apenas Membership `ACTIVE` concede claims, roles e permissions no [Profile](/data-modelling/identity/profile).
* Revogar uma Membership muda `status` para `REVOKED`, preenche `revokedAt` e preserva o histórico do vínculo.
* Membership `REVOKED` não pode ser reativada nem bloquear novo convite equivalente. Para devolver acesso, um novo Invite deve criar um novo vínculo.
* Quando a Membership pertence à Organization de uma Company, ela pode originar o `Employee` correspondente para o mesmo `userId`.

## Enums

### MembershipStatus

| Valor     | Descrição                                     |
| --------- | --------------------------------------------- |
| `ACTIVE`  | Vínculo ativo e considerado no Profile        |
| `REVOKED` | Vínculo encerrado e ignorado para autorização |

## Example

```json theme={null}
{
  "membershipId": "0197a803-39a7-75e7-8cc2-62fb0542e642",
  "userId": "0197a7f5-2a88-7c1e-9b65-1f6d8f3b3a10",
  "organizationId": "0197a7f7-7291-7a43-96db-2c8580b80c5d",
  "roleId": "0197a7f8-15d1-7320-9b60-02497d7a0d61",
  "status": "ACTIVE",
  "revokedAt": null,
  "revokedBy": null,
  "createdBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "createdAt": "2026-07-03T13:30:00.000Z",
  "updatedBy": "0197a805-0910-7eb2-bae7-90a13df2a9b2",
  "updatedAt": "2026-07-03T13:30:00.000Z"
}
```
