devops/go

swagger 수정

꼬락이 2024. 11. 29. 16:26

이제 swagger서 로그인을 한 후 이 토큰을 받아서 ChangePassword에 넣으면 된다. 그런데 기존에 우리가 구현한 화면에서는 토큰 값을 넣는 곳이 없으므로 swagger에 이 부분을 추가해줘야 한다.

 

일단 swagger부터 교환해야 하겠다. 기존에 사용하던것은 middleware에서 swagger를 이용하는 것인데 이렇게 하다보니까 cache때문에 즉각적으로 교환이 되지 않는 문제가 있었다. 그래서 router를 만들어서 추가하는 방법으로 변경하겠다.

 

routes/swagger.go

package routes

import (
    "github.com/gofiber/fiber/v2"
    "github.com/gofiber/swagger"
)

func SwaggerRouter(app fiber.Router) {

    app.Get("/docs/*", swagger.HandlerDefault)
}

 

 

api/handlers/user.go

package handlers

import (
    "camping-backend-with-go/api/presenter"
    "camping-backend-with-go/pkg/entities"
    "camping-backend-with-go/pkg/user"
    "github.com/gofiber/fiber/v2"
    "net/http"
)

// ChangePassword is a function to ChangePassword
// @Summary ChangePassword
// @Description ChangePassword
// @Tags Users
// @Accept json
// @Produce json
// @Param user body entities.ChangePasswordInputSchema true "Change Password"
// @Success 200 {object} presenter.JsonResponse{}
// @Failure 503 {object} presenter.JsonResponse{}
// @Router /user/changepw [put]
// @Security Bearer
func ChangePassword(service user.Service) fiber.Handler {
    return func(c *fiber.Ctx) error {
       var requestBody entities.ChangePasswordInputSchema
       var jsonResponse presenter.JsonResponse

       // parsing error
       if err := c.BodyParser(&requestBody); err != nil {
          jsonResponse = presenter.JsonResponse{
             Status: false,
             Data:   nil,
             Error:  err.Error(),
          }
          return c.Status(http.StatusBadRequest).JSON(jsonResponse)
       }

       //oldPassword := requestBody.OldPassword
       newPassword := requestBody.NewPassword
       newPasswordConfirm := requestBody.NewPasswordConfirm

       // user가 존재하지 않음
       // service -> repository 에서 처리
       err := service.ChangePassword(&requestBody, c)
       if err != nil {
          jsonResponse = presenter.JsonResponse{
             Status: false,
             Data:   nil,
             Error:  err.Error(),
          }
          return c.Status(http.StatusBadRequest).JSON(jsonResponse)
       }

       // newPassword와 newPasswordConfirm이 다름
       // => 400 error
       if newPassword != newPasswordConfirm {
          jsonResponse = presenter.JsonResponse{
             Status: false,
             Data:   nil,
             Error:  "password didn't not match",
          }
          return c.Status(http.StatusBadRequest).JSON(jsonResponse)
       }

       jsonResponse = presenter.JsonResponse{
          Status: true,
          Data:   "success change password",
          Error:  "",
       }
       return c.Status(http.StatusOK).JSON(jsonResponse)
    }
}

 

main.go

package main

import (
    "camping-backend-with-go/api/routes"
    _ "camping-backend-with-go/docs"
    "camping-backend-with-go/pkg/entities"
    "camping-backend-with-go/pkg/healthcheck"
    "camping-backend-with-go/pkg/proxy"
    "camping-backend-with-go/pkg/spot"
    "camping-backend-with-go/pkg/user"
    "github.com/gofiber/fiber/v2/middleware/cors"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "log"
    "os"

    "github.com/gofiber/fiber/v2"
)

// @title ggocamping App
// @version 1.0
// @description This is an API for ggocamping Application

// @contact.name ggorockee
// @contact.email ggorockee@gmail.com

// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html

// @BasePath /v1
// @securityDefinitions.apikey Bearer
// @in header
// @name Authorization
// @description Type "Bearer" followed by a space and JWT token.
func main() {
    db := databaseConnection()

    healthcheckService := healthcheck.NewService()

    userRepo := user.NewRepo(db)
    userService := user.NewService(userRepo)

    spotRepo := spot.NewRepo(db)
    spotService := spot.NewService(spotRepo)

    app := fiber.New()
    app.Use(cors.New())

    // swagger settings
    //swaggerCfg := swagger.Config{
    // BasePath: "/v1",
    // FilePath: "./docs/swagger.json",
    // Path:     "docs",
    //}
    //app.Use(swagger.New(swaggerCfg))

    v1 := app.Group("/v1")

    routes.UserRouter(v1, userService)
    routes.AuthRouter(v1, userService)
    routes.SpotRouter(v1, spotService)
    routes.SwaggerRouter(v1)
    routes.HealthCheckRouter(v1, healthcheckService)
    log.Fatal(app.Listen(":3000"))
}

func databaseConnection() *gorm.DB {
    // Local에서 Teleport 작업할 때만 사용
    // 배포시에는 comment 활성화
    if err := os.Setenv("PROXY", "false"); err != nil {
       log.Println(err.Error())
    }

    dsn := proxy.GetProxyDatabase()
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

    if err != nil {
       log.Fatal("Failed to connect to database. \n", err)
       os.Exit(2)
    }

    log.Println("connected")
    err = db.AutoMigrate(
       &entities.Spot{},
       &entities.User{},
    )
    if err != nil {
       log.Println(err.Error())
    }

    return db
}

 

일단 로그인을 하자.

 

로그인을 하면 이렇게 토큰값을 뱉어주는데 이 값을 복사해서

 

 

Authentication에 붙여주자. 이 때 앞에 Bearer를 붙여주는것을 잊지 말자.

 

그리고 ChangePassword를 인증하면 된다.

 

결과는 다음과 같다.

 

정상적으로 작동하는 것을 볼 수 있다.