add projects and metrics routes
This commit is contained in:
@ -103,6 +103,56 @@ func GET_CheckService(c *fiber.Ctx) error {
|
||||
return util.JSON(c, 200, nil)
|
||||
}
|
||||
|
||||
func PUT_AddProject(c *fiber.Ctx) error {
|
||||
var (
|
||||
project database.Project
|
||||
err error
|
||||
)
|
||||
|
||||
db := c.Locals("database").(*database.Type)
|
||||
|
||||
if c.BodyParser(&project) != nil {
|
||||
return util.ErrBadJSON(c)
|
||||
}
|
||||
|
||||
if !project.IsValid() {
|
||||
return util.ErrBadReq(c)
|
||||
}
|
||||
|
||||
if err = admin_log(c, fmt.Sprintf("Added project \"%s\"", project.Name)); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
if err = db.ProjectAdd(&project); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
return util.JSON(c, 200, nil)
|
||||
}
|
||||
|
||||
func DEL_DelProject(c *fiber.Ctx) error {
|
||||
var (
|
||||
name string
|
||||
err error
|
||||
)
|
||||
|
||||
db := c.Locals("database").(*database.Type)
|
||||
|
||||
if name = c.Query("name"); name == "" {
|
||||
util.ErrBadReq(c)
|
||||
}
|
||||
|
||||
if err = admin_log(c, fmt.Sprintf("Removed project \"%s\"", name)); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
if err = db.ProjectRemove(name); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
return util.JSON(c, 200, nil)
|
||||
}
|
||||
|
||||
func DEL_DelNews(c *fiber.Ctx) error {
|
||||
var (
|
||||
id string
|
||||
|
77
api/routes/metrics.go
Normal file
77
api/routes/metrics.go
Normal file
@ -0,0 +1,77 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/ngn13/website/api/database"
|
||||
"github.com/ngn13/website/api/util"
|
||||
)
|
||||
|
||||
type visitor_cache_entry struct {
|
||||
Addr string // SHA1 hash of visitor's IP
|
||||
Number uint64 // number of the visitor
|
||||
}
|
||||
|
||||
const VISITOR_CACHE_MAX = 30 // store 30 visitor data at most
|
||||
var visitor_cache []visitor_cache_entry // in memory cache for the visitor
|
||||
|
||||
func GET_Metrics(c *fiber.Ctx) error {
|
||||
var (
|
||||
err error
|
||||
result map[string]uint64 = map[string]uint64{
|
||||
"number": 0, // visitor number of the current visitor
|
||||
"total": 0, // total number of visitors
|
||||
"since": 0, // metric collection start date (UNIX timestamp)
|
||||
}
|
||||
)
|
||||
|
||||
db := c.Locals("database").(*database.Type)
|
||||
new_addr := util.GetSHA1(util.IP(c))
|
||||
|
||||
for i := range visitor_cache {
|
||||
if new_addr == visitor_cache[i].Addr {
|
||||
result["number"] = visitor_cache[i].Number
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if result["total"], err = db.MetricsGet("visitor_count"); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
if result["number"] == 0 {
|
||||
result["total"]++
|
||||
result["number"] = result["total"]
|
||||
|
||||
if len(visitor_cache) > VISITOR_CACHE_MAX {
|
||||
util.Debg("visitor cache is full, removing the oldest entry")
|
||||
visitor_cache = visitor_cache[1:]
|
||||
}
|
||||
|
||||
visitor_cache = append(visitor_cache, visitor_cache_entry{
|
||||
Addr: new_addr,
|
||||
Number: result["number"],
|
||||
})
|
||||
|
||||
if err = db.MetricsSet("visitor_count", result["total"]); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
}
|
||||
|
||||
if result["since"], err = db.MetricsGet("start_date"); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
if result["since"] == 0 {
|
||||
result["since"] = uint64(time.Now().Truncate(24 * time.Hour).Unix())
|
||||
|
||||
if err = db.MetricsSet("since", result["since"]); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
}
|
||||
|
||||
return util.JSON(c, 200, fiber.Map{
|
||||
"result": result,
|
||||
})
|
||||
}
|
24
api/routes/projects.go
Normal file
24
api/routes/projects.go
Normal file
@ -0,0 +1,24 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/ngn13/website/api/database"
|
||||
"github.com/ngn13/website/api/util"
|
||||
)
|
||||
|
||||
func GET_Projects(c *fiber.Ctx) error {
|
||||
var (
|
||||
projects []database.Project
|
||||
project database.Project
|
||||
)
|
||||
|
||||
db := c.Locals("database").(*database.Type)
|
||||
|
||||
for db.ProjectNext(&project) {
|
||||
projects = append(projects, project)
|
||||
}
|
||||
|
||||
return util.JSON(c, 200, fiber.Map{
|
||||
"result": projects,
|
||||
})
|
||||
}
|
@ -1,50 +0,0 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/ngn13/website/api/database"
|
||||
"github.com/ngn13/website/api/util"
|
||||
)
|
||||
|
||||
const LAST_ADDRS_MAX = 30
|
||||
|
||||
var last_addrs []string
|
||||
|
||||
func GET_Visitor(c *fiber.Ctx) error {
|
||||
var (
|
||||
err error
|
||||
count uint64
|
||||
)
|
||||
|
||||
db := c.Locals("database").(*database.Type)
|
||||
new_addr := util.GetSHA1(util.IP(c))
|
||||
|
||||
for _, addr := range last_addrs {
|
||||
if new_addr == addr {
|
||||
if count, err = db.VisitorGet(); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
return util.JSON(c, 200, fiber.Map{
|
||||
"result": count,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if err = db.VisitorIncrement(); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
if count, err = db.VisitorGet(); err != nil {
|
||||
return util.ErrInternal(c, err)
|
||||
}
|
||||
|
||||
if len(last_addrs) > LAST_ADDRS_MAX {
|
||||
last_addrs = append(last_addrs[:0], last_addrs[1:]...)
|
||||
last_addrs = append(last_addrs, new_addr)
|
||||
}
|
||||
|
||||
return util.JSON(c, 200, fiber.Map{
|
||||
"result": count,
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user