members.proto 9.5 KB

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