Skip to content

Instantly share code, notes, and snippets.

@yogthos
Created December 7, 2012 00:55
Show Gist options
  • Save yogthos/4229822 to your computer and use it in GitHub Desktop.
Save yogthos/4229822 to your computer and use it in GitHub Desktop.
Guestbook app
wget https://raw.github.com/technomancy/leiningen/preview/bin/lein
chmod +x lein
lein self-install
lein new noir guestbook
cd guestbook

#Add dependencies

edit project.clj and add jdbc dependencies

(defproject guestbook "0.1.0-SNAPSHOT"
            :description "guestbook"
            :dependencies [[org.clojure/clojure "1.3.0"]
                           [noir "1.3.0-beta3"] 
                           [org.clojure/java.jdbc "0.2.3"]
                           [org.xerial/sqlite-jdbc "3.7.2"]]
            :main guestbook.server)

run the project

lein run

update common namespace with our layout

(ns guestbook.views.common
  (:use [noir.core :only [defpartial]]
        [hiccup.page :only [include-css html5]]))

(defpartial layout [& content]
  (html5
    [:head
     [:title "guestbook"]
     (include-css "/css/reset.css")]
    [:body               
     [:section#wrapper content]
     [:footer#footer "My awesome guestbook"]]))

add the main page to welcome namespace

(ns guestbook.views.welcome
  (:require [guestbook.views.common :as common]
            [noir.content.getting-started]
            [guestbook.models.db :as db])
  (:use noir.core hiccup.core hiccup.form))

(defn show-guests []
  (into [:ul.guests]
        (for [{:keys [message name timestamp]} (db/read-guests)]
          [:li
           [:blockquote message]
           [:p "-" [:cite name]]
           [:time timestamp]])))

(defpage "/" {:keys [name message error]}
  (common/layout
    [:h1 "Guestbook"]
    [:p "Welcome to my guestbook!"]
    [:p error]
    (show-guests)
    [:hr]
    (form-to [:post "/"]
             [:p "Name:" (text-field "name" name)]
             [:p "Message:" (text-area {:rows 10 :cols 40} "message" message)]
             (submit-button "comment"))))

(defn error [params error]
  (assoc params :error error))

(defpage [:post "/"] params
  (cond 
    (empty? (:name params )) (render "/" (error params "Some dummy who forgot to leave a name"))
    (empty? (:message params )) (render "/" (error params "THIS IS THE BEST WEBSITE EVER!"))
    :else 
    (do 
      (db/save-message params)
      (render "/"))))

create the database handler

(ns guestbook.models.db
  (:require [clojure.java.jdbc :as sql])
  (:import java.sql.DriverManager))

(def db {:classname  "org.sqlite.JDBC",
         :subprotocol   "sqlite",
         :subname       "db.sq3"})

(defn read-guests []
  (sql/with-connection
    db
    (sql/with-query-results res 
      ["SELECT * FROM guestbook ORDER BY timestamp DESC"] 
      (doall res))))

(defn save-message [{:keys [name message]}]
  (sql/with-connection 
    db
    (sql/insert-values
      :guestbook
      [:name :message :timestamp]
      [name message (new java.util.Date)])))

and we're done.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment