syntax = "proto3";

package core;
option go_package="./core";

//  操作类型
enum Operator {
  EQ = 0;
  NEQ = 1;
  IN = 2;
  NotIn = 3;
  GT = 4;
  GTE = 5;
  LT = 6;
  LTE = 7;
  Contains = 8;
  Prefix = 9;
  Suffix = 10;
  EqualFold = 11;
  ContainsFold = 12;
}

enum DistrictQueryType {
  Normal = 0;
  Children = 1;
  ChildrenByLevel = 2;
  Parents = 3;
}

//  基础回执
message BaseResp {
  int32 code = 1;
  string msg = 2;
}

message DistrictTree {
  repeated DistrictInfo tree = 1;
}

message RoleReq {
  int64 ID = 1;
  string name = 2;
  string code = 3;
  bool with_user = 4;
  optional Pagination page = 10;
}

message TokenReq {
  int64 ID = 1;
  int64 user_id = 2;
  string username = 3;
  string phone_number = 4;
  string email = 5;
  bool with_user = 6;
  optional Pagination page = 10;
}

message UserSocialListResp {
  optional Pagination page = 1;
  repeated UserSocialInfo data = 2;
}

message DepartmentListResp {
  optional Pagination page = 1;
  repeated DepartmentInfo data = 2;
}

message DictionaryReq {
  int64 ID = 1;
  string name = 2;
  string title = 3;
  bool with_details = 4;
  optional Pagination page = 10;
}

message DeleteDictionaryDetailReq {
  repeated int64 ids = 1;
  int64 dict_id = 2;
}

message GetDistrictNameReq {
  string code = 1;
  string separator = 2;
}

message CallbackReq {
  string state = 1;
  string code = 2;
}

message RoleInfo {
  int64 ID = 1;
  string status = 2;
  string created_at = 3;
  string updated_at = 4;
  string code = 5;
  string name = 6;
  string description = 7;
  repeated UserInfo users = 10;
}

message UserSocialInfo {
  int64 ID = 1;
  string created_at = 2;
  string updated_at = 3;
  int64 user_id = 4;
  string provider = 5;
  string access_token = 6;
  string refresh_token = 7;
  string uid = 8;
  string open_id = 9;
  string union_id = 10;
  string key = 11;
  uint64 expires_in = 12;
  string user_profile = 13;
  UserInfo user = 14;
}

message DepartmentInfo {
  int64 ID = 1;
  string status = 2;
  string created_at = 3;
  string updated_at = 4;
  string name = 5;
  int64 leader_id = 6;
  string remark = 7;
  int64 parent_id = 8;
  DepartmentInfo parent = 10;
  repeated DepartmentInfo children = 11;
  repeated UserInfo users = 12;
  UserInfo leader = 13;
}

//  DistrictInfo 地址单体结构
message DistrictInfo {
  int64 ID = 1;
  string created_at = 2;
  string updated_at = 3;
  string name = 4;
  string short_name = 5;
  string code = 6;
  string province = 7;
  string city = 8;
  string area = 9;
  string street = 10;
  uint32 level = 11;
  double latitude = 12;
  double longitude = 13;
  repeated DistrictInfo children = 20;
}

message DistrictListResp {
  optional Pagination page = 1;
  repeated DistrictInfo data = 2;
}

message RecordReq {
  int64 user_id = 1;
}

message UserRoleReq {
  int64 user_id = 1;
  repeated int64 role_ids = 2;
  repeated string role_codes = 3;
}

message DistrictReq {
  string code = 1;
  string province = 2;
  string city = 3;
  string area = 4;
  string street = 5;
  uint32 level = 6;
  string name = 7;
  string parent_code = 8;
  optional Pagination page = 10;
  DistrictQueryType query_type = 11;
}

message OauthProviderReq {
  int64 ID = 1;
  string name = 2;
  string client_id = 3;
  optional bool system = 4;
  optional bool init = 5;
  optional Pagination page = 10;
}

message TokenListResp {
  optional Pagination page = 1;
  repeated TokenInfo data = 2;
}

message UserReq {
  int64 ID = 1;
  string username = 2;
  string phone_number = 3;
  string email = 4;
  string nickname = 5;
  bool with_role = 6;
  bool with_social = 7;
  bool with_department = 8;
  bool with_token = 9;
  bool with_login_record = 10;
  optional Pagination page = 20;
}

message DictionaryDetailReq {
  optional Pagination page = 1;
  int64 ID = 2;
  int64 dict_id = 3;
  string title = 4;
  string key = 5;
  string value = 6;
  bool with_dictionary = 7;
}

message GetDistrictNameResp {
  string code = 1;
  string name = 2;
  repeated string name_list = 3;
}

message GetUserRolesReq {
  optional Pagination page = 1;
  int64 user_id = 2;
}

//  Base message
message Empty {}

//  基础回执带ID
message BaseIDResp {
  int64 ID = 1;
  int32 code = 2;
  string msg = 3;
}

message DictionaryInfo {
  int64 ID = 1;
  string status = 2;
  string created_at = 3;
  string updated_at = 4;
  string title = 5;
  string name = 6;
  string description = 7;
  repeated DictionaryDetailInfo details = 10;
}

message DictionaryDetailInfo {
  int64 ID = 1;
  string status = 2;
  string created_at = 3;
  string updated_at = 4;
  string title = 5;
  string key = 6;
  string value = 7;
  uint32 sort = 8;
  int64 dictionary_id = 9;
  DictionaryInfo dictionary = 10;
}

message OauthProviderListResp {
  optional Pagination page = 1;
  repeated OauthProviderInfo data = 2;
}

message RoleListResp {
  optional Pagination page = 1;
  repeated RoleInfo data = 2;
}

message TokenUserReq {
  int64 user_id = 1;
}

message IDReq {
  int64 ID = 1;
}

message IDsReq {
  repeated int64 ids = 1;
}

message DepartmentReq {
  int64 ID = 1;
  string name = 2;
  int64 leader_id = 3;
  int64 parent_id = 4;
  bool with_leader = 5;
  bool with_user = 6;
  bool with_children = 7;
  optional Pagination page = 10;
}

message DictionaryListResp {
  optional Pagination page = 1;
  repeated DictionaryInfo data = 2;
}

message UserSocialReq {
  int64 ID = 1;
  int64 user_id = 2;
  string provider = 3;
  string access_token = 4;
  string uid = 5;
  string open_id = 6;
  string union_id = 7;
  bool with_user = 8;
  optional Pagination page = 10;
}

message DictionaryDetailListResp {
  optional Pagination page = 1;
  repeated DictionaryDetailInfo data = 2;
}

message LoginRecordInfo {
  int64 ID = 1;
  string created_at = 3;
  string updated_at = 4;
  int64 user_id = 5;
  string last_login_at = 6;
  string last_login_ipv4 = 7;
  string last_login_device = 8;
  string last_login_ua = 9;
  uint64 login_count = 10;
}

message OauthLoginReq {
  string state = 1;
  string provider = 2;
}

message TokenInfo {
  int64 ID = 1;
  string status = 2;
  string created_at = 3;
  string updated_at = 4;
  int64 user_id = 5;
  string access_token = 6;
  string refresh_token = 7;
  string source = 8;
  int64 expired_at = 9;
  UserInfo user = 10;
}

message UserInfo {
  int64 ID = 1;
  string status = 2;
  string created_at = 3;
  string updated_at = 4;
  string username = 5;
  optional string phone_number = 6;
  optional string email = 7;
  string password = 8;
  optional string nickname = 9;
  map<string,string> metas = 10;
  repeated RoleInfo roles = 20;
  repeated UserSocialInfo socials = 21;
  repeated DepartmentInfo departments = 22;
  repeated TokenInfo tokens = 23;
  LoginRecordInfo login_record = 24;
}

message UserListResp {
  optional Pagination page = 1;
  repeated UserInfo data = 2;
}

//  分页参数
message Pagination {
  uint64 size = 1;
  uint64 total = 2;
  uint64 current = 3;
}

message DistrictCodeReq {
  string code = 1;
}

message OauthProviderInfo {
  int64 ID = 1;
  string created_at = 2;
  string updated_at = 3;
  string name = 4;
  string client_id = 5;
  string client_secret = 6;
  string redirect_url = 7;
  string scopes = 8;
  string auth_url = 9;
  string token_url = 10;
  string info_url = 11;
  string description = 12;
  bool system = 13;
  bool init = 14;
}

message OauthRedirectResp {
  string url = 1;
}

service Core {
  //  group: base
  rpc initDatabase(Empty) returns (BaseResp);
  //  Role management
  //  group: department
  rpc createDepartment(DepartmentInfo) returns (BaseIDResp);
  //  group: department
  rpc updateDepartment(DepartmentInfo) returns (BaseResp);
  //  group: department
  rpc getDepartmentList(DepartmentReq) returns (DepartmentListResp);
  //  group: department
  rpc getDepartment(DepartmentReq) returns (DepartmentInfo);
  //  group: department
  rpc deleteDepartment(IDsReq) returns (BaseResp);
  //  Dictionary Management
  //  group: dictionary
  rpc createDictionary(DictionaryInfo) returns (BaseIDResp);
  //  group: dictionary
  rpc updateDictionary(DictionaryInfo) returns (BaseResp);
  //  group: dictionary
  rpc getDictionaryList(DictionaryReq) returns (DictionaryListResp);
  //  group: dictionary
  rpc getDictionary(DictionaryReq) returns (DictionaryInfo);
  //  group: dictionary
  rpc deleteDictionary(IDsReq) returns (BaseResp);
  //  Details
  //  group: dictionary
  rpc createDictionaryDetail(DictionaryDetailInfo) returns (BaseIDResp);
  //  group: dictionary
  rpc updateDictionaryDetail(DictionaryDetailInfo) returns (BaseResp);
  //  group: dictionary
  rpc getDictionaryDetailList(DictionaryDetailReq) returns (DictionaryDetailListResp);
  //  group: dictionary
  rpc getDictionaryDetail(DictionaryDetailReq) returns (DictionaryDetailInfo);
  //  group: dictionary
  rpc deleteDictionaryDetail(DeleteDictionaryDetailReq) returns (BaseResp);
  //  District management
  //  group: district
  rpc getDistrict(DistrictCodeReq) returns (DistrictInfo);
  //  group: district
  rpc getDistrictList(DistrictReq) returns (DistrictListResp);
  //  group: district
  rpc getDistrictTree(DistrictCodeReq) returns (DistrictTree);
  //  group: district
  rpc getDistrictName(GetDistrictNameReq) returns (GetDistrictNameResp);
  //  Login Record management
  //  group: login_record
  rpc getRecord(RecordReq) returns (LoginRecordInfo);
  //  group: login_record
  rpc record(LoginRecordInfo) returns (BaseResp);
  //  OauthProvider management
  //  group: oauth_provider
  rpc createOauthProvider(OauthProviderInfo) returns (BaseIDResp);
  //  group: oauth_provider
  rpc updateOauthProvider(OauthProviderInfo) returns (BaseResp);
  //  group: oauth_provider
  rpc getOauthProviderList(OauthProviderReq) returns (OauthProviderListResp);
  //  group: oauth_provider
  rpc getOauthProvider(OauthProviderReq) returns (OauthProviderInfo);
  //  group: oauth_provider
  rpc deleteOauthProvider(IDsReq) returns (BaseResp);
  //  group: oauth_provider
  rpc oauthLogin(OauthLoginReq) returns (OauthRedirectResp);
  //  group: oauth_provider
  rpc oauthCallback(CallbackReq) returns (UserInfo);
  //  Role management
  //  group: role
  rpc createRole(RoleInfo) returns (BaseIDResp);
  //  group: role
  rpc updateRole(RoleInfo) returns (BaseResp);
  //  group: role
  rpc getRoleList(RoleReq) returns (RoleListResp);
  //  group: role
  rpc getRole(RoleReq) returns (RoleInfo);
  //  group: role
  rpc deleteRole(IDsReq) returns (BaseResp);
  //  Token management
  //  group: token
  rpc createToken(TokenInfo) returns (BaseIDResp);
  //  group: token
  rpc updateToken(TokenInfo) returns (BaseResp);
  //  group: token
  rpc getTokenList(TokenReq) returns (TokenListResp);
  //  group: token
  rpc getToken(TokenReq) returns (TokenInfo);
  //  group: token
  rpc deleteToken(IDsReq) returns (BaseResp);
  //  group: token
  rpc blockUserAllToken(TokenUserReq) returns (BaseResp);
  //  User Management
  //  group: user
  rpc createUser(UserInfo) returns (BaseIDResp);
  //  group: user
  rpc updateUser(UserInfo) returns (BaseResp);
  //  group: user
  rpc getUserList(UserReq) returns (UserListResp);
  //  group: user
  rpc getUser(UserReq) returns (UserInfo);
  //  group: user
  rpc deleteUser(IDsReq) returns (BaseResp);
  //  User-Role Relationship Management
  //  UserBindRole 用户绑定角色
  //  group: user_role
  rpc userBindRole(UserRoleReq) returns (BaseResp);
  //  UserUnbindRole 用户解绑角色
  //  group: user_role
  rpc userUnbindRole(UserRoleReq) returns (BaseResp);
  //  UserClearRole 用户清理角色
  //  group: user_role
  rpc userClearRole(IDReq) returns (BaseResp);
  //  GetUserRoles 获取用户绑定的角色列表
  //  group: user_role
  rpc getUserRoles(GetUserRolesReq) returns (RoleListResp);
  //  User Management
  //  group: user_social
  rpc createUserSocial(UserSocialInfo) returns (BaseIDResp);
  //  group: user_social
  rpc updateUserSocial(UserSocialInfo) returns (BaseResp);
  //  group: user_social
  rpc getUserSocialList(UserSocialReq) returns (UserSocialListResp);
  //  group: user_social
  rpc getUserSocial(UserSocialReq) returns (UserSocialInfo);
  //  group: user_social
  rpc deleteUserSocial(IDsReq) returns (BaseResp);
}

