members.proto 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. syntax = "proto3";
  2. package chatto.admin.v1;
  3. import "buf/validate/validate.proto";
  4. import "chatto/api/v1/pagination.proto";
  5. import "chatto/api/v1/roles.proto";
  6. import "chatto/api/v1/users.proto";
  7. import "chatto/admin/v1/roles.proto";
  8. import "google/protobuf/timestamp.proto";
  9. // User row returned by server-admin member management reads.
  10. //
  11. // The embedded user record carries public identity fields; remaining fields are
  12. // admin/member metadata with visibility controlled by the service.
  13. message AdminMember {
  14. reserved 1 to 4;
  15. reserved "id", "login", "display_name", "avatar_url";
  16. // Explicit role assignments. The implicit everyone role is omitted.
  17. repeated string roles = 5;
  18. // Account creation time, when known.
  19. google.protobuf.Timestamp created_at = 6;
  20. reserved 7;
  21. reserved "deleted";
  22. // Whether the caller may see that the user has a verified email and one exists.
  23. bool has_verified_email = 8;
  24. // Verified email addresses visible to the caller.
  25. repeated string verified_emails = 9;
  26. // Whether the caller may delete this account.
  27. bool viewer_can_delete_account = 10;
  28. // Start of the current username-change cooldown, when visible and known.
  29. google.protobuf.Timestamp last_login_change = 11;
  30. // Public identity fields for this user.
  31. chatto.api.v1.User user = 12;
  32. // Selected primary verified email visible to the caller. Absence can mean
  33. // that no primary email exists or that the field is not visible.
  34. optional string primary_verified_email = 13;
  35. }
  36. // Request server-admin member IDs.
  37. // Results use creation time, oldest first. Users without a creation time
  38. // appear last, ordered by case-insensitive login. User IDs break ties.
  39. message ListMembersRequest {
  40. reserved 2, 3;
  41. reserved "limit", "offset";
  42. // Case-insensitive login/display-name search term. Empty disables search.
  43. string search = 1;
  44. // Defaults to 20 results when absent or limit is zero. Maximum: 100.
  45. chatto.api.v1.PageRequest page = 4;
  46. }
  47. // Ordered server-admin member IDs. Load rows and role summaries with
  48. // BatchGetMembers. Advance the offset by the number of IDs, including IDs
  49. // omitted by a later batch read.
  50. message ListMembersResponse {
  51. reserved 1 to 4;
  52. reserved "members", "roles", "total_count", "has_more";
  53. // Page metadata.
  54. chatto.api.v1.PageInfo page = 5;
  55. // Matching member IDs in list order.
  56. repeated string user_ids = 6;
  57. }
  58. // Request one server-admin member detail record.
  59. message GetMemberRequest {
  60. oneof target {
  61. // Target stable user ID.
  62. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  63. // Target login identifier.
  64. string login = 2 [(buf.validate.field).string.min_len = 1];
  65. }
  66. }
  67. // Server-admin member detail payload.
  68. message GetMemberResponse {
  69. // Member record.
  70. AdminMember member = 1;
  71. // Roles for assignment UI.
  72. repeated AdminRole roles = 2;
  73. // Permissions available for per-user overrides.
  74. repeated string available_permissions = 3;
  75. // Whether the caller may assign/revoke roles.
  76. bool viewer_can_assign_roles = 4;
  77. // Whether the caller may edit role definitions.
  78. bool viewer_can_manage_roles = 5;
  79. // Whether the caller may edit direct user permissions.
  80. bool viewer_can_manage_user_permissions = 6;
  81. // Roles the caller may assign without granting authority the caller does not
  82. // possess. Populated when assignment limits are enforced.
  83. repeated string assignable_role_names = 7;
  84. // Roles the caller may revoke without removing restrictions or authority
  85. // beyond the caller's own. Populated when assignment limits are enforced.
  86. repeated string revocable_role_names = 8;
  87. // True when assignable_role_names and revocable_role_names are authoritative.
  88. // Older servers leave this false and clients may retain legacy behaviour.
  89. bool role_assignment_limits_enforced = 9;
  90. }
  91. // Request server-admin member rows for a set of stable user IDs.
  92. message BatchGetMembersRequest {
  93. // Required target user IDs. Unknown IDs are omitted from the response.
  94. repeated string user_ids = 1 [(buf.validate.field).repeated = {
  95. min_items: 1
  96. max_items: 100
  97. items: {
  98. string: {min_len: 1}
  99. }
  100. }];
  101. }
  102. // Batch server-admin member response.
  103. message BatchGetMembersResponse {
  104. // Found members. The server preserves first-seen request order and
  105. // de-duplicates repeated IDs.
  106. repeated AdminMember members = 1;
  107. // Public roles for display-name lookup.
  108. repeated chatto.api.v1.Role roles = 2;
  109. }
  110. // Request to assign a role to a user.
  111. message AssignRoleRequest {
  112. // Target user ID.
  113. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  114. // Role name to assign.
  115. string role_name = 2 [(buf.validate.field).string.min_len = 1];
  116. }
  117. // Result of assigning a role.
  118. message AssignRoleResponse {
  119. reserved 1;
  120. reserved "assigned";
  121. // Updated admin member row.
  122. AdminMember member = 2;
  123. }
  124. // Request to revoke a role from a user.
  125. message RevokeRoleRequest {
  126. // Target user ID.
  127. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  128. // Role name to revoke.
  129. string role_name = 2 [(buf.validate.field).string.min_len = 1];
  130. }
  131. // Result of revoking a role.
  132. message RevokeRoleResponse {
  133. reserved 1;
  134. reserved "revoked";
  135. // Updated admin member row.
  136. AdminMember member = 2;
  137. }
  138. // Request to update a user's password as a server-admin action.
  139. message ChangeUserPasswordRequest {
  140. // Target user ID.
  141. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  142. // New password. The server applies the same password policy as registration
  143. // and password reset.
  144. string password = 2 [(buf.validate.field).string = {
  145. min_len: 8
  146. max_len: 128
  147. }];
  148. }
  149. // Result of an admin password update.
  150. message ChangeUserPasswordResponse {
  151. // Updated admin member row.
  152. AdminMember member = 1;
  153. }
  154. // Request to clear a user's self-service username-change cooldown.
  155. message ClearUsernameCooldownRequest {
  156. // Target user ID.
  157. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  158. }
  159. // Result of clearing a user's username-change cooldown.
  160. message ClearUsernameCooldownResponse {
  161. reserved 1;
  162. reserved "cleared";
  163. }
  164. // Request to delete a user account as a server-admin action.
  165. message DeleteUserRequest {
  166. reserved 2;
  167. reserved "current_password";
  168. // Target user ID.
  169. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  170. }
  171. // Result of deleting a user account.
  172. message DeleteUserResponse {
  173. reserved 1;
  174. reserved "deleted";
  175. }
  176. // Server-admin user management commands and member-detail reads.
  177. service AdminUserService {
  178. // Lists server members for the admin members screen. Requires
  179. // admin.view-users.
  180. rpc ListMembers(ListMembersRequest) returns (ListMembersResponse);
  181. // Gets one server member plus role/permission metadata for admin details.
  182. // Requires admin.view-users. Returns NOT_FOUND when the user does not exist.
  183. rpc GetMember(GetMemberRequest) returns (GetMemberResponse);
  184. // Gets server member rows for multiple users. Requires admin.view-users.
  185. rpc BatchGetMembers(BatchGetMembersRequest) returns (BatchGetMembersResponse);
  186. // Assigns a role to a user. Requires role.assign, and non-owner callers may
  187. // only assign roles whose granted authority they already possess.
  188. rpc AssignRole(AssignRoleRequest) returns (AssignRoleResponse);
  189. // Revokes a role from a user. Requires role.assign, and non-owner callers may
  190. // only revoke roles whose permission decisions are within their authority.
  191. rpc RevokeRole(RevokeRoleRequest) returns (RevokeRoleResponse);
  192. // Updates another user's password as an admin action. Requires
  193. // user.manage-accounts and a fresh credential for the caller; the caller
  194. // cannot target their own account.
  195. rpc ChangeUserPassword(ChangeUserPasswordRequest) returns (ChangeUserPasswordResponse);
  196. // Clears the target user's self-service username-change cooldown. Requires
  197. // user.manage-accounts, including when the caller targets their own account.
  198. rpc ClearUsernameCooldown(ClearUsernameCooldownRequest) returns (ClearUsernameCooldownResponse);
  199. // Deletes a user account as an admin action. Requires user.delete-any for
  200. // other users or user.delete-self for the caller.
  201. rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse);
  202. }