diff options
author | Vikas Kushwaha <dev@vikas.rocks> | 2025-02-11 16:31:08 +0530 |
---|---|---|
committer | Vikas Kushwaha <dev@vikas.rocks> | 2025-02-11 16:31:08 +0530 |
commit | 57eb8f6712361a3bf75983ce153fac4846dc0273 (patch) | |
tree | 269a168d59c917c4e313c819e2b4c3ff8175f912 /internal |
Initial commit
Diffstat (limited to 'internal')
-rw-r--r-- | internal/authentication/session.go | 60 | ||||
-rw-r--r-- | internal/database/database.go | 50 | ||||
-rw-r--r-- | internal/errormessage.go | 17 | ||||
-rw-r--r-- | internal/helper/route.go | 15 | ||||
-rw-r--r-- | internal/middleware/NotFound.go | 10 | ||||
-rw-r--r-- | internal/renderer/renderer.go | 45 | ||||
-rw-r--r-- | internal/validator.go | 17 |
7 files changed, 214 insertions, 0 deletions
diff --git a/internal/authentication/session.go b/internal/authentication/session.go new file mode 100644 index 0000000..8204034 --- /dev/null +++ b/internal/authentication/session.go @@ -0,0 +1,60 @@ +package authentication + +import ( + "github.com/gofiber/fiber/v2" + "github.com/gofiber/fiber/v2/middleware/session" + "github.com/gofiber/storage/sqlite3" +) + +var StoredAuthenticationSession *session.Store + +func SessionStart() { + + store := sqlite3.New(sqlite3.Config{ + Table: "fiber_storage", + }) + + authSession := session.New(session.Config{ + Storage: store, + }) + + StoredAuthenticationSession = authSession +} + +func AuthStore(c *fiber.Ctx, userID uint) { + session, err := StoredAuthenticationSession.Get(c) + if err != nil { + panic(err) + } + + session.Set("authentication", userID) + if err := session.Save(); err != nil { + panic(err) + } +} + +func AuthGet(c *fiber.Ctx) (bool, uint) { + session, err := StoredAuthenticationSession.Get(c) + if err != nil { + panic(err) + } + + value := session.Get("authentication") + if value == nil { + return false, 0 + } + + return true, value.(uint) +} + +func AuthDestroy(c *fiber.Ctx) { + session, err := StoredAuthenticationSession.Get(c) + if err != nil { + panic(err) + } + + session.Delete("authentication") + if err := session.Save(); err != nil { + panic(err) + } +} diff --git a/internal/database/database.go b/internal/database/database.go new file mode 100644 index 0000000..c67c75e --- /dev/null +++ b/internal/database/database.go @@ -0,0 +1,50 @@ +package database + +import ( + "fmt" + "log" + "os" + "time" + + "github.com/glebarez/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +var DB *gorm.DB + +func Open() { + + newLogger := logger.New( + log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer + logger.Config{ + SlowThreshold: time.Millisecond * 10, // Slow SQL threshold + LogLevel: logger.Info, // Log level + IgnoreRecordNotFoundError: false, // Ignore ErrRecordNotFound error for logger + Colorful: true, // Disable color + }, + ) + + db, err := gorm.Open(sqlite.Open("database.sqlite"), &gorm.Config{ + Logger: newLogger, + }) + + if err != nil { + fmt.Println("storage err: ", err) + } + + sqlDB, err := db.DB() + if err != nil { + fmt.Println("storage err: ", err) + } + + sqlDB.SetMaxIdleConns(3) + sqlDB.SetMaxOpenConns(100) + sqlDB.SetConnMaxLifetime(time.Hour) + + DB = db +} + +func Get() *gorm.DB { + return DB +} diff --git a/internal/errormessage.go b/internal/errormessage.go new file mode 100644 index 0000000..34e0466 --- /dev/null +++ b/internal/errormessage.go @@ -0,0 +1,17 @@ +package internal + +func ErrorMessage(fieldName string, fieldType string) string { + + message := "" + + switch fieldType { + case "required": + message = fieldName + " is required." + case "email": + message = fieldName + " must be an email." + default: + message = "" + } + + return message +} diff --git a/internal/helper/route.go b/internal/helper/route.go new file mode 100644 index 0000000..69f00b9 --- /dev/null +++ b/internal/helper/route.go @@ -0,0 +1,15 @@ +package helper + +import "github.com/gofiber/fiber/v2" + +func HTMXRedirectTo(HXURL string, HXGETURL string, c *fiber.Ctx) error { + + c.Append("HX-Replace-Url", HXURL) + c.Append("HX-Reswap", "none") + + return c.Render("components/redirect", fiber.Map{ + "HXGet": HXGETURL, + "HXTarget": "#app-body", + "HXTrigger": "load", + }, "layouts/app-htmx") +} diff --git a/internal/middleware/NotFound.go b/internal/middleware/NotFound.go new file mode 100644 index 0000000..2db3198 --- /dev/null +++ b/internal/middleware/NotFound.go @@ -0,0 +1,10 @@ +package middleware + +import "github.com/gofiber/fiber/v2" + +func NotFound(c *fiber.Ctx) error { + + return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ + "message": "Page not found.", + }) +} diff --git a/internal/renderer/renderer.go b/internal/renderer/renderer.go new file mode 100644 index 0000000..92af85c --- /dev/null +++ b/internal/renderer/renderer.go @@ -0,0 +1,45 @@ +package renderer + +import ( + "errors" + "projecty/internal/authentication" + + "github.com/gofiber/fiber/v2" + "github.com/gofiber/template/html/v2" +) + +func ViewEngineStart() *html.Engine { + + viewEngine := html.New("./cmd/web/templates", ".tmpl") + + viewEngine.AddFunc("IsAuthenticated", func(c *fiber.Ctx) bool { + isAuthenticated, _ := authentication.AuthGet(c) + return isAuthenticated + }) + + viewEngine.AddFunc("Iterate", func(start int, end int) []int { + n := end - start + 1 + result := make([]int, n) + for i := 0; i < n; i++ { + result[i] = start + i + } + return result + }) + + viewEngine.AddFunc("Dict", func(values ...interface{}) (map[string]interface{}, error) { + if len(values)%2 != 0 { + return nil, errors.New("invalid dict call") + } + dict := make(map[string]interface{}, len(values)/2) + for i := 0; i < len(values); i += 2 { + key, ok := values[i].(string) + if !ok { + return nil, errors.New("dict keys must be strings") + } + dict[key] = values[i+1] + } + return dict, nil + }) + + return viewEngine +} diff --git a/internal/validator.go b/internal/validator.go new file mode 100644 index 0000000..2d9550a --- /dev/null +++ b/internal/validator.go @@ -0,0 +1,17 @@ +package internal + +import "github.com/go-playground/validator/v10" + +type Validator struct { + validator *validator.Validate +} + +func NewValidator() *Validator { + return &Validator{ + validator: validator.New(), + } +} + +func (v *Validator) Validate(i interface{}) error { + return v.validator.Struct(i) +} |