syntax = "v1"

info (
	title:   "User API"
	desc:    "API for ppanel"
	author:  "Tension"
	email:   "tension@ppanel.com"
	version: "0.0.1"
)

import (
	"../types.api"
)

type (
	// GetUserListRequest
	GetUserListRequest {
		Page            int    `form:"page"`
		Size            int    `form:"size"`
		Search          string `form:"search,omitempty"`
		UserId          *int64 `form:"user_id,omitempty"`
		SubscribeId     *int64 `form:"subscribe_id,omitempty"`
		UserSubscribeId *int64 `form:"user_subscribe_id,omitempty"`
	}
	// GetUserListResponse
	GetUserListResponse {
		Total int64  `json:"total"`
		List  []User `json:"list"`
	}
	// GetUserDetail
	GetDetailRequest {
		Id int64 `form:"id" validate:"required"`
	}
	UpdateUserBasiceInfoRequest {
		UserId     int64  `json:"user_id" validate:"required"`
		Password   string `json:"password"`
		Avatar     string `json:"avatar"`
		Balance    int64  `json:"balance"`
		Commission int64  `json:"commission"`
		GiftAmount int64  `json:"gift_amount"`
		Telegram   int64  `json:"telegram"`
		ReferCode  string `json:"refer_code"`
		RefererId  int64  `json:"referer_id"`
		Enable     bool   `json:"enable"`
		IsAdmin    bool   `json:"is_admin"`
	}
	UpdateUserNotifySettingRequest {
		UserId                int64 `json:"user_id" validate:"required"`
		EnableBalanceNotify   bool  `json:"enable_balance_notify"`
		EnableLoginNotify     bool  `json:"enable_login_notify"`
		EnableSubscribeNotify bool  `json:"enable_subscribe_notify"`
		EnableTradeNotify     bool  `json:"enable_trade_notify"`
	}
	CreateUserRequest {
		Email             string `json:"email"`
		Telephone         string `json:"telephone"`
		TelephoneAreaCode string `json:"telephone_area_code"`
		Password          string `json:"password"`
		ProductId         int64  `json:"product_id"`
		Duration          int64  `json:"duration"`
		RefererUser       string `json:"referer_user"`
		ReferCode         string `json:"refer_code"`
		Balance           int64  `json:"balance"`
		Commission        int64  `json:"commission"`
		GiftAmount        int64  `json:"gift_amount"`
		IsAdmin           bool   `json:"is_admin"`
	}
	UserSubscribeDetail {
		Id          int64     `json:"id"`
		UserId      int64     `json:"user_id"`
		User        User      `json:"user"`
		OrderId     int64     `json:"order_id"`
		SubscribeId int64     `json:"subscribe_id"`
		Subscribe   Subscribe `json:"subscribe"`
		StartTime   int64     `json:"start_time"`
		ExpireTime  int64     `json:"expire_time"`
		ResetTime   int64     `json:"reset_time"`
		Traffic     int64     `json:"traffic"`
		Download    int64     `json:"download"`
		Upload      int64     `json:"upload"`
		Token       string    `json:"token"`
		Status      uint8     `json:"status"`
		CreatedAt   int64     `json:"created_at"`
		UpdatedAt   int64     `json:"updated_at"`
	}
	BatchDeleteUserRequest {
		Ids []int64 `json:"ids" validate:"required"`
	}
	DeleteUserDeivceRequest {
		Id int64 `json:"id"`
	}
	KickOfflineRequest {
		Id int64 `json:"id"`
	}
	CreateUserAuthMethodRequest {
		UserId         int64  `json:"user_id"`
		AuthType       string `json:"auth_type"`
		AuthIdentifier string `json:"auth_identifier"`
	}
	DeleteUserAuthMethodRequest {
		UserId   int64  `json:"user_id"`
		AuthType string `json:"auth_type"`
	}
	UpdateUserAuthMethodRequest {
		UserId         int64  `json:"user_id"`
		AuthType       string `json:"auth_type"`
		AuthIdentifier string `json:"auth_identifier"`
	}
	GetUserAuthMethodRequest {
		UserId int64 `json:"user_id"`
	}
	GetUserAuthMethodResponse {
		AuthMethods []UserAuthMethod `json:"auth_methods"`
	}
	GetUserSubscribeListRequest {
		Page   int   `form:"page"`
		Size   int   `form:"size"`
		UserId int64 `form:"user_id"`
	}
	GetUserSubscribeListResponse {
		List  []UserSubscribe `json:"list"`
		Total int64           `json:"total"`
	}
	GetUserSubscribeLogsRequest {
		Page        int   `form:"page"`
		Size        int   `form:"size"`
		UserId      int64 `form:"user_id"`
		SubscribeId int64 `form:"subscribe_id,omitempty"`
	}
	GetUserSubscribeLogsResponse {
		List  []UserSubscribeLog `json:"list"`
		Total int64              `json:"total"`
	}
	GetUserSubscribeDevicesRequest {
		Page        int   `form:"page"`
		Size        int   `form:"size"`
		UserId      int64 `form:"user_id"`
		SubscribeId int64 `form:"subscribe_id"`
	}
	GetUserSubscribeDevicesResponse {
		List  []UserDevice `json:"list"`
		Total int64        `json:"total"`
	}
	CreateUserSubscribeRequest {
		UserId      int64 `json:"user_id"`
		ExpiredAt   int64 `json:"expired_at"`
		Traffic     int64 `json:"traffic"`
		SubscribeId int64 `json:"subscribe_id"`
	}
	UpdateUserSubscribeRequest {
		UserSubscribeId int64 `json:"user_subscribe_id"`
		SubscribeId     int64 `json:"subscribe_id"`
		Traffic         int64 `json:"traffic"`
		ExpiredAt       int64 `json:"expired_at"`
		Upload          int64 `json:"upload"`
		Download        int64 `json:"download"`
	}
	GetUserLoginLogsRequest {
		Page   int   `form:"page"`
		Size   int   `form:"size"`
		UserId int64 `form:"user_id"`
	}
	GetUserLoginLogsResponse {
		List  []UserLoginLog `json:"list"`
		Total int64          `json:"total"`
	}
	DeleteUserSubscribeRequest {
		UserSubscribeId int64 `json:"user_subscribe_id"`
	}
	GetUserSubscribeByIdRequest {
		Id int64 `form:"id" validate:"required"`
	}
)

@server (
	prefix:     v1/admin/user
	group:      admin/user
	jwt:        JwtAuth
	middleware: AuthMiddleware
)
service ppanel {
	@doc "Get user list"
	@handler GetUserList
	get /list (GetUserListRequest) returns (GetUserListResponse)

	@doc "Get user detail"
	@handler GetUserDetail
	get /detail (GetDetailRequest) returns (User)

	@doc "Update user basic info"
	@handler UpdateUserBasicInfo
	put /basic (UpdateUserBasiceInfoRequest)

	@doc "Update user notify setting"
	@handler UpdateUserNotifySetting
	put /notify (UpdateUserNotifySettingRequest)

	@doc "Delete user"
	@handler DeleteUser
	delete / (GetDetailRequest)

	@doc "Current user"
	@handler CurrentUser
	get /current returns (User)

	@doc "Batch delete user"
	@handler BatchDeleteUser
	delete /batch (BatchDeleteUserRequest)

	@doc "Create user"
	@handler CreateUser
	post / (CreateUserRequest)

	@doc "User device"
	@handler UpdateUserDevice
	put /device (UserDevice)

	@doc "Delete user device"
	@handler DeleteUserDevice
	delete /device (DeleteUserDeivceRequest)

	@doc "kick offline user device"
	@handler KickOfflineByUserDevice
	put /device/kick_offline (KickOfflineRequest)

	@doc "Create user auth method"
	@handler CreateUserAuthMethod
	post /auth_method (CreateUserAuthMethodRequest)

	@doc "Delete user auth method"
	@handler DeleteUserAuthMethod
	delete /auth_method (DeleteUserAuthMethodRequest)

	@doc "Update user auth method"
	@handler UpdateUserAuthMethod
	put /auth_method (UpdateUserAuthMethodRequest)

	@doc "Get user auth method"
	@handler GetUserAuthMethod
	get /auth_method (GetUserAuthMethodRequest) returns (GetUserAuthMethodResponse)

	@doc "Get user subcribe"
	@handler GetUserSubscribe
	get /subscribe (GetUserSubscribeListRequest) returns (GetUserSubscribeListResponse)

	@doc "Get user subcribe by id"
	@handler GetUserSubscribeById
	get /subscribe/detail (GetUserSubscribeByIdRequest) returns (UserSubscribeDetail)

	@doc "Get user subcribe logs"
	@handler GetUserSubscribeLogs
	get /subscribe/logs (GetUserSubscribeLogsRequest) returns (GetUserSubscribeLogsResponse)

	@doc "Get user subcribe traffic logs"
	@handler GetUserSubscribeTrafficLogs
	get /subscribe/traffic_logs (GetUserSubscribeTrafficLogsRequest) returns (GetUserSubscribeTrafficLogsResponse)

	@doc "Get user subcribe devices"
	@handler GetUserSubscribeDevices
	get /subscribe/device (GetUserSubscribeDevicesRequest) returns (GetUserSubscribeDevicesResponse)

	@doc "Create user subcribe"
	@handler CreateUserSubscribe
	post /subscribe (CreateUserSubscribeRequest)

	@doc "Update user subcribe"
	@handler UpdateUserSubscribe
	put /subscribe (UpdateUserSubscribeRequest)

	@doc "Delete user subcribe"
	@handler DeleteUserSubscribe
	delete /subscribe (DeleteUserSubscribeRequest)

	@doc "Get user login logs"
	@handler GetUserLoginLogs
	get /login/logs (GetUserLoginLogsRequest) returns (GetUserLoginLogsResponse)
}

