Skip to content

Commit 583ea28

Browse files
authored
add data to ipfs through server (#461)
1 parent 062b5ea commit 583ea28

12 files changed

Lines changed: 74 additions & 39 deletions

File tree

server/src/ethlance/server/graphql/resolvers.cljs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
(ns ethlance.server.graphql.resolvers
22
(:require
33
[camel-snake-kebab.core]
4+
[cljs-ipfs-api.files :as ipfs-files]
45
[clojure.string :as string]
56
[district.graphql-utils :as graphql-utils]
67
[district.server.async-db :as db :include-macros true]
@@ -9,6 +10,7 @@
910
[ethlance.server.db :as ethlance-db]
1011
[ethlance.server.event-replay-queue :as replay-queue]
1112
[ethlance.server.graphql.authorization :as authorization]
13+
[ethlance.server.ipfs :as ipfs]
1214
[ethlance.server.syncer :as syncer]
1315
[ethlance.shared.spec :refer [validate-keys]]
1416
[honeysql.core :as sql]
@@ -1261,6 +1263,30 @@
12611263
user)))
12621264

12631265

1266+
(defn data-to-buffer [data]
1267+
(let [matcher (re-matches #"data:(\w+/\w+);base64,(.+)" data)]
1268+
(if matcher
1269+
(let [base64-image (get matcher 2)]
1270+
(js/Buffer.from base64-image "base64"))
1271+
(ipfs/to-buffer data))))
1272+
1273+
1274+
(defn upload-data-mutation
1275+
[_ {:keys [data]} _]
1276+
(js/Promise.
1277+
(fn [resolve reject]
1278+
(ipfs-files/add (data-to-buffer data)
1279+
(fn [error result]
1280+
(if (or error (empty? result))
1281+
(let [err-txt "Error when adding data to ipfs"]
1282+
(log/error err-txt {:result result
1283+
:error error
1284+
:data data}
1285+
:upload-data-mutation)
1286+
(println ">>> upload-data-mutation REJECT")
1287+
(reject err-txt))
1288+
(resolve (:Hash result))))))))
1289+
12641290
(defn replay-events
12651291
[_ _ _]
12661292
(db/with-async-resolver-tx conn
@@ -1363,6 +1389,7 @@
13631389
:removeJobProposal (require-auth remove-job-proposal-mutation)
13641390
:replayEvents replay-events
13651391
:githubSignUp (require-auth github-signup-mutation)
1366-
:linkedinSignUp (require-auth linkedin-signup-mutation)}
1392+
:linkedinSignUp (require-auth linkedin-signup-mutation)
1393+
:uploadData (require-auth upload-data-mutation)}
13671394
;; :Date ; TODO: https://www.apollographql.com/docs/apollo-server/schema/custom-scalars/#example-the-date-scalar
13681395
})

server/src/ethlance/server/graphql/server.cljs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
;; NOTE: the order off how we are applying middlewares matter
4747
app (doto (express)
48-
(.use (.json body-parser))
48+
(.use (.json body-parser #js {:limit "2mb"}))
4949
(.use middlewares/current-user-express-middleware))
5050

5151
server (new ApolloServer

shared/src/ethlance/shared/graphql/schema.cljs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@
194194
replayEvents: Boolean!,
195195
githubSignUp(input: githubSignUpInput!): githubSignUpPayload!
196196
linkedinSignUp(input: linkedinSignUpInput!): linkedinSignUpPayload!
197+
uploadData(data: String!): ID!
197198
}
198199
199200
# mutation result types

ui/src/ethlance/ui/effects.cljs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
(ns ethlance.ui.effects
22
(:require
33
[cljs-web3.core :as web3]
4+
[district.ui.graphql.events :as gql-events]
5+
[ethlance.ui.events]
46
[re-frame.core :as re]))
57

68

@@ -16,3 +18,12 @@
1618
(if err
1719
(re/dispatch (conj on-error err))
1820
(re/dispatch (conj on-success (aget result "result"))))))))
21+
22+
23+
(re/reg-fx
24+
:data/upload
25+
(fn [{:keys [:data :on-success :on-error]}]
26+
(re/dispatch [::gql-events/mutation
27+
{:queries [[:upload-data {:data (if (string? data) data (pr-str data))}]]
28+
:on-success [:ethlance/data-upload-success on-success]
29+
:on-error on-error}])))

ui/src/ethlance/ui/events.cljs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,8 @@
5757
[:page.invoices/initialize-page]
5858
[:page.new-invoice/initialize-page]]
5959
:dispatch-later [{:ms 1000 :dispatch [::listen-account-changes]}]})))
60+
61+
(re/reg-event-fx
62+
:ethlance/data-upload-success
63+
(fn [_ [_ on-success result]]
64+
{:dispatch (conj on-success {:Hash (:upload-data result)})}))

ui/src/ethlance/ui/page/invoices/events.cljs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,9 @@
3232
(re/reg-event-fx
3333
:page.invoices/pay
3434
(fn [_ [_ invoice]]
35-
{:ipfs/call {:func "add"
36-
:args [(js/Blob. [invoice])]
37-
:on-success [::invoice-to-ipfs-success invoice]
38-
:on-error [::invoice-to-ipfs-failure invoice]}}))
35+
{:data/upload {:data invoice
36+
:on-success [::invoice-to-ipfs-success invoice]
37+
:on-error [::invoice-to-ipfs-failure invoice]}}))
3938

4039

4140
(re/reg-event-fx

ui/src/ethlance/ui/page/job_contract/events.cljs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,9 @@
144144
:job-story/id job-story-id
145145
:invoice/id invoice-id}]
146146
{:fx [[:dispatch [::set-buttons-disabled true]]]
147-
:ipfs/call {:func "add"
148-
:args [(js/Blob. [ipfs-dispute])]
149-
:on-success [:page.job-contract/raise-dispute-to-ipfs-success ipfs-dispute]
150-
:on-error [::dispute-to-ipfs-failure invoice-id]}}))
147+
:data/upload {:data ipfs-dispute
148+
:on-success [:page.job-contract/raise-dispute-to-ipfs-success ipfs-dispute]
149+
:on-error [::dispute-to-ipfs-failure invoice-id]}}))
151150

152151

153152
(re/reg-event-fx
@@ -186,10 +185,9 @@
186185
:message/creator (:employer proposal-data)
187186
:text (:text proposal-data)}]
188187
{:fx [[:dispatch [::set-buttons-disabled true]]]
189-
:ipfs/call {:func "add"
190-
:args [(js/Blob. [to-ipfs])]
191-
:on-success [:accept-proposal-to-ipfs-success to-ipfs]
192-
:on-error [::accept-proposal-to-ipfs-failure to-ipfs]}})))
188+
:data/upload {:data to-ipfs
189+
:on-success [:accept-proposal-to-ipfs-success to-ipfs]
190+
:on-error [::accept-proposal-to-ipfs-failure to-ipfs]}})))
193191

194192

195193
(re/reg-event-fx
@@ -273,10 +271,9 @@
273271
:job/id job-id
274272
:job-story/id job-story-id
275273
:invoice/id invoice-id}]
276-
{:ipfs/call {:func "add"
277-
:args [(js/Blob. [ipfs-dispute])]
278-
:on-success [:page.job-contract/resolve-dispute-to-ipfs-success event]
279-
:on-error [::dispute-to-ipfs-failure event]}}))
274+
{:data/upload {:data ipfs-dispute
275+
:on-success [:page.job-contract/resolve-dispute-to-ipfs-success event]
276+
:on-error [::dispute-to-ipfs-failure event]}}))
280277

281278

282279
(defn send-resolve-dispute-tx

ui/src/ethlance/ui/page/job_detail/events.cljs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@
216216
:job-arbiter/fee
217217
:job-arbiter/fee-currency-id])]
218218
{:fx [[:dispatch [::set-arbiter-tx-in-progress true]]]
219-
:ipfs/call {:func "add"
220-
:args [(js/Blob. [ipfs-arbitration])]
221-
:on-success [:page.job-detail/arbitration-to-ipfs-success event]
222-
:on-error [::arbitration-to-ipfs-failed]}}))
219+
:data/upload {:data ipfs-arbitration
220+
:on-success [:page.job-detail/arbitration-to-ipfs-success event]
221+
:on-error [::arbitration-to-ipfs-failed]}}))
223222

224223

225224
(re/reg-event-fx

ui/src/ethlance/ui/page/new_invoice/events.cljs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,10 @@
102102
:message/text (:message db-invoice)
103103
:job/id (-> db-invoice :invoiced-job :job/id)
104104
:job-story/id (-> db-invoice :invoiced-job :job-story/id parse-int)}]
105-
{:fx [[:dispatch [::set-tx-in-progress true]]
106-
[:ipfs/call {:func "add"
107-
:args [(js/Blob. [ipfs-invoice])]
108-
:on-success [::invoice-to-ipfs-success ipfs-invoice]
109-
:on-error [::invoice-to-ipfs-failure ipfs-invoice]}]]})))
105+
{:fx [[:dispatch [::set-tx-in-progress true]]]
106+
:data/upload {:data ipfs-invoice
107+
:on-success [::invoice-to-ipfs-success ipfs-invoice]
108+
:on-error [::invoice-to-ipfs-failure ipfs-invoice]}})))
110109

111110

112111
(re/reg-event-fx

ui/src/ethlance/ui/page/new_job/events.cljs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,9 @@
206206
(fn [{:keys [db]}]
207207
(let [db-job (get db state-key)
208208
ipfs-job (reduce-kv (partial db-job->ipfs-job db-job) {} db->ipfs-mapping)]
209-
{:fx [[:ipfs/call {:func "add"
210-
:args [(js/Blob. [ipfs-job])]
211-
:on-success [::job-to-ipfs-success]
212-
:on-error [::job-to-ipfs-failure]}]]})))
209+
{:data/upload {:data ipfs-job
210+
:on-success [::job-to-ipfs-success]
211+
:on-error [::job-to-ipfs-failure]}})))
213212

214213

215214
(re/reg-event-fx

0 commit comments

Comments
 (0)