syntax = "v1"

type(
    Role{
        Id          int64  `json:"id,optional,omitempty"`         // 角色ID
        Name        string `json:"name,optional,omitempty"`       // 角色名称
        Menus       []Menu `json:"menus,optional,omitempty"`      // 菜单列表
        AuthUsers   []User `json:"users,optional,omitempty"`      // 拥护该角色的用户列表 user_id 列表
        AuthRange   int    `json:"authRange,optional,omitempty,option=0|1|2"`  // 权限范围(1:全部权限 2:部分权限)
        UpdatedAt   int64  `json:"updatedAt,optional,omitempty"`  // 更新时间
    }
)

@server(
    prefix: v1/system
    group: role
    middleware: LogRequest
    jwt: SystemAuth
)
service Core {
    @doc  "角色-详情"
    @handler systemRoleGet
    get /role/:id (RoleGetRequest) returns (RoleGetResponse)
    @doc  "角色-保存"
    @handler systemRoleSave
    post /role (RoleSaveRequest) returns (RoleSaveResponse)
    @doc  "角色-删除"
    @handler systemRoleDelete
    delete /role/:id (RoleDeleteRequest) returns (RoleDeleteResponse)
    @doc  "角色-更新"
    @handler systemRoleUpdate
    put /role/:id (RoleUpdateRequest) returns (RoleUpdateResponse)
    @doc  "角色-搜索"
    @handler systemRoleSearch
    post /role/search (RoleSearchRequest) returns (RoleSearchResponse)

    @doc  "菜单-列表"
    @handler systemMenuList
    post /menu/list (MenuListRequest) returns (MenuListResponse)
}

type (
    RoleGetRequest {
        Id int64 `path:"id"`
    }
    RoleGetResponse struct{
        Role Role `json:"role"`
    }

    RoleSaveRequest struct{
        Role Role `json:"role"`
    }
    RoleSaveResponse struct{}

    RoleDeleteRequest struct{
        Id int64 `path:"id"`
    }
    RoleDeleteResponse struct{}

    RoleUpdateRequest struct{
        Id      int64   `path:"id"`
        Role    Role    `json:"role"`
    }
    RoleUpdateResponse struct{}

    RoleSearchRequest struct{
        Page int  `json:"page"`
        Size int  `json:"size"`
        RoleName     string `json:"rolename,optional"`  // 角色名称
        UserName     string `json:"userName,optional"`  // 用户名称
    }
    RoleSearchResponse{
        List  []Role  `json:"list"`
        Total int64   `json:"total"`
    }
)

// 菜单列表
type(
    MenuListRequest{

    }
    MenuListResponse{
        List []Menu `json:"list"`
    }
    Menu{
        Id         int64  `json:"id,optional,omitempty"`         // 菜单ID
        ParentId   int64  `json:"parentId,optional"`             // 父级ID
        Name       string `json:"name,optional,omitempty"`       // 菜单名称
        Code       string `json:"code,optional,omitempty"`       // 菜单编码
        MenuType   string `json:"menuType,optional,omitempty"`   // 菜单类型 (目录catalog、菜单menu、按钮button)
        Icon       string `json:"icon,optional,omitempty"`       // 图标
        Sort       int64  `json:"sort,optional,omitempty"`       // 排序
    }
)