feat: implement role, permission, project, milestone, and task command groups
- Add role commands: list, get, create, update, delete, set/add/remove-permissions - Add permission list command - Add project commands: list, get, create, update, delete, members, add/remove-member - Add milestone commands: list, get, create, update, delete, progress - Add task commands: list, get, create, update, transition, take, delete, search - Wire all new command groups into main.go dispatcher - All commands support --json output mode and --token manual auth - Passes go build and go vet cleanly
This commit is contained in:
284
cmd/hf/main.go
284
cmd/hf/main.go
@@ -143,6 +143,21 @@ func handleGroup(group help.Group, args []string) {
|
||||
case "user":
|
||||
handleUserCommand(sub.Name, remaining)
|
||||
return
|
||||
case "role":
|
||||
handleRoleCommand(sub.Name, remaining)
|
||||
return
|
||||
case "permission":
|
||||
handlePermissionCommand(sub.Name, remaining)
|
||||
return
|
||||
case "project":
|
||||
handleProjectCommand(sub.Name, remaining)
|
||||
return
|
||||
case "milestone":
|
||||
handleMilestoneCommand(sub.Name, remaining)
|
||||
return
|
||||
case "task":
|
||||
handleTaskCommand(sub.Name, remaining)
|
||||
return
|
||||
}
|
||||
|
||||
output.Errorf("hf %s %s is recognized but not implemented yet", group.Name, sub.Name)
|
||||
@@ -256,3 +271,272 @@ func findSubCommand(group help.Group, name string) (help.Command, bool) {
|
||||
}
|
||||
return help.Command{}, false
|
||||
}
|
||||
|
||||
func handleRoleCommand(subCmd string, args []string) {
|
||||
tokenFlag := ""
|
||||
var filtered []string
|
||||
for i := 0; i < len(args); i++ {
|
||||
switch args[i] {
|
||||
case "--token":
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
tokenFlag = args[i]
|
||||
}
|
||||
default:
|
||||
filtered = append(filtered, args[i])
|
||||
}
|
||||
}
|
||||
|
||||
switch subCmd {
|
||||
case "list":
|
||||
commands.RunRoleList(tokenFlag)
|
||||
case "get":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf role get <role-name>")
|
||||
}
|
||||
commands.RunRoleGet(filtered[0], tokenFlag)
|
||||
case "create":
|
||||
name, desc := "", ""
|
||||
global := false
|
||||
var remaining []string
|
||||
for i := 0; i < len(filtered); i++ {
|
||||
switch filtered[i] {
|
||||
case "--name":
|
||||
if i+1 < len(filtered) {
|
||||
i++
|
||||
name = filtered[i]
|
||||
}
|
||||
case "--desc":
|
||||
if i+1 < len(filtered) {
|
||||
i++
|
||||
desc = filtered[i]
|
||||
}
|
||||
case "--global":
|
||||
if i+1 < len(filtered) {
|
||||
i++
|
||||
global = filtered[i] == "true"
|
||||
}
|
||||
default:
|
||||
remaining = append(remaining, filtered[i])
|
||||
}
|
||||
}
|
||||
_ = remaining
|
||||
if name == "" {
|
||||
output.Error("usage: hf role create --name <role-name>")
|
||||
}
|
||||
commands.RunRoleCreate(name, desc, global, tokenFlag)
|
||||
case "update":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf role update <role-name> [--desc ...]")
|
||||
}
|
||||
commands.RunRoleUpdate(filtered[0], filtered[1:], tokenFlag)
|
||||
case "delete":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf role delete <role-name>")
|
||||
}
|
||||
commands.RunRoleDelete(filtered[0], tokenFlag)
|
||||
case "set-permissions":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf role set-permissions <role-name> --permission <perm> [...]")
|
||||
}
|
||||
roleName := filtered[0]
|
||||
perms := extractPermissions(filtered[1:])
|
||||
commands.RunRoleSetPermissions(roleName, perms, tokenFlag)
|
||||
case "add-permissions":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf role add-permissions <role-name> --permission <perm> [...]")
|
||||
}
|
||||
roleName := filtered[0]
|
||||
perms := extractPermissions(filtered[1:])
|
||||
commands.RunRoleAddPermissions(roleName, perms, tokenFlag)
|
||||
case "remove-permissions":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf role remove-permissions <role-name> --permission <perm> [...]")
|
||||
}
|
||||
roleName := filtered[0]
|
||||
perms := extractPermissions(filtered[1:])
|
||||
commands.RunRoleRemovePermissions(roleName, perms, tokenFlag)
|
||||
default:
|
||||
output.Errorf("hf role %s is not implemented yet", subCmd)
|
||||
}
|
||||
}
|
||||
|
||||
func extractPermissions(args []string) []string {
|
||||
var perms []string
|
||||
for i := 0; i < len(args); i++ {
|
||||
if args[i] == "--permission" && i+1 < len(args) {
|
||||
i++
|
||||
perms = append(perms, args[i])
|
||||
}
|
||||
}
|
||||
return perms
|
||||
}
|
||||
|
||||
func handlePermissionCommand(subCmd string, args []string) {
|
||||
tokenFlag := ""
|
||||
for i := 0; i < len(args); i++ {
|
||||
if args[i] == "--token" && i+1 < len(args) {
|
||||
i++
|
||||
tokenFlag = args[i]
|
||||
}
|
||||
}
|
||||
|
||||
switch subCmd {
|
||||
case "list":
|
||||
commands.RunPermissionList(tokenFlag)
|
||||
default:
|
||||
output.Errorf("hf permission %s is not implemented yet", subCmd)
|
||||
}
|
||||
}
|
||||
|
||||
func handleMilestoneCommand(subCmd string, args []string) {
|
||||
tokenFlag := ""
|
||||
var filtered []string
|
||||
for i := 0; i < len(args); i++ {
|
||||
switch args[i] {
|
||||
case "--token":
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
tokenFlag = args[i]
|
||||
}
|
||||
default:
|
||||
filtered = append(filtered, args[i])
|
||||
}
|
||||
}
|
||||
|
||||
switch subCmd {
|
||||
case "list":
|
||||
commands.RunMilestoneList(filtered, tokenFlag)
|
||||
case "get":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf milestone get <milestone-code>")
|
||||
}
|
||||
commands.RunMilestoneGet(filtered[0], tokenFlag)
|
||||
case "create":
|
||||
commands.RunMilestoneCreate(filtered, tokenFlag)
|
||||
case "update":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf milestone update <milestone-code> [--title ...] [--desc ...] [--status ...] [--due ...]")
|
||||
}
|
||||
commands.RunMilestoneUpdate(filtered[0], filtered[1:], tokenFlag)
|
||||
case "delete":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf milestone delete <milestone-code>")
|
||||
}
|
||||
commands.RunMilestoneDelete(filtered[0], tokenFlag)
|
||||
case "progress":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf milestone progress <milestone-code>")
|
||||
}
|
||||
commands.RunMilestoneProgress(filtered[0], tokenFlag)
|
||||
default:
|
||||
output.Errorf("hf milestone %s is not implemented yet", subCmd)
|
||||
}
|
||||
}
|
||||
|
||||
func handleTaskCommand(subCmd string, args []string) {
|
||||
tokenFlag := ""
|
||||
var filtered []string
|
||||
for i := 0; i < len(args); i++ {
|
||||
switch args[i] {
|
||||
case "--token":
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
tokenFlag = args[i]
|
||||
}
|
||||
default:
|
||||
filtered = append(filtered, args[i])
|
||||
}
|
||||
}
|
||||
|
||||
switch subCmd {
|
||||
case "list":
|
||||
commands.RunTaskList(filtered, tokenFlag)
|
||||
case "get":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf task get <task-code>")
|
||||
}
|
||||
commands.RunTaskGet(filtered[0], tokenFlag)
|
||||
case "create":
|
||||
commands.RunTaskCreate(filtered, tokenFlag)
|
||||
case "update":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf task update <task-code> [--title ...] [--desc ...] [--status ...] [--priority ...] [--assignee ...]")
|
||||
}
|
||||
commands.RunTaskUpdate(filtered[0], filtered[1:], tokenFlag)
|
||||
case "transition":
|
||||
if len(filtered) < 2 {
|
||||
output.Error("usage: hf task transition <task-code> <status>")
|
||||
}
|
||||
commands.RunTaskTransition(filtered[0], filtered[1], tokenFlag)
|
||||
case "take":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf task take <task-code>")
|
||||
}
|
||||
commands.RunTaskTake(filtered[0], tokenFlag)
|
||||
case "delete":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf task delete <task-code>")
|
||||
}
|
||||
commands.RunTaskDelete(filtered[0], tokenFlag)
|
||||
case "search":
|
||||
commands.RunTaskSearch(filtered, tokenFlag)
|
||||
default:
|
||||
output.Errorf("hf task %s is not implemented yet", subCmd)
|
||||
}
|
||||
}
|
||||
|
||||
func handleProjectCommand(subCmd string, args []string) {
|
||||
tokenFlag := ""
|
||||
var filtered []string
|
||||
for i := 0; i < len(args); i++ {
|
||||
switch args[i] {
|
||||
case "--token":
|
||||
if i+1 < len(args) {
|
||||
i++
|
||||
tokenFlag = args[i]
|
||||
}
|
||||
default:
|
||||
filtered = append(filtered, args[i])
|
||||
}
|
||||
}
|
||||
|
||||
switch subCmd {
|
||||
case "list":
|
||||
commands.RunProjectList(filtered, tokenFlag)
|
||||
case "get":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf project get <project-code>")
|
||||
}
|
||||
commands.RunProjectGet(filtered[0], tokenFlag)
|
||||
case "create":
|
||||
commands.RunProjectCreate(filtered, tokenFlag)
|
||||
case "update":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf project update <project-code> [--name ...] [--desc ...] [--repo ...]")
|
||||
}
|
||||
commands.RunProjectUpdate(filtered[0], filtered[1:], tokenFlag)
|
||||
case "delete":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf project delete <project-code>")
|
||||
}
|
||||
commands.RunProjectDelete(filtered[0], tokenFlag)
|
||||
case "members":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf project members <project-code>")
|
||||
}
|
||||
commands.RunProjectMembers(filtered[0], tokenFlag)
|
||||
case "add-member":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf project add-member <project-code> --user <username> --role <role-name>")
|
||||
}
|
||||
commands.RunProjectAddMember(filtered[0], filtered[1:], tokenFlag)
|
||||
case "remove-member":
|
||||
if len(filtered) < 1 {
|
||||
output.Error("usage: hf project remove-member <project-code> --user <username>")
|
||||
}
|
||||
commands.RunProjectRemoveMember(filtered[0], filtered[1:], tokenFlag)
|
||||
default:
|
||||
output.Errorf("hf project %s is not implemented yet", subCmd)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user