From 7eb9e93f226b832e6e38c2f7658b5988733900ff Mon Sep 17 00:00:00 2001 From: zrshishir Date: Mon, 20 Dec 2021 17:55:16 +0600 Subject: [PATCH] carrier request api publisher done --- internal/app/model/entities.go | 15 ++++++++++++ internal/app/server/handler.go | 42 +++++++++++++++++++++++++++++++++- internal/app/server/server.go | 2 ++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/internal/app/model/entities.go b/internal/app/model/entities.go index 8aa341a..19d9743 100644 --- a/internal/app/model/entities.go +++ b/internal/app/model/entities.go @@ -21,6 +21,13 @@ 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 +47,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..fa57dc8 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) { @@ -34,5 +36,43 @@ func (s *server) createParcel(w http.ResponseWriter, r *http.Request) { return } - SuccessResponse(w, http.StatusOK, "your parcel is being created withing some moments") + SuccessResponse(w, http.StatusOK, "your parcel request is on process") } + +func (s *server) addCarrierRequest(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 + 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 request is on process") +} + diff --git a/internal/app/server/server.go b/internal/app/server/server.go index 5844fe1..c64e256 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}/request").HandlerFunc(s.addCarrierRequest) + return r }