Add endpoint for updating link

This commit is contained in:
Andrey Chervyakov 2021-03-16 00:45:13 +06:00
parent 9ae733e618
commit 8a23425826
3 changed files with 70 additions and 5 deletions

View file

@ -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)

View file

@ -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()

View file

@ -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)