naomijub / gXTDB

gRPC Plugin for XTDB
MIT License
7 stars 0 forks source link

[Clojure] Improve Error Handling #16

Open naomijub opened 1 year ago

naomijub commented 1 year ago

As a User I want to have proper error handling in the Clojure gRPC side Currently we rely on Protojure grpc interceptor to handle errors So we need to implement an interceptor to handle gXTDB errors as well as XDTB transaction errors

naomijub commented 1 year ago
;; protojure/pedestal/interceptor/grpc.clj
(def error-interceptor
  (err/error-dispatch
   [ctx ex]

   [{:exception-type ::status/error}]
   (let [{:keys [code msg]} (ex-data ex)]
     (err-status ctx code msg))

   :else
   (err-status ctx (grpc.status/get-code :internal) (ex-message ex))))

;; protojure/pedestal/routes.clj
(defn ->tablesyntax
  "Generates routes in [Table Syntax](http://pedestal.io/reference/table-syntax) format"
  [{:keys [rpc-metadata interceptors callback-context] :as options}]
  (for [{:keys [pkg service method method-fn] :as rpc} rpc-metadata]
    (let [fqs (str pkg "." service)
          name (keyword fqs (str method "-handler"))
          handler (handler name (partial method-fn callback-context))]
      [(str "/" fqs "/" method)
       :post (-> (consv grpc/error-interceptor interceptors)
                 (conj grpc.web/proxy
                       (grpc/route-interceptor rpc)
                       handler))
       :route-name name])))

;; gxtdb.service.clj
(defn grpc-routes [xtdb-node] (reduce conj routes (proutes/->tablesyntax {:rpc-metadata api/rpc-metadata :interceptors common-interceptors :callback-context (GrpcAPI. xtdb-node)})))