From 25365baa9060769c6df37480916bb5b23fb879fd Mon Sep 17 00:00:00 2001 From: Miguel Ángel Moreno Date: Tue, 20 Dec 2022 00:38:35 +0100 Subject: feat: Set up reitit routes and serve static index --- src/backend/tau/http.clj | 110 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 src/backend/tau/http.clj (limited to 'src/backend/tau/http.clj') diff --git a/src/backend/tau/http.clj b/src/backend/tau/http.clj new file mode 100644 index 0000000..1469f77 --- /dev/null +++ b/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))) -- cgit v1.2.3