diff --git a/internal/accessor/ads/impl.go b/internal/accessor/ads/impl.go index f6d367f..9125259 100644 --- a/internal/accessor/ads/impl.go +++ b/internal/accessor/ads/impl.go @@ -12,6 +12,7 @@ type accessor struct { type Ads interface { Create(adsdomain.Ads) error GetAll() ([]adsdomain.Ads, error) + Update(adsdomain.Ads) error Delete(string) error } diff --git a/internal/accessor/ads/update.go b/internal/accessor/ads/update.go new file mode 100644 index 0000000..925fdf0 --- /dev/null +++ b/internal/accessor/ads/update.go @@ -0,0 +1,31 @@ +package adsrepository + +import ( + "fmt" + adsdomain "legalgo-BE-go/internal/domain/ads" + + "gorm.io/gorm/clause" +) + +func (a *accessor) Update(spec adsdomain.Ads) error { + if err := a.db.Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "id"}}, + DoUpdates: clause.AssignmentColumns([]string{ + "image_url", + "url", + "updated_at", + "start_date", + "end_date", + }), + }).Select( + "image_url", + "url", + "updated_at", + "start_date", + "end_date", + ).Save(&spec).Error; err != nil { + return fmt.Errorf("failed to update tag: %v", err) + } + + return nil +} diff --git a/internal/api/http/ads/module.go b/internal/api/http/ads/module.go index fd214a4..cb81050 100644 --- a/internal/api/http/ads/module.go +++ b/internal/api/http/ads/module.go @@ -5,5 +5,6 @@ import "go.uber.org/fx" var Module = fx.Module("ads-http", fx.Invoke( Create, GetAll, + Update, Delete, )) diff --git a/internal/api/http/ads/update.go b/internal/api/http/ads/update.go new file mode 100644 index 0000000..bdae12d --- /dev/null +++ b/internal/api/http/ads/update.go @@ -0,0 +1,82 @@ +package adshttp + +import ( + "fmt" + authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" + adsdomain "legalgo-BE-go/internal/domain/ads" + adssvc "legalgo-BE-go/internal/services/ads" + "legalgo-BE-go/internal/utilities/response" + "legalgo-BE-go/internal/utilities/utils" + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-playground/validator/v10" +) + +func Update( + router chi.Router, + validate *validator.Validate, + adsSvc adssvc.Ads, +) { + router. + With(authmiddleware.Authorize()). + Put("/ads/{ads_id}/update", func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + adsID := chi.URLParam(r, "ads_id") + + if adsID == "" { + response.RespondJsonErrorWithCode( + ctx, + w, + fmt.Errorf("ads id is not provided"), + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + "ads id is not provided", + ) + return + } + + var spec adsdomain.AdsReq + if err := utils.UnmarshalBody(r, &spec); err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + "failed to unmarshal body", + ) + return + } + + if err := validate.Struct(spec); err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.(validator.ValidationErrors).Error(), + ) + return + } + + if err := adsSvc.Update(adsID, spec); err != nil { + response.RespondJsonErrorWithCode( + ctx, + w, + err, + response.ErrBadRequest.Code, + response.ErrBadRequest.HttpCode, + err.Error(), + ) + return + } + + response.RespondJsonSuccess(ctx, w, struct { + Message string + }{ + Message: "update ads success", + }) + }) +} diff --git a/internal/services/ads/impl.go b/internal/services/ads/impl.go index 7bca408..0042992 100644 --- a/internal/services/ads/impl.go +++ b/internal/services/ads/impl.go @@ -12,6 +12,7 @@ type impl struct { type Ads interface { Create(adsdomain.AdsReq) error GetAll() ([]adsdomain.Ads, error) + Update(string, adsdomain.AdsReq) error Delete(string) error } diff --git a/internal/services/ads/update.go b/internal/services/ads/update.go new file mode 100644 index 0000000..fcde3e4 --- /dev/null +++ b/internal/services/ads/update.go @@ -0,0 +1,19 @@ +package adssvc + +import ( + adsdomain "legalgo-BE-go/internal/domain/ads" + timeutils "legalgo-BE-go/internal/utilities/time_utils" +) + +func (i *impl) Update(adsID string, spec adsdomain.AdsReq) error { + newsSpec := adsdomain.Ads{ + ID: adsID, + ImageUrl: spec.Image, + Url: spec.URL, + UpdatedAt: timeutils.Now(), + StartDate: spec.StartDate, + EndDate: spec.EndDate, + } + + return i.adsRepo.Update(newsSpec) +}