diff --git a/app/helpers/forum_topic_visits_helper.rb b/app/helpers/forum_topic_visits_helper.rb new file mode 100644 index 000000000..adddd224a --- /dev/null +++ b/app/helpers/forum_topic_visits_helper.rb @@ -0,0 +1,2 @@ +module ForumTopicVisitsHelper +end diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index bc841fde3..902a971e8 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -105,16 +105,8 @@ class ForumTopic < ActiveRecord::Base super + [:text_index] end - def read_by?(user, read_forum_topic_ids) - if read_forum_topic_ids.any? {|topic_id, timestamp| id.to_s == topic_id && updated_at.to_i > timestamp.to_i} - return false - end - if read_forum_topic_ids.any? {|topic_id, timestamp| id.to_s == topic_id && updated_at.to_i <= timestamp.to_i} - return true - end - return false if user.last_forum_read_at.nil? - return true if updated_at < user.last_forum_read_at - return false + def check!(user) + ForumTopicVisit.check!(user, self) end def mark_as_read(read_forum_topic_ids) diff --git a/app/models/forum_topic_visit.rb b/app/models/forum_topic_visit.rb new file mode 100644 index 000000000..7409735d4 --- /dev/null +++ b/app/models/forum_topic_visit.rb @@ -0,0 +1,30 @@ +class ForumTopicVisit < ActiveRecord::Base + def self.check!(user, topic) + match = where(:user_id => user.id, :forum_topic_id => topic.id).first + result = false + if match + if match.last_read_at < topic.updated_at + result = true + end + match.update_attribute(:last_read_at, topic.updated_at) + else + create(:user_id => user.id, :forum_topic_id => topic.id, :last_read_at => topic.updated_at) + end + result + end + + def self.check_list!(user, topics) + matches = where(:user_id => user.id, :forum_topic_id => topics.map(&:id)).to_a.inject({}) do |hash, x| + hash[x.forum_topic_id] = x + hash + end + topics.each do |topic| + if matches[topic.id] + matches[topic.id].update_attribute(:last_read_at, topic.updated_at) + else + create(:user_id => user.id,, :forum_topic_id => topic.id, :last_read_at => topic.updated_at) + end + end + matches + end +end diff --git a/config/routes.rb b/config/routes.rb index 128631d25..9d8c0b71b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -124,6 +124,7 @@ Rails.application.routes.draw do collection do post :mark_all_as_read end + resource :visit, :controller => "forum_topic_visits" end resources :ip_bans resources :iqdb_queries, :only => [:create] diff --git a/db/migrate/20140701224800_create_forum_topic_visits.rb b/db/migrate/20140701224800_create_forum_topic_visits.rb new file mode 100644 index 000000000..6c4f1051a --- /dev/null +++ b/db/migrate/20140701224800_create_forum_topic_visits.rb @@ -0,0 +1,14 @@ +class CreateForumTopicVisits < ActiveRecord::Migration + def change + create_table :forum_topic_visits do |t| + t.integer :user_id + t.integer :forum_topic_id + t.timestamp :last_read_at + + t.timestamps + end + + add_index :forum_topic_visits, :user_id + add_index :forum_topic_visits, :forum_topic_id + end +end diff --git a/db/structure.sql b/db/structure.sql index 6ebf87b7f..f291c8d4c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -3,6 +3,7 @@ -- SET statement_timeout = 0; +SET lock_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = on; SET check_function_bodies = false; @@ -1979,6 +1980,39 @@ CREATE SEQUENCE forum_posts_id_seq ALTER SEQUENCE forum_posts_id_seq OWNED BY forum_posts.id; +-- +-- Name: forum_topic_visits; Type: TABLE; Schema: public; Owner: -; Tablespace: +-- + +CREATE TABLE forum_topic_visits ( + id integer NOT NULL, + user_id integer, + forum_topic_id integer, + last_read_at timestamp without time zone, + created_at timestamp without time zone, + updated_at timestamp without time zone +); + + +-- +-- Name: forum_topic_visits_id_seq; Type: SEQUENCE; Schema: public; Owner: - +-- + +CREATE SEQUENCE forum_topic_visits_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: forum_topic_visits_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: - +-- + +ALTER SEQUENCE forum_topic_visits_id_seq OWNED BY forum_topic_visits.id; + + -- -- Name: forum_topics; Type: TABLE; Schema: public; Owner: -; Tablespace: -- @@ -3881,6 +3915,13 @@ ALTER TABLE ONLY favorites_99 ALTER COLUMN id SET DEFAULT nextval('favorites_id_ ALTER TABLE ONLY forum_posts ALTER COLUMN id SET DEFAULT nextval('forum_posts_id_seq'::regclass); +-- +-- Name: id; Type: DEFAULT; Schema: public; Owner: - +-- + +ALTER TABLE ONLY forum_topic_visits ALTER COLUMN id SET DEFAULT nextval('forum_topic_visits_id_seq'::regclass); + + -- -- Name: id; Type: DEFAULT; Schema: public; Owner: - -- @@ -4212,6 +4253,14 @@ ALTER TABLE ONLY forum_posts ADD CONSTRAINT forum_posts_pkey PRIMARY KEY (id); +-- +-- Name: forum_topic_visits_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: +-- + +ALTER TABLE ONLY forum_topic_visits + ADD CONSTRAINT forum_topic_visits_pkey PRIMARY KEY (id); + + -- -- Name: forum_topics_pkey; Type: CONSTRAINT; Schema: public; Owner: -; Tablespace: -- @@ -6075,6 +6124,20 @@ CREATE INDEX index_forum_posts_on_text_index ON forum_posts USING gin (text_inde CREATE INDEX index_forum_posts_on_topic_id ON forum_posts USING btree (topic_id); +-- +-- Name: index_forum_topic_visits_on_forum_topic_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX index_forum_topic_visits_on_forum_topic_id ON forum_topic_visits USING btree (forum_topic_id); + + +-- +-- Name: index_forum_topic_visits_on_user_id; Type: INDEX; Schema: public; Owner: -; Tablespace: +-- + +CREATE INDEX index_forum_topic_visits_on_user_id ON forum_topic_visits USING btree (user_id); + + -- -- Name: index_forum_topics_on_creator_id; Type: INDEX; Schema: public; Owner: -; Tablespace: -- @@ -6864,3 +6927,5 @@ INSERT INTO schema_migrations (version) VALUES ('20140604002414'); INSERT INTO schema_migrations (version) VALUES ('20140613004559'); +INSERT INTO schema_migrations (version) VALUES ('20140701224800'); +