Fork me on GitHub
#pathom
<
2020-08-10
>
Tyler Nisonoff17:08:26

can a pathom mutation utilize resolvers to load data, or can it only utilize parameters explicitly passed to it? for example, if I pass a user/id to the mutation, can i use my already written resolves to load other fields, or would i have to load them from explicitly from whatever data-source I’m using?

souenzzo17:08:26

@tylernisonoff you can do

(pc/defmutation do-thing [{:keys [parser]
                           :as   env} {:user/keys [id]}]
  {::pc/params [:user/id]}
  (let [eid [:user/id id]
        user-with-address (-> env
                              (parser [{eid [:user/id
                                             :user/address]}])
                              (get eid))]
    ...))
Yeah, I agree with you that pc could implement something like ::pc/resolved-params that take ::pc/params as input and resolve it.

souenzzo12:08:02

Using ::pc/transform

(let [connect-params (fn [{::pc/keys [mutate]
                           ::keys    [connected-params]
                           :as       mutation}]
                       (if connected-params
                         (assoc mutation
                           ::pc/mutate (fn [{:keys [parser] :as env}
                                            [eid & {:as others}]]
                                         (let [result (parser env `[{(~eid ~{:pathom/context others})
                                                                     ~connected-params}])]
                                           (mutate env (get result eid)))))
                         mutation))
      parser (ps/connect-serial-parser
               [(pc/mutation
                  `op {::pc/params        [:a]
                       ::connected-params [:a :b]
                       ::pc/transform     connect-params}
                  (fn [_ params] params))
                (pc/resolver
                  `b {::pc/input #{:a} ::pc/output [:b]}
                  (fn [_ {:keys [a]}]
                    {:b (str [:b a])}))])]
  (parser {} `[(op {:a 42})]))