Udělení a odebrání adresy
Druhá osa: ke kterým adresám se jeden člověk smí dostat a na jaké úrovni.
Spustí kterékoli z 2 volání na této stránce proti vašemu pracovnímu prostoru, s vaším vlastním klíčem.
POST /members/{userId}/addresses
Druhá osa: ke kterým adresám se jeden člověk smí dostat a na jaké úrovni.
Přístup není role
access je starší slovník pro jednotlivé adresy a se jmény oprávnění se záměrně nepřekrývá: member adresu čte a odesílá za ni, viewer ji jen čte. Neříká nic o tom, zda ten člověk vůbec smí odesílat – to je jeho role – a než k odeslání dojde, musí ho povolit obojí.
| Jejich role | Jejich přístup k billing@ | Mohou odesílat jako billing@ |
|---|---|---|
| má `emails:send` | member | Ano. |
| má `emails:send` | viewer | Ne, přístup to odmítne. |
| nemá `emails:send` | member | Ne, role to odmítne. |
| má `emails:send` | žádný přístup | Ne, adresa se vůbec nedostane do seznamu, proti kterému se odeslání kontroluje. |
Udělení role nedá nikomu žádné adresy. Člen s rolí a bez přístupů otevře PRÁZDNOU schránku, a ne schránku všech – a to je to správné selhání, dokud se teprve rozhodujete, co má vidět.
Udělení adresy
Vyžaduje members:write. POST /members/{userId}/addresses s { addressId, access }; access má výchozí hodnotu member. Vrací celého člena v podobě, v jaké teď je.
curl -X POST "$OE/members/nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t/addresses" -H "$AUTH" \ -H "Content-Type: application/json" \ -d '{ "addressId": "c40a95f2-1cc6-4d31-82a8-9e075d31c2a8", "access": "viewer" }'{ "object": "member", "userId": "nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t", "email": "[email protected]", "name": "Sam Okonjo", "image": null, "role": { "id": "role_2b81de079c1f0a4b7e05d386", "name": "Support", "builtin": null }, "implied": false, "permissions": ["emails:send", "emails:read", "threads:read", "threads:write"], "addresses": [ { "addressId": "2b81de07-9c1f-4a4b-8e05-d3862c1f0a44", "address": "[email protected]", "access": "member" }, { "addressId": "c40a95f2-1cc6-4d31-82a8-9e075d31c2a8", "address": "[email protected]", "access": "viewer" } ], "createdAt": "2026-08-12T14:20:00.000Z" }POST na podkolekci místo PUT na dvojici, protože tak jako tak jde o upsert a id řádku volající nikdy neuvádí. Opakovaný POST s jiným access je způsob, jak se z viewera stane member: na dvojici (adresa, osoba) je jeden řádek, takže druhé volání mění úroveň, místo aby přidávalo druhý přístup. To z tohohle zároveň dělá ten vzácný POST, který je bezpečné opakovat.
Hlídáno přes members:write, a ne přes vlastnictví adresy – v tom se to liší od starší cesty pro udělování na routeru domén. Vlastnictví je správná pojistka pro toho, kdo doménu přidal, a špatná pro admina, který nevlastní nic a spravuje přístupy workspace za vlastníka. Obojí zapisuje tentýž řádek.
Vrací se celý člen, ne jen samotný přístup, takže řádek na obrazovce lze překreslit bez druhého požadavku a odpověď vypadá stejně, ať byl přístup nový, nebo jen upravený.
Adresa, která nepatří tomuto workspace, je member_not_found, 422, nesoucí param: "addressId". Klíč může rozdávat jen adresy patřící workspace, pro který byl vydán.
Udělení VLASTNÍKOVI workspace je member_is_owner, 422. Má už každou adresu, takže volání nemá co přidat.
Odebrání adresy
Vyžaduje members:write. DELETE /members/{userId}/addresses/{addressId}. Vrací člena bez té adresy.
curl -X DELETE \ "$OE/members/nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t/addresses/c40a95f2-1cc6-4d31-82a8-9e075d31c2a8" \ -H "$AUTH"{ "object": "member", "userId": "nQ8vBz1aRd4tYwKx7fQ2mN8vBz1aRd4t", "email": "[email protected]", "name": "Sam Okonjo", "image": null, "role": { "id": "role_2b81de079c1f0a4b7e05d386", "name": "Support", "builtin": null }, "implied": false, "permissions": ["emails:send", "emails:read", "threads:read", "threads:write"], "addresses": [ { "addressId": "2b81de07-9c1f-4a4b-8e05-d3862c1f0a44", "address": "[email protected]", "access": "member" } ], "createdAt": "2026-08-12T14:20:00.000Z" }Úzké odebrání, a to, po kterém sáhnout, když někdo mění tým: ponechá si roli i ostatní adresy a přestane vidět tuhle.
Adresa, která nepatří tomuto workspace, je odmítnuta, místo aby byla tiše ignorována. Překlep v id by jinak ohlásil úspěšné odebrání, které se nikdy nestalo – a právě tomuhle selhání má tenhle endpoint bránit.
Vrací se člen, ne náhrobek, protože zajímavá odpověď je, kam všude ještě dosáhne. { deleted: true } by tu nechalo klienta, aby si to dopočítal odečtením.
Pokud chcete vzít zpátky všechno naráz, DELETE /members/{userId} odebere roli i všechny přístupy dohromady a nahlásí, kolik jich zmizelo.