syntax = "v1"

info(
	title: "Model"
	desc: "API basic"
	author: "NorthLan"
	email: "lan6995@gmail.com"
	version: "v1.0"
)

import "../base.api"

type (
	UserInfo {
		BaseID
		TimeInfo

		// Status | 状态
		Status string `json:"status,optional"`
		// Username | 用户名
		Username string `json:"username,optional"`
		// Phone number | 手机号码
		PhoneNumber *string `json:"phoneNumber,optional"`
		// Email | 邮箱
		Email *string `json:"email,optional"`
		// Password | 密码
		Password string `json:"password,optional,omitempty"`
		// Nickname | 昵称
		Nickname *string `json:"nickname,optional"`
		// Roles | 角色代码列表
		Roles []string `json:"roles,optional"`
		// LoginRecord | 用户登录记录
		LoginRecord *UserLoginRecordInfo `json:"loginRecord,optional"`
		// Meta | 元数据
		Metas map[string]string `json:"metadata"`
	}

		// 用户登录记录
	UserLoginRecordInfo {
		BaseID
		TimeInfo

		// 用户ID
		UserId int64 `json:"userId,string,optional"`
		// 最近一次登录时间
		LastLoginAt string `json:"lastLoginAt,optional"`
		// 最近一次登录IPv4
		LastLoginIpv4 string `json:"lastLoginIpv4,optional"`
		// 最近一次登录设备
		LastLoginDevice string `json:"lastLoginDevice,optional"`
		// 最近一次登录浏览器Ua
		LastLoginUa string `json:"lastLoginUa,optional"`
		// 总登录次数
		LoginCount uint64 `json:"loginCount,optional"`
	}

		// Token信息
	TokenInfo {
		BaseID
		TimeInfo

		// Status | 状态
		Status string `json:"status,optional"`
		// User's Id | 用户ID
		UserId int64 `json:"userId,string,optional"`
		// AccessToken | AccessToken 字符串
		AccessToken string `json:"accessToken,optional"`
		// RefreshToken | RefreshToken 字符串
		RefreshToken string `json:"refreshYoken,optional"`
		// Source | Token来源，PCWeb/WechatMini/AlipayMini
		Source string `json:"source,optional"`
		// Expire Time | 过期时间
		ExpiredAt int64 `json:"expiredAt,optional"`
	}

		// 用户社交平台信息
	UserSocialInfo {
		BaseID
		TimeInfo

		// 系统用户ID
		UserId int64 `json:"userId,string,optional"`
		// OAuth Provider | 服务提供商
		Provider string `json:"provider,optional"`
		// Access Token | 用户在提供商最近一次登录的访问凭证
		AccessToken string `json:"accessToken,optional"`
		// Refresh Token | 用户在提供商最近一次登录的刷新凭证
		RefreshToken string `json:"refreshToken,optional"`
		// User's ID | 提供商用户ID，不一定存在
		Uid string `json:"uid,optional"`
		// OpenId | 用户在提供商的OpenID
		OpenId string `json:"openId,optional"`
		// UnionId | 用户在提供商的UnionID
		UnionId string `json:"unionId,optional"`
		// Key | 用户在提供商的用于解密的key
		Key string `json:"key,optional"`
		// Expires in | 访问凭证过期时长，单位：秒
		ExpiresIn uint64 `json:"expiresIn,optional"`
		// User Profile | 提供商用户信息，不一定存在
		UserProfile string `json:"userProfile,optional"`
	}
)

type (
	// 角色信息
	RoleInfo {
		BaseID
		TimeInfo

		// Status | 状态
		Status string `json:"status,optional"`
		// Role Code | 角色编码，可用于权限控制
		Code string `json:"code,optional"`
		// Role Name | 角色名
		Name string `json:"name,optional"`
		// Description | 角色描述
		Description string `json:"description,optional"`
	}
)

type (
	DepartmentInfo {
		BaseID
		TimeInfo

		// Status | 状态
		Status string `json:"status,optional"`
		// Department name | 部门名称
		Name string `json:"name,optional"`
		// Department leader | 部门负责人
		LeaderId int64 `json:"leaderId,string,optional"`
		// Remark | 备注
		Remark string `json:"remark,optional"`
		// Parent ID | 直接父级ID
		ParentId int64 `json:"parentId,string,optional"`

		// Leader | 部门负责人信息
		Leader *UserInfo `json:"leader,optional"`
		// Parent | 直接父级
		Parent *DepartmentInfo `json:"parent,optional"`
		// Children | 孩子列表
		Children []*DepartmentInfo `json:"children,optional"`
	}
)

type (
	OauthProviderInfo {
		BaseID
		TimeInfo
		// The provider's name | 提供商名称
		Name string `json:"name,optional"`
		// The client id | 客户端 id
		ClientId string `json:"clientId,optional"`
		// The client secret | 客户端密钥
		ClientSecret string `json:"clientSecret,optional"`
		// The redirect url | 跳转地址
		RedirectUrl string `json:"redirectUrl,optional"`
		// The scopes | 权限范围
		Scopes string `json:"scopes,optional"`
		// The auth url of the provider | 认证地址
		AuthUrl string `json:"authUrl,optional"`
		// The token url of the provider | 获取 Token 地址
		TokenUrl string `json:"tokenUrl,optional"`
		// The URL to request user information by token | 用户信息请求地址
		InfoUrl string `json:"infoUrl,optional"`
		// The description of the provider | 提供商描述
		Description string `json:"description,optional"`
		// The system internal oauth provider | 系统内置提供商
		System bool `json:"system,optional"`
		// The oauth provider init status | 提供商初始化状态
		Init bool `json:"init,optional"`
	}
)

type (
	// District info | 地址信息
	DistrictInfo {
		BaseID
		TimeInfo

		// Name | 地区名称
		Name string `json:"name"`
		// Short name | 地区缩写，省级
		ShortName string `json:"shortName"`
		// Code | 地址编码
		Code string `json:"code"`
		// Province code | 省级行政编号，表示该地区归属
		Province string `json:"province"`
		// City | 地级行政编号，表示该地区归属
		City string `json:"city"`
		// Area | 县级行政编号，表示该地区归属
		Area string `json:"area"`
		// Street or Town | 乡级行政编号，表示该地区归属
		Street string `json:"street"`
		// Level | 地区级别 1-省、自治区、直辖市 2-地级市、地区、自治州、盟 3-市辖区、县级市、县 4-乡镇
		Level uint32 `json:"level"`
		// Latitude | 纬度
		Latitude float64 `json:"latitude"`
		// Longitude | 经度
		Longitude float64 `json:"longitude"`
		// Children | 子级
		Children []*DistrictInfo `json:"children,optional"`
	}

		// CaptchaInfo | 验证码信息
	CaptchaInfo {
		// CaptchaId | 验证码ID
		CaptchaId string `json:"captchaId"`
		// Base64 | 验证码图片 Base64
		Base64 string `json:"base64"`
	}

		// 字典信息
	DictionaryInfo {
		BaseID
		TimeInfo

		// Status | 状态
		Status string `json:"status,optional"`
		// The title shown in the ui | 展示名称 （建议配合i18n）
		Title string `json:"title,optional"`
		// The name of dictionary for search | 字典搜索名称
		Name string `json:"name,optional"`
		// The description of dictionary | 字典的描述
		Description string `json:"description,optional"`

		// Details | 字典项
		Details []*DictionaryDetailInfo `json:"details,optional"`
	}

		// 字典项信息
	DictionaryDetailInfo {
		BaseID
		TimeInfo

		// Status | 状态
		Status string `json:"status,optional"`
		// Sort number | 排序号
		Sort uint32 `json:"sort,optional"`
		// The title shown in the ui | 展示名称 （建议配合i18n）
		Title string `json:"title,optional"`
		// key | 键
		Key string `json:"key,optional"`
		// value | 值
		Value string `json:"value,optional"`
		// Dictionary Id | 字典ID
		DictionaryId int64 `json:"dictionaryId,string,optional"`

		// Dictionary | 字典信息
		Dictionary *DictionaryInfo `json:"dictionary,optional"`
	}
)