From 8a234258269c4a06dc927088780fbb02dcb96e05 Mon Sep 17 00:00:00 2001 From: Andrey Chervyakov Date: Tue, 16 Mar 2021 00:45:13 +0600 Subject: [PATCH] Add endpoint for updating link --- link/handlers.go | 33 ++++++++++++++++++++++++++++----- link/repository.go | 33 +++++++++++++++++++++++++++++++++ link/service.go | 9 +++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/link/handlers.go b/link/handlers.go index da5fc13..6892a35 100644 --- a/link/handlers.go +++ b/link/handlers.go @@ -5,6 +5,7 @@ import ( "github.com/jackc/pgx/v4/pgxpool" "github.com/labstack/echo/v4" "net/http" + "net/url" "strconv" ) @@ -82,7 +83,7 @@ func allRetrievalHandler(c echo.Context, serv *PgService) error { return c.JSON(http.StatusOK, models) } -/*func updateHandler(c echo.Context, serv *PgService) error { +func updateHandler(c echo.Context, serv *PgService) error { linkId := c.Param("id") var model UpdateModel @@ -90,13 +91,35 @@ func allRetrievalHandler(c echo.Context, serv *PgService) error { return echo.NewHTTPError(http.StatusBadRequest, "Invalid data format.") } - l, err := serv.GetById(linkId) + updatingLink, err := serv.GetById(linkId) if err != nil { return err } + hasChanges := false + switch { + case model.Name != "" && model.Name != updatingLink.Name: + updatingLink.Name = model.Name + + hasChanges = true + case model.RedirectURL != "" && model.RedirectURL != updatingLink.RedirectURL.String(): + if parsedUrl, err := url.Parse(model.RedirectURL); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "Invalid URL value.") + } else { + updatingLink.RedirectURL = *parsedUrl + } + + hasChanges = true + } + + if hasChanges { + if err = serv.Update(updatingLink); err != nil { + return err + } + } + return c.NoContent(http.StatusOK) -}*/ +} func removalHandler(c echo.Context, serv *PgService) error { linkId := c.Param("id") @@ -126,9 +149,9 @@ func AddHandlers(s *echo.Echo, pool *pgxpool.Pool) { return retrievalByIdHandler(ctx, &serv) }) - /*exactLinkGroup.PATCH("", func(ctx echo.Context) error { + exactLinkGroup.PATCH("", func(ctx echo.Context) error { return updateHandler(ctx, &serv) - })*/ + }) exactLinkGroup.DELETE("", func(ctx echo.Context) error { return removalHandler(ctx, &serv) diff --git a/link/repository.go b/link/repository.go index f07792e..6ab2fb2 100644 --- a/link/repository.go +++ b/link/repository.go @@ -16,6 +16,7 @@ type Repository interface { Save(link *Link) error FindById(id string) (*Link, error) FindAll(limit int, offset int) (Links, error) + Update(link *Link) error DeleteById(id string) error } @@ -135,6 +136,38 @@ func (r *PgRepository) FindAll(limit int, offset int) (Links, error) { return links, nil } +func (r *PgRepository) Update(link *Link) error { + if link.Id == "" { + return errors.New("link ID must not be empty") + } + + ctx, cancel := context.WithTimeout(context.Background(), defaultContextTimeout) + defer cancel() + + tx, err := r.pool.Begin(ctx) + if err != nil { + return err + } + + sql := ` + UPDATE links + SET name = $1, redirect_url = $2 + WHERE id = $3 + ` + + _, err = tx.Exec(ctx, sql, link.Name, link.RedirectURL.String(), link.Id) + if err != nil { + _ = tx.Rollback(ctx) + return err + } + + if err = tx.Commit(ctx); err != nil { + return err + } + + return nil +} + func (r *PgRepository) DeleteById(id string) error { ctx, cancel := context.WithTimeout(context.Background(), defaultContextTimeout) defer cancel() diff --git a/link/service.go b/link/service.go index 3c89321..f6acee1 100644 --- a/link/service.go +++ b/link/service.go @@ -10,6 +10,7 @@ type Service interface { Create(link *Link) error GetById(id string) (*Link, error) GetAll(limit int, offset int) (Links, error) + Update(data *Link) error DeleteById(id string) error } @@ -72,6 +73,14 @@ func (s *PgService) GetAll(limit int, offset int) (Links, error) { return links, nil } +func (s *PgService) Update(data *Link) error { + if err := s.rep.Update(data); err != nil { + return apperrors.UnknownError{Err: err} + } + + return nil +} + func (s *PgService) DeleteById(id string) error { s.cache.Delete(id)