aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorVikas Kushwaha <dev@vikas.rocks>2025-02-11 16:31:08 +0530
committerVikas Kushwaha <dev@vikas.rocks>2025-02-11 16:31:08 +0530
commit57eb8f6712361a3bf75983ce153fac4846dc0273 (patch)
tree269a168d59c917c4e313c819e2b4c3ff8175f912 /internal
Initial commit
Diffstat (limited to 'internal')
-rw-r--r--internal/authentication/session.go60
-rw-r--r--internal/database/database.go50
-rw-r--r--internal/errormessage.go17
-rw-r--r--internal/helper/route.go15
-rw-r--r--internal/middleware/NotFound.go10
-rw-r--r--internal/renderer/renderer.go45
-rw-r--r--internal/validator.go17
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)
+}