2022-10-09 15:23:52 +02:00
package main
import (
"io"
"net/url"
"os"
"sort"
"time"
"github.com/alecthomas/kong"
"github.com/apex/log"
2026-01-17 22:53:46 +01:00
"gitea.unbound.se/unboundsoftware/schemas/ctl"
2022-10-09 15:23:52 +02:00
)
type Context struct {
ApiKey string
SchemaRef string
SchemasURL url . URL
logger log . Interface
}
type PublishCmd struct {
Service string ` name:"service" env:"SERVICE" help:"The service to publish SDL for" required:"" `
Url * url . URL ` name:"url" env:"URL" help:"The URL of the service" optional:"" `
WSUrl * url . URL ` name:"ws-url" env:"WS_URL" help:"The Websocket URL of the service" optional:"" `
SDL * os . File ` name:"sdl" env:"SDL" help:"The file containing the GraphQL SDL" required:"" `
}
func ( c * PublishCmd ) Run ( ctx Context ) error {
buff , err := io . ReadAll ( c . SDL )
if err != nil {
return err
}
subGraph , err := ctl . Publish ( ctx . ApiKey , ctx . SchemaRef , c . Service , string ( buff ) , c . Url , c . WSUrl , ctx . SchemasURL )
if err != nil {
return err
}
ctx . logger . Infof ( "published %s@%s %s" , subGraph . Service , subGraph . ChangedAt . Format ( time . RFC3339 ) , subGraph . ChangedBy )
return nil
}
type ListCmd struct {
Service string ` name:"service" env:"SERVICE" help:"The service to publish SDL for" optional:"" `
}
func ( c * ListCmd ) Run ( ctx Context ) error {
subGraphs , err := ctl . List ( ctx . ApiKey , ctx . SchemaRef , c . Service , ctx . SchemasURL )
if err != nil {
return err
}
sort . SliceStable ( subGraphs , func ( i , j int ) bool {
return subGraphs [ i ] . Service < subGraphs [ j ] . Service
} )
for _ , subGraph := range subGraphs {
ctx . logger . Infof ( "%s URL: %s WS-URL: %s Changed: %s %s" , subGraph . Service , emptyIfNil ( subGraph . URL ) , emptyIfNil ( subGraph . WSUrl ) , subGraph . ChangedAt . Format ( time . RFC3339 ) , subGraph . ChangedBy )
}
return nil
}
type CLI struct {
ApiKey string ` name:"api-key" env:"API_KEY" help:"The API-key to use when communicating with the server" required:"" `
SchemaRef string ` name:"schema-ref" env:"SCHEMA_REF" help:"The schema reference to work with" required:"" `
OverrideSchemasUrl * url . URL ` name:"override-schemas-url" env:"OVERRIDE_SCHEMAS_URL" help:"Use a specific URL when communicating with the Schemas-API" optional:"" `
Publish PublishCmd ` cmd:"" `
List ListCmd ` cmd:"" `
LogLevel string ` name:"log-level" env:"LOG_LEVEL" help:"The level of logging to use (debug, info, warn, error, fatal)" default:"info" `
}
func main ( ) {
cli := CLI { }
ctx := kong . Parse ( & cli )
log . SetLevelFromString ( cli . LogLevel )
logger := log . WithField ( "service" , "schemactl" )
err := ctx . Run ( Context { ApiKey : cli . ApiKey , SchemaRef : cli . SchemaRef , SchemasURL : schemasUrl ( cli . OverrideSchemasUrl ) , logger : logger } )
ctx . FatalIfErrorf ( err )
}
func emptyIfNil ( s * string ) string {
if s == nil {
return ""
}
return * s
}
func schemasUrl ( u * url . URL ) url . URL {
if u == nil {
u , err := url . Parse ( "https://schemas.unbound.se/query" )
if err != nil {
return url . URL { }
}
return * u
}
return * u
}