diff --git a/app.go b/app.go index 08cd160f47566b06b44eeb44044e416c8263ad8d..2b73e58b465681b076946ca998736fef619c2021 100644 --- a/app.go +++ b/app.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "os" + "sync/atomic" "time" "github.com/gofiber/contrib/hcaptcha" @@ -54,8 +55,14 @@ func serve(sig chan os.Signal, db *leveldb.DB) error { confEnv[hCaptchaSiteKey][0], confEnv[hCaptchaSecretKey][0]) } + count := new(atomic.Uint64) + routeHCaptchaSiteKey(app, "/api", !hCaptchaEnable, conf[hCaptchaSiteKey]) - routeRegister(app, "/api/register", db, captcha) + routeRegister(app, "/api/register", db, count, captcha) + + if err := routeCount(app, "/api/count", db, count); err != nil { + return err + } // graceful shutdown go func() { diff --git a/count.go b/count.go new file mode 100644 index 0000000000000000000000000000000000000000..bff029a534a796039a463b27db4dff040dce79c5 --- /dev/null +++ b/count.go @@ -0,0 +1,32 @@ +package main + +import ( + "log" + "strconv" + "sync/atomic" + + "github.com/gofiber/fiber/v3" + "github.com/syndtr/goleveldb/leveldb" +) + +func routeCount(app *fiber.App, p string, db *leveldb.DB, count *atomic.Uint64) error { + var c uint64 + iter := db.NewIterator(nil, nil) + for iter.Next() { + c++ + } + iter.Release() + if err := iter.Error(); err != nil { + return err + } + count.Store(c) + + log.Printf("registration count is %d on startup", c) + + app.Get(p, func(c fiber.Ctx) error { + c.Set("Content-Type", "text/plain") + return c.SendString(strconv.FormatUint(count.Load(), 10)) + }) + + return nil +} diff --git a/register.go b/register.go index a27fb2497b8bc310a7adc18e48cc2a7fa4caac14..5ad3d002d419623a37b16f24b817a232088764c5 100644 --- a/register.go +++ b/register.go @@ -3,6 +3,7 @@ package main import ( "log" "regexp" + "sync/atomic" "github.com/gofiber/fiber/v3" "github.com/syndtr/goleveldb/leveldb" @@ -15,7 +16,7 @@ type registration struct { } // Waitlist registration route -func routeRegister(app *fiber.App, p string, db *leveldb.DB, captcha fiber.Handler) { +func routeRegister(app *fiber.App, p string, db *leveldb.DB, count *atomic.Uint64, captcha fiber.Handler) { app.Post(p, func(c fiber.Ctx) error { req := new(registration) @@ -53,6 +54,7 @@ func routeRegister(app *fiber.App, p string, db *leveldb.DB, captcha fiber.Handl } log.Printf("registered email %q", req.Email) + count.Add(1) return c.JSON(newMessage(true, "Email registered successfully")) }, captcha) }