ロール
`roles.list`、`list_all`、`iterate`、`get`、`create`、`update`、`delete`、`list_permissions`。
すべてのメソッド
page = client.roles.listputs page.items.size role = client.roles.get("role_8b1f4c2e9a7d3b60e5f1a2c4")puts role[:name] support = client.roles.create( name: "Support", description: "Answers the shared inboxes and nothing else.", permissions: ["emails:send", "threads:write", "labels:write"]) p support[:permissions] client.roles.update(support[:id], permissions: [*support[:permissions], "templates:read"]) client.roles.delete(support[:id], reassign_to: role[:id]) vocabulary = client.roles.list_permissionsp vocabulary.map { |permission| permission[:id] }support[:permissions] の要素は 3 つではなく 6 つです:emails:send は emails:read を、threads:write は threads:read を、labels:write は labels:read を連れてくるからです。中身を推測せず、リストを読み直してください。
list は OpenEmail::Page を 1 つ返し、list_all はすべてのロールを 1 つの Array で返し、iterate は各ロールをブロックに yield するか、ブロックがなければ Enumerator を返します。ロールは Symbol キーの Hash として返るため、role[:permissions] でリストを読めます。create と update はボディのフィールドをキーワード引数または 1 つの Hash として受け取り、delete は reassign_to: を受け取ります。これは snake_case のキーワード引数で、gem が API 向けに名前を変換します。
ロールが定めるのは、その人が何を「してよいか」です。どの「アドレス」に対してそれをしてよいかはもう一方の軸であり、client.members に属します:メンバーのページの grant_address と revoke_address を参照してください。「メールを送信してよい」と「invoices@ として送信してよい」は別の文であり、サポート担当者をもう 1 人雇ったワークスペースは、前者に触れずに後者だけを変更します。両方に答える権限が 1 つあります:addresses:all を持つロールは、付与なしで、後から追加されたものも含めてすべてのアドレスに届きます。これをロールに付けられるのはアプリ上の人だけです。
分岐には builtin や名前ではなく editable と deletable を使ってください。両方が false になるのはオーナーだけで、その権限リストは「来年生まれるものも含めたすべての権限」であり、保存されているのではなく計算されます。それ以外のロールは、ワークスペースに初期投入される 5 つを含めて、どちらにも true を返します。誰かが名前を変更したロールでも両方の値は正しいままですが、名前はもう何も語りません。
update は権限リストを「置き換え」ます。1 件だけ付与する呼び出しはないため、上の [*support[:permissions], "templates:read"] のように、ロールを読み取り、目的の項目を変更したうえで全件を送り返してください。権限を 1 つだけ送れば、そのロールが持つのはその 1 つと、そこから含意されるものだけになります。
そのロールを誰か 1 人でも持っている時点で、delete には reassign_to: が必要になります。gem はこれを reassignTo クエリパラメーターとして送ります。DELETE のボディは、いくつかのランタイムと少なからぬプロキシで破棄されるからです。何も渡さなければパラメーターは省かれます。結果は reassigned と keysReassigned を別々に報告するため、スクリプトは依頼した内容ではなく実際に行われた内容を記録できます。
list_permissions は GET /roles/permissions で、ちょうどロール id が入る位置にある固定のパスです。gem はその語を get に渡すのではなくそのパスを直接呼び出し、OpenEmail::Page ではなく素の Array を返します:権限ごとに 1 つの Hash で、id、label、group、scope を持ちます。scope: false は、どのキーも決して持てない項目を示します。その語を自分で get に渡さないでください。client.roles.get("permissions") は同じパスを組み立てるため、同じリクエストを送り、ロールや 404 ではなく語彙が返ってきます。
ロールはキーの上限である
ロールに紐付けて発行されたキーができることは、そのキー自身のスコープとロールの権限の「積集合」で、リクエストごとに境界で解決されます。したがってロールを狭めれば、キーをローテーションしなくても、そのキーの権限はその場で取り消されます。ロールを持たないキーには上限がまったくないため、roleId が nil であることはキーにとって最も狭い状態ではなく、最も広い状態です。
roles.delete がキーの移動先を必須としているのもそのためである。キーを孤立させれば上限が丸ごと外れ、そのロールが抑えていたすべての資格情報が黙って昇格してしまう。
GET /keys/self と GET /ping は、実効的な scopes と並べて roleId と grantedScopes を返します。「キーには emails:send があるのに insufficient_scope が返る」という疑問はこれで解決します:grantedScopes にあって scopes にないものは、ロールによって取り除かれたものです。client.me.get と client.me.ping はその両方を Hash で返すため、key[:grantedScopes] - key[:scopes] でロールが取り除いたものを一覧にできます。拒否そのものは、scope_missing? が true の OpenEmail::PermissionError です。
パラメーター
nameString必須- ワークスペースがそのロールを呼ぶ名前:1〜48 文字で、保存前に前後の空白が取り除かれます。名前はワークスペース内で大文字小文字を区別せず一意であるため、2 つ目の「Support」は最初のものと並べて作成されるのではなく `role_name_taken`(409)で拒否され、`OpenEmail::ConflictError` として送出されます。
descriptionString- そのロールが何のためのものかを述べる 1 文で、前後の空白が取り除かれ、最大 240 文字です。取り除くと空になる文字列は nil として保存されるため、空白だけの説明は送った値ではなく nil として返ります。`create` では nil を渡さずに省略してください:gem は nil をそのまま送り、`create` はそれを 422 で拒否します。`update` では `description: nil` で消去されます。
permissionsArray<String>必須- そのロールが付与する権限で、`list_permissions` が提供する語彙から選びます。語彙にない文字列は黙って捨てられるのではなく `permissions` に対する 422 となり、`param` が `permissions` の `OpenEmail::ValidationError` として送出されるため、打ち間違いは半日を失う代わりに報告されます。リストは受け取り時に「展開」され(`templates:write` は `templates:read` も並べて保存します)、重複が除かれ、正規の順序に並べ直されるため、送った内容がそのまま保存されていると考えず、レスポンスから保存後のリストを読み取ってください。
レスポンス
objectString- 常に `role`。削除時のトゥームストーンも同じ値に加えて、そのロールの `id`、`deleted: true`、2 つの再割り当て件数を返し、以下の他のフィールドは返しません。
idString- ロールの id で、`role[:id]` として読みます。メンバーの `roleId` が指すもの、API キーの上限が指すもの、そして別のロールが削除されてその保持者がこのロールに移るときに `reassign_to:` が受け取るものです。
nameString- ワークスペースにおけるそのロールの名前で、前後の空白が取り除かれ、大文字小文字を区別せず一意です。オーナーのロールを除けば、初期投入されたものも含めてすべてのロールを改名できます(`builtin` はその行の出自を示すもので、名前を固定するものではありません)。したがって「Admin」という名前を、そのロールが持つ権限の保証として読まないでください。他のロールがすでに名乗っている名前は `role_name_taken`(409、`param` は `name`)になります。オーナーの改名は、その他のあらゆる編集と同じく `role_immutable`(409)になります。
descriptionString or nil- ロールを説明する文で、指定されなかった場合は nil です。空白だけの入力は create でも update でも nil として保存されるため、この値が空文字列になることはありません。
permissionsArray<String>- そのロールが付与するすべての権限で、入力された順ではなく、展開済みかつ正規の順序で並びます。この順序には意味があります:同じ権限を持つ 2 つのロールは等しい Array を持つため、設定画面は `==` で比較して、保存ボタンを有効にするかどうかを判断できます。
builtinString or nil- この行が、初期投入される 6 つのロール(`owner`、`admin`、`member`、`viewer`、`developer`、`billing`)のどれに由来するか。ワークスペースが自分で作成したロールでは nil です。これは出自の記録であって状態ではありません:初期投入されたロールも、他と同じように改名され、権限を変更され、削除されます。分岐にはこの値ではなく `editable` と `deletable` を使ってください。誰かが「Admin」と名付けたロールが初期投入のものであるとは限らず、初期投入のものがもうその名前で呼ばれていないこともあります。
editableBoolean- `builtin != "owner"` として計算されるため、false になるのはオーナーのロールだけで、そのロールに対する `update` はすべて `role_immutable`(409)で拒否されます。それ以外のロールは、ワークスペースに初期投入される 5 つも含めて、名前・説明・権限のすべてを編集できます。
deletableBoolean- `builtin != "owner"` として計算されます:false になるのはオーナーのロールだけで、その削除は `role_undeletable`(409)で返ります。初期投入されたものを含め、それ以外のロールでは true です。拒否された後ではなく、ボタンを表示する前にこの値を確認してください。まだ誰かが持っているロールには `reassign_to:` も必要で、指定しなければ削除は `role_in_use`(409)になります。どちらの拒否も `OpenEmail::ConflictError` として送出され、`code` で区別できます。
membersInteger- このロールを持つ人数で、ワークスペースのメンバー行から数えます。オーナーはここに含まれません:オーナーにはメンバー行がなくロールを割り当てることもできないため、メンバー一覧には現れていても、Owner ロールの保持者は 0 と報告されます。
apiKeysInteger- このロールによって上限を課されている有効な API キーの数。失効したキーは数に含まれませんが、削除時にはそのロールを指すすべてのキー行が、失効したものも含めて付け替えられます。これはロールを削除する前に移さなければならないもう 1 つの集団であり、誰も気づかない方の集団でもあります:キーはプログラムであり、プログラムは文句を言いません。
createdAtString- ロールの行が書き込まれた時刻で、ISO 8601 の String です。組み込みロールの行は、ワークスペース作成時ではなく、ロール一覧の読み取り、ロールの作成、API キー画面の表示など、初めて必要になった時点で遅延的に生成されます。そのため組み込みロールのタイムスタンプは、その最初のリクエストが届いた時刻であり、ワークスペースが作られた時刻ではありません。
updatedAtString- ロールが最後に変更された時刻で、ISO 8601 の String です。受け付けられた `update` はすべてこの値を更新します。すでに保持している値をそのまま設定した場合も同様です。