summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/admin/users_controller.rb10
-rw-r--r--app/controllers/creation_tags_controller.rb8
-rw-r--r--app/models/creation.rb4
-rw-r--r--app/models/creation/repository.rb18
-rw-r--r--app/models/user/repository.rb7
-rw-r--r--config/initializers/container.rb2
-rw-r--r--spec/controllers/admin/users_controller_spec.rb2
-rw-r--r--spec/models/creation/repository_spec.rb22
8 files changed, 56 insertions, 17 deletions
diff --git a/app/controllers/admin/users_controller.rb b/app/controllers/admin/users_controller.rb
index f2386854..abc33286 100644
--- a/app/controllers/admin/users_controller.rb
+++ b/app/controllers/admin/users_controller.rb
@@ -1,20 +1,20 @@
module Admin
class UsersController < AdminController
- def initialize(users_repository = Spank::IOC.resolve(:users))
- @users_repository = users_repository
+ def initialize(repository = Spank::IOC.resolve(:users))
+ @repository = repository
super()
end
def index
- @users = users_repository.search_by(params[:q])
+ @users = repository.search_by(params[:q])
end
def show
- @user = users_repository.includes(creations: :photos).find(params[:id])
+ @user = repository.includes(creations: :photos).find(params[:id])
end
private
- attr_reader :users_repository
+ attr_reader :repository
end
end
diff --git a/app/controllers/creation_tags_controller.rb b/app/controllers/creation_tags_controller.rb
index b11ff867..8b71d8ab 100644
--- a/app/controllers/creation_tags_controller.rb
+++ b/app/controllers/creation_tags_controller.rb
@@ -1,10 +1,14 @@
class CreationTagsController < ApplicationController
+ def initialize(repository = Spank::IOC.resolve(:cakes))
+ @repository = repository
+ end
+
def index
- @tags = Creation.tag_counts_on(:tags)
+ @tags = @repository.tag_counts_on(:tags)
end
def show
@tag = params[:id].downcase.parameterize
- @creations = Creation.tagged(@tag).page(params[:page]).per(12)
+ @creations = @repository.tagged(@tag).page(params[:page]).per(12)
end
end
diff --git a/app/models/creation.rb b/app/models/creation.rb
index 4b4821e2..4ebe67b0 100644
--- a/app/models/creation.rb
+++ b/app/models/creation.rb
@@ -30,8 +30,4 @@ class Creation < ActiveRecord::Base
def liked_by(user)
favorites.find_or_create_by(user: user)
end
-
- def self.tagged(tag)
- includes([:user, :photos]).tagged_with([tag]).where('photos_count > 0')
- end
end
diff --git a/app/models/creation/repository.rb b/app/models/creation/repository.rb
new file mode 100644
index 00000000..35bc7a93
--- /dev/null
+++ b/app/models/creation/repository.rb
@@ -0,0 +1,18 @@
+class Creation
+ scope :tagged, ->(tag) { tagged_with([tag]).where('photos_count > 0') }
+
+ class Repository < SimpleDelegator
+ def initialize(connection = Creation)
+ @connection = connection
+ super(connection)
+ end
+
+ def tagged(tag)
+ connection.includes([:user, :photos]).tagged(tag)
+ end
+
+ private
+
+ attr_reader :connection
+ end
+end
diff --git a/app/models/user/repository.rb b/app/models/user/repository.rb
index e59c9fde..3210134a 100644
--- a/app/models/user/repository.rb
+++ b/app/models/user/repository.rb
@@ -1,14 +1,13 @@
class User
scope :artists, ->{ where('creations_count > 0').order(creations_count: :desc) }
- scope :search_by, ->(query) { query.blank? ? self.scoped : where('name like :query or email like :query', query: "#{query}%") }
+ scope :search_by, ->(query) { query.blank? ? self.all : where('name like :query or email like :query', query: "#{query}%") }
- class Repository
+ class Repository < SimpleDelegator
def initialize(connection = User)
@connection = connection
+ super(connection)
end
- delegate :all, :includes, :find, :search_by, to: :connection
-
def ordered
connection.order(creations_count: :desc)
end
diff --git a/config/initializers/container.rb b/config/initializers/container.rb
index 550cb028..34e61bd1 100644
--- a/config/initializers/container.rb
+++ b/config/initializers/container.rb
@@ -16,7 +16,7 @@ class ConfigureContainerCommand
end
# repositories
- container.register(:cakes) { |builder| Creation }
+ container.register(:cakes) { |builder| Creation::Repository.new }.as_singleton
container.register(:photos) { |builder| Photo }
container.register(:users) { |builder| User::Repository.new }.as_singleton
end
diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb
index bc94346d..7844d3f6 100644
--- a/spec/controllers/admin/users_controller_spec.rb
+++ b/spec/controllers/admin/users_controller_spec.rb
@@ -19,7 +19,7 @@ module Admin
it "returns users that match the search results" do
matching_user = double
repository = double
- controller.stub(:users_repository).and_return(repository)
+ controller.stub(:repository).and_return(repository)
repository.stub(:search_by).with('mo').and_return([matching_user])
get :index, q: 'mo'
expect(assigns(:users)).to include(matching_user)
diff --git a/spec/models/creation/repository_spec.rb b/spec/models/creation/repository_spec.rb
new file mode 100644
index 00000000..a406fcb8
--- /dev/null
+++ b/spec/models/creation/repository_spec.rb
@@ -0,0 +1,22 @@
+require 'rails_helper'
+
+describe Creation::Repository do
+ describe "#tagged" do
+ let(:user) { create(:user) }
+ let(:tag) { "cake" }
+ let(:tagged_cake) { create(:creation, photos_count: 1) }
+ let(:untagged_cake) { create(:creation) }
+
+ before :each do
+ user.tag(tagged_cake, with: tag, on: :tags)
+ end
+
+ it "returns each cake that is tagged" do
+ expect(subject.tagged(tag)).to include(tagged_cake)
+ end
+
+ it "does not return cakes that are not tagged" do
+ expect(subject.tagged(tag)).to_not include(untagged_cake)
+ end
+ end
+end