// Post ...
func (r *RequestResource) Post() http.HandlerFunc {
	return func(rw http.ResponseWriter, req *http.Request) {
		apiIncomingRequest, err := r.DecodeInputRequest(req.Body)
		if err != nil {
			log.Printf("incoming-request-decode-error: %v", err)
			http.Error(rw, err.Error(), http.StatusBadRequest)
			return
		}

		err = r.ValidateIncomingRequest(apiIncomingRequest)
		if err != nil {
			log.Printf("incoming-request-validation-error: %v", err)
			http.Error(rw, err.Error(), http.StatusBadRequest)
			return
		}

		inReq := download.FromAPIIncomingRequest(apiIncomingRequest)
		downloadRequest, err := r.RequestService.ProcessNewRequest(inReq)

		if err != nil {
			log.Printf("request-processing-error: %v", err)
			rw.Header().Set("Content-Type", "application/json")
			rw.WriteHeader(http.StatusInternalServerError)
			encoder := json.NewEncoder(rw)
			encErr := encoder.Encode(r.WrapError(err))
			if encErr != nil {
				log.Printf("encode-error: %v", encErr)
			}
		} else {
			newURL, _ := r.GetRequestURL(downloadRequest.ID)
			rw.Header().Set("Content-Type", "application/json")
			rw.Header().Set("Location", newURL.String())
			rw.WriteHeader(http.StatusAccepted)
			encoder := json.NewEncoder(rw)
			dr := download.ToAPIRequest(downloadRequest)
			r.populateLinks(req, dr)
			encErr := encoder.Encode(dr)
			if encErr != nil {
				log.Printf("encode-error: %v", encErr)
			}

		}
	}
}
// Get ...
func (r *RequestResource) Get() http.HandlerFunc {
	return func(rw http.ResponseWriter, req *http.Request) {
		vars := mux.Vars(req)
		requestID := vars["id"]

		downloadRequest, err := r.RequestService.FindByID(requestID)

		encoder := json.NewEncoder(rw)
		rw.Header().Set("Content-Type", "application/json")

		if err != nil {
			log.Printf("server-error: %v", err)
			rw.WriteHeader(http.StatusInternalServerError)
			encErr := encoder.Encode(r.WrapError(err))
			if encErr != nil {
				log.Printf("encode-error: %v", encErr)
			}
		} else if downloadRequest != nil {
			rw.WriteHeader(http.StatusOK)
			dr := download.ToAPIRequest(downloadRequest)
			r.populateLinks(req, dr)
			encErr := encoder.Encode(dr)
			if encErr != nil {
				log.Printf("encode-error: %v", encErr)
			}
		} else {
			errMessage := fmt.Sprintf("Unable to find request with id:%s", requestID)
			log.Printf("server-error: %v", errMessage)

			rw.WriteHeader(http.StatusNotFound)
			encErr := encoder.Encode(errors.New(errMessage))
			if encErr != nil {
				log.Printf("encode-error: %v", encErr)
			}
		}
	}
}