Skip to content

Commit

Permalink
Implement GraphQL API base
Browse files Browse the repository at this point in the history
  • Loading branch information
lagenorhynque committed Dec 23, 2018
1 parent 4ecfc19 commit 5e62c34
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 7 deletions.
43 changes: 36 additions & 7 deletions dev/src/dev.clj
@@ -1,23 +1,52 @@
(ns dev
(:refer-clojure :exclude [test])
(:require [clojure.repl :refer :all]
[fipp.edn :refer [pprint]]
(:require [clojure.java.io :as io]
[clojure.repl :refer :all]
[clojure.spec.alpha :as s]
[clojure.tools.namespace.repl :refer [refresh]]
[clojure.java.io :as io]
[com.walmartlabs.lacinia :as lacinia]
[duct.core :as duct]
[duct.core.repl :as duct-repl]
[eftest.runner :as eftest]
[fipp.edn :refer [pprint]]
[integrant.core :as ig]
[integrant.repl :refer [clear halt go init prep reset]]
[integrant.repl.state :refer [config system]]))
[integrant.repl :refer [clear halt go init prep]]
[integrant.repl.state :refer [config system]]
[orchestra.spec.test :as stest]))

(duct/load-hierarchy)

(defn read-config []
(duct/read-config (io/resource "dev.edn")))

(defn test []
(eftest/run-tests (eftest/find-tests "test")))
(defn reset []
(let [result (integrant.repl/reset)]
(with-out-str (stest/instrument))
result))

;;; unit testing

(defn test
([]
(eftest/run-tests (eftest/find-tests "test")
{:multithread? false}))
([sym]
(eftest/run-tests (eftest/find-tests sym)
{:multithread? false})))

;;; DB access

(defn db-run [f & args]
(apply f (:duct.database.sql/hikaricp system) args))

;;; GraphQL

(defn q [query-string]
(-> system
:aqoursql.graphql/schema
(lacinia/execute query-string nil nil)))

;;; namespace settings

(clojure.tools.namespace.repl/set-refresh-dirs "dev/src" "src" "test")

Expand Down
49 changes: 49 additions & 0 deletions resources/aqoursql/graphql-schema.edn
@@ -0,0 +1,49 @@
{:objects
{:Member
{:description "メンバー"
:fields
{:id {:type (non-null Int)
:description "メンバーID"}
:name {:type (non-null String)
:description "メンバー名"}
:organization_id {:type (non-null Int)
:description "所属組織ID"}
:organization_name {:type (non-null String)
:description "所属組織名"}}}

:Artist
{:description "アーティスト"
:fields
{:id {:type (non-null Int)
:description "アーティストID"}
:type {:type (non-null Int)
:description "アーティストタイプ (1: グループ, 2: ソロ)"}
:name {:type (non-null String)
:description "アーティスト名"}
:members {:type (list :Member)
:description "メンバー一覧"
:resolve :Artist/members}}}

:Song
{:description "楽曲"
:fields
{:id {:type (non-null Int)
:description "楽曲ID"}
:name {:type (non-null String)
:description "楽曲名"}
:artist_id {:type (non-null Int)
:description "アーティストID"}
:artist {:type (non-null :Artist)
:description "アーティスト"
:resolve :Song/artist}
:release_date {:type (non-null String)
:description "リリース日 (YYYY-MM-DD)"}}}}

:queries
{:member_by_id
{:type :Member
:description "IDによるメンバー取得"
:args
{:id {:type (non-null Int)
:description "メンバーID"}}
:resolve :query/member-by-id}}}
27 changes: 27 additions & 0 deletions src/aqoursql/graphql.clj
@@ -0,0 +1,27 @@
(ns aqoursql.graphql
(:require [clojure.edn :as edn]
[clojure.java.io :as io]
[com.walmartlabs.lacinia.pedestal :as lacinia]
[com.walmartlabs.lacinia.schema :as schema]
[com.walmartlabs.lacinia.util :as util]
[integrant.core :as ig]))

(def resolver-map
{;; TODO: implement fetch-member-by-id resolver
:query/member-by-id (constantly nil)
;; TODO: implement list-artist-members resolver
:Artist/members (constantly [])
;; TODO: implement fetch-artist-by-id resolver
:Song/artist (constantly nil)})

(defmethod ig/init-key ::schema
[_ _]
(-> (io/resource "aqoursql/graphql-schema.edn")
slurp
edn/read-string
(util/attach-resolvers resolver-map)
schema/compile))

(defmethod ig/init-key ::service
[_ {:keys [schema options]}]
(lacinia/service-map schema options))

0 comments on commit 5e62c34

Please sign in to comment.