diff --git a/services/dashboard/main.go b/services/dashboard/main.go index cc7874d..d2c0af4 100644 --- a/services/dashboard/main.go +++ b/services/dashboard/main.go @@ -68,6 +68,7 @@ func Run(cleanup cleanupper.Cleanupper) error { jwks := auth.NewJWKSHttpClient(AUTH_JWKS_URL) router.Use( middleware.Logger, + middleware.Recoverer, auth.ForwardRequestAuthentication(), auth.Authenticate(jwks), auth.Protect(), @@ -107,7 +108,6 @@ func Run(cleanup cleanupper.Cleanupper) error { )) csrfWrappedHandler := nosurf.New(router) csrfWrappedHandler.SetFailureHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Printf("nosurf.Reason(r): %v\n", nosurf.Reason(r)) layout.WithSnackbarError(w, "CSRF Token was invalid, try reloading the page") //nolint w.Write([]byte("A CSRF error occured. Reload the previous page and try again")) diff --git a/services/dashboard/routes/ingress.go b/services/dashboard/routes/ingress.go index b797a79..41f3fbe 100644 --- a/services/dashboard/routes/ingress.go +++ b/services/dashboard/routes/ingress.go @@ -75,22 +75,22 @@ func (h *TracesPageHandler) listPartial() http.HandlerFunc { func formatSince(t time.Time) string { d := time.Since(t) - if d.Hours() > 24 { + switch { + case d.Hours() > 24: return "More than a day ago" - } - if int(d.Hours()) > 1 { - return fmt.Sprintf("About %d hours ago", int(d.Hours())) - } - if int(d.Hours()) > 0 { + case int(d.Hours()) >= 1: + if int(d.Hours()) == 1 { + return "About 1 hour ago" + } return fmt.Sprintf("About %d hours ago", int(d.Hours())) - } - if int(d.Minutes()) > 1 { + case int(d.Minutes()) >= 1: + if int(d.Minutes()) == 1 { + return "About 1 minute ago" + } return fmt.Sprintf("About %d minutes ago", int(d.Minutes())) + default: + return fmt.Sprintf("About %d seconds ago", int(d.Seconds())) } - if int(d.Minutes()) > 0 { - return fmt.Sprintf("About %d minute ago", int(d.Minutes())) - } - return fmt.Sprintf("About %d seconds ago", int(d.Seconds())) } func (h *TracesPageHandler) createViewData(ctx context.Context, traces []api.Trace) ([]views.Trace, error) { @@ -138,7 +138,7 @@ func (h *TracesPageHandler) createViewData(ctx context.Context, traces []api.Tra viewModels[i].Steps = append(viewModels[i].Steps, step) // update last worker with duration - if j > 0 { + if j > 0 && j < len(trace.WorkerTimes) { viewModels[i].Steps[j-1].Label = trace.WorkerTimes[j].Sub(trace.WorkerTimes[j-1]).String() } diff --git a/services/dashboard/routes/overview.go b/services/dashboard/routes/overview.go index 8a320b3..8e8ac3e 100644 --- a/services/dashboard/routes/overview.go +++ b/services/dashboard/routes/overview.go @@ -98,7 +98,15 @@ func (t *OverviewRoute) createSensorGroup() http.HandlerFunc { w.Header().Set("hx-push-url", views.U("/overview?%s", r.URL.Query().Encode())) w.Header().Set("hx-trigger-after-settle", "newDeviceList") views.WriteRenderFilters(w, sg, true) - views.WriteRenderDeviceTable(w, res.Data, getCursor(res.Links.GetNext())) + nextPage := "" + if cursor := getCursor(res.Links.GetNext()); cursor != "" { + if sg != nil { + nextPage = views.U("/overview/devices/table?sensor_group=%d&cursor=%s", sg.GetId(), cursor) + } else { + nextPage = views.U("/overview/devices/table?cursor=%s", cursor) + } + } + views.WriteRenderDeviceTable(w, res.Data, nextPage) } } @@ -112,7 +120,11 @@ func (t *OverviewRoute) deleteSensorGroup() http.HandlerFunc { w.Header().Set("hx-push-url", views.U("/overview?%s", r.URL.Query().Encode())) w.Header().Set("hx-trigger-after-settle", "newDeviceList") views.WriteRenderFilters(w, nil, true) - views.WriteRenderDeviceTable(w, res.Data, getCursor(res.Links.GetNext())) + nextPage := "" + if cursor := getCursor(res.Links.GetNext()); cursor != "" { + nextPage = views.U("/overview/devices/table?cursor=%s", cursor) + } + views.WriteRenderDeviceTable(w, res.Data, nextPage) } } @@ -137,8 +149,12 @@ func (t *OverviewRoute) getDevicesTable() http.HandlerFunc { } nextCursor := "" - if res.Links.GetNext() != "" { - nextCursor = views.U("/overview/devices/table?cursor=%s", getCursor(res.Links.GetNext())) + if cursor := getCursor(res.Links.GetNext()); cursor != "" { + if sg := r.URL.Query().Get("sensor_group"); sg != "" { + nextCursor = views.U("/overview/devices/table?sensor_group=%s&cursor=%s", sg, cursor) + } else { + nextCursor = views.U("/overview/devices/table?cursor=%s", cursor) + } } views.WriteRenderDeviceTableRows(w, res.Data, nextCursor) } @@ -187,10 +203,11 @@ func (t *OverviewRoute) deviceListPage() http.HandlerFunc { } page.Devices = res.Data - if res.Links.GetNext() != "" { - u, err := url.Parse(res.Links.GetNext()) - if err == nil { - page.DevicesNextPage = views.U("/overview/devices/table?cursor=%s", u.Query().Get("cursor")) + if cursor := getCursor(res.Links.GetNext()); cursor != "" { + if page.SensorGroup != nil { + page.DevicesNextPage = views.U("/overview/devices/table?sensor_group=%d&cursor=%s", page.SensorGroup.GetId(), cursor) + } else { + page.DevicesNextPage = views.U("/overview/devices/table?cursor=%s", cursor) } } @@ -290,12 +307,12 @@ func (t *OverviewRoute) devicesStreamMap() http.HandlerFunc { log.Printf("cannot open writer for ws: %v\n", err) return } - defer writer.Close() frame := fmt.Sprintf(`{"device_id": %d, "device_code": "%s", "coordinates": [%f,%f]}`, dev.Id, dev.Code, dev.GetLatitude(), dev.GetLongitude()) if _, err := writer.Write([]byte(frame)); err != nil { log.Printf("Failed to write to websocket: %v\n", err) return } + writer.Close() } nextCursor = getCursor(res.Links.GetNext()) if nextCursor == "" { @@ -369,10 +386,12 @@ func (t *OverviewRoute) overviewDatastreamStream() http.HandlerFunc { start, err := time.Parse(time.RFC3339, r.URL.Query().Get("start")) if err != nil { web.HTTPError(w, web.NewError(http.StatusBadRequest, "Start parameter is not ISO8601/RFC3339", "")) + return } end, err := time.Parse(time.RFC3339, r.URL.Query().Get("end")) if err != nil { web.HTTPError(w, web.NewError(http.StatusBadRequest, "End parameter is not ISO8601/RFC3339", "")) + return } ws, err := upgrader.Upgrade(w, r, nil) diff --git a/services/dashboard/routes/pipelines.go b/services/dashboard/routes/pipelines.go index d00efec..aa98e24 100644 --- a/services/dashboard/routes/pipelines.go +++ b/services/dashboard/routes/pipelines.go @@ -240,34 +240,18 @@ func (h *PipelinePageHandler) updatePipeline(next http.Handler) http.Handler { _, resp, err := h.coreClient.PipelinesApi.UpdatePipeline(r.Context(), pipelineId).UpdatePipelineRequest(updateDto).Execute() if err != nil { - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - log.Printf("in createPipeline, err reading response body: %s\n", err) - } else { - log.Printf("in createPipeline, err: %s\n", string(responseBody)) - } - layout.SnackbarSomethingWentWrong(w) - return - } - - // TODO: API returns status created instead of found for some reason - if resp.StatusCode != http.StatusCreated { - if resp.StatusCode == http.StatusInternalServerError { - responseBody, err := io.ReadAll(resp.Body) - if err != nil { - log.Printf("in createPipeline, err reading response body: %s\n", err) - } else { - log.Printf("in createPipeline, err: %s\n", string(responseBody)) - } - layout.SnackbarSomethingWentWrong(w) - } else { - var apierror *web.APIError - if errors.As(err, &apierror) { - layout.WithSnackbarError(w, apierror.Message) - w.WriteHeader(apierror.HTTPStatus) - return + if resp != nil && resp.Body != nil { + if body, readErr := io.ReadAll(resp.Body); readErr == nil { + log.Printf("in updatePipeline, err: %s\n", string(body)) } } + var apiErr *web.APIError + if errors.As(err, &apiErr) { + layout.WithSnackbarError(w, apiErr.Message) + w.WriteHeader(apiErr.HTTPStatus) + return + } + layout.SnackbarSomethingWentWrong(w) return } @@ -491,8 +475,6 @@ func (h *PipelinePageHandler) getWorkersForSteps(r *http.Request, steps []string workers := res.GetData() workers = append(workers, createPlaceholderWorkers(missingWorkers)...) - fmt.Printf("workers: %v\n", workers) - fmt.Printf("steps: %v\n", steps) if len(workers) != len(steps) { return nil, fmt.Errorf("some pipeline workers not found") } diff --git a/services/dashboard/routes/workers.go b/services/dashboard/routes/workers.go index 487418b..777ec7d 100644 --- a/services/dashboard/routes/workers.go +++ b/services/dashboard/routes/workers.go @@ -56,7 +56,6 @@ func (h *WorkerPageHandler) listWorkers() http.HandlerFunc { page.WorkersNextPage = views.U("/workers/table?cursor=%s", getCursor(res.Links.GetNext())) } - fmt.Println("Cursor", res.Links.GetNext()) if isHX(r) { page.WriteBody(w) return @@ -67,7 +66,6 @@ func (h *WorkerPageHandler) listWorkers() http.HandlerFunc { func (h *WorkerPageHandler) workersTable() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - fmt.Println("get table") req := h.workersClient.WorkersApi.ListWorkers(r.Context()) if r.URL.Query().Has("cursor") { req = req.Cursor(r.URL.Query().Get("cursor")) @@ -129,9 +127,8 @@ func (h *WorkerPageHandler) updateWorker() http.HandlerFunc { if name := r.FormValue("name"); name != "" { dto.Name = &name } - if desc := r.FormValue("description"); desc != "" { - dto.Description = &desc - } + desc := r.FormValue("description") + dto.Description = &desc switch r.FormValue("state") { case "on": dto.SetState("enabled") @@ -181,6 +178,12 @@ func (h *WorkerPageHandler) createWorker() http.HandlerFunc { dto.SetName(r.FormValue("name")) dto.SetUserCode(r.FormValue("userCode")) dto.SetDescription(r.FormValue("description")) + switch r.FormValue("state") { + case "on": + dto.SetState("enabled") + default: + dto.SetState("disabled") + } _, _, err := h.workersClient.WorkersApi.CreateWorker(r.Context()).CreateUserWorkerRequest(dto).Execute() if err != nil { diff --git a/services/dashboard/views/pipelineEditPage.qtpl b/services/dashboard/views/pipelineEditPage.qtpl index cd3629e..617fecd 100644 --- a/services/dashboard/views/pipelineEditPage.qtpl +++ b/services/dashboard/views/pipelineEditPage.qtpl @@ -84,7 +84,8 @@ -
@@ -94,6 +95,7 @@
+ {% endif %} {% endfunc %} diff --git a/services/dashboard/views/pipelineEditPage.qtpl.go b/services/dashboard/views/pipelineEditPage.qtpl.go index 96b9280..28dfffb 100644 --- a/services/dashboard/views/pipelineEditPage.qtpl.go +++ b/services/dashboard/views/pipelineEditPage.qtpl.go @@ -181,60 +181,70 @@ func (p *PipelineEditPage) StreamBody(qw422016 *qt422016.Writer) { -
Incoming data and processing statusses +//line views/pipelineEditPage.qtpl:93 + qw422016.E().S(U("/traces/list?pipeline=%s&limit=%d", p.Pipeline.Id, 10)) +//line views/pipelineEditPage.qtpl:93 + qw422016.N().S(`" hx-trigger="load, click" hx-target="next div">Refresh
+ `) +//line views/pipelineEditPage.qtpl:98 + } +//line views/pipelineEditPage.qtpl:98 + qw422016.N().S(` `) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 } -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 func (p *PipelineEditPage) WriteBody(qq422016 qtio422016.Writer) { -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 qw422016 := qt422016.AcquireWriter(qq422016) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 p.StreamBody(qw422016) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 qt422016.ReleaseWriter(qw422016) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 } -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 func (p *PipelineEditPage) Body() string { -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 qb422016 := qt422016.AcquireByteBuffer() -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 p.WriteBody(qb422016) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 qs422016 := string(qb422016.B) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 qt422016.ReleaseByteBuffer(qb422016) -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 return qs422016 -//line views/pipelineEditPage.qtpl:98 +//line views/pipelineEditPage.qtpl:100 } -//line views/pipelineEditPage.qtpl:100 +//line views/pipelineEditPage.qtpl:102 func (p *PipelineEditPage) StreamRenderPipelineSteps(qw422016 *qt422016.Writer, pipeline *api.Pipeline, workers *[]api.UserWorker) { -//line views/pipelineEditPage.qtpl:100 +//line views/pipelineEditPage.qtpl:102 qw422016.N().S(`