members.proto 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. // Last self-service username change, 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. }
  33. // Request server-admin member rows.
  34. message ListMembersRequest {
  35. reserved 2, 3;
  36. reserved "limit", "offset";
  37. // Case-insensitive login/display-name search term. Empty disables search.
  38. string search = 1;
  39. // Page request. Defaults to 20 results when absent or limit is zero.
  40. chatto.api.v1.PageRequest page = 4;
  41. }
  42. // Server-admin member rows plus role summaries.
  43. message ListMembersResponse {
  44. reserved 3, 4;
  45. reserved "total_count", "has_more";
  46. // Matching members.
  47. repeated AdminMember members = 1;
  48. // Public roles for display-name lookup.
  49. repeated chatto.api.v1.Role roles = 2;
  50. // Page metadata.
  51. chatto.api.v1.PageInfo page = 5;
  52. }
  53. // Request one server-admin member detail record.
  54. message GetMemberRequest {
  55. oneof target {
  56. // Target stable user ID.
  57. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  58. // Target login identifier.
  59. string login = 2 [(buf.validate.field).string.min_len = 1];
  60. }
  61. }
  62. // Server-admin member detail payload.
  63. message GetMemberResponse {
  64. // Member record.
  65. AdminMember member = 1;
  66. // Roles for assignment UI.
  67. repeated AdminRole roles = 2;
  68. // Permissions available for per-user overrides.
  69. repeated string available_permissions = 3;
  70. // Whether the caller may assign/revoke roles.
  71. bool viewer_can_assign_roles = 4;
  72. // Whether the caller may edit role definitions.
  73. bool viewer_can_manage_roles = 5;
  74. // Whether the caller may edit direct user permissions.
  75. bool viewer_can_manage_user_permissions = 6;
  76. }
  77. // Request server-admin member rows for a set of stable user IDs.
  78. message BatchGetMembersRequest {
  79. // Required target user IDs. Unknown IDs are omitted from the response.
  80. repeated string user_ids = 1 [(buf.validate.field).repeated = {
  81. min_items: 1
  82. max_items: 100
  83. items: {
  84. string: {min_len: 1}
  85. }
  86. }];
  87. }
  88. // Batch server-admin member response.
  89. message BatchGetMembersResponse {
  90. // Found members. The server preserves first-seen request order and
  91. // de-duplicates repeated IDs.
  92. repeated AdminMember members = 1;
  93. // Public roles for display-name lookup.
  94. repeated chatto.api.v1.Role roles = 2;
  95. }
  96. // Request to assign a role to a user.
  97. message AssignRoleRequest {
  98. // Target user ID.
  99. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  100. // Role name to assign.
  101. string role_name = 2 [(buf.validate.field).string.min_len = 1];
  102. }
  103. // Result of assigning a role.
  104. message AssignRoleResponse {
  105. reserved 1;
  106. reserved "assigned";
  107. // Updated admin member row.
  108. AdminMember member = 2;
  109. }
  110. // Request to revoke a role from a user.
  111. message RevokeRoleRequest {
  112. // Target user ID.
  113. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  114. // Role name to revoke.
  115. string role_name = 2 [(buf.validate.field).string.min_len = 1];
  116. }
  117. // Result of revoking a role.
  118. message RevokeRoleResponse {
  119. reserved 1;
  120. reserved "revoked";
  121. // Updated admin member row.
  122. AdminMember member = 2;
  123. }
  124. // Request to update a user's identity as a server-admin action.
  125. message UpdateUserRequest {
  126. // Target user ID.
  127. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  128. // New display name, when changing it. Empty clears the explicit display
  129. // name. The server also rejects control and confusing invisible characters.
  130. optional string display_name = 2 [(buf.validate.field).string.max_len = 32];
  131. // New login identifier, when changing it. The server accepts ASCII letters,
  132. // digits, period, underscore, and hyphen, starting with a letter or digit.
  133. optional string login = 3 [(buf.validate.field).string = {
  134. min_len: 2
  135. max_len: 32
  136. }];
  137. }
  138. // Result of an admin user update.
  139. message UpdateUserResponse {
  140. // Updated user profile.
  141. chatto.api.v1.User user = 1;
  142. // Updated admin member row.
  143. AdminMember member = 2;
  144. }
  145. // Request to update a user's password as a server-admin action.
  146. message UpdateUserPasswordRequest {
  147. // Target user ID.
  148. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  149. // New password. The server applies the same password policy as registration
  150. // and password reset.
  151. string password = 2 [(buf.validate.field).string = {
  152. min_len: 8
  153. max_len: 128
  154. }];
  155. }
  156. // Result of an admin password update.
  157. message UpdateUserPasswordResponse {
  158. // Updated admin member row.
  159. AdminMember member = 1;
  160. }
  161. // Request to clear a user's self-service username-change cooldown.
  162. message ClearUsernameCooldownRequest {
  163. // Target user ID.
  164. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  165. }
  166. // Result of clearing a user's username-change cooldown.
  167. message ClearUsernameCooldownResponse {
  168. // True when the request completed.
  169. bool cleared = 1;
  170. }
  171. // Request to delete a user account as a server-admin action.
  172. message DeleteUserRequest {
  173. // Target user ID.
  174. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  175. // Current password proof for accounts with a password when the active
  176. // runtime credential is no longer fresh.
  177. string current_password = 2;
  178. }
  179. // Result of deleting a user account.
  180. message DeleteUserResponse {
  181. // True when the user was deleted.
  182. bool deleted = 1;
  183. }
  184. // Server-admin user management commands and member-detail reads.
  185. service AdminUserService {
  186. // Lists server members for the admin members screen. Requires
  187. // admin.view-users.
  188. rpc ListMembers(ListMembersRequest) returns (ListMembersResponse);
  189. // Gets one server member plus role/permission metadata for admin details.
  190. // Requires admin.view-users. Returns NOT_FOUND when the user does not exist.
  191. rpc GetMember(GetMemberRequest) returns (GetMemberResponse);
  192. // Gets server member rows for multiple users. Requires admin.view-users.
  193. rpc BatchGetMembers(BatchGetMembersRequest) returns (BatchGetMembersResponse);
  194. // Assigns a role to a user. Requires role.assign.
  195. rpc AssignRole(AssignRoleRequest) returns (AssignRoleResponse);
  196. // Revokes a role from a user. Requires role.assign.
  197. rpc RevokeRole(RevokeRoleRequest) returns (RevokeRoleResponse);
  198. // Updates another user's login and/or display name as an admin action.
  199. // Requires user.manage-accounts; the caller cannot target their own account.
  200. rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
  201. // Updates another user's password as an admin action. Requires
  202. // user.manage-accounts and a fresh credential for the caller; the caller
  203. // cannot target their own account.
  204. rpc UpdateUserPassword(UpdateUserPasswordRequest) returns (UpdateUserPasswordResponse);
  205. // Clears the target user's self-service username-change cooldown. Requires
  206. // user.manage-accounts.
  207. rpc ClearUsernameCooldown(ClearUsernameCooldownRequest) returns (ClearUsernameCooldownResponse);
  208. // Deletes a user account as an admin action. Requires user.delete-any for
  209. // other users, user.delete-self for the caller, and a fresh credential for
  210. // the caller.
  211. rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse);
  212. }