/*
* Copyright (C) 2024 Jonni Liljamo <jonni@liljamo.com>
*
* This file is licensed under GPL-3.0-or-later, see NOTICE and LICENSE for
* more information.
*/
package handlers
import (
"fmt"
"log/slog"
"net/http"
"git.src.quest/~liljamo/emerwen-web/internal/client"
"git.src.quest/~liljamo/emerwen-web/internal/components"
"git.src.quest/~liljamo/emerwen-web/internal/renderer"
"github.com/gin-gonic/gin"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
)
func handleClientError(c *gin.Context, err error) {
if status, ok := status.FromError(err); ok {
slog.Error("RPC error", slog.String("err", err.Error()))
if status.Code() == codes.Unavailable {
c.String(http.StatusInternalServerError, "RPC unavailable.")
return
}
c.String(http.StatusInternalServerError, fmt.Sprintf("RPC error: %s", status.String()))
return
}
slog.Error("Non-RPC error", slog.String("err", err.Error()))
c.String(http.StatusInternalServerError, "Non-RPC error, see server logs.")
}
// PartialWorkers returns a gin handler for the partial workers route.
func PartialWorkers(client *client.Client) gin.HandlerFunc {
return func(c *gin.Context) {
response, err := client.Client.GetWorkers(client.Ctx, &emptypb.Empty{})
if err != nil {
handleClientError(c, err)
return
}
r := renderer.New(BaseContext(c), http.StatusOK, components.PartialWorkers(response.Workers))
c.Render(http.StatusOK, r)
}
}