worktime/internal/cli/commands/group/edit.go
2025-11-07 13:40:22 +01:00

57 lines
1.4 KiB
Go

package group
import (
"context"
"fmt"
"git.zervo.org/zervo/worktime/internal/database"
"git.zervo.org/zervo/worktime/internal/database/models"
"github.com/spf13/cobra"
"gorm.io/gorm"
)
var editCmd = &cobra.Command{
Use: "edit [flags] (group) (field) (value)",
Short: "Edit details for a group",
Long: `Edit details, such as name or description, for a locally stored project group.
Specify group by ID or name, which can be found with 'group list'.
Specify either 'name' or 'description' as field.
Specify new desired value as value.`,
Args: cobra.ExactArgs(3),
RunE: editExecute,
}
func editExecute(cmd *cobra.Command, args []string) error {
groupId := args[0]
field := args[1]
value := args[2]
if len(value) > 255 {
return fmt.Errorf("given value is too long (%d): maximum allowed length is 255", len(value))
}
db := database.DB()
ctx := context.Background()
group, err := gorm.G[models.ProjectGroup](db).Where("id = ?", groupId).First(ctx)
if err == gorm.ErrRecordNotFound {
group, err = gorm.G[models.ProjectGroup](db).Where("name = ?", groupId).First(ctx)
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("no group with given name or ID found")
}
}
switch field {
case "name":
group.Name = value
case "description":
group.Description = value
default:
return fmt.Errorf("uknown field '%s': expected 'name' or 'description'", field)
}
db.Save(&group)
fmt.Println("Edited project!")
return nil
}