diff --git a/app/models/topic.rb b/app/models/topic.rb index 3d85a00..845d87b 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -32,12 +32,6 @@ class Topic < ActiveRecord::Base scope :basic, :include => [:latest, { forum: :forumer }, :user] scope :ordered, :order => "state DESC, posts.id DESC" - scope :recent, - :conditions => "forumers.id IS NULL AND posts.id = (SELECT id FROM posts AS P WHERE P.topic_id = topics.id ORDER BY id DESC LIMIT 1)", - :order => "posts.id DESC", - :group => "topics.id" - scope :latest_page, - lambda { |page| {:limit => "#{(page-1)*LATEST_PER_PAGE}, #{(page-1)*LATEST_PER_PAGE+LATEST_PER_PAGE}"} } validates_presence_of :user_id, :forum_id validates_length_of :title, :in => 1..50 @@ -47,6 +41,24 @@ class Topic < ActiveRecord::Base acts_as_readable + def self.recent_topics + find_by_sql %q{ + SELECT DISTINCT topics.* + FROM (SELECT id, topic_id + FROM posts + ORDER BY id DESC + LIMIT 20) AS T + INNER JOIN topics + ON T.topic_id = topics.id + INNER JOIN forums + ON forums.id = topics.forum_id + LEFT OUTER JOIN forumers + ON forumers.forum_id = forums.id + WHERE forumers.id IS NULL + LIMIT 5 + } + end + def to_s title end diff --git a/app/views/topics/_index.html.erb b/app/views/topics/_index.html.erb index 4363ecd..d412ce5 100644 --- a/app/views/topics/_index.html.erb +++ b/app/views/topics/_index.html.erb @@ -1,5 +1,5 @@
    - <% Topic.basic.recent.latest_page(page).each do |topic| %> + <% Topic.recent_topics.each do |topic| %>
  1. <%= link_to (h topic), lastpost(topic) %>
  2. diff --git a/app/views/widgets/_posts.html.erb b/app/views/widgets/_posts.html.erb index 9a333cf..6639986 100644 --- a/app/views/widgets/_posts.html.erb +++ b/app/views/widgets/_posts.html.erb @@ -4,7 +4,7 @@
    Latest forum posts
      - <% Topic.basic.recent.latest_page(1).each do |topic| %> + <% Topic.recent_topics.each do |topic| %>
    1. <%= link_to shorten(topic, 28), lastpost(topic) %>
    2. diff --git a/db/migrate/20150820223313_add_index_to_forumers.rb b/db/migrate/20150820223313_add_index_to_forumers.rb new file mode 100644 index 0000000..15ad4cd --- /dev/null +++ b/db/migrate/20150820223313_add_index_to_forumers.rb @@ -0,0 +1,6 @@ +class AddIndexToForumers < ActiveRecord::Migration + def change + add_index :forumers, :forum_id + add_index :forumers, :group_id + end +end diff --git a/db/schema.rb b/db/schema.rb index 5422b4f..7f203e9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,21 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20150701233306) do +ActiveRecord::Schema.define(:version => 20150820223313) do + + create_table "admin_requests", :force => true do |t| + t.string "addr" + t.string "pwd" + t.integer "server_id" + t.string "player" + t.integer "user_id" + t.string "msg" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "admin_requests", ["server_id"], :name => "index_admin_requests_on_server_id" + add_index "admin_requests", ["user_id"], :name => "index_admin_requests_on_user_id" create_table "article_versions", :force => true do |t| t.integer "article_id" @@ -200,6 +214,16 @@ ActiveRecord::Schema.define(:version => 20150701233306) do add_index "data_files", ["directory_id"], :name => "index_data_files_on_directory_id" add_index "data_files", ["related_id"], :name => "index_data_files_on_related_id" + create_table "deleteds", :force => true do |t| + t.integer "deletable_id" + t.string "deletable_type" + t.integer "user_id" + t.text "reason" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "related_id" + end + create_table "directories", :force => true do |t| t.string "name" t.string "description" @@ -212,6 +236,21 @@ ActiveRecord::Schema.define(:version => 20150701233306) do add_index "directories", ["parent_id"], :name => "index_directories_on_parent_id" + create_table "firms", :force => true do |t| + t.string "name" + t.string "y_code" + t.string "email" + t.string "website" + t.string "phone" + t.string "address" + t.integer "zipcode" + t.string "town" + t.integer "owner" + t.string "opentime" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "forumers", :force => true do |t| t.integer "forum_id" t.integer "group_id" @@ -220,6 +259,9 @@ ActiveRecord::Schema.define(:version => 20150701233306) do t.datetime "updated_at" end + add_index "forumers", ["forum_id"], :name => "index_forumers_on_forum_id" + add_index "forumers", ["group_id"], :name => "index_forumers_on_group_id" + create_table "forums", :force => true do |t| t.string "title" t.string "description" @@ -340,6 +382,44 @@ ActiveRecord::Schema.define(:version => 20150701233306) do add_index "locks", ["lockable_id", "lockable_type"], :name => "index_locks_on_lockable_id_and_lockable_type" + create_table "log_events", :force => true do |t| + t.string "name" + t.string "description" + t.integer "team" + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "log_files", :force => true do |t| + t.string "name" + t.string "md5" + t.integer "size" + t.integer "server_id" + t.datetime "updated_at" + end + + add_index "log_files", ["server_id"], :name => "index_log_files_on_server_id" + + create_table "logs", :force => true do |t| + t.integer "server_id" + t.text "text" + t.integer "domain" + t.datetime "created_at" + t.integer "round_id" + t.string "details" + t.integer "actor_id" + t.integer "target_id" + t.string "specifics1" + t.string "specifics2" + t.integer "log_file_id" + end + + add_index "logs", ["actor_id"], :name => "index_logs_on_actor_id" + add_index "logs", ["log_file_id"], :name => "index_logs_on_log_file_id" + add_index "logs", ["round_id"], :name => "index_logs_on_round_id" + add_index "logs", ["server_id"], :name => "index_logs_on_server_id" + add_index "logs", ["target_id"], :name => "index_logs_on_target_id" + create_table "maps", :force => true do |t| t.string "name" t.string "download" @@ -441,6 +521,13 @@ ActiveRecord::Schema.define(:version => 20150701233306) do add_index "movies", ["status"], :name => "index_movies_on_status" add_index "movies", ["user_id"], :name => "index_movies_on_user_id" + create_table "nodes", :force => true do |t| + t.string "name" + t.integer "foreign_key" + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "options", :force => true do |t| t.string "option" t.integer "poll_id" @@ -583,6 +670,42 @@ ActiveRecord::Schema.define(:version => 20150701233306) do add_index "readings", ["user_id", "readable_id", "readable_type"], :name => "index_readings_on_user_id_and_readable_id_and_readable_type" add_index "readings", ["user_id"], :name => "index_readings_on_user_id" + create_table "rounders", :force => true do |t| + t.integer "round_id" + t.integer "user_id" + t.integer "team" + t.string "roles" + t.integer "kills" + t.integer "deaths" + t.string "name" + t.string "steamid" + t.integer "team_id" + end + + add_index "rounders", ["round_id"], :name => "index_rounders_on_round_id" + add_index "rounders", ["team_id"], :name => "index_rounders_on_team_id" + add_index "rounders", ["user_id"], :name => "index_rounders_on_user_id" + + create_table "rounds", :force => true do |t| + t.integer "server_id" + t.datetime "start" + t.datetime "end" + t.integer "winner" + t.integer "match_id" + t.integer "commander_id" + t.integer "team1_id" + t.integer "team2_id" + t.string "map_name" + t.integer "map_id" + end + + add_index "rounds", ["commander_id"], :name => "index_rounds_on_commander_id" + add_index "rounds", ["map_id"], :name => "index_rounds_on_map_id" + add_index "rounds", ["match_id"], :name => "index_rounds_on_match_id" + add_index "rounds", ["server_id"], :name => "index_rounds_on_server_id" + add_index "rounds", ["team1_id"], :name => "index_rounds_on_team1_id" + add_index "rounds", ["team2_id"], :name => "index_rounds_on_team2_id" + create_table "server_versions", :force => true do |t| t.integer "server_id" t.integer "version" @@ -638,18 +761,6 @@ ActiveRecord::Schema.define(:version => 20150701233306) do add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id" add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at" - create_table "shoutmsg_archive", :force => true do |t| - t.integer "user_id" - t.string "text" - t.datetime "created_at" - t.datetime "updated_at" - t.string "shoutable_type" - t.integer "shoutable_id" - end - - add_index "shoutmsg_archive", ["shoutable_type", "shoutable_id"], :name => "index_shoutmsgs_on_shoutable_type_and_shoutable_id" - add_index "shoutmsg_archive", ["user_id"], :name => "index_shoutmsgs_on_user_id" - create_table "shoutmsgs", :force => true do |t| t.integer "user_id" t.string "text" @@ -744,9 +855,13 @@ ActiveRecord::Schema.define(:version => 20150701233306) do t.string "time_zone" t.integer "version" t.boolean "public_email", :default => false, :null => false + t.string "salt" end + add_index "users", ["email"], :name => "index_users_on_email" + add_index "users", ["password"], :name => "index_users_on_password" add_index "users", ["team_id"], :name => "index_users_on_team_id" + add_index "users", ["username"], :name => "index_users_on_username" create_table "versions", :force => true do |t| t.string "item_type", :null => false diff --git a/spec/factories/forum.rb b/spec/factories/forum.rb new file mode 100644 index 0000000..a5bbe09 --- /dev/null +++ b/spec/factories/forum.rb @@ -0,0 +1,6 @@ +FactoryGirl.define do + factory :forum do + sequence(:title) { |n| "Forum Title #{n}" } + sequence(:description) { |n| "Forum Description #{n}" } + end +end diff --git a/spec/factories/forumer.rb b/spec/factories/forumer.rb new file mode 100644 index 0000000..50988a3 --- /dev/null +++ b/spec/factories/forumer.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :forumer do + forum + group + access Forumer::ACCESS_TOPIC + end +end diff --git a/spec/factories/post.rb b/spec/factories/post.rb new file mode 100644 index 0000000..e557bbb --- /dev/null +++ b/spec/factories/post.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :post do + sequence(:text) { |n| "Post Body #{n}" } + topic + user + end +end diff --git a/spec/factories/topic.rb b/spec/factories/topic.rb new file mode 100644 index 0000000..fde6d83 --- /dev/null +++ b/spec/factories/topic.rb @@ -0,0 +1,10 @@ +FactoryGirl.define do + factory :topic do + sequence(:title) { |n| "Topic Title #{n}" } + forum + user + before(:create) do |topic| + topic.first_post = "My first post on the topic" + end + end +end diff --git a/spec/models/forum_spec.rb b/spec/models/forum_spec.rb new file mode 100644 index 0000000..211c244 --- /dev/null +++ b/spec/models/forum_spec.rb @@ -0,0 +1,29 @@ +# == Schema Information +# +# Table name: forums +# +# id :integer not null, primary key +# title :string(255) +# description :string(255) +# category_id :integer +# created_at :datetime +# updated_at :datetime +# position :integer +# + +require "spec_helper" + +describe Forum do + let!(:user) { create :user } + + describe "create" do + let(:forum) { build :forum } + + it "creates a new forum" do + expect(forum.valid?).to eq(true) + expect do + forum.save! + end.to change(Forum, :count).by(1) + end + end +end diff --git a/spec/models/forumer_spec.rb b/spec/models/forumer_spec.rb new file mode 100644 index 0000000..c66b284 --- /dev/null +++ b/spec/models/forumer_spec.rb @@ -0,0 +1,26 @@ +# == Schema Information +# +# Table name: forumers +# +# id :integer not null, primary key +# forum_id :integer +# group_id :integer +# access :integer +# created_at :datetime +# updated_at :datetime +# + +require "spec_helper" + +describe Forumer do + describe "create" do + let(:forumer) { build :forumer } + + it "creates a new forumer" do + expect(forumer.valid?).to eq(true) + expect do + forumer.save! + end.to change(Forumer, :count).by(1) + end + end +end diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb new file mode 100644 index 0000000..9ef6175 --- /dev/null +++ b/spec/models/post_spec.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: posts +# +# id :integer not null, primary key +# text :text +# topic_id :integer +# user_id :integer +# created_at :datetime +# updated_at :datetime +# text_parsed :text +# + +require "spec_helper" + +describe Post do + let!(:user) { create :user } + + describe "create" do + let(:post) { build :post } + + it "creates a new post" do + # expect(post.valid?).to eq(true) + post.topic = create :topic + expect do + post.save! + end.to change(Post, :count).by(1) + end + end +end diff --git a/spec/models/topic_spec.rb b/spec/models/topic_spec.rb new file mode 100644 index 0000000..718315a --- /dev/null +++ b/spec/models/topic_spec.rb @@ -0,0 +1,51 @@ +# == Schema Information +# +# Table name: topics +# +# id :integer not null, primary key +# title :string(255) +# user_id :integer +# forum_id :integer +# created_at :datetime +# updated_at :datetime +# state :integer default(0), not null +# + +require "spec_helper" + +describe Topic do + let!(:user) { create :user } + let!(:forum) { create :forum } + + describe "create" do + let(:topic) { build :topic, user: user, forum: forum } + + it "creates a new topic" do + topic.first_post = "Foo" + expect do + topic.save! + end.to change(Topic, :count).by(1) + end + end + + describe ".recent_topics" do + it "returns 5 unique, most recently posted topics" do + topics = [] + 6.times do + topic = create :topic + topics << topic + 3.times { create :post, topic: topic } + end + recent_topics = Topic.recent_topics + topics.last(5).each do |topic| + expect(recent_topics).to include(topic) + end + end + it "does not return posts from restricted forums" do + restricted_topic = create :topic, title: "Restricted" + create :forumer, forum: restricted_topic.forum + create :post, topic: restricted_topic + expect(Topic.recent_topics).to_not include(restricted_topic) + end + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 0931978..49f261c 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -19,6 +19,7 @@ # time_zone :string(255) # version :integer # public_email :boolean default(FALSE), not null +# salt :string(255) # require 'spec_helper'