summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/site.clj10
-rw-r--r--src/tags.clj22
-rwxr-xr-xsrc/utils.clj17
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]