diff --git a/app/controllers/api/v0/languages_controller.rb b/app/controllers/api/v0/languages_controller.rb index 1ec281a..37c3a67 100644 --- a/app/controllers/api/v0/languages_controller.rb +++ b/app/controllers/api/v0/languages_controller.rb @@ -6,8 +6,9 @@ class LanguagesController < ApiController def index sort = params["sort"].try(:to_sym) || :alphabetical - languages = Languages::Index.get(sort: sort) - respond({languages: languages}, :ok) + with_count = params["with_count"] || false + languages = Languages::Index.get({ sort: sort, with_count: with_count }) + respond({ languages: languages }, :ok) end end diff --git a/app/usecases/languages/index.rb b/app/usecases/languages/index.rb index 387f6d0..a046b99 100644 --- a/app/usecases/languages/index.rb +++ b/app/usecases/languages/index.rb @@ -3,18 +3,36 @@ class Index class << self - def get(sort: :alphabetical) - languages = Rails.cache.fetch('languages') do + attr_accessor :languages + + def get(context) + read_languages + languages.sort! if context[:sort] == :alphabetical + add_users_count if ["true", true].include?(context[:with_count]) + languages + end + + private + + def read_languages + @languages = Rails.cache.fetch('languages') do file_contents = File.read(languages_file) JSON.parse(file_contents).compact end - sort == :alphabetical ? languages.sort : languages + end + + def add_users_count + languages.map! { |l| { "name" => "#{l}", "users_count" => users_for_language(l) } } end def languages_file Rails.root.join('app/assets/json/languages.json') end + def users_for_language(language) + $redis.zcard("user_#{language}".redis_key) + end + end end diff --git a/spec/controllers/api/languages_controller_spec.rb b/spec/controllers/api/languages_controller_spec.rb index 6e4fd35..df13ffb 100644 --- a/spec/controllers/api/languages_controller_spec.rb +++ b/spec/controllers/api/languages_controller_spec.rb @@ -35,6 +35,68 @@ def response_hash get :index, sort: :alphabetical expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"]) end + + it 'should return a list of languages ordered alphabetically with count false' do + get :index, sort: :alphabetical, with_count: false + expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"]) + end end + + context "return with user count" do + + before(:each) do + @vdaubry = FactoryGirl.create(:user, gravatar_url: 'url', login: 'vdaubry', city: 'paris', country: 'france') + FactoryGirl.create(:repository, language: 'ruby', user: @vdaubry) + + @nunogoncalves = FactoryGirl.create(:user, gravatar_url: 'url', login: 'nunogoncalves', city: 'lisbon', country: 'portugal') + FactoryGirl.create(:repository, name: 'rails', language: 'ruby', user: @nunogoncalves, stars: 3) + + @walterwhite = FactoryGirl.create(:user, login: 'walterwhite', city: 'albuquerque', country: 'usa') + FactoryGirl.create(:repository, language: 'JavaScript', user: @walterwhite, stars: 4) + + @sherlockholmes = FactoryGirl.create(:user, login: 'sherlockholmes', city: 'san francisco', country: 'us', gravatar_url: 'url') + FactoryGirl.create(:repository, language: 'C#', user: @sherlockholmes, stars: 5) + + + $redis.zadd("user_ruby_paris", 1.1, @vdaubry.id) + $redis.zadd("user_ruby", 1.1, @vdaubry.id) + $redis.zadd("user_ruby_lisbon", 1.2, @nunogoncalves.id) + $redis.zadd("user_ruby", 1.2, @nunogoncalves.id) + $redis.zadd("user_javascript_albuquerque", 0.2, @walterwhite.id) + $redis.zadd("user_javascript", 0.2, @walterwhite.id) + $redis.zadd("user_javascript_san_francisco", 0.5, @sherlockholmes.id) + $redis.zadd("user_c#", 0.5, @sherlockholmes.id) + end + + let :languages_objects do + [{ + "name" => "C#", + "users_count" => 1 + }, { + "name" => "JavaScript", + "users_count" => 1 + }, { + "name" => "Ruby", + "users_count" => 2 + }] + end + + it 'should return a list of languages with users count' do + get :index, sort: :alphabetical, with_count: true + expect(response_hash['languages']).to eq(languages_objects) + end + + it 'should return a list of languages with users count' do + get :index, sort: :alphabetical, with_count: "true" + expect(response_hash['languages']).to eq(languages_objects) + end + + + it 'should return a list of languages with users count' do + get :index, sort: :alphabetical, with_count: "some_string_value" + expect(response_hash['languages']).to eq(["C#","JavaScript","Ruby"]) + end + end + end end \ No newline at end of file