Browse Source

feat: Set up reitit routes and serve static index

Miguel Ángel Moreno 2 years ago
parent
commit
25365baa90
3 changed files with 113 additions and 75 deletions
  1. 3 2
      src/backend/tau/core.clj
  2. 110 0
      src/backend/tau/http.clj
  3. 0 73
      src/backend/tau/services/http.clj

+ 3 - 2
src/backend/tau/core.clj

@@ -1,10 +1,11 @@
 (ns tau.core
+  (:gen-class)
   (:require
-   [tau.services.http :as http]))
+   [tau.http :as http]))
 
 (defn -main
   [& _]
-  (http/start-server! 3000))
+  (http/start-server!))
 
 (defn reset
   []

+ 110 - 0
src/backend/tau/http.clj

@@ -0,0 +1,110 @@
+(ns tau.http
+  (:require
+   [org.httpkit.server :refer [run-server]]
+   [ring.middleware.reload :refer [wrap-reload]]
+   [ring.middleware.params :refer [wrap-params]]
+   [ring.middleware.json :refer [wrap-json-response]]
+   [ring.middleware.cors :refer [wrap-cors]]
+   [ring.util.response :refer [response]]
+   [reitit.ring :as ring]
+   [reitit.coercion :as coercion]
+   [reitit.ring.coercion :as rrc]
+   [reitit.coercion.malli]
+   [clojure.string :as str]
+   [malli.experimental.lite :as l]
+   [hiccup.page :as hiccup]
+   [tau.api.stream :as stream]
+   [tau.api.search :as search]
+   [tau.api.channel :as channel]
+   [tau.api.playlist :as playlist]
+   [tau.api.comment :as comment]
+   [tau.api.kiosk :as kiosk]
+   [tau.api.service :as service])
+  (:import
+   tau.DownloaderImpl
+   org.schabi.newpipe.extractor.NewPipe
+   org.schabi.newpipe.extractor.localization.Localization))
+
+(defn index-html
+  []
+  (hiccup/html5
+   [:head
+    [:meta {:charset "UTF-8"}]
+    [:meta {:name "viewport" :content "width=device-width, initial-scale=1"}]
+    [:title "Tau"]
+    (hiccup/include-css "/css/output.css")]
+   [:body
+    [:div#app]
+    (hiccup/include-js "/js/main.js")
+    [:script "tau.core.init();"]]))
+
+(defonce server (atom nil))
+
+(def router
+  (ring/router
+   [["/" (constantly (response (index-html)))]
+    ["/search" (constantly (response (index-html)))]
+    ["/stream" (constantly (response (index-html)))]
+    ["/channel" (constantly (response (index-html)))]
+    ["/api"
+     ["/stream" {:get (fn [{{:strs [url]} :query-params}]
+                        (response (stream/get-info url)))}]
+     ["/search" {:get {:coercion reitit.coercion.malli/coercion
+                       :parameters {:query {:serviceId int?
+                                            :q string?
+                                            ;; :sortFilter (l/maybe string?)
+                                            ;; :contentFilters (l/maybe string?)
+                                            ;; :nextPage (l/maybe string?)
+                                            }}
+                       :handler (fn [{:keys [parameters]}]
+                                  (let [{:keys [contentFilters serviceId q sortFilter nextPage]} (:query parameters)
+                                        content-filters (and contentFilters (str/split contentFilters #","))]
+                                    (response (apply search/get-info serviceId q
+                                                     content-filters sortFilter
+                                                     (or nextPage '())))))}}]
+     ["/channel" {:get (fn [{{:keys [url nextPage]} :query-params}]
+                         (response (channel/get-info url nextPage)))}]
+     ["/playlist" {:get (fn [{{:keys [url nextPage]} :query-params}]
+                          (response (playlist/get-info url nextPage)))}]
+     ["/comments" {:get (fn [{{:keys [url nextPage]} :query-params}]
+                          (response (apply comment/get-info url (or nextPage '()))))}]
+     ["/services" {:get (constantly (response (service/get-services)))}]
+     ["/kiosks"
+      ["" {:coercion reitit.coercion.malli/coercion
+           :parameters {:query {:serviceId int?}}
+           :get (fn [{:keys [parameters]}]
+                  (println parameters)
+                  (response (kiosk/get-kiosks (-> parameters :query :serviceId))))}]
+      ["/:kioskId" {:get {:coercion reitit.coercion.malli/coercion
+                          :parameters {:query {:serviceId int?}}
+                          :handler (fn [{{:keys [kioskId serviceId nextPage]} :query-params}]
+                                     (response (kiosk/get-info kioskId serviceId nextPage)))}}]]]]
+   ;;{:compile coercion/compile-request-coercers}
+   {:data {:middleware [rrc/coerce-request-middleware
+                        rrc/coerce-response-middleware
+                        rrc/coerce-exceptions-middleware]}}))
+
+(def app
+  (ring/ring-handler
+   router
+   (ring/routes
+    (ring/create-resource-handler {:path "/"})
+    (ring/create-default-handler
+     {:not-found (constantly {:status 404, :body "Not found"})}))
+   {:middleware [wrap-params
+                 [wrap-json-response {:pretty true}]
+                 wrap-reload]}))
+
+(defn stop-server!
+  []
+  (when @server
+    (@server :timeout 100)
+    (reset! server nil)))
+
+(defn start-server!
+  ([]
+   (start-server! 3000))
+  ([port]
+   (NewPipe/init (DownloaderImpl/init) (Localization. "en" "GB"))
+   (reset! server (run-server #'app {:port port}))
+   (println "Server running in port" port)))

+ 0 - 73
src/backend/tau/services/http.clj

@@ -1,73 +0,0 @@
-(ns tau.services.http
-  (:require
-   [org.httpkit.server :refer [run-server]]
-   [ring.middleware.reload :refer [wrap-reload]]
-   [ring.middleware.params :refer [wrap-params]]
-   [ring.middleware.json :refer [wrap-json-response]]
-   [ring.util.response :refer [response]]
-   [compojure.route :as route]
-   [compojure.core :refer :all]
-   [compojure.coercions :refer [as-int]]
-   [clojure.string :as str]
-   [tau.api.stream :as stream]
-   [tau.api.search :as search]
-   [tau.api.channel :as channel]
-   [tau.api.playlist :as playlist]
-   [tau.api.comment :as comment]
-   [tau.api.kiosk :as kiosk]
-   [tau.api.service :as service])
-  (:import
-   tau.DownloaderImpl
-   org.schabi.newpipe.extractor.NewPipe
-   org.schabi.newpipe.extractor.localization.Localization))
-
-(defonce server (atom nil))
-
-(defn stop-server!
-  []
-  (when @server
-    (@server :timeout 100)
-    (reset! server nil)))
-
-(defroutes app-routes
-  (context "/api" []
-           (GET "/stream" [url]
-                (response (stream/get-stream-info url)))
-           (GET "/search" [serviceId :<< as-int q sortFilter contentFilters nextPage]
-                (let [content-filters (when contentFilters (str/split contentFilters #","))]
-                  (response (if nextPage
-                              (search/get-search-info serviceId q content-filters sortFilter nextPage)
-                              (search/get-search-info serviceId q content-filters sortFilter)))))
-           (GET "/channel" [url nextPage]
-                (if nextPage
-                  (response (channel/get-channel-info url nextPage))
-                  (response (channel/get-channel-info url))))
-           (GET "/playlist" [url nextPage]
-                (if nextPage
-                  (response (playlist/get-playlist-info url nextPage))
-                  (response (playlist/get-playlist-info url))))
-           (GET "/comments" [url nextPage]
-                (if nextPage
-                  (response (comment/get-comments-info url nextPage))
-                  (response (comment/get-comments-info url))))
-           (GET "/services" []
-                (response (service/get-service-list-info)))
-           (context "/kiosks" []
-                    (GET "/" [serviceId :<< as-int]
-                         (response (kiosk/get-kiosk-list-info serviceId)))
-                    (GET "/:kioskId" [kioskId serviceId :<< as-int nextPage]
-                         (if nextPage
-                           (response (kiosk/get-kiosk-info kioskId serviceId nextPage))
-                           (response (kiosk/get-kiosk-info kioskId serviceId)))))))
-
-(defn make-handler
-  []
-  (-> #'app-routes
-      wrap-params
-      (wrap-json-response {:pretty true})
-      wrap-reload))
-
-(defn start-server!
-  [port]
-  (NewPipe/init (DownloaderImpl/init) (Localization. "en" "GB"))
-  (reset! server (run-server (make-handler) {:port port})))