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를 인증하면 된다.
결과는 다음과 같다.
정상적으로 작동하는 것을 볼 수 있다.