summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-03-03 16:32:30 +0530
committerBobby <[email protected]>2026-03-03 16:32:30 +0530
commit8631dd7420c35ce8c8b7da5f19eb4b516abcddc3 (patch)
tree2f4527eda31d5275fb3e38255184de27eee38af4
parent471758d1eb63c550c644b9233d04473adde962e8 (diff)
downloadpagoda-8631dd7420c35ce8c8b7da5f19eb4b516abcddc3.tar.xz
pagoda-8631dd7420c35ce8c8b7da5f19eb4b516abcddc3.zip
feat(config): add CORS origins configuration to server struct
refactor(database): remove unused database drivers fix(middleware): use constant for request context key refactor(router): clean up import statement for controllers fix(main): use CORS origins from config refactor(env): simplify environment variable handling for uint fields refactor(meta): update request context key to use constant
-rw-r--r--shrine/config/env.go9
-rw-r--r--shrine/enums/database.go6
-rw-r--r--shrine/middleware/request.go4
-rw-r--r--shrine/router/router.go2
-rw-r--r--shrine/shrine/main.go3
-rw-r--r--shrine/utils/env/functions.go32
-rw-r--r--shrine/utils/env/setter.go50
-rw-r--r--shrine/utils/meta/request.go4
8 files changed, 19 insertions, 91 deletions
diff --git a/shrine/config/env.go b/shrine/config/env.go
index bb5567b..f48cd90 100644
--- a/shrine/config/env.go
+++ b/shrine/config/env.go
@@ -1,10 +1,11 @@
package config
type server struct {
- Host string `env:"HOST" default:"0.0.0.0"`
- Port int `env:"PORT" default:"3000"`
- Secret string `env:"SECRET" default:"pagoda-secret"`
- Debug bool `env:"DEBUG" default:"false"`
+ Host string `env:"HOST" default:"0.0.0.0"`
+ Port int `env:"PORT" default:"3000"`
+ Secret string `env:"SECRET" default:"pagoda-secret"`
+ Debug bool `env:"DEBUG" default:"false"`
+ CorsOrigins string `env:"CORS_ORIGINS" default:"*"`
}
type database struct {
diff --git a/shrine/enums/database.go b/shrine/enums/database.go
index d8fff0b..d57ef13 100644
--- a/shrine/enums/database.go
+++ b/shrine/enums/database.go
@@ -3,8 +3,6 @@ package enums
type DatabaseDriver string
const (
- SQLite DatabaseDriver = "sqlite"
- MySQL DatabaseDriver = "mysql"
- Postgres DatabaseDriver = "postgres"
- SQLServer DatabaseDriver = "sqlserver"
+ SQLite DatabaseDriver = "sqlite"
+ Postgres DatabaseDriver = "postgres"
)
diff --git a/shrine/middleware/request.go b/shrine/middleware/request.go
index a9a1cd8..2577f16 100644
--- a/shrine/middleware/request.go
+++ b/shrine/middleware/request.go
@@ -6,12 +6,10 @@ import (
"github.com/gofiber/fiber/v2"
)
-const requestKey = "__request_ctx"
-
func request() fiber.Handler {
return func(c *fiber.Ctx) error {
req := meta.BuildRequest(c)
- c.Locals(requestKey, req)
+ c.Locals(meta.RequestKey, req)
return c.Next()
}
}
diff --git a/shrine/router/router.go b/shrine/router/router.go
index 4f1da5d..b92aecb 100644
--- a/shrine/router/router.go
+++ b/shrine/router/router.go
@@ -1,7 +1,7 @@
package router
import (
- controllers "shrine/controllers"
+ "shrine/controllers"
"shrine/utils/urls"
"github.com/gofiber/fiber/v2"
diff --git a/shrine/shrine/main.go b/shrine/shrine/main.go
index 45ca105..f82d46e 100644
--- a/shrine/shrine/main.go
+++ b/shrine/shrine/main.go
@@ -19,9 +19,10 @@ import (
func main() {
app := fiber.New(fiber.Config{
DisableStartupMessage: true,
+ ErrorHandler: router.ErrorHandler,
})
app.Use(cors.New(cors.Config{
- AllowOrigins: "*",
+ AllowOrigins: config.Server.CorsOrigins,
AllowMethods: "GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS",
AllowHeaders: "Origin, Content-Type, Accept, Authorization, X-Requested-With, X-API-Key, X-CSRF-Token",
ExposeHeaders: "Content-Length, Content-Type, Content-Disposition, X-Pagination, X-Total-Count",
diff --git a/shrine/utils/env/functions.go b/shrine/utils/env/functions.go
index de03793..12b57e2 100644
--- a/shrine/utils/env/functions.go
+++ b/shrine/utils/env/functions.go
@@ -2,7 +2,6 @@ package env
import (
"os"
- "reflect"
"strconv"
"strings"
"time"
@@ -66,32 +65,11 @@ func getEnvStringSlice(key string, defaultVal []string) []string {
return defaultVal
}
-func Defaults[T any](config *T) *T {
- v := reflect.ValueOf(config)
- if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct {
- return config
- }
-
- elem := v.Elem()
- t := elem.Type()
- newStruct := reflect.New(t)
- newElem := newStruct.Elem()
-
- for i := range elem.NumField() {
- field := newElem.Field(i)
- fieldType := t.Field(i)
-
- if !field.CanSet() {
- continue
- }
-
- defaultVal := fieldType.Tag.Get("default")
- if defaultVal == "" {
- continue
+func getEnvUint(key string, defaultVal uint64) uint64 {
+ if value := os.Getenv(key); value != "" {
+ if parsed, err := strconv.ParseUint(value, 10, 64); err == nil {
+ return parsed
}
-
- setFieldDefault(field, defaultVal)
}
-
- return newStruct.Interface().(*T)
+ return defaultVal
}
diff --git a/shrine/utils/env/setter.go b/shrine/utils/env/setter.go
index 8b53a1d..4aad059 100644
--- a/shrine/utils/env/setter.go
+++ b/shrine/utils/env/setter.go
@@ -1,7 +1,6 @@
package env
import (
- "os"
"reflect"
"strconv"
"strings"
@@ -32,13 +31,7 @@ func setFieldFromEnv(field reflect.Value, envKey, defaultVal string) {
}
func setUintField(field reflect.Value, envKey string, defaultVal uint64) {
- if value := os.Getenv(envKey); value != "" {
- if parsed, err := strconv.ParseUint(value, 10, 64); err == nil {
- field.SetUint(parsed)
- return
- }
- }
- field.SetUint(defaultVal)
+ field.SetUint(getEnvUint(envKey, defaultVal))
}
func setDurationField(field reflect.Value, envKey, defaultVal string) {
@@ -64,44 +57,3 @@ func setSliceField(field reflect.Value, envKey, defaultVal string) {
field.Set(reflect.ValueOf(result))
}
}
-
-func setFieldDefault(field reflect.Value, defaultVal string) {
- switch field.Kind() {
- case reflect.String:
- field.SetString(defaultVal)
- case reflect.Bool:
- if defaultBool, err := strconv.ParseBool(defaultVal); err == nil {
- field.SetBool(defaultBool)
- }
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- if defaultInt, err := strconv.ParseInt(defaultVal, 10, 64); err == nil {
- field.SetInt(defaultInt)
- }
- case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- if defaultUint, err := strconv.ParseUint(defaultVal, 10, 64); err == nil {
- field.SetUint(defaultUint)
- }
- case reflect.Float32, reflect.Float64:
- if defaultFloat, err := strconv.ParseFloat(defaultVal, 64); err == nil {
- field.SetFloat(defaultFloat)
- }
- case reflect.Slice:
- if field.Type().Elem().Kind() == reflect.String && defaultVal != "" {
- parts := strings.Split(defaultVal, ",")
- result := make([]string, 0, len(parts))
- for _, part := range parts {
- trimmed := strings.TrimSpace(part)
- if trimmed != "" {
- result = append(result, trimmed)
- }
- }
- field.Set(reflect.ValueOf(result))
- }
- default:
- if field.Type() == reflect.TypeFor[time.Duration]() {
- if defaultDuration, err := time.ParseDuration(defaultVal); err == nil {
- field.Set(reflect.ValueOf(defaultDuration))
- }
- }
- }
-}
diff --git a/shrine/utils/meta/request.go b/shrine/utils/meta/request.go
index d2ae242..7e499e7 100644
--- a/shrine/utils/meta/request.go
+++ b/shrine/utils/meta/request.go
@@ -7,10 +7,10 @@ import (
"github.com/gofiber/fiber/v2"
)
-const requestKey = "__request_ctx"
+const RequestKey = "__request_ctx"
func Request(c *fiber.Ctx) facade {
- req, ok := c.Locals(requestKey).(types.Request)
+ req, ok := c.Locals(RequestKey).(types.Request)
if !ok {
logger.Errorf("META", "RequestContext missing in fiber locals")
return facade{}