diff --git a/cmd/parka/cmds/serve.go b/cmd/parka/cmds/serve.go index 6b77ed4..336067c 100644 --- a/cmd/parka/cmds/serve.go +++ b/cmd/parka/cmds/serve.go @@ -7,6 +7,8 @@ import ( "github.com/go-go-golems/glazed/pkg/cli" "github.com/go-go-golems/glazed/pkg/helpers" "github.com/go-go-golems/glazed/pkg/types" + "github.com/go-go-golems/parka/pkg/glazed/handlers/datatables" + json2 "github.com/go-go-golems/parka/pkg/glazed/handlers/json" "github.com/go-go-golems/parka/pkg/render" "github.com/go-go-golems/parka/pkg/server" "github.com/go-go-golems/parka/pkg/utils/fs" @@ -69,8 +71,8 @@ var ServeCmd = &cobra.Command{ // NOTE(manuel, 2023-05-26) This could also be done with a simple Command config file struct once // implemented as part of sqleton serve - s.Router.GET("/api/example", server.HandleJSONQueryHandler(NewExampleCommand())) - s.Router.GET("/sqleton/example", server.HandleDataTables(NewExampleCommand(), "", "example")) + s.Router.GET("/api/example", json2.HandleJSONQueryHandler(NewExampleCommand())) + s.Router.GET("/sqleton/example", datatables.HandleDataTables(NewExampleCommand(), "", "example")) ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/pkg/glazed/handlers/datatables/datatables.go b/pkg/glazed/handlers/datatables/datatables.go index 3c59fff..62172fe 100644 --- a/pkg/glazed/handlers/datatables/datatables.go +++ b/pkg/glazed/handlers/datatables/datatables.go @@ -2,6 +2,7 @@ package datatables import ( "embed" + "fmt" "github.com/gin-gonic/gin" "github.com/go-go-golems/glazed/pkg/cmds" "github.com/go-go-golems/glazed/pkg/formatters" @@ -14,9 +15,12 @@ import ( "github.com/go-go-golems/parka/pkg/glazed/parser" "github.com/go-go-golems/parka/pkg/render" "github.com/go-go-golems/parka/pkg/render/layout" + "github.com/rs/zerolog/log" "golang.org/x/sync/errgroup" "html/template" "io" + "net/http" + "time" ) // DataTables describes the data passed to the template displaying the results of a glazed command. @@ -312,3 +316,71 @@ func (qh *QueryHandler) renderTemplate( return nil } + +func HandleDataTables( + cmd cmds.GlazeCommand, + path string, + commandPath string, + options ...QueryHandlerOption, +) gin.HandlerFunc { + // TODO(manuel, 2023-07-02) Move this to the datatables package + return func(c *gin.Context) { + name := cmd.Description().Name + dateTime := time.Now().Format("2006-01-02--15-04-05") + links := []layout.Link{ + { + Href: fmt.Sprintf("%s/download/%s/%s-%s.csv", path, commandPath, dateTime, name), + Text: "Download CSV", + Class: "download", + }, + { + Href: fmt.Sprintf("%s/download/%s/%s-%s.json", path, commandPath, dateTime, name), + Text: "Download JSON", + Class: "download", + }, + { + Href: fmt.Sprintf("%s/download/%s/%s-%s.xlsx", path, commandPath, dateTime, name), + Text: "Download Excel", + Class: "download", + }, + { + Href: fmt.Sprintf("%s/download/%s/%s-%s.md", path, commandPath, dateTime, name), + Text: "Download Markdown", + Class: "download", + }, + { + Href: fmt.Sprintf("%s/download/%s/%s-%s.html", path, commandPath, dateTime, name), + Text: "Download HTML", + Class: "download", + }, + { + Href: fmt.Sprintf("%s/download/%s/%s-%s.txt", path, commandPath, dateTime, name), + Text: "Download Text", + Class: "download", + }, + } + + dt := &DataTables{ + Command: cmd.Description(), + Links: links, + BasePath: path, + JSRendering: true, + UseDataTables: false, + } + + options_ := []QueryHandlerOption{ + WithDataTables(dt), + } + options_ = append(options_, options...) + + handler := NewQueryHandler(cmd, options_...) + + err := handler.Handle(c, c.Writer) + if err != nil { + log.Error().Err(err).Msg("error handling query") + c.JSON(http.StatusInternalServerError, gin.H{ + "error": err.Error(), + }) + } + } +} diff --git a/pkg/glazed/handlers/json/json.go b/pkg/glazed/handlers/json/json.go index e237788..8a4345a 100644 --- a/pkg/glazed/handlers/json/json.go +++ b/pkg/glazed/handlers/json/json.go @@ -8,7 +8,9 @@ import ( "github.com/go-go-golems/parka/pkg/glazed" "github.com/go-go-golems/parka/pkg/glazed/handlers" "github.com/go-go-golems/parka/pkg/glazed/parser" + "github.com/rs/zerolog/log" "io" + "net/http" ) type QueryHandler struct { @@ -94,3 +96,21 @@ func (h *QueryHandler) Handle(c *gin.Context, writer io.Writer) error { return nil } + +func HandleJSONQueryHandler( + cmd cmds.GlazeCommand, + parserOptions ...parser.ParserOption, +) gin.HandlerFunc { + handler := NewQueryHandler(cmd, + WithQueryHandlerParserOptions(parserOptions...), + ) + return func(c *gin.Context) { + err := handler.Handle(c, c.Writer) + if err != nil { + log.Error().Err(err).Msg("failed to handle query") + c.JSON(http.StatusInternalServerError, gin.H{ + "error": err.Error(), + }) + } + } +} diff --git a/pkg/handlers/command-dir/command-dir.go b/pkg/handlers/command-dir/command-dir.go index a37948e..20c5dc4 100644 --- a/pkg/handlers/command-dir/command-dir.go +++ b/pkg/handlers/command-dir/command-dir.go @@ -7,6 +7,7 @@ import ( "github.com/go-go-golems/glazed/pkg/cmds" "github.com/go-go-golems/glazed/pkg/cmds/layers" "github.com/go-go-golems/parka/pkg/glazed/handlers/datatables" + "github.com/go-go-golems/parka/pkg/glazed/handlers/json" "github.com/go-go-golems/parka/pkg/glazed/parser" "github.com/go-go-golems/parka/pkg/handlers/config" "github.com/go-go-golems/parka/pkg/render" @@ -418,7 +419,7 @@ func (cd *CommandDirHandler) Serve(server *parka.Server, path string) error { return } - parka.HandleJSONQueryHandler(sqlCommand) + json.HandleJSONQueryHandler(sqlCommand) }) server.Router.GET(path+"/sqleton/*path", @@ -440,7 +441,7 @@ func (cd *CommandDirHandler) Serve(server *parka.Server, path string) error { datatables.WithAdditionalData(cd.AdditionalData), } - parka.HandleDataTables(sqlCommand, path, commandPath, options...) + datatables.HandleDataTables(sqlCommand, path, commandPath, options...) }) server.Router.GET(path+"/download/*path", func(c *gin.Context) { diff --git a/pkg/server/server.go b/pkg/server/server.go index 619104f..e52472c 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -6,18 +6,11 @@ import ( "fmt" "github.com/gin-gonic/contrib/gzip" "github.com/gin-gonic/gin" - "github.com/go-go-golems/glazed/pkg/cmds" - "github.com/go-go-golems/parka/pkg/glazed/handlers/datatables" - "github.com/go-go-golems/parka/pkg/glazed/handlers/json" - "github.com/go-go-golems/parka/pkg/glazed/parser" "github.com/go-go-golems/parka/pkg/render" - "github.com/go-go-golems/parka/pkg/render/layout" utils_fs "github.com/go-go-golems/parka/pkg/utils/fs" - "github.com/rs/zerolog/log" "golang.org/x/sync/errgroup" "io/fs" "net/http" - "time" ) //go:embed "web/src/templates/*" @@ -222,89 +215,3 @@ func (s *Server) Run(ctx context.Context) error { return eg.Wait() } - -func HandleJSONQueryHandler( - cmd cmds.GlazeCommand, - parserOptions ...parser.ParserOption, -) gin.HandlerFunc { - handler := json.NewQueryHandler(cmd, - json.WithQueryHandlerParserOptions(parserOptions...), - ) - return func(c *gin.Context) { - err := handler.Handle(c, c.Writer) - if err != nil { - log.Error().Err(err).Msg("failed to handle query") - c.JSON(http.StatusInternalServerError, gin.H{ - "error": err.Error(), - }) - } - } -} - -func HandleDataTables( - cmd cmds.GlazeCommand, - path string, - commandPath string, - options ...datatables.QueryHandlerOption, -) gin.HandlerFunc { - // TODO(manuel, 2023-07-02) Move this to the datatables package - return func(c *gin.Context) { - name := cmd.Description().Name - dateTime := time.Now().Format("2006-01-02--15-04-05") - links := []layout.Link{ - { - Href: fmt.Sprintf("%s/download/%s/%s-%s.csv", path, commandPath, dateTime, name), - Text: "Download CSV", - Class: "download", - }, - { - Href: fmt.Sprintf("%s/download/%s/%s-%s.json", path, commandPath, dateTime, name), - Text: "Download JSON", - Class: "download", - }, - { - Href: fmt.Sprintf("%s/download/%s/%s-%s.xlsx", path, commandPath, dateTime, name), - Text: "Download Excel", - Class: "download", - }, - { - Href: fmt.Sprintf("%s/download/%s/%s-%s.md", path, commandPath, dateTime, name), - Text: "Download Markdown", - Class: "download", - }, - { - Href: fmt.Sprintf("%s/download/%s/%s-%s.html", path, commandPath, dateTime, name), - Text: "Download HTML", - Class: "download", - }, - { - Href: fmt.Sprintf("%s/download/%s/%s-%s.txt", path, commandPath, dateTime, name), - Text: "Download Text", - Class: "download", - }, - } - - dt := &datatables.DataTables{ - Command: cmd.Description(), - Links: links, - BasePath: path, - JSRendering: true, - UseDataTables: false, - } - - options_ := []datatables.QueryHandlerOption{ - datatables.WithDataTables(dt), - } - options_ = append(options_, options...) - - handler := datatables.NewQueryHandler(cmd, options_...) - - err := handler.Handle(c, c.Writer) - if err != nil { - log.Error().Err(err).Msg("error handling query") - c.JSON(http.StatusInternalServerError, gin.H{ - "error": err.Error(), - }) - } - } -}