From ba079a44e056d7173fd62a3f95b0c201015aef16 Mon Sep 17 00:00:00 2001 From: itsscb Date: Thu, 21 Sep 2023 22:51:21 +0200 Subject: [PATCH] add http routes accounts (#19) --- api/account.go | 104 ++++++++++++++++++++++++++++++++++++++++++++++++- api/server.go | 4 ++ 2 files changed, 107 insertions(+), 1 deletion(-) diff --git a/api/account.go b/api/account.go index 810cb8f..46be565 100644 --- a/api/account.go +++ b/api/account.go @@ -1,7 +1,109 @@ package api -import "github.com/gin-gonic/gin" +import ( + "database/sql" + "net/http" + "time" + + "github.com/gin-gonic/gin" + db "github.com/itsscb/df/db/sqlc" +) + +type createAccountRequest struct { + Passwordhash string `binding:"required" json:"passwordhash"` + Firstname string `binding:"required" json:"firstname"` + Lastname string `binding:"required" json:"lastname"` + Birthday time.Time `binding:"required" json:"birthday"` + Email string `binding:"required" json:"email"` + Phone string `json:"phone"` + City string `binding:"required" json:"city"` + Zip string `binding:"required" json:"zip"` + Street string `binding:"required" json:"street"` + Country string `binding:"required" json:"country"` +} func (server *Server) createAccount(ctx *gin.Context) { + var req createAccountRequest + if err := ctx.ShouldBindJSON(&req); err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + arg := db.CreateAccountParams{ + Passwordhash: req.Passwordhash, + Firstname: req.Firstname, + Lastname: req.Lastname, + Birthday: req.Birthday, + Email: req.Email, + City: req.City, + Zip: req.Zip, + Street: req.Street, + Country: req.Country, + Creator: "system", + Phone: sql.NullString{ + Valid: req.Phone != "", + String: req.Phone, + }, + } + + account, err := server.store.CreateAccount(ctx, arg) + if err != nil { + ctx.JSON(http.StatusInternalServerError, errorResponse(err)) + return + } + + ctx.JSON(http.StatusOK, account) +} + +type getAccountRequest struct { + ID int64 `uri:"id" binding:"required,min=1" json:"id"` +} + +func (server *Server) getAccount(ctx *gin.Context) { + var req getAccountRequest + + if err := ctx.ShouldBindUri(&req); err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + account, err := server.store.GetAccount(ctx, req.ID) + if err != nil { + if err == sql.ErrNoRows { + ctx.JSON(http.StatusNotFound, errorResponse(err)) + return + } + + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + ctx.JSON(http.StatusOK, account) +} + +type listAccountRequest struct { + PageID int32 `form:"pageid" binding:"required,min=1"` + PageSize int32 `form:"pagesize" binding:"required,min=5,max=50"` +} + +func (server *Server) listAccounts(ctx *gin.Context) { + var req listAccountRequest + + if err := ctx.ShouldBindQuery(&req); err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + arg := db.ListAccountsParams{ + Limit: req.PageSize, + Offset: (req.PageID - 1) * req.PageSize, + } + + accounts, err := server.store.ListAccounts(ctx, arg) + if err != nil { + ctx.JSON(http.StatusBadRequest, errorResponse(err)) + return + } + + ctx.JSON(http.StatusOK, accounts) } diff --git a/api/server.go b/api/server.go index 3f1eb55..d18d215 100644 --- a/api/server.go +++ b/api/server.go @@ -19,6 +19,10 @@ func NewServer(store *db.Store) *Server { router := gin.Default() + router.POST("/accounts", server.createAccount) + router.GET("/accounts/:id", server.getAccount) + router.GET("/accounts", server.listAccounts) + server.router = router return server }