roles.proto 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. syntax = "proto3";
  2. package chatto.admin.v1;
  3. import "google/protobuf/field_mask.proto";
  4. import "buf/validate/validate.proto";
  5. import "chatto/api/v1/roles.proto";
  6. import "chatto/api/v1/users.proto";
  7. import "chatto/api/v1/pagination.proto";
  8. // Role metadata plus administrative permission state.
  9. message AdminRole {
  10. // Public role metadata shared with ordinary role catalog reads.
  11. chatto.api.v1.Role role = 1;
  12. // Permissions granted by this role.
  13. repeated string permissions = 2;
  14. // Permissions denied by this role.
  15. repeated string permission_denials = 3;
  16. }
  17. // Request the role catalog.
  18. message ListRolesRequest {}
  19. // Finite role catalog snapshot plus viewer role-management capabilities.
  20. message ListRolesResponse {
  21. // Roles sorted by position.
  22. repeated AdminRole roles = 1;
  23. // Whether the caller may create/update/delete role definitions.
  24. bool viewer_can_manage_roles = 2;
  25. // Whether the caller may assign/revoke roles and view role rosters.
  26. bool viewer_can_assign_roles = 3;
  27. }
  28. // Request one role.
  29. message GetRoleRequest {
  30. // Stable role name.
  31. string name = 1 [(buf.validate.field).string.min_len = 1];
  32. }
  33. // One role plus role-management metadata.
  34. message GetRoleResponse {
  35. // Requested role.
  36. AdminRole role = 1;
  37. reserved 2;
  38. reserved "users";
  39. // Whether the caller may create/update/delete role definitions.
  40. bool viewer_can_manage_roles = 3;
  41. // Whether the caller may assign/revoke roles and view role rosters.
  42. bool viewer_can_assign_roles = 4;
  43. }
  44. // Request a page of explicit role members.
  45. message AdminRoleServiceListMembersRequest {
  46. // Stable role name.
  47. string name = 1 [(buf.validate.field).string.min_len = 1];
  48. // Defaults to 20 members; capped at 100. Offset counts explicit assignments.
  49. chatto.api.v1.PageRequest page = 2;
  50. }
  51. // Explicit members sorted by user ID. Each page is a live read; assignment
  52. // changes between requests can shift offsets. The implicit everyone role has
  53. // no explicit members. Revoked assignments are excluded.
  54. message AdminRoleServiceListMembersResponse {
  55. // Canonical public user records for the selected assignments.
  56. repeated chatto.api.v1.User members = 1;
  57. // Total explicit assignment count and whether another page exists.
  58. chatto.api.v1.PageInfo page = 2;
  59. }
  60. // Request to create a role.
  61. message CreateRoleRequest {
  62. // Stable role name.
  63. string name = 1 [(buf.validate.field).string.min_len = 1];
  64. // Display name shown in admin and mention UIs.
  65. string display_name = 2 [(buf.validate.field).string.max_len = 80];
  66. // Optional role description.
  67. string description = 3 [(buf.validate.field).string.max_len = 500];
  68. // Whether messages may notify users assigned to this role.
  69. bool pingable = 4;
  70. }
  71. // Result of creating a role.
  72. message CreateRoleResponse {
  73. // Created role.
  74. AdminRole role = 1;
  75. }
  76. // Request to update role metadata.
  77. message UpdateRoleRequest {
  78. // Stable role name.
  79. string name = 1 [(buf.validate.field).string.min_len = 1];
  80. // Display name shown in admin and mention UIs, when changing it.
  81. optional string display_name = 2 [(buf.validate.field).string.max_len = 80];
  82. // Role description, when changing it. Empty clears the description.
  83. optional string description = 3 [(buf.validate.field).string.max_len = 500];
  84. // Whether messages may notify users assigned to this role, when changing it.
  85. optional bool pingable = 4;
  86. // Editable fields to apply or reset: display_name, description, pingable.
  87. // Omit to infer populated fields; * selects all editable fields. An explicit
  88. // empty mask is invalid. Unselected values are ignored. Selected absent values
  89. // reset the field to its default, subject to field validation.
  90. google.protobuf.FieldMask update_mask = 5;
  91. }
  92. // Result of updating a role.
  93. message UpdateRoleResponse {
  94. // Updated role.
  95. AdminRole role = 1;
  96. }
  97. // Request to delete a role.
  98. message DeleteRoleRequest {
  99. // Stable role name.
  100. string name = 1 [(buf.validate.field).string.min_len = 1];
  101. }
  102. // Result of deleting a role.
  103. message DeleteRoleResponse {
  104. reserved 1;
  105. reserved "deleted";
  106. }
  107. // Request to replace custom role order.
  108. message ReorderRolesRequest {
  109. // Ordered custom role names. The list must include every custom role exactly
  110. // once; system roles keep fixed positions and must not be included.
  111. repeated string role_names = 1 [(buf.validate.field).repeated = {
  112. max_items: 1000
  113. items: {
  114. string: {min_len: 1}
  115. }
  116. }];
  117. }
  118. // Result of replacing custom role order.
  119. message ReorderRolesResponse {
  120. // Full role catalog after reordering.
  121. repeated AdminRole roles = 1;
  122. }
  123. // Provides authenticated role reads and administrative role definition changes.
  124. service AdminRoleService {
  125. // Lists the role catalog including permission arrays as a finite snapshot.
  126. // Requires an authenticated user. This intentionally includes permission
  127. // arrays for clients that need to show a user's assigned roles and their
  128. // effects; use chatto.api.v1.RoleService for lightweight catalog rendering.
  129. rpc ListRoles(ListRolesRequest) returns (ListRolesResponse);
  130. // Gets one role plus admin detail metadata. Returns NOT_FOUND when the
  131. // role does not exist. Requires an authenticated user.
  132. rpc GetRole(GetRoleRequest) returns (GetRoleResponse);
  133. // Lists explicit role members. Requires role.assign, without requiring
  134. // admin.view-users. Returns NOT_FOUND when the role does not exist.
  135. rpc ListMembers(AdminRoleServiceListMembersRequest) returns (AdminRoleServiceListMembersResponse);
  136. // Creates a custom role. Requires role.manage.
  137. rpc CreateRole(CreateRoleRequest) returns (CreateRoleResponse);
  138. // Updates role metadata. Requires role.manage.
  139. rpc UpdateRole(UpdateRoleRequest) returns (UpdateRoleResponse);
  140. // Deletes a custom role. Requires role.manage.
  141. rpc DeleteRole(DeleteRoleRequest) returns (DeleteRoleResponse);
  142. // Replaces the custom role order. Requires role.manage.
  143. rpc ReorderRoles(ReorderRolesRequest) returns (ReorderRolesResponse);
  144. }