diff --git a/frontend/html/admin/home.html b/frontend/html/admin/home.html index 42f65f3..b524c7e 100644 --- a/frontend/html/admin/home.html +++ b/frontend/html/admin/home.html @@ -13,6 +13,13 @@ {{ define "admin-content" }}
Home
+{{ with .NewVersionMessage }} + +
+ {{ . }}
+
+{{ end }} {{/* Contests overview */}}
Active Contests
diff --git a/server/admin/home.go b/server/admin/home.go index 1d91aab..f522c2b 100644 --- a/server/admin/home.go +++ b/server/admin/home.go @@ -1,8 +1,10 @@ package admin import ( + "log" "net/http" + "git.nkagami.me/natsukagami/kjudge/db" "git.nkagami.me/natsukagami/kjudge/models" "github.com/labstack/echo/v4" ) @@ -11,17 +13,37 @@ import ( type HomeCtx struct { Contests []*models.Contest Queue *models.QueueOverview + + NewVersionMessage string } -// Home renders the home page. -func (g *Group) Home(c echo.Context) error { - contests, err := models.GetContestsUnfinished(g.db) +func getHomeCtx(db db.DBContext, c echo.Context) (*HomeCtx, error) { + contests, err := models.GetContestsUnfinished(db) if err != nil { - return err + return nil, err + } + queue, err := models.GetQueueOverview(db) + if err != nil { + return nil, err + } + message, err := NewVersionMessageGet() + if err != nil { + log.Printf("Falied to get kjudge's release version: %+v", err) + message = "" } - queue, err := models.GetQueueOverview(g.db) + return &HomeCtx{Contests: contests, Queue: queue, NewVersionMessage: message}, nil +} + +// Render renders the context. +func (h *HomeCtx) Render(c echo.Context) error { + return c.Render(http.StatusOK, "admin/home", h) +} + +// Home renders the home page. +func (g *Group) Home(c echo.Context) error { + ctx, err := getHomeCtx(g.db, c) if err != nil { return err } - return c.Render(http.StatusOK, "admin/home", &HomeCtx{Contests: contests, Queue: queue}) + return ctx.Render(c) } diff --git a/server/admin/message_dev.go b/server/admin/message_dev.go new file mode 100644 index 0000000..cd5deb6 --- /dev/null +++ b/server/admin/message_dev.go @@ -0,0 +1,8 @@ +// +build !production + +package admin + +// NewVersionMessageGet checks if there is a new version of kjudge +func NewVersionMessageGet() (string, error) { + return "", nil +} diff --git a/server/admin/message_prod.go b/server/admin/message_prod.go new file mode 100644 index 0000000..d0db779 --- /dev/null +++ b/server/admin/message_prod.go @@ -0,0 +1,50 @@ +// +build production + +package admin + +import ( + "encoding/json" + "fmt" + "net/http" + "time" + + "git.nkagami.me/natsukagami/kjudge" + "github.com/pkg/errors" +) + +type jsonRelease struct { + TagName string `json:"tag_name"` +} + +type version struct { + TagName string + LastUpdate time.Time +} + +var currentVersion version + +// NewVersionMessageGet checks if there is a new version of kjudge +func NewVersionMessageGet() (string, error) { + if currentVersion.TagName == "" || time.Now().After(currentVersion.LastUpdate.Add(time.Hour)) { + response, err := http.Get("https://git.nkagami.me/api/v1/repos/natsukagami/kjudge/releases?page=1&per_page=1") + if err != nil { + return "", errors.WithStack(err) + } + defer response.Body.Close() + var x []jsonRelease + decode := json.NewDecoder(response.Body) + if err := decode.Decode(&x); err != nil { + return "", errors.WithStack(err) + } + if len(x) == 0 { + return "", errors.New("Found no relase") + } + currentVersion.TagName = x[0].TagName[1:] + currentVersion.LastUpdate = time.Now() + } + if kjudge.Version != currentVersion.TagName { + return fmt.Sprintf("Please update kjudge to the newest version (%s)", currentVersion.TagName), nil + } else { + return "", nil + } +}