

syntax = "proto3";

package bufman.dubbo.apache.org.registry.v1alpha1;

import "registry/v1alpha1/role.proto";
import "registry/v1alpha1/verification_status.proto";
import "google/protobuf/timestamp.proto";

message User {
  // primary key, unique, immutable
  string id = 1;
  // immutable
  google.protobuf.Timestamp create_time = 2;
  // mutable
  google.protobuf.Timestamp update_time = 3;
  // unique, mutable
  string username = 4;
  // mutable
  bool deactivated = 5;
  // description is the user configurable description of the user.
  string description = 6;
  // url is the user configurable URL in the description of the user,
  // always included the scheme and will not have a #fragment suffix.
  string url = 7;
  // verification status of the user, configurable by server admin.
  VerificationStatus verification_status = 8;
  // user type of the user, depends on how the user was created.
  UserType user_type = 9;
}

// TODO: #663 move this to organization service
message OrganizationUser {
  User user = 1;
  // The ID of the organization for which the role belongs to.
  string organization_id = 2;
  // The role that the user has in the organization above.
  OrganizationRole organization_role = 3;
  // The source of the user's role in the organization above.
  OrganizationRoleSource organization_role_source = 4;
}

enum UserState {
  USER_STATE_UNSPECIFIED = 0;
  USER_STATE_ACTIVE = 1;
  USER_STATE_DEACTIVATED = 2;
}

enum UserType {
  USER_TYPE_UNSPECIFIED = 0;
  USER_TYPE_PERSONAL = 1;
  USER_TYPE_MACHINE = 2;
  USER_TYPE_SYSTEM = 3;
}

// UserService is the User service.
service UserService {
  // CreateUser creates a new user with the given username.
  rpc CreateUser(CreateUserRequest) returns (CreateUserResponse) {
    option idempotency_level = IDEMPOTENT;
  }
  // GetUser gets a user by ID.
  rpc GetUser(GetUserRequest) returns (GetUserResponse) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  // GetUserByUsername gets a user by username.
  rpc GetUserByUsername(GetUserByUsernameRequest) returns (GetUserByUsernameResponse) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  // ListUsers lists all users.
  rpc ListUsers(ListUsersRequest) returns (ListUsersResponse) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  // ListOrganizationUsers lists all users for an organization.
  // TODO: #663 move this to organization service
  rpc ListOrganizationUsers(ListOrganizationUsersRequest) returns (ListOrganizationUsersResponse) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  // DeleteUser deletes a user.
  rpc DeleteUser(DeleteUserRequest) returns (DeleteUserResponse) {
    option idempotency_level = IDEMPOTENT;
  }
  // Deactivate user deactivates a user.
  rpc DeactivateUser(DeactivateUserRequest) returns (DeactivateUserResponse) {
    option idempotency_level = IDEMPOTENT;
  }
  // UpdateUserServerRole update the role of an user in the server.
  rpc UpdateUserServerRole(UpdateUserServerRoleRequest) returns (UpdateUserServerRoleResponse);
  // CountUsers returns the number of users in the server by the user state provided.
  rpc CountUsers(CountUsersRequest) returns (CountUsersResponse) {
    option idempotency_level = NO_SIDE_EFFECTS;
  }
  // UpdateUserSettings update the user settings including description.
  rpc UpdateUserSettings(UpdateUserSettingsRequest) returns (UpdateUserSettingsResponse);
}

message CreateUserRequest {
  string username = 1;
  string password = 2;
}

message CreateUserResponse {
  User user = 1;
}

message GetUserRequest {
  string id = 1;
}

message GetUserResponse {
  User user = 1;
}

message GetUserByUsernameRequest {
  string username = 1;
}

message GetUserByUsernameResponse {
  User user = 1;
}

message ListUsersRequest {
  uint32 page_size = 1;
  // The first page is returned if this is empty.
  string page_token = 2;
  bool reverse = 3;
  // If the user_state_filter is unspecified, users of all states are included.
  UserState user_state_filter = 4;
  // If the user_type_filters is empty, users of all types are included.
  repeated UserType user_type_filters = 5;
}

message ListUsersResponse {
  repeated User users = 1;
  // There are no more pages if this is empty.
  string next_page_token = 2;
}

message ListOrganizationUsersRequest {
  string organization_id = 1;
  uint32 page_size = 2;
  // The first page is returned if this is empty.
  string page_token = 3;
  bool reverse = 4;
}

message ListOrganizationUsersResponse {
  repeated OrganizationUser users = 1;
  // There are no more pages if this is empty.
  string next_page_token = 2;
}

message DeleteUserRequest {}

message DeleteUserResponse {}

message DeactivateUserRequest {
  string id = 1;
}

message DeactivateUserResponse {}

message UpdateUserServerRoleRequest {
  // The ID of the user for which to be updated a role.
  string user_id = 1;
  // The new role of the user in the server.
  ServerRole server_role = 2;
}

message UpdateUserServerRoleResponse {}

message CountUsersRequest {
  // If the user_state_filter is unspecified, all users are included.
  UserState user_state_filter = 1;
}

message CountUsersResponse {
  uint32 total_count = 1;
}

message UpdateUserSettingsRequest {
  string user_id = 1;
  // optional, update to description will only be made when this is present
  optional string description = 2;
  // optional, update to url will only be made when this is present
  optional string url = 3;
}

message UpdateUserSettingsResponse {}
