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..9cc6da8 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 on the process") +} diff --git a/internal/app/server/server.go b/internal/app/server/server.go index 5844fe1..42ec4a4 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 }