6.2.2.15 OrganizationJoinLink
6.2.2.15.1 Purpose¶
A link an Organization shares so that people join by themselves, like the invite links of Slack or Discord: whoever opens it signs in or registers and becomes a member with the link's role and groups, at once or after an approval. Because it names no e-mail, its limits keep it safe: an expiry of at most 30 days, an optional number of uses, an optional e-mail domain, and a role that can never manage members, groups, delegations or the Organization itself. Every join is audited with the link, so a leaked link can be traced, revoked and its members reviewed.
6.2.2.15.2 Questions it answers¶
- Which links does this Organization have open, with which role, until when?
- Who joined through a link, and when?
- Which links require an approval?
6.2.2.15.3 Fields¶
| Field | Type | Cardinality | Description |
|---|---|---|---|
id |
string (uuid) |
1..1 |
Key. |
organization |
Organization | 1..1 |
|
role |
OrganizationRoleAccessControl | 1..1 |
The creator must be allowed to give it (OrganizationRoleAccessControl.priority), checked again at every join. A link can never give a role that holds an admin capability (OrganizationRoleCapabilityEnum), nor Owner or Sync Client: roles with admin capabilities are given by invitation only. |
groups |
UserGroup | 0..* |
|
created_by |
User | 1..1 |
|
token_hash |
string |
1..1 |
Unique. SHA-256 of the secret in the link; the secret is shown once, when the link is created. |
expires_at |
datetime |
1..1 |
At most 30 days after creation; seven by default. |
max_uses |
integer |
0..1 |
Empty: no limit until it expires. |
uses |
integer |
1..1 |
Default: 0. |
email_domain |
string |
0..1 |
When set, only a Person whose verified e-mail is in this domain can use it, e.g. a cooperative's own domain. |
requires_approval |
boolean |
1..1 |
Default: false.When true, joining creates an OrganizationJoinRequest that a member with access.members.manage approves. |
revoked_at |
datetime |
0..1 |
|
revoked_by |
User | 0..1 |
|
created_at |
datetime |
1..1 |
|
updated_at |
datetime |
1..1 |
6.2.2.15.4 Relationships¶
References
OrganizationJoinLink.organization→ Organization (1..1)OrganizationJoinLink.role→ OrganizationRoleAccessControl (1..1)OrganizationJoinLink.groups→ UserGroup (0..*)OrganizationJoinLink.created_by→ User (1..1)OrganizationJoinLink.revoked_by→ User (0..1)
Referenced by
OrganizationJoinRequest.link(1..1)
6.2.2.15.5 Rules & constraints¶
- A link an Organization shares so that people join it by themselves, like the invite links of Slack or Discord: whoever opens it signs in or registers (User) and becomes a member with the link's role and groups, at once or after an approval. Unlike an invitation (OrganizationInvitation) it names no e-mail, so its limits are what keeps it safe.
- A link works while it is not revoked, not expired, under
max_usesand while the Organization is active. Using it again as a member changes nothing. Every join is a PlatformAuditEvent with the link, so a leaked link can be traced and revoked, and its members reviewed. Creating, listing and revoking links needsaccess.members.manage.