code: func ArticleCtx(next http.Handler) http.Handler {
  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  		var article *Article
  		var err error
  
  		if articleID := chi.URLParam(r, "articleID"); articleID != "" {
  			article, err = dbGetArticle(articleID)
  		} else if articleSlug := chi.URLParam(r, "articleSlug"); articleSlug != "" {
  			article, err = dbGetArticleBySlug(articleSlug)
  		} else {
  			render.Render(w, r, ErrNotFound)
  			return
  		}
  		if err != nil {
  			render.Render(w, r, ErrNotFound)
  			return
  		}
  
  		ctx := context.WithValue(r.Context(), "article", article)
  		next.ServeHTTP(w, r.WithContext(ctx))
  	})
  }
docs: // ArticleCtx middleware is used to load an Article object from
  // the URL parameters passed through as the request. In case
  // the Article could not be found, we stop here and return a 404.