github.com/mikebionic/viewscount

A smart organic views counter library for PostgreSQL, configurable to count views for any tables and columns


Keywords
counter, go, middleware, organic, sql, views
Install
go get github.com/mikebionic/viewscount

Documentation

Organic Views counter in Go

Imagine you have tables with a view_count column, but you don't want to write separate api for them and you want to prevent DOS type increment. This library is a solution for you.

CREATE TABLE tbl_driver
(
    id              SERIAL PRIMARY KEY,
    first_name      VARCHAR(100) NOT NULL DEFAULT '',
    view_count      INT          NOT NULL DEFAULT 0,
    deleted         INT          NOT NULL DEFAULT 0
);

CREATE TABLE tbl_vehicle
(
    id              SERIAL PRIMARY KEY,
    numberplate      VARCHAR(100) NOT NULL DEFAULT '',
    view_count      INT          NOT NULL DEFAULT 0,
    deleted         INT          NOT NULL DEFAULT 0
);


An example how you can integrate viewscounter into Gin API. You should create a middleware handler

package middlewares

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/mikebionic/viewscount"
	"time"
)

var viewTracker *viewscount.ViewTracker

func InitializeViewTracker(db interface{}, minutesGap time.Duration) {
	viewTracker = viewscount.NewViewTracker(db, minutesGap)
}

func ViewCounterMiddleware(tableName string) gin.HandlerFunc {
	return func(c *gin.Context) {
		id := c.Param("id")
		if id == "" {
			c.Next()
			return
		}

		idInt := 0
		fmt.Sscanf(id, "%d", &idInt)

		if err := viewTracker.HandleView(c.Request, tableName, idInt); err != nil {
			fmt.Printf("Error tracking view: %v\n", err)
		}
		c.Next()
	}
}

In your main app you should import created middleware and configure the database (supports sql.DB and pgxscann.DB)

func main() {
	//...
	middlewares.InitializeViewTracker(database.DB, 10)	

	// some routers controllers:
	router.GET("/:id", middlewares.ViewCounterMiddleware("tbl_driver"), services.GetDriver)
	//...
}