From a56bc98df71690cb2f228963cc5afb18b367e1b2 Mon Sep 17 00:00:00 2001 From: Albert Luganga Date: Fri, 23 Oct 2020 01:55:57 +0300 Subject: [PATCH] add transfer endpoints --- api/server.go | 4 +++ api/transfer.go | 92 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 api/transfer.go diff --git a/api/server.go b/api/server.go index 2a44d5c..74118b7 100644 --- a/api/server.go +++ b/api/server.go @@ -20,6 +20,10 @@ func NewServer(store *db.Store) *Server { router.GET("/accounts", server.listAccounts) router.GET("/accounts/:id", server.getAccount) + router.POST("/transfers", server.createTransfer) + router.GET("/transfers", server.listTransfers) + router.GET("/transfers/:id", server.getTransfer) + server.router = router return server } diff --git a/api/transfer.go b/api/transfer.go new file mode 100644 index 0000000..cbbee0d --- /dev/null +++ b/api/transfer.go @@ -0,0 +1,92 @@ +package api + +import ( + "database/sql" + "net/http" + + db "github.com/phalbert/simplebank/db/sqlc" + + "github.com/gin-gonic/gin" +) + +type createTransferRequest struct { + FromAccountID int64 `json:"from_account_id" binding:"required"` + ToAccountID int64 `json:"to_account_id" binding:"required"` + Amount int64 `json:"amount" binding:"required"` +} + +func (server *Server) createTransfer(ctx *gin.Context) { + var req createTransferRequest + if err := ctx.ShouldBindJSON(&req); err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + arg := db.TransferTxParams{ + FromAccountID: req.FromAccountID, + ToAccountID: req.ToAccountID, + Amount: req.Amount, + } + + transfer, err := server.store.TransferTx(ctx, arg) + if err != nil { + ctx.JSON(http.StatusInternalServerError, errorResponse(err)) + return + } + + ctx.JSON(http.StatusOK, transfer) +} + +type getTransferRequest struct { + ID int64 `uri:"id" binding:"required,min=1"` +} + +func (server *Server) getTransfer(ctx *gin.Context) { + var req getTransferRequest + if err := ctx.ShouldBindUri(&req); err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + transfer, err := server.store.GetTransfer(ctx, req.ID) + if err != nil { + if err == sql.ErrNoRows { + ctx.JSON(http.StatusNotFound, errorResponse(err)) + return + } + ctx.JSON(http.StatusInternalServerError, errorResponse(err)) + return + } + + ctx.JSON(http.StatusOK, transfer) +} + +type listTransfersRequest struct { + Page int32 `form:"page" binding:"required,min=1"` + Size int32 `form:"size" binding:"required,min=5,max=100"` +} + +func (server *Server) listTransfers(ctx *gin.Context) { + var req listTransfersRequest + if err := ctx.ShouldBindQuery(&req); err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + arg := db.ListTransfersParams{ + Limit: req.Size, + Offset: (req.Page - 1) * req.Size, + } + + transfers, err := server.store.ListTransfers(ctx, arg) + if err != nil { + if err == sql.ErrNoRows { + ctx.JSON(http.StatusNotFound, errorResponse(err)) + return + } + ctx.JSON(http.StatusInternalServerError, errorResponse(err)) + return + } + + ctx.JSON(http.StatusOK, transfers) +}