members.proto 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. // Roles the caller may assign without granting authority the caller does not
  77. // possess. Populated when assignment limits are enforced.
  78. repeated string assignable_role_names = 7;
  79. // Roles the caller may revoke without removing restrictions or authority
  80. // beyond the caller's own. Populated when assignment limits are enforced.
  81. repeated string revocable_role_names = 8;
  82. // True when assignable_role_names and revocable_role_names are authoritative.
  83. // Older servers leave this false and clients may retain legacy behaviour.
  84. bool role_assignment_limits_enforced = 9;
  85. }
  86. // Request server-admin member rows for a set of stable user IDs.
  87. message BatchGetMembersRequest {
  88. // Required target user IDs. Unknown IDs are omitted from the response.
  89. repeated string user_ids = 1 [(buf.validate.field).repeated = {
  90. min_items: 1
  91. max_items: 100
  92. items: {
  93. string: {min_len: 1}
  94. }
  95. }];
  96. }
  97. // Batch server-admin member response.
  98. message BatchGetMembersResponse {
  99. // Found members. The server preserves first-seen request order and
  100. // de-duplicates repeated IDs.
  101. repeated AdminMember members = 1;
  102. // Public roles for display-name lookup.
  103. repeated chatto.api.v1.Role roles = 2;
  104. }
  105. // Request to assign a role to a user.
  106. message AssignRoleRequest {
  107. // Target user ID.
  108. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  109. // Role name to assign.
  110. string role_name = 2 [(buf.validate.field).string.min_len = 1];
  111. }
  112. // Result of assigning a role.
  113. message AssignRoleResponse {
  114. reserved 1;
  115. reserved "assigned";
  116. // Updated admin member row.
  117. AdminMember member = 2;
  118. }
  119. // Request to revoke a role from a user.
  120. message RevokeRoleRequest {
  121. // Target user ID.
  122. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  123. // Role name to revoke.
  124. string role_name = 2 [(buf.validate.field).string.min_len = 1];
  125. }
  126. // Result of revoking a role.
  127. message RevokeRoleResponse {
  128. reserved 1;
  129. reserved "revoked";
  130. // Updated admin member row.
  131. AdminMember member = 2;
  132. }
  133. // Request to update a user's identity as a server-admin action.
  134. message UpdateUserRequest {
  135. // Target user ID.
  136. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  137. // New display name, when changing it. Empty clears the explicit display
  138. // name. The server also rejects control and confusing invisible characters.
  139. optional string display_name = 2 [(buf.validate.field).string.max_len = 32];
  140. // New login identifier, when changing it. The server accepts ASCII letters,
  141. // digits, period, underscore, and hyphen, starting with a letter or digit.
  142. optional string login = 3 [(buf.validate.field).string = {
  143. min_len: 2
  144. max_len: 32
  145. }];
  146. }
  147. // Result of an admin user update.
  148. message UpdateUserResponse {
  149. // Updated user profile.
  150. chatto.api.v1.User user = 1;
  151. // Updated admin member row.
  152. AdminMember member = 2;
  153. }
  154. // Request to update a user's password as a server-admin action.
  155. message UpdateUserPasswordRequest {
  156. // Target user ID.
  157. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  158. // New password. The server applies the same password policy as registration
  159. // and password reset.
  160. string password = 2 [(buf.validate.field).string = {
  161. min_len: 8
  162. max_len: 128
  163. }];
  164. }
  165. // Result of an admin password update.
  166. message UpdateUserPasswordResponse {
  167. // Updated admin member row.
  168. AdminMember member = 1;
  169. }
  170. // Request to clear a user's self-service username-change cooldown.
  171. message ClearUsernameCooldownRequest {
  172. // Target user ID.
  173. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  174. }
  175. // Result of clearing a user's username-change cooldown.
  176. message ClearUsernameCooldownResponse {
  177. // True when the request completed.
  178. bool cleared = 1;
  179. }
  180. // Request to delete a user account as a server-admin action.
  181. message DeleteUserRequest {
  182. reserved 2;
  183. reserved "current_password";
  184. // Target user ID.
  185. string user_id = 1 [(buf.validate.field).string.min_len = 1];
  186. }
  187. // Result of deleting a user account.
  188. message DeleteUserResponse {
  189. // True when the user was deleted.
  190. bool deleted = 1;
  191. }
  192. // Server-admin user management commands and member-detail reads.
  193. service AdminUserService {
  194. // Lists server members for the admin members screen. Requires
  195. // admin.view-users.
  196. rpc ListMembers(ListMembersRequest) returns (ListMembersResponse);
  197. // Gets one server member plus role/permission metadata for admin details.
  198. // Requires admin.view-users. Returns NOT_FOUND when the user does not exist.
  199. rpc GetMember(GetMemberRequest) returns (GetMemberResponse);
  200. // Gets server member rows for multiple users. Requires admin.view-users.
  201. rpc BatchGetMembers(BatchGetMembersRequest) returns (BatchGetMembersResponse);
  202. // Assigns a role to a user. Requires role.assign, and non-owner callers may
  203. // only assign roles whose granted authority they already possess.
  204. rpc AssignRole(AssignRoleRequest) returns (AssignRoleResponse);
  205. // Revokes a role from a user. Requires role.assign, and non-owner callers may
  206. // only revoke roles whose permission decisions are within their authority.
  207. rpc RevokeRole(RevokeRoleRequest) returns (RevokeRoleResponse);
  208. // Updates another user's login and/or display name as an admin action.
  209. // Requires user.manage-accounts; the caller cannot target their own account.
  210. rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
  211. // Updates another user's password as an admin action. Requires
  212. // user.manage-accounts and a fresh credential for the caller; the caller
  213. // cannot target their own account.
  214. rpc UpdateUserPassword(UpdateUserPasswordRequest) returns (UpdateUserPasswordResponse);
  215. // Clears the target user's self-service username-change cooldown. Requires
  216. // user.manage-accounts.
  217. rpc ClearUsernameCooldown(ClearUsernameCooldownRequest) returns (ClearUsernameCooldownResponse);
  218. // Deletes a user account as an admin action. Requires user.delete-any for
  219. // other users or user.delete-self for the caller.
  220. rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse);
  221. }