(ns lezer.controller.routes (:require lezer.view.main :refer [index-html]) (:require lezer.view.author :refer [author-html]) (:require lezer.module.greet :as g) (:require phel.router :as r) (:require phel.http :as h) (:require phel.pdo) (:require phel.string :as str)) (def conn (pdo/connect "sqlite:test.db")) (pdo/exec conn "create table if not exists books (id integer primary key autoincrement, title varchar(255))") (pdo/exec conn "create table if not exists authors (id integer primary key autoincrement, name varchar(255))") (pdo/exec conn "create table if not exists authors_books (author_id integer, book_id integer)") (defn index-handler [req router] (let [books (for [b :in (pdo/select conn "select * from books")] {:book b :authors (pdo/select conn "select * from authors where id in (select author_id from authors_books where book_id = :book_id)" {:book_id (:id b)})})] (h/response-from-map {:status 200 :body (index-html books router)}))) (defn ping-handler [req] (h/response-from-map {:status 200 :body (g/greet (str "pong - " (rand)))})) (defn book-create-handler [request] (let [title (get-in request [:parsed-body "title"]) authors (str/split (get-in request [:parsed-body "author"]) #",")] (pdo/with-transaction conn (let [book-id (pdo/insert conn :books {:title title})] (for [a :in authors] (pdo/insert conn :authors_books {:book_id book-id :author_id (or (pdo/fetch-column (pdo/query conn "select id from authors where name = :name" {:name a})) (pdo/insert conn :authors {:name a}))}))))) (h/response-from-map {:status 301 :headers {:location "/"}})) (defn author-view-handler [req] (let [id (get-in req [:attributes :match :path-params :id]) author (first (pdo/select conn "select * from authors where id = :author_id" {:author_id id})) books (pdo/select conn "select * from books where id in (select book_id from authors_books where author_id = :author_id)" {:author_id id})] (h/response-from-map {:status 200 :body (author-html author books)})))