Files
photoprism/internal/commands/show_scopes.go
2025-11-22 17:55:26 +01:00

58 lines
1.5 KiB
Go

package commands
import (
"fmt"
"github.com/urfave/cli/v2"
"github.com/photoprism/photoprism/internal/auth/acl"
"github.com/photoprism/photoprism/pkg/txt/report"
)
// ShowScopesCommand configures the CLI command that lists supported authorization scopes.
var ShowScopesCommand = &cli.Command{
Name: "scopes",
Usage: "Displays supported authorization scopes",
Flags: report.CliFlags,
Action: showScopesAction,
}
// showScopesAction renders the list of supported authorization scopes.
func showScopesAction(ctx *cli.Context) error {
rows, cols := scopesReport()
format, formatErr := report.CliFormatStrict(ctx)
if formatErr != nil {
return formatErr
}
result, err := report.RenderFormat(rows, cols, format)
fmt.Println(result)
return err
}
// scopesReport returns the table rows and columns for the scope listing.
func scopesReport() (rows [][]string, cols []string) {
cols = []string{"scope", "description"}
rows = make([][]string, 0, len(acl.ScopeDescriptions))
for _, scope := range []string{"*", acl.ScopeRead.String(), acl.ScopeWrite.String()} {
if desc, ok := acl.ScopeDescriptions[scope]; ok {
rows = append(rows, []string{scope, desc})
}
}
for _, resource := range acl.ResourceNames {
name := resource.String()
desc, ok := acl.ScopeDescriptions[name]
if !ok {
// Should never happen, but keep the command resilient.
desc = "Resource available for use in authorization scopes."
}
rows = append(rows, []string{name, desc})
}
return rows, cols
}