From 4d3a579a5192cbe2c324adcb70bd513c133aad48 Mon Sep 17 00:00:00 2001 From: zrshishir Date: Sat, 25 Dec 2021 10:54:02 +0600 Subject: [PATCH] update api status publisher is done --- internal/app/model/entities.go | 16 ++++++++++++++ internal/app/server/handler.go | 40 ++++++++++++++++++++++++++++++++++ internal/app/server/server.go | 2 ++ 3 files changed, 58 insertions(+) diff --git a/internal/app/model/entities.go b/internal/app/model/entities.go index 8aa341a..85af898 100644 --- a/internal/app/model/entities.go +++ b/internal/app/model/entities.go @@ -21,6 +21,14 @@ type Parcel struct { UpdatedAt time.Time `json:"updated_at" db:"updated_at"` } +type CarrierRequest struct { + ID int `json:"id"` + ParcelID int `json:"parcel_id" db:"parcel_id"` + CarrierID int `json:"carrier_id" db:"carrier_id"` + Status int `json:"status" db:"status"` +} + + func (p *Parcel) ValidateParcelInput() error { if p.SourceAddress == "" { return fmt.Errorf("source Address is required :%w", ErrEmpty) @@ -40,3 +48,11 @@ func (p *Parcel) ValidateParcelInput() error { return nil } + +// Validates carrier request input credentials +func (cr *CarrierRequest) ValidateCarrierId() error { + if cr.CarrierID == 0 { + return fmt.Errorf("Carrier ID is required :%w", ErrEmpty) + } + return nil +} diff --git a/internal/app/server/handler.go b/internal/app/server/handler.go index 90d14f3..8e46783 100644 --- a/internal/app/server/handler.go +++ b/internal/app/server/handler.go @@ -3,8 +3,10 @@ package server import ( "CreateParcelApi/internal/app/model" "encoding/json" + "github.com/gorilla/mux" "github.com/rs/zerolog/log" "net/http" + "strconv" ) func (s *server) createParcel(w http.ResponseWriter, r *http.Request) { @@ -36,3 +38,41 @@ func (s *server) createParcel(w http.ResponseWriter, r *http.Request) { SuccessResponse(w, http.StatusOK, "your parcel is being created withing some moments") } + +func (s *server) parcelCarrierAccept(w http.ResponseWriter, r *http.Request) { + var data model.CarrierRequest + vars := mux.Vars(r) + + if err := json.NewDecoder(r.Body).Decode(&data); err != nil { + ErrUnprocessableEntityResponse(w, "Decode Error", err) + return + } + parcelID, err := strconv.Atoi(vars["id"]) + if err != nil { + ErrInvalidEntityResponse(w, "Invalid Parcel ID", err) + return + } + data.ParcelID = parcelID + + // validating input credentials for parcel request + if err := data.ValidateCarrierId(); err != nil { + ErrInvalidEntityResponse(w, "Invalid Input", err) + return + } + + message, err := json.Marshal(data) + if err != nil { + log.Error().Err(err).Msg("json marshal failed") + ErrUnprocessableEntityResponse(w, "bad request", err) + return + } + + err = s.publisherService.Push(message) + if err != nil { + log.Error().Err(err).Msg("failed to publish message") + ErrInternalServerResponse(w, "Failed to publish message", err) + return + } + + SuccessResponse(w, http.StatusOK, "your parcel accept request is being created withing some moments") +} diff --git a/internal/app/server/server.go b/internal/app/server/server.go index 5844fe1..7ed0877 100644 --- a/internal/app/server/server.go +++ b/internal/app/server/server.go @@ -31,6 +31,8 @@ func (s *server) route() *mux.Router { //apiRoute := r.PathPrefix("/api/v1").Subrouter() r.Methods(http.MethodGet).Path("/ping").HandlerFunc(s.pingHandler) r.Methods(http.MethodPost).Path("/api/v1/parcel").HandlerFunc(s.createParcel) + r.Methods(http.MethodPost).Path("/api/v1/parcel/{id}/accept").HandlerFunc(s.parcelCarrierAccept) + return r }