package controller import ( "fmt" "net/http" "strconv" "github.com/gin-gonic/gin" "github.com/swaggo/swag/example/celler/httputil" "github.com/swaggo/swag/example/celler/model" ) // ShowAccount godoc // // @Summary Show an account // @Description get string by ID // @Tags accounts // @Accept json // @Produce json // @Param id path int true "Account ID" // @Success 200 {object} model.Account // @Failure 400 {object} httputil.HTTPError // @Failure 404 {object} httputil.HTTPError // @Failure 500 {object} httputil.HTTPError // @Router /accounts/{id} [get] func (c *Controller) ShowAccount(ctx *gin.Context) { id := ctx.Param("id") aid, err := strconv.Atoi(id) if err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } account, err := model.AccountOne(aid) if err != nil { httputil.NewError(ctx, http.StatusNotFound, err) return } ctx.JSON(http.StatusOK, account) } // ListAccounts godoc // // @Summary List accounts // @Description get accounts // @Tags accounts // @Accept json // @Produce json // @Param q query string false "name search by q" Format(email) // @Success 200 {array} model.Account // @Failure 400 {object} httputil.HTTPError // @Failure 404 {object} httputil.HTTPError // @Failure 500 {object} httputil.HTTPError // @Router /accounts [get] func (c *Controller) ListAccounts(ctx *gin.Context) { q := ctx.Request.URL.Query().Get("q") accounts, err := model.AccountsAll(q) if err != nil { httputil.NewError(ctx, http.StatusNotFound, err) return } ctx.JSON(http.StatusOK, accounts) } // AddAccount godoc // // @Summary Add an account // @Description add by json account // @Tags accounts // @Accept json // @Produce json // @Param account body model.AddAccount true "Add account" // @Success 200 {object} model.Account // @Failure 400 {object} httputil.HTTPError // @Failure 404 {object} httputil.HTTPError // @Failure 500 {object} httputil.HTTPError // @Router /accounts [post] func (c *Controller) AddAccount(ctx *gin.Context) { var addAccount model.AddAccount if err := ctx.ShouldBindJSON(&addAccount); err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } if err := addAccount.Validation(); err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } account := model.Account{ Name: addAccount.Name, } lastID, err := account.Insert() if err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } account.ID = lastID ctx.JSON(http.StatusOK, account) } // UpdateAccount godoc // // @Summary Update an account // @Description Update by json account // @Tags accounts // @Accept json // @Produce json // @Param id path int true "Account ID" // @Param account body model.UpdateAccount true "Update account" // @Success 200 {object} model.Account // @Failure 400 {object} httputil.HTTPError // @Failure 404 {object} httputil.HTTPError // @Failure 500 {object} httputil.HTTPError // @Router /accounts/{id} [patch] func (c *Controller) UpdateAccount(ctx *gin.Context) { id := ctx.Param("id") aid, err := strconv.Atoi(id) if err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } var updateAccount model.UpdateAccount if err := ctx.ShouldBindJSON(&updateAccount); err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } account := model.Account{ ID: aid, Name: updateAccount.Name, } err = account.Update() if err != nil { httputil.NewError(ctx, http.StatusNotFound, err) return } ctx.JSON(http.StatusOK, account) } // DeleteAccount godoc // // @Summary Delete an account // @Description Delete by account ID // @Tags accounts // @Accept json // @Produce json // @Param id path int true "Account ID" Format(int64) // @Success 204 {object} model.Account // @Failure 400 {object} httputil.HTTPError // @Failure 404 {object} httputil.HTTPError // @Failure 500 {object} httputil.HTTPError // @Router /accounts/{id} [delete] func (c *Controller) DeleteAccount(ctx *gin.Context) { id := ctx.Param("id") aid, err := strconv.Atoi(id) if err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } err = model.Delete(aid) if err != nil { httputil.NewError(ctx, http.StatusNotFound, err) return } ctx.JSON(http.StatusNoContent, gin.H{}) } // UploadAccountImage godoc // // @Summary Upload account image // @Description Upload file // @Tags accounts // @Accept multipart/form-data // @Produce json // @Param id path int true "Account ID" // @Param file formData file true "account image" // @Success 200 {object} controller.Message // @Failure 400 {object} httputil.HTTPError // @Failure 404 {object} httputil.HTTPError // @Failure 500 {object} httputil.HTTPError // @Router /accounts/{id}/images [post] func (c *Controller) UploadAccountImage(ctx *gin.Context) { id, err := strconv.Atoi(ctx.Param("id")) if err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } file, err := ctx.FormFile("file") if err != nil { httputil.NewError(ctx, http.StatusBadRequest, err) return } ctx.JSON(http.StatusOK, Message{Message: fmt.Sprintf("upload complete userID=%d filename=%s", id, file.Filename)}) }