Commit d124c462

mo khan <mo@mokhan.ca>
2014-10-17 02:13:58
create a creations repository.
1 parent 7a941ff
Changed files (8)
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
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
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
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
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
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
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)
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