Fork me on GitHub
#pathom
<
2019-12-05
>
wilkerlucio02:12:14

Hello everybody, I just released pathom 2.2.28, in this version: • fix bounded recursive queries on parallel parser @mroerni • connect mutations add the key ::pc/mutation-ast to env , @splayemu you can use this now to see the source mutation when doing follow up reads

❤️ 20
Spencer Apple02:12:00

ah great, thanks for your work!

🤙 8
souenzzo10:12:55

Mutation ast will be awesome for ingá :)

fjolne13:12:27

Hi there! I’m trying to get a root resolver for ::current-user, which is resolved from the ::current-session, which doesn’t require any inputs. So, instead of having to write [{::current-session [{:session/user [:user/id]}]}] every time, I want to be able to get the same result by [::current-user]. Seems like it would require to be able to resolve attributes inside of the resolver itself, something like

(defresolver current-user-resolver [_ {::keys [current-session]}]
  {::pc/input #{{::current-session [{:session/user [:user/id]}]}}
   ::pc/output [{::current-user [:user/id]}]}
  {::current-user (select-keys (:session/user current-session) [:user/id])})

(defresolver session-resolver [{:keys [db]} {:session/keys [id]}]
  {::pc/input  #{:session/id}
   ::pc/output [{:session/user [:user/id]}]}
  (d/pull db [{:session/user [:user/id]}] [:session/id id]))

(defresolver current-session-resolver [{{:keys [session]} :ring/request} _]
  {::pc/output [{::current-session [:session/id]}]}
  {::current-session (select-keys session [:session/id])})
Is there a way to achieve that without writing a custom DB query (given that Pathom Connect knows how to get the needed data)?

wilkerlucio12:12:55

I guess what you are looking for is nested inputs, this is something I like to support, but not there yet, there is a way around it now, you can do a manual call to the parser with the input sub-query, something like this:

(defresolver current-user-resolver [{:keys [parser] :as env} {::keys [current-session]}]
  {::pc/input  #{::current-session}
   ::pc/output [{::current-user [:user/id]}]}
  ; note: if you are using async or parallel parsers, the parser return is a channel and
  ; you have to add code to wait for it
  (let [current-session (-> (parser env [{::current-session [{:session/user [:user/id]}]}])
                            ::current-session)]
   {::current-user (select-keys (:session/user current-session) [:user/id])}))

(defresolver session-resolver [{:keys [db]} {:session/keys [id]}]
  {::pc/input  #{:session/id}
   ::pc/output [{:session/user [:user/id]}]}
  (d/pull db [{:session/user [:user/id]}] [:session/id id]))

(defresolver current-session-resolver [{{:keys [session]} :ring/request} _]
  {::pc/output [{::current-session [:session/id]}]}
  {::current-session (select-keys session [:session/id])})

fjolne05:12:33

Yes, thank you! That’s what I was looking for (and also for the approval that I’m not misunderstanding some principles).