diff --git a/app/configs/configs.go b/app/configs/configs.go index ecc22ff..31e6b22 100644 --- a/app/configs/configs.go +++ b/app/configs/configs.go @@ -1,7 +1,6 @@ package configs import ( - "fmt" "os" "sync" ) @@ -9,6 +8,7 @@ import ( type AppConfig struct { Name string Env string + Port string } type DbConfig struct { @@ -35,13 +35,13 @@ var lock = &sync.Mutex{} var configs *Configs func GetInstance() *Configs { - fmt.Println("[CONFIG] : ", &configs) if configs == nil { lock.Lock() configs = &Configs{ Appconfig: AppConfig{ Name: os.Getenv("APP_NAME"), Env: os.Getenv("APP_ENV"), + Port: os.Getenv("APP_PORT"), }, Dbconfig: DbConfig{ Host: os.Getenv("DB_HOST"), @@ -58,5 +58,6 @@ func GetInstance() *Configs { } lock.Unlock() } + // fmt.Println("[CONFIG] : ", &configs) return configs } diff --git a/app/handlers/home.handler.go b/app/controllers/home/home.controller.go similarity index 95% rename from app/handlers/home.handler.go rename to app/controllers/home/home.controller.go index 00ab0c5..6c0f391 100644 --- a/app/handlers/home.handler.go +++ b/app/controllers/home/home.controller.go @@ -1,4 +1,4 @@ -package handlers +package home import ( "github.com/ajikamaludin/go-fiber-rest/app/configs" diff --git a/app/handlers/note.handler.go b/app/controllers/note/note.controller.go similarity index 80% rename from app/handlers/note.handler.go rename to app/controllers/note/note.controller.go index e13e274..b19ba68 100644 --- a/app/handlers/note.handler.go +++ b/app/controllers/note/note.controller.go @@ -1,9 +1,8 @@ -package handlers +package note import ( - "time" - "github.com/ajikamaludin/go-fiber-rest/app/models" + noteRepository "github.com/ajikamaludin/go-fiber-rest/app/repository/note" gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db" redisclient "github.com/ajikamaludin/go-fiber-rest/pkg/redis.client" "github.com/ajikamaludin/go-fiber-rest/pkg/utils/constants" @@ -14,19 +13,13 @@ import ( func GetAllNotes(c *fiber.Ctx) error { var notes []models.Note - err := redisclient.Get("allnotes", ¬es) + err := noteRepository.GetAllNotes(¬es) if err != nil { - db, err := gormdb.GetInstance() - if err != nil { - return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ - "status": constants.STATUS_FAIL, - "message": "Internal Service Error", - "error": err.Error(), - }) - } - db.Find(¬es) - - redisclient.Set("allnotes", ¬es, 30*time.Second) + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "status": constants.STATUS_FAIL, + "message": "Internal Service Error", + "error": err.Error(), + }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ @@ -40,25 +33,13 @@ func GetNoteById(c *fiber.Ctx) error { id := c.Params("id") note := models.Note{} - key := "note+" + id - err := redisclient.Get(key, ¬e) + err := noteRepository.GetNoteById(id, ¬e) if err != nil { - db, err := gormdb.GetInstance() - - if err != nil { - return err - } - - err = db.First(¬e, id).Error - - if err != nil { - return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ - "status": constants.STATUS_FAIL, - "message": "note not found", - }) - } - - redisclient.Set(key, ¬e, 30*time.Second) + return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{ + "status": constants.STATUS_FAIL, + "message": "note not found", + "error": err.Error(), + }) } return c.Status(fiber.StatusOK).JSON(fiber.Map{ diff --git a/app/repository/note/note.repository.go b/app/repository/note/note.repository.go new file mode 100644 index 0000000..dbb6846 --- /dev/null +++ b/app/repository/note/note.repository.go @@ -0,0 +1,44 @@ +package note + +import ( + "time" + + "github.com/ajikamaludin/go-fiber-rest/app/models" + gormdb "github.com/ajikamaludin/go-fiber-rest/pkg/gorm.db" + redisclient "github.com/ajikamaludin/go-fiber-rest/pkg/redis.client" +) + +func GetAllNotes(notes *[]models.Note) error { + err := redisclient.Get("allnotes", ¬es) + if err != nil { + db, err := gormdb.GetInstance() + if err != nil { + return err + } + db.Find(¬es) + + redisclient.Set("allnotes", ¬es, 30*time.Second) + } + return nil +} + +func GetNoteById(id string, note *models.Note) error { + key := "note+" + id + err := redisclient.Get(key, ¬e) + if err != nil { + db, err := gormdb.GetInstance() + + if err != nil { + return err + } + + err = db.First(¬e, id).Error + + if err != nil { + return err + } + + redisclient.Set(key, ¬e, 30*time.Second) + } + return nil +} diff --git a/main.go b/main.go index 84534aa..67ff90d 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,13 @@ package main import ( + "fmt" "log" - "github.com/ajikamaludin/go-fiber-rest/app/handlers" + "github.com/ajikamaludin/go-fiber-rest/app/configs" + apiRoute "github.com/ajikamaludin/go-fiber-rest/routers/api/v1" + exceptionRoute "github.com/ajikamaludin/go-fiber-rest/routers/exception" + homeRoute "github.com/ajikamaludin/go-fiber-rest/routers/home" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/recover" "github.com/joho/godotenv" @@ -18,15 +22,14 @@ func main() { app := fiber.New() app.Use(recover.New()) - // route here - app.Get("/", handlers.Home) + // default here : / + homeRoute.HomeRoutes(app) + // api route : api/v1 + apiRoute.ApiRoutes(app) + // handle 404 + exceptionRoute.Routes(app) - // route Note - app.Get("/notes", handlers.GetAllNotes) - app.Post("/notes", handlers.CreateNote) - app.Get("/notes/:id", handlers.GetNoteById) - app.Put("/notes/:id", handlers.UpdateNote) - app.Delete("/notes/:id", handlers.DeleteNote) - - log.Fatal(app.Listen(":3000")) + config := configs.GetInstance().Appconfig + listenPort := fmt.Sprintf(":%v", config.Port) + log.Fatal(app.Listen(listenPort)) } diff --git a/pkg/gorm.db/gorm.db.go b/pkg/gorm.db/gorm.db.go index c77f2f0..4d0a9fe 100644 --- a/pkg/gorm.db/gorm.db.go +++ b/pkg/gorm.db/gorm.db.go @@ -14,7 +14,7 @@ var lock = &sync.Mutex{} var db *gorm.DB func GetInstance() (*gorm.DB, error) { - fmt.Println("[DATABASE] : ", db) + // fmt.Println("[DATABASE] : ", db) if db == nil { configs := configs.GetInstance() diff --git a/pkg/redis.client/redis.client.go b/pkg/redis.client/redis.client.go index 805480c..e823a9e 100644 --- a/pkg/redis.client/redis.client.go +++ b/pkg/redis.client/redis.client.go @@ -16,7 +16,7 @@ var rdb *redis.Client var ctx = context.Background() func GetInstance() *redis.Client { - fmt.Println("[REDIS] : ", &rdb) + // fmt.Println("[REDIS] : ", &rdb) if rdb == nil { configs := configs.GetInstance() addr := fmt.Sprintf("%s:%s", configs.Redisconfig.Host, configs.Redisconfig.Port) @@ -33,7 +33,7 @@ func GetInstance() *redis.Client { func Get(key string, model interface{}) error { redis := GetInstance() - fmt.Println("[REDIS][READ] : ", key) + // fmt.Println("[REDIS][READ] : ", key) renotes, err := redis.Get(ctx, key).Result() if err != nil { return err @@ -49,7 +49,7 @@ func Get(key string, model interface{}) error { func Set(key string, model interface{}, expired time.Duration) error { redis := GetInstance() - fmt.Println("[REDIS][WRITE] : ", key) + // fmt.Println("[REDIS][WRITE] : ", key) val, err := json.Marshal(&model) if err != nil { return err @@ -65,6 +65,6 @@ func Set(key string, model interface{}, expired time.Duration) error { func Remove(key string) error { redis := GetInstance() - fmt.Println("[REDIS][REMOVE] : ", key) + // fmt.Println("[REDIS][REMOVE] : ", key) return redis.Do(ctx, "DEL", key).Err() } diff --git a/routers/api/v1/routes.go b/routers/api/v1/routes.go new file mode 100644 index 0000000..597c0e8 --- /dev/null +++ b/routers/api/v1/routes.go @@ -0,0 +1,16 @@ +package apiv1 + +import ( + noteController "github.com/ajikamaludin/go-fiber-rest/app/controllers/note" + "github.com/gofiber/fiber/v2" +) + +func ApiRoutes(app *fiber.App) { + route := app.Group("/api/v1") + + route.Get("/notes", noteController.GetAllNotes) + route.Post("/notes", noteController.CreateNote) + route.Get("/notes/:id", noteController.GetNoteById) + route.Put("/notes/:id", noteController.UpdateNote) + route.Delete("/notes/:id", noteController.DeleteNote) +} diff --git a/routers/exception/routes.go b/routers/exception/routes.go new file mode 100644 index 0000000..3e69a74 --- /dev/null +++ b/routers/exception/routes.go @@ -0,0 +1,13 @@ +package http + +import "github.com/gofiber/fiber/v2" + +func Routes(app *fiber.App) { + app.Use( + func(c *fiber.Ctx) error { + return c.Status(fiber.StatusNotFound).JSON(fiber.Map{ + "message": "Not Found", + }) + }, + ) +} diff --git a/routers/home/routes.go b/routers/home/routes.go new file mode 100644 index 0000000..8dfd4a2 --- /dev/null +++ b/routers/home/routes.go @@ -0,0 +1,12 @@ +package home + +import ( + homeController "github.com/ajikamaludin/go-fiber-rest/app/controllers/home" + "github.com/gofiber/fiber/v2" +) + +func HomeRoutes(app *fiber.App) { + route := app.Group("/") + + route.Get("/", homeController.Home) +}