From 19ed2a66e8fd10ec9cee1580b92d3ff7f8ac7ebd Mon Sep 17 00:00:00 2001 From: Pulkit Kathuria Date: Thu, 28 Dec 2023 20:34:24 +0900 Subject: [PATCH 1/3] (feat) reafactored handlers by moving printer logic to pkg classes --- pkg/bar_chart.go | 85 ++++++++++++++++++++++++++++++++++++++ pkg/bar_chart_handler.go | 74 ++------------------------------- pkg/chart.go | 8 ++++ pkg/donut_chart.go | 20 +++++++-- pkg/donut_chart_handler.go | 16 +------ pkg/line_chart.go | 58 ++++++++++++++++++++++++++ pkg/line_chart_handler.go | 52 +---------------------- pkg/pie_chart.go | 39 ++++++++++++++--- pkg/pie_chart_handler.go | 28 +------------ pkg/radar_chart.go | 36 ++++++++++++++++ pkg/radar_chart_handler.go | 38 ++--------------- pkg/routes.go | 33 +++++++++++---- 12 files changed, 273 insertions(+), 214 deletions(-) diff --git a/pkg/bar_chart.go b/pkg/bar_chart.go index 1bda913..5076b4f 100644 --- a/pkg/bar_chart.go +++ b/pkg/bar_chart.go @@ -1,5 +1,13 @@ package pkg +import ( + "fmt" + "net/http" + + "github.com/labstack/echo/v4" + charts "github.com/vicanso/go-charts/v2" +) + type BarChart struct { chart *Chart } @@ -9,3 +17,80 @@ func NewBarChart() *BarChart { chart: NewChart(), } } + +func (c *BarChart) GetVertical(xData []string, yData [][]float64, names []string, req *ChartRequest) ([]byte, error) { + p, err := charts.BarRender( + yData, + charts.TitleOptionFunc(charts.TitleOption{ + Text: req.ChartTitle, + Subtext: req.ChartSubtitle, + SubtextFontSize: DEFAULT_SUBTITLE_FONT_SIZE, + Left: charts.PositionCenter, + }), + charts.HeightOptionFunc(req.Height), + charts.WidthOptionFunc(req.Width), + charts.XAxisDataOptionFunc(xData), + charts.LegendOptionFunc(charts.LegendOption{ + Orient: charts.OrientVertical, + Data: names, + Left: charts.PositionLeft, + }), + charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage), + charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin), + func(opt *charts.ChartOption) { + opt.Theme = req.Theme + opt.ValueFormatter = func(f float64) string { + return fmt.Sprintf("%.0f%s", f, req.Metric) + } + idx := len(opt.SeriesList) - 1 + if len(opt.SeriesList) > 1 { + idx = 1 + } + opt.SeriesList[idx].MarkPoint = charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ) + opt.SeriesList[idx].MarkLine = charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ) + }, + ) + if err != nil { + return nil, err + } + + buf, err := p.Bytes() + if err != nil { + return nil, err + } + return buf, err +} + +func (c *BarChart) GetHorizontal(xData []string, yData [][]float64, names []string, req *ChartRequest) ([]byte, error) { + p, err := charts.HorizontalBarRender( + yData, + charts.TitleOptionFunc(charts.TitleOption{ + Text: req.ChartTitle, + Subtext: req.ChartSubtitle, + SubtextFontSize: DEFAULT_SUBTITLE_FONT_SIZE, + Left: charts.PositionCenter, + }), + charts.HeightOptionFunc(req.Height), + charts.WidthOptionFunc(req.Width), + charts.YAxisDataOptionFunc(xData), + func(opt *charts.ChartOption) { + opt.Theme = req.Theme + opt.ValueFormatter = func(f float64) string { + return fmt.Sprintf("%.0f%s", f, req.Metric) + } + }, + ) + + if err != nil { + return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) + } + + buf, err := p.Bytes() + return buf, err +} diff --git a/pkg/bar_chart_handler.go b/pkg/bar_chart_handler.go index 6cf8f54..0cf0d9f 100644 --- a/pkg/bar_chart_handler.go +++ b/pkg/bar_chart_handler.go @@ -2,11 +2,9 @@ package pkg import ( "encoding/json" - "fmt" "net/http" "github.com/labstack/echo/v4" - charts "github.com/vicanso/go-charts/v2" ) type BarChartHandler struct { @@ -45,76 +43,10 @@ func (h *BarChartHandler) Get(c echo.Context) ([]byte, error) { } return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) } - + SetHeaders(c.Response().Header()) if !req.Horizontal { - p, err := charts.BarRender( - data.YData, - charts.TitleOptionFunc(charts.TitleOption{ - Text: req.ChartTitle, - Subtext: req.ChartSubtitle, - SubtextFontSize: 9, - Left: charts.PositionCenter, - }), - charts.HeightOptionFunc(req.Height), - charts.WidthOptionFunc(req.Width), - charts.XAxisDataOptionFunc(data.XData), - charts.LegendOptionFunc(charts.LegendOption{ - Orient: charts.OrientVertical, - Data: data.Names, - Left: charts.PositionLeft, - }), - charts.MarkLineOptionFunc(0, charts.SeriesMarkDataTypeAverage), - charts.MarkPointOptionFunc(0, charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin), - func(opt *charts.ChartOption) { - opt.Theme = req.Theme - opt.ValueFormatter = func(f float64) string { - return fmt.Sprintf("%.0f%s", f, req.Metric) - } - idx := len(opt.SeriesList) - 1 - if len(opt.SeriesList) > 1 { - idx = 1 - } - opt.SeriesList[idx].MarkPoint = charts.NewMarkPoint( - charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin, - ) - opt.SeriesList[idx].MarkLine = charts.NewMarkLine( - charts.SeriesMarkDataTypeAverage, - ) - }, - ) - if err != nil { - return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) - } - buf, err := p.Bytes() - return buf, err + return h.chart.GetVertical(data.XData, data.YData, data.Names, req) } - p, err := charts.HorizontalBarRender( - data.YData, - charts.TitleOptionFunc(charts.TitleOption{ - Text: req.ChartTitle, - Subtext: req.ChartSubtitle, - SubtextFontSize: 9, - Left: charts.PositionCenter, - }), - charts.HeightOptionFunc(req.Height), - charts.WidthOptionFunc(req.Width), - charts.YAxisDataOptionFunc(data.XData), - func(opt *charts.ChartOption) { - opt.Theme = req.Theme - opt.ValueFormatter = func(f float64) string { - return fmt.Sprintf("%.0f%s", f, req.Metric) - } - }, - ) - - if err != nil { - return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) - } - - buf, err := p.Bytes() - SetHeaders(c.Response().Header()) - return buf, err + return h.chart.GetHorizontal(data.XData, data.YData, data.Names, req) } diff --git a/pkg/chart.go b/pkg/chart.go index 77dee54..9eb3d25 100644 --- a/pkg/chart.go +++ b/pkg/chart.go @@ -4,6 +4,14 @@ import ( "net/http" ) +const ( + DEFAULT_PADDING_TOP = 20 + DEFAULT_PADDING_RIGHT = 20 + DEFAULT_PADDING_BOTTOM = 20 + DEFAULT_PADDING_LEFT = 20 + DEFAULT_SUBTITLE_FONT_SIZE = 9 +) + type Chart struct { } diff --git a/pkg/donut_chart.go b/pkg/donut_chart.go index be9e92b..5b25112 100644 --- a/pkg/donut_chart.go +++ b/pkg/donut_chart.go @@ -1,6 +1,10 @@ package pkg -import "github.com/wcharczuk/go-chart/v2" +import ( + "bytes" + + "github.com/wcharczuk/go-chart/v2" +) type DonutChart struct { chart *Chart @@ -11,7 +15,8 @@ func NewDonutChart() *DonutChart { chart: NewChart(), } } -func (c *DonutChart) GetValues(names []string, values []float64) []chart.Value { + +func (c *DonutChart) Get(values []float64, names []string, req *ChartRequest) ([]byte, error) { var chartValues []chart.Value for i := 0; i < len(names); i++ { chartValues = append(chartValues, chart.Value{ @@ -19,5 +24,14 @@ func (c *DonutChart) GetValues(names []string, values []float64) []chart.Value { Label: names[i], }) } - return chartValues + graph := chart.DonutChart{ + Title: req.ChartTitle, + Height: req.Height, + Width: req.Width, + Values: chartValues, + } + + buffer := bytes.NewBuffer([]byte{}) + err := graph.Render(chart.PNG, buffer) + return buffer.Bytes(), err } diff --git a/pkg/donut_chart_handler.go b/pkg/donut_chart_handler.go index 1d5164f..cf83920 100644 --- a/pkg/donut_chart_handler.go +++ b/pkg/donut_chart_handler.go @@ -1,12 +1,10 @@ package pkg import ( - "bytes" "encoding/json" "net/http" "github.com/labstack/echo/v4" - "github.com/wcharczuk/go-chart/v2" ) type DonutChartHandler struct { @@ -45,18 +43,6 @@ func (h *DonutChartHandler) Get(c echo.Context) ([]byte, error) { return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) } - graph := chart.DonutChart{ - Title: req.ChartTitle, - Height: req.Height, - Width: req.Width, - Values: h.chart.GetValues(data.Names, data.Values), - } - - buffer := bytes.NewBuffer([]byte{}) - err := graph.Render(chart.PNG, buffer) - if err != nil { - return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) - } SetHeaders(c.Response().Header()) - return buffer.Bytes(), err + return h.chart.Get(data.Values, data.Names, req) } diff --git a/pkg/line_chart.go b/pkg/line_chart.go index 4916103..ac44527 100644 --- a/pkg/line_chart.go +++ b/pkg/line_chart.go @@ -1,5 +1,11 @@ package pkg +import ( + "fmt" + + charts "github.com/vicanso/go-charts/v2" +) + type LineChart struct { chart *Chart } @@ -9,3 +15,55 @@ func NewLineChart() *LineChart { chart: NewChart(), } } + +func (c *LineChart) Get(xData [][]string, yData [][]float64, names []string, req *ChartRequest) ([]byte, error) { + p, err := charts.LineRender( + yData, + charts.HeightOptionFunc(req.Height), + charts.WidthOptionFunc(req.Width), + charts.TitleOptionFunc(charts.TitleOption{ + Text: req.ChartTitle, + Subtext: req.ChartSubtitle, + SubtextFontSize: DEFAULT_SUBTITLE_FONT_SIZE, + Left: charts.PositionCenter, + }), + charts.XAxisDataOptionFunc(xData[0]), + charts.LegendOptionFunc(charts.LegendOption{ + Orient: charts.OrientVertical, + Data: names, + Left: charts.PositionLeft, + }), + func(opt *charts.ChartOption) { + opt.Theme = req.Theme + opt.Legend.Padding = charts.Box{ + Top: DEFAULT_PADDING_TOP, + Bottom: DEFAULT_PADDING_BOTTOM, + } + opt.ValueFormatter = func(f float64) string { + return fmt.Sprintf("%.0f%s", f, req.Metric) + } + opt.FillArea = req.Fill + + idx := len(opt.SeriesList) - 1 + if len(opt.SeriesList) > 1 { + idx = 1 + } + opt.SeriesList[idx].MarkPoint = charts.NewMarkPoint( + charts.SeriesMarkDataTypeMax, + charts.SeriesMarkDataTypeMin, + ) + opt.SeriesList[idx].MarkLine = charts.NewMarkLine( + charts.SeriesMarkDataTypeAverage, + ) + }, + ) + if err != nil { + return nil, err + } + + buf, err := p.Bytes() + if err != nil { + return nil, err + } + return buf, err +} diff --git a/pkg/line_chart_handler.go b/pkg/line_chart_handler.go index bf62154..ad66dcd 100644 --- a/pkg/line_chart_handler.go +++ b/pkg/line_chart_handler.go @@ -2,11 +2,9 @@ package pkg import ( "encoding/json" - "fmt" "net/http" "github.com/labstack/echo/v4" - charts "github.com/vicanso/go-charts/v2" ) type LineChartHandler struct { @@ -38,55 +36,7 @@ func (h *LineChartHandler) Get(c echo.Context) ([]byte, error) { } return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) } - p, err := charts.LineRender( - data.YData, - charts.HeightOptionFunc(req.Height), - charts.WidthOptionFunc(req.Width), - charts.TitleOptionFunc(charts.TitleOption{ - Text: req.ChartTitle, - Subtext: req.ChartSubtitle, - SubtextFontSize: 9, - Left: charts.PositionCenter, - }), - charts.XAxisDataOptionFunc(data.XData[0]), - charts.LegendOptionFunc(charts.LegendOption{ - Orient: charts.OrientVertical, - Data: data.Names, - Left: charts.PositionLeft, - }), - func(opt *charts.ChartOption) { - opt.Theme = req.Theme - opt.Legend.Padding = charts.Box{ - Top: 25, - Bottom: 25, - } - opt.ValueFormatter = func(f float64) string { - return fmt.Sprintf("%.0f%s", f, req.Metric) - } - opt.FillArea = req.Fill - idx := len(opt.SeriesList) - 1 - if len(opt.SeriesList) > 1 { - idx = 1 - } - opt.SeriesList[idx].MarkPoint = charts.NewMarkPoint( - charts.SeriesMarkDataTypeMax, - charts.SeriesMarkDataTypeMin, - ) - opt.SeriesList[idx].MarkLine = charts.NewMarkLine( - charts.SeriesMarkDataTypeAverage, - ) - }, - ) - - if err != nil { - return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) - } - - buf, err := p.Bytes() - if err != nil { - return nil, err - } SetHeaders(c.Response().Header()) - return buf, err + return h.chart.Get(data.XData, data.YData, data.Names, req) } diff --git a/pkg/pie_chart.go b/pkg/pie_chart.go index 6f4e356..bf6f976 100644 --- a/pkg/pie_chart.go +++ b/pkg/pie_chart.go @@ -13,11 +13,38 @@ func NewPieChart() *PieChart { chart: NewChart(), } } -func (c *PieChart) GetPadding() charts.Box { - return charts.Box{ - Top: 20, - Right: 20, - Bottom: 20, - Left: 20, + +func (c *PieChart) Get(values []float64, names []string, req *ChartRequest) ([]byte, error) { + p, err := charts.PieRender( + values, + charts.TitleOptionFunc(charts.TitleOption{ + Text: req.ChartTitle, + Subtext: req.ChartSubtitle, + SubtextFontSize: DEFAULT_SUBTITLE_FONT_SIZE, + Left: charts.PositionCenter, + }), + charts.HeightOptionFunc(req.Height), + charts.WidthOptionFunc(req.Width), + charts.PaddingOptionFunc(charts.Box{ + Top: DEFAULT_PADDING_TOP, + Right: DEFAULT_PADDING_RIGHT, + Bottom: DEFAULT_PADDING_BOTTOM, + Left: DEFAULT_PADDING_LEFT, + }), + charts.LegendOptionFunc(charts.LegendOption{ + Orient: charts.OrientVertical, + Data: names, + Left: charts.PositionLeft, + }), + charts.PieSeriesShowLabel(), + func(opt *charts.ChartOption) { + opt.Theme = req.Theme + }, + ) + if err != nil { + return nil, err } + + buf, err := p.Bytes() + return buf, err } diff --git a/pkg/pie_chart_handler.go b/pkg/pie_chart_handler.go index 28f8197..cabb6da 100644 --- a/pkg/pie_chart_handler.go +++ b/pkg/pie_chart_handler.go @@ -5,7 +5,6 @@ import ( "net/http" "github.com/labstack/echo/v4" - charts "github.com/vicanso/go-charts/v2" ) type PieChartHandler struct { @@ -44,32 +43,7 @@ func (h *PieChartHandler) Get(c echo.Context) ([]byte, error) { return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) } - p, err := charts.PieRender( - data.Values, - charts.TitleOptionFunc(charts.TitleOption{ - Text: req.ChartTitle, - Subtext: req.ChartSubtitle, - SubtextFontSize: 9, - Left: charts.PositionCenter, - }), - charts.HeightOptionFunc(req.Height), - charts.WidthOptionFunc(req.Width), - charts.PaddingOptionFunc(h.chart.GetPadding()), - charts.LegendOptionFunc(charts.LegendOption{ - Orient: charts.OrientVertical, - Data: data.Names, - Left: charts.PositionLeft, - }), - charts.PieSeriesShowLabel(), - func(opt *charts.ChartOption) { - opt.Theme = req.Theme - }, - ) - if err != nil { - return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) - } - - buf, err := p.Bytes() + buf, err := h.chart.Get(data.Values, data.Names, req) SetHeaders(c.Response().Header()) return buf, err } diff --git a/pkg/radar_chart.go b/pkg/radar_chart.go index 33609d5..4b39759 100644 --- a/pkg/radar_chart.go +++ b/pkg/radar_chart.go @@ -1,5 +1,12 @@ package pkg +import ( + "net/http" + + "github.com/labstack/echo/v4" + charts "github.com/vicanso/go-charts/v2" +) + type RadarChart struct { } @@ -26,3 +33,32 @@ func (c *RadarChart) GetIndicators(values [][]float64) []float64 { } return maxValues } + +func (c *RadarChart) Get(values [][]float64, names []string, labels []string, req *ChartRequest) ([]byte, error) { + p, err := charts.RadarRender( + values, + charts.TitleOptionFunc(charts.TitleOption{ + Text: req.ChartTitle, + Subtext: req.ChartSubtitle, + SubtextFontSize: DEFAULT_SUBTITLE_FONT_SIZE, + Left: charts.PositionCenter, + }), + charts.HeightOptionFunc(req.Height), + charts.WidthOptionFunc(req.Width), + charts.LegendOptionFunc(charts.LegendOption{ + Orient: charts.OrientVertical, + Data: labels, + Left: charts.PositionLeft, + }), + charts.RadarIndicatorOptionFunc(names, c.GetIndicators(values)), + func(opt *charts.ChartOption) { + opt.Theme = req.Theme + }, + ) + if err != nil { + return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) + } + + buf, err := p.Bytes() + return buf, err +} diff --git a/pkg/radar_chart_handler.go b/pkg/radar_chart_handler.go index 81acd58..06bcc01 100644 --- a/pkg/radar_chart_handler.go +++ b/pkg/radar_chart_handler.go @@ -5,7 +5,6 @@ import ( "net/http" "github.com/labstack/echo/v4" - charts "github.com/vicanso/go-charts/v2" ) type RadarChartHandler struct { @@ -19,10 +18,9 @@ func NewRadarChartHandler() *RadarChartHandler { } type RadarChartData struct { - Labels []string `json:"labels"` - Names []string `json:"names"` - Indicators []float64 `json:"indicators"` - Values [][]float64 `json:"values"` + Labels []string `json:"labels"` + Names []string `json:"names"` + Values [][]float64 `json:"values"` } func (h *RadarChartHandler) Get(c echo.Context) ([]byte, error) { @@ -46,34 +44,6 @@ func (h *RadarChartHandler) Get(c echo.Context) ([]byte, error) { return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) } - graph, err := charts.RadarRender( - data.Values, - charts.TitleOptionFunc(charts.TitleOption{ - Text: req.ChartTitle, - Subtext: req.ChartSubtitle, - SubtextFontSize: 9, - Left: charts.PositionCenter, - }), - charts.HeightOptionFunc(req.Height), - charts.WidthOptionFunc(req.Width), - charts.LegendOptionFunc(charts.LegendOption{ - Orient: charts.OrientVertical, - Data: data.Labels, - Left: charts.PositionLeft, - }), - charts.RadarIndicatorOptionFunc(data.Names, h.chart.GetIndicators(data.Values)), - func(opt *charts.ChartOption) { - opt.Theme = req.Theme - }, - ) - if err != nil { - return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, err.Error()) - } - - buf, err := graph.Bytes() - if err != nil { - return nil, err - } SetHeaders(c.Response().Header()) - return buf, nil + return h.chart.Get(data.Values, data.Names, data.Labels, req) } diff --git a/pkg/routes.go b/pkg/routes.go index 5e71e71..d88d18c 100644 --- a/pkg/routes.go +++ b/pkg/routes.go @@ -10,21 +10,36 @@ import ( //go:embed favicon.ico var faviconEmbed embed.FS +const ( + DOCS_URL = "https://github.com/kevincobain2000/instachart" + FAVICON_FILE = "favicon.ico" + ROBOTS_FILE = "robots.txt" + ROBOTS_TXT = "User-agent: *\nAllow: /" +) + func SetupRoutes(e *echo.Echo, baseURL string) { - fav, _ := faviconEmbed.ReadFile("favicon.ico") + fav, _ := faviconEmbed.ReadFile(FAVICON_FILE) + + // / + e.GET(baseURL+"", func(c echo.Context) error { + return c.Redirect(http.StatusMovedPermanently, DOCS_URL) + }) + + // /health e.GET(baseURL+"health", func(c echo.Context) error { return c.String(http.StatusOK, "OK") }) - e.GET(baseURL+"robots.txt", func(c echo.Context) error { - return c.String(http.StatusOK, "User-agent: *\nAllow: /") + // /robots.txt + e.GET(baseURL+ROBOTS_FILE, func(c echo.Context) error { + return c.String(http.StatusOK, ROBOTS_TXT) }) - e.GET(baseURL+"favicon.ico", func(c echo.Context) error { + // /favicon.ico + e.GET(baseURL+FAVICON_FILE, func(c echo.Context) error { return c.Blob(http.StatusOK, "image/x-icon", fav) }) - e.GET(baseURL+"", func(c echo.Context) error { - return c.Redirect(http.StatusMovedPermanently, "https://github.com/kevincobain2000/instachart") - }) + + // /line e.GET(baseURL+"line", func(c echo.Context) error { img, err := NewLineChartHandler().Get(c) if err != nil { @@ -32,6 +47,7 @@ func SetupRoutes(e *echo.Echo, baseURL string) { } return c.Blob(http.StatusOK, "", img) }) + // /bar e.GET(baseURL+"bar", func(c echo.Context) error { img, err := NewBarChartHandler().Get(c) if err != nil { @@ -39,6 +55,7 @@ func SetupRoutes(e *echo.Echo, baseURL string) { } return c.Blob(http.StatusOK, "", img) }) + // /radar e.GET(baseURL+"radar", func(c echo.Context) error { img, err := NewRadarChartHandler().Get(c) if err != nil { @@ -46,6 +63,7 @@ func SetupRoutes(e *echo.Echo, baseURL string) { } return c.Blob(http.StatusOK, "", img) }) + // /donut e.GET(baseURL+"donut", func(c echo.Context) error { img, err := NewDonutChartHandler().Get(c) if err != nil { @@ -53,6 +71,7 @@ func SetupRoutes(e *echo.Echo, baseURL string) { } return c.Blob(http.StatusOK, "", img) }) + // /pie e.GET(baseURL+"pie", func(c echo.Context) error { img, err := NewPieChartHandler().Get(c) if err != nil { From 08babe422722c7acd16b6b80a47de862629cfe06 Mon Sep 17 00:00:00 2001 From: Pulkit Kathuria Date: Thu, 28 Dec 2023 21:58:22 +0900 Subject: [PATCH 2/3] (fix) missing headers on bar --- README.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 53e2bce..363828e 100644 --- a/README.md +++ b/README.md @@ -104,16 +104,13 @@ https://instachart.coveritup.app/line?title=Line+Chart+Simple&subtitle=Sleeping+

- - - ## `GET /bar` -| `data` | Required | Description | Example | -| :----- | :------- | :--------------- | :--------------------------- | -| `x` | ◯ | []Array (string) | `"x": [["Mon","Tue", "Wed"]` | -| `y` | ◯ | []Array (int) | `"y": [[1,2,3]]` | +| `data` | Required | Description | Example | +| :----- | :------- | :------------- | :-------------------------- | +| `x` | ◯ | Array (string) | `"x": ["Mon","Tue", "Wed"]` | +| `y` | ◯ | []Array (int) | `"y": [[1,2,3]]` |
REQUEST URL @@ -121,7 +118,7 @@ https://instachart.coveritup.app/line?title=Line+Chart+Simple&subtitle=Sleeping+ ```sh https://instachart.coveritup.app/bar?title=Bar+Chart&subtitle=Sleeping+hours&data={ "x": ["Monday", "Friday", "Sunday"], - "y": [[8, 2 ,14]] + "y": [[8,2,14]] } ``` @@ -130,8 +127,8 @@ https://instachart.coveritup.app/bar?title=Bar+Chart&subtitle=Sleeping+hours&dat

- - bar chart + + bar chart

From 2e307343d6e4c76d1c79029212de0cd3f10f894e Mon Sep 17 00:00:00 2001 From: Pulkit Kathuria Date: Thu, 28 Dec 2023 21:59:06 +0900 Subject: [PATCH 3/3] (fix) principle --- pkg/bar_chart_handler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/bar_chart_handler.go b/pkg/bar_chart_handler.go index 0cf0d9f..378d551 100644 --- a/pkg/bar_chart_handler.go +++ b/pkg/bar_chart_handler.go @@ -44,9 +44,9 @@ func (h *BarChartHandler) Get(c echo.Context) ([]byte, error) { return nil, echo.NewHTTPError(http.StatusUnprocessableEntity, msgs) } SetHeaders(c.Response().Header()) - if !req.Horizontal { - return h.chart.GetVertical(data.XData, data.YData, data.Names, req) + if req.Horizontal { + return h.chart.GetHorizontal(data.XData, data.YData, data.Names, req) } - return h.chart.GetHorizontal(data.XData, data.YData, data.Names, req) + return h.chart.GetVertical(data.XData, data.YData, data.Names, req) }