From eeca4277255b3dfd568c8c42724e18c1efe1ac24 Mon Sep 17 00:00:00 2001 From: log101 Date: Mon, 5 Aug 2024 10:18:15 +0300 Subject: [PATCH] refactor: move handlers to seperate file --- handlers/handlers.go | 112 +++++++++++++++++++++++++++++++++++++++++++ server.go | 108 ++--------------------------------------- 2 files changed, 116 insertions(+), 104 deletions(-) create mode 100644 handlers/handlers.go diff --git a/handlers/handlers.go b/handlers/handlers.go new file mode 100644 index 0000000..248e0be --- /dev/null +++ b/handlers/handlers.go @@ -0,0 +1,112 @@ +package handlers + +import ( + "fmt" + "io" + "os" + "strings" + + DB "log101/konulu-konum-backend/db" + "log101/konulu-konum-backend/models" + + "github.com/dchest/uniuri" + "github.com/gofiber/fiber/v2" + "github.com/h2non/bimg" + "gorm.io/gorm" +) + +func KonuluKonumCreate(c *fiber.Ctx) error { + if form, err := c.MultipartForm(); err == nil { + // Get form values + author := form.Value["author"][0] + description := form.Value["description"][0] + geolocation := fmt.Sprintf("[%s]", form.Value["geolocation"][0]) + + file := form.File["selected-photo"][0] + fmt.Println(file.Filename, file.Size, file.Header["Content-Type"][0]) + + newFile, err := file.Open() + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + defer newFile.Close() + + data, err := io.ReadAll(newFile) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + + // Compress image + newImage, err := bimg.NewImage(data).Convert(bimg.WEBP) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + + imageName := strings.Split(file.Filename, ".")[0] + imagePath := fmt.Sprintf("./public/%s.webp", imageName) + imageURL := fmt.Sprintf("%s.webp", imageName) + err = bimg.Write(imagePath, newImage) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + // Generate public uri for the image + chars := uniuri.StdChars[26:52] + randomUri := uniuri.NewLenChars(10, chars) + imageUri := fmt.Sprintf("%s-%s-%s", randomUri[0:3], randomUri[3:7], randomUri[7:]) + + db := DB.GetDB() + db.Create(&models.KonuluKonum{URI: imageUri, ImageURL: imageURL, Coordinates: geolocation, AuthorName: author, Description: description, UnlockedCounter: 0}) + + return c.JSON(fiber.Map{ + "url": imageUri, + }) + } + + return c.SendStatus(fiber.StatusBadRequest) +} + +func KonuluKonumGet(c *fiber.Ctx) error { + uri := c.Params("locationUri") + if len(uri) == 0 { + return c.SendStatus(fiber.StatusBadRequest) + } + + var konuluKonum models.KonuluKonum + db := DB.GetDB() + rows := db.Where("URI = ?", uri).First(&konuluKonum) + if rows.Error != nil { + return c.SendStatus(fiber.StatusInternalServerError) + } + + return c.JSON(fiber.Map{ + "url": konuluKonum.URI, + "blob_url": konuluKonum.ImageURL, + "loc": konuluKonum.Coordinates, + "author": konuluKonum.AuthorName, + "description": konuluKonum.Description, + "unlocked_counter": konuluKonum.UnlockedCounter, + }) +} + +func KonuluKonumUpdateCounter(c *fiber.Ctx) error { + uri := c.Params("locationUri") + if len(uri) == 0 { + return c.SendStatus(fiber.StatusBadRequest) + } + + var konuluKonum models.KonuluKonum + db := DB.GetDB() + rows := db.Where("URI = ?", uri).First(&konuluKonum) + if rows.Error != nil { + return c.SendStatus(fiber.StatusNotFound) + } + + rows = db.Model(&konuluKonum).Where("uri = ?", uri).UpdateColumn("unlocked_counter", gorm.Expr("unlocked_counter + 1")) + if rows.Error != nil { + c.SendStatus(fiber.StatusInternalServerError) + } + + return c.JSON(fiber.Map{ + "counter": konuluKonum.ID, + }) +} diff --git a/server.go b/server.go index c884f50..13cbb31 100644 --- a/server.go +++ b/server.go @@ -1,22 +1,14 @@ package main import ( - "fmt" - "io" "log" DB "log101/konulu-konum-backend/db" - "log101/konulu-konum-backend/models" - "strings" + "log101/konulu-konum-backend/handlers" - "os" - - "github.com/dchest/uniuri" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/logger" - "github.com/h2non/bimg" "github.com/joho/godotenv" - "gorm.io/gorm" ) func main() { @@ -28,7 +20,6 @@ func main() { // initialize db DB.InitDB() - db := DB.GetDB() app := fiber.New() app.Use(logger.New()) @@ -37,102 +28,11 @@ func main() { })) app.Static("/images", "./public") - app.Get("/", func(c *fiber.Ctx) error { - return c.SendString("Sample") - }) + app.Post("/api/location", handlers.KonuluKonumCreate) - app.Post("/api/location", func(c *fiber.Ctx) error { - if form, err := c.MultipartForm(); err == nil { - // Get form values - author := form.Value["author"][0] - description := form.Value["description"][0] - geolocation := fmt.Sprintf("[%s]", form.Value["geolocation"][0]) + app.Get("/api/location/:locationUri", handlers.KonuluKonumGet) - file := form.File["selected-photo"][0] - fmt.Println(file.Filename, file.Size, file.Header["Content-Type"][0]) - - newFile, err := file.Open() - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - defer newFile.Close() - - data, err := io.ReadAll(newFile) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - - // Compress image - newImage, err := bimg.NewImage(data).Convert(bimg.WEBP) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - - imageName := strings.Split(file.Filename, ".")[0] - imagePath := fmt.Sprintf("./public/%s.webp", imageName) - imageURL := fmt.Sprintf("%s.webp", imageName) - err = bimg.Write(imagePath, newImage) - if err != nil { - fmt.Fprintln(os.Stderr, err) - } - // Generate public uri for the image - chars := uniuri.StdChars[26:52] - randomUri := uniuri.NewLenChars(10, chars) - imageUri := fmt.Sprintf("%s-%s-%s", randomUri[0:3], randomUri[3:7], randomUri[7:]) - - db.Create(&models.KonuluKonum{URI: imageUri, ImageURL: imageURL, Coordinates: geolocation, AuthorName: author, Description: description, UnlockedCounter: 0}) - - return c.JSON(fiber.Map{ - "url": imageUri, - }) - } - - return c.SendStatus(fiber.StatusBadRequest) - }) - - app.Get("/api/location/:locationUri", func(c *fiber.Ctx) error { - uri := c.Params("locationUri") - if len(uri) == 0 { - return c.SendStatus(fiber.StatusBadRequest) - } - - var konuluKonum models.KonuluKonum - rows := db.Where("URI = ?", uri).First(&konuluKonum) - if rows.Error != nil { - return c.SendStatus(fiber.StatusInternalServerError) - } - - return c.JSON(fiber.Map{ - "url": konuluKonum.URI, - "blob_url": konuluKonum.ImageURL, - "loc": konuluKonum.Coordinates, - "author": konuluKonum.AuthorName, - "description": konuluKonum.Description, - "unlocked_counter": konuluKonum.UnlockedCounter, - }) - }) - - app.Patch("/api/location/increment/:locationUri", func(c *fiber.Ctx) error { - uri := c.Params("locationUri") - if len(uri) == 0 { - return c.SendStatus(fiber.StatusBadRequest) - } - - var konuluKonum models.KonuluKonum - rows := db.Where("URI = ?", uri).First(&konuluKonum) - if rows.Error != nil { - return c.SendStatus(fiber.StatusNotFound) - } - - rows = db.Model(&konuluKonum).Where("uri = ?", uri).UpdateColumn("unlocked_counter", gorm.Expr("unlocked_counter + 1")) - if rows.Error != nil { - c.SendStatus(fiber.StatusInternalServerError) - } - - return c.JSON(fiber.Map{ - "counter": konuluKonum.ID, - }) - }) + app.Patch("/api/location/increment/:locationUri", handlers.KonuluKonumUpdateCounter) app.Listen(":3456")