package meta import ( "net/http" "os" "codeberg.org/pronounscc/pronouns.cc/backend/db" "codeberg.org/pronounscc/pronouns.cc/backend/server" "emperror.dev/errors" "github.com/go-chi/chi/v5" "github.com/go-chi/render" ) type Server struct { *server.Server } func Mount(srv *server.Server, r chi.Router) { s := &Server{Server: srv} r.Get("/meta", server.WrapHandler(s.meta)) } type MetaResponse struct { GitRepository string `json:"git_repository"` GitCommit string `json:"git_commit"` Users MetaUsers `json:"users"` Members int64 `json:"members"` RequireInvite bool `json:"require_invite"` } type MetaUsers struct { Total int64 `json:"total"` ActiveMonth int64 `json:"active_month"` ActiveWeek int64 `json:"active_week"` ActiveDay int64 `json:"active_day"` } func (s *Server) meta(w http.ResponseWriter, r *http.Request) error { ctx := r.Context() numUsers, err := s.DB.TotalUserCount(ctx) if err != nil { return errors.Wrap(err, "querying user count") } activeMonth, err := s.DB.ActiveUsers(ctx, db.ActiveMonth) if err != nil { return errors.Wrap(err, "querying user count") } activeWeek, err := s.DB.ActiveUsers(ctx, db.ActiveWeek) if err != nil { return errors.Wrap(err, "querying user count") } activeDay, err := s.DB.ActiveUsers(ctx, db.ActiveDay) if err != nil { return errors.Wrap(err, "querying user count") } numMembers, err := s.DB.TotalMemberCount(ctx) if err != nil { return errors.Wrap(err, "querying user count") } render.JSON(w, r, MetaResponse{ GitRepository: server.Repository, GitCommit: server.Revision, Users: MetaUsers{ Total: numUsers, ActiveMonth: activeMonth, ActiveWeek: activeWeek, ActiveDay: activeDay, }, Members: numMembers, RequireInvite: os.Getenv("REQUIRE_INVITE") == "true", }) return nil }