Browse Source

feat(backend): Modularize components

Miguel Ángel Moreno 2 years ago
parent
commit
dce9e36b35
3 changed files with 134 additions and 94 deletions
  1. 71 0
      src/backend/tau/handler.clj
  2. 8 94
      src/backend/tau/http.clj
  3. 55 0
      src/backend/tau/router.clj

+ 71 - 0
src/backend/tau/handler.clj

@@ -0,0 +1,71 @@
+(ns tau.handler
+  (:require
+   [clojure.string :as str]
+   [hiccup.page :as hiccup]
+   [ring.util.response :refer [response]]
+   [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]))
+
+(defn index
+  [_]
+  (response
+   (hiccup/html5
+    [:head
+     [:meta {:charset "UTF-8"}]
+     [:meta {:name "viewport" :content "width=device-width, initial-scale=1"}]
+     [:title "Tau"]
+     (hiccup/include-css "/css/tau.css")]
+    [:body
+     [:div#app]
+     (hiccup/include-js "/js/main.js")
+     [:script "tau.core.init();"]])))
+
+(defn search
+  [{:keys [parameters] :as req}]
+  (let [{:keys [service-id]} (:path parameters)
+        {:keys [q]} (:query parameters)
+        {:strs [contentFilters sortFilter nextPage]} (:query-params req)
+        content-filters (and contentFilters (str/split contentFilters #","))]
+    (response (if nextPage
+                (search/get-info service-id q contentFilters sortFilter nextPage)
+                (search/get-info service-id q contentFilters sortFilter)))))
+
+(defn channel
+  [{{:keys [url]} :path-params {:strs [nextPage]} :query-params}]
+  (response (if nextPage
+              (channel/get-info url nextPage)
+              (channel/get-info url))))
+
+(defn playlist
+  [{{:keys [url]} :path-params {:strs [nextPage]} :query-params}]
+  (response (if nextPage
+              (playlist/get-info url nextPage)
+              (playlist/get-info url))))
+
+(defn comments
+  [{{:keys [url]} :path-params {:strs [nextPage]} :query-params}]
+  (response (if nextPage
+              (comment/get-info url nextPage)
+              (comment/get-info url))))
+
+(defn services
+  [_]
+  (response (service/get-services)))
+
+(defn kiosks
+  [{{{:keys [service-id]} :path} :parameters}]
+  (response (kiosk/get-kiosks service-id)))
+
+(defn kiosk
+  [{{{:keys [kiosk-id service-id]} :path} :parameters {:strs [nextPage]} :query-params}]
+  (response (if nextPage
+              (kiosk/get-info kiosk-id service-id nextPage)
+              (kiosk/get-info kiosk-id service-id))))
+
+(defn stream [{{:keys [url]} :path-params}]
+  (response (stream/get-info url)))

+ 8 - 94
src/backend/tau/http.clj

@@ -1,110 +1,24 @@
 (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])
+   [tau.router :as router])
   (: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}))
+   (reset! server (run-server #'router/app {:port port}))
    (println "Server running in port" port)))
+
+(defn stop-server!
+  []
+  (when @server
+    (@server :timeout 100)
+    (reset! server nil)))

+ 55 - 0
src/backend/tau/router.clj

@@ -0,0 +1,55 @@
+(ns tau.router
+  (:require
+   [malli.experimental.lite :as l]
+   [reitit.ring :as ring]
+   [reitit.coercion :as coercion]
+   [reitit.ring.coercion :as rrc]
+   [reitit.coercion.malli]
+   [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]]
+   [tau.handler :as handler]))
+
+(def router
+  (ring/router
+   [["/" handler/index]
+    ["/search" handler/index]
+    ["/stream" handler/index]
+    ["/channel" handler/index]
+    ["/playlist" handler/index]
+    ["/kiosk" handler/index]
+    ["/api"
+     ["/services"
+      ["" {:get handler/services}]
+      ["/:service-id/search"
+       {:get {:coercion reitit.coercion.malli/coercion
+              :parameters {:path {:service-id int?}
+                           :query {:q string?}}
+              :handler handler/search}}]
+      ["/:service-id/kiosks"
+       ["" {:get {:coercion reitit.coercion.malli/coercion
+                  :parameters {:path {:service-id int?}}
+                  :handler handler/kiosks}}]
+       ["/:kiosk-id"
+        ["" {:get {:coercion reitit.coercion.malli/coercion
+                   :parameters {:path {:service-id int? :kiosk-id string?}}
+                   :handler handler/kiosk}}]]]]
+     ["/streams/:url" {:get handler/stream}]
+     ["/channels/:url" {:get handler/channel}]
+     ["/playlists/:url" {:get handler/playlist}]
+     ["/comments/:url" {:get handler/comments}]]]
+   {: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]}))