diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/site.clj | 10 | ||||
| -rw-r--r-- | src/tags.clj | 22 | ||||
| -rwxr-xr-x | src/utils.clj | 17 |
3 files changed, 38 insertions, 11 deletions
diff --git a/src/site.clj b/src/site.clj index 45331c7..91f982e 100644 --- a/src/site.clj +++ b/src/site.clj @@ -17,7 +17,7 @@ admin compojure email - fame + fame utils cookie-login session-sweeper @@ -145,7 +145,7 @@ (first (do-select [query (maybe-parse-int m-id -1)])))) (defn fetch-public-message-by-id [m-id] - (let [msg (fetch-message-by-id m-id)] + (let [msg (tags/fetch-dump-by-id m-id)] (if (and msg (not (:admin_only msg))) msg))) @@ -570,8 +570,10 @@ FROM users u ; error if nick in url doesn't match the nick who posted the message from the id in url ; this prevents people from scraping all the content by incrementing the id in the url (if (= (user-info :user_id) (message :user_id)) - (let [st (fetch-template "single_message" session)] - (.setAttribute st "message" (process-message-for-output message)) + (let [st (fetch-template "single_message" session) + message (tags/add-favorited-flag message session) + message (tags/remove-tags-for-output message)] + (.setAttribute st "dump" (process-message-for-output message)) (.toString st)) (resp-error "NO_MESSAGE")) (resp-error "NO_MESSAGE")) diff --git a/src/tags.clj b/src/tags.clj index de0b476..b6642d3 100644 --- a/src/tags.clj +++ b/src/tags.clj @@ -86,6 +86,22 @@ WHERE EXISTS (defn explain-query [query] (str "EXPLAIN ANALYZE " query)) +(defn fetch-dump-by-message-id-query [] (str +" SELECT + m.content, m.message_id, m.created_on, m.user_id, + u.nick, u.avatar, + r.key, r.admin_only, + array_to_string(ARRAY(SELECT nick || ' ' || tag + FROM tags, users + WHERE message_id = m.message_id AND tags.user_id = users.user_id), ' ') as tags + FROM + messages m, + users u, + rooms r + WHERE m.user_id = u.user_id + AND r.room_id = m.room_id + AND m.message_id = ?")) + ;; OFFSET is very slow when it is large ;; so, a subquery could be used when offset is large ;; one other thing we could do is include message_id in 'next page' url (tumblr & reddit do that for example) @@ -186,6 +202,7 @@ WHERE EXISTS ;; todo: only return distinct dumps? sorted by tag.created_on? ;; tag intersections +;; timb: just realized this is implemented wrongly... looking up "foo+bar" will also match stuff tagged "foo" by two people (defnk fetch-dumps-by-tags-query [:image-only true :num-tags 1 :message-user-id false :tag-user-id false :with-tags true :include-vip false] (str " SELECT m.content, m.message_id, m.created_on, @@ -212,6 +229,11 @@ WHERE EXISTS (if include-vip "" "AND r.admin_only = false"))) +(defn fetch-dump-by-id [m-id] + (let [query (fetch-dump-by-message-id-query)] + (let [rows (do-select [query (maybe-parse-int m-id -1)])] + (first (map parse-tags-from-row-as-tag-map rows))))) + (defnk fetch-dumps-by-room [:room-id 1 :image-only true :amount *dumps-per-page* :offset 0] (let [query (fetch-dumps-by-room-query image-only)] (let [rows (do-select [query room-id amount offset])] diff --git a/src/utils.clj b/src/utils.clj index fbdefda..9008793 100755 --- a/src/utils.clj +++ b/src/utils.clj @@ -13,7 +13,8 @@ clojure.contrib.sql clojure.contrib.duck-streams clojure.contrib.str-utils - compojure)) + compojure + config)) (let [db-host "localhost" db-name "dumpfm" @@ -263,13 +264,15 @@ (try (let [st (.getInstanceOf template-group template)] (if (session :nick) - (doto st - (.setAttribute "user_email" (session :email)) - (.setAttribute "user_nick" (session :nick)) - (.setAttribute "user_avatar" (if (non-empty-string? (session :avatar)) + (doto st + (.setAttribute "user_email" (session :email)) + (.setAttribute "user_nick" (session :nick)) + (.setAttribute "user_avatar" (if (non-empty-string? (session :avatar)) (session :avatar) nil)) - (.setAttribute "isadmin" (session :is_admin))) - st)) + (.setAttribute "isadmin" (session :is_admin)) + (.setAttribute "domain" config/*server-url*)) + (doto st + (.setAttribute "domain" config/*server-url*)))) (catch Exception e nil))) (defn fetch-template-fragment [template] |
