Commit f1ddbea6 authored by James Lopez's avatar James Lopez

refactor code to separate concerns

parent 3c5150a1
......@@ -948,7 +948,7 @@ class User < ActiveRecord::Base
end
def record_activity
Gitlab::UserActivities.record(self)
Gitlab::User::ActivitySet.record(self)
end
private
......
......@@ -467,11 +467,11 @@ module API
get ":activities" do
authenticated_as_admin!
user_activities = Gitlab::UserActivities.query(from: params[:from],
page: params[:page],
per_page: params[:per_page])
raw_activities = Gitlab::User::ActivitySet.query(from: params[:from],
page: params[:page],
per_page: params[:per_page])
present paginate(user_activities), with: Entities::UserActivity
present Gitlab::User::Activity.from_array(raw_activities), with: Entities::UserActivity
end
end
end
......
module Gitlab
module User
class Activity
attr_reader :username
def self.from_array(activities)
activities.map { |activity| new(*activity) }
end
def initialize(username, time)
@username = username
@time = time
end
def date
@date ||= Time.at(@time).utc.to_datetime
end
end
end
end
module Gitlab
module User
class ActivitySet
KEY = 'user/activities'
DEFAULT_PAGE_SIZE = 50
DEFAULT_FROM = 1.year.ago
def self.record(user)
Gitlab::Redis.with do |redis|
redis.zadd(KEY, Time.now.to_i, user.username)
end
end
def self.query(*args)
new(*args).query
end
def initialize(from:, page:, per_page:)
@from = from || DEFAULT_FROM
@page = page || 0
@per_page = per_page || DEFAULT_PAGE_SIZE
end
def query
Gitlab::Redis.with do |redis|
redis.zrangebyscore(KEY, @from.to_i, Time.now.to_i, with_scores: true, limit: [offset, @per_page])
end
end
private
def offset
@page * @per_page
end
end
end
end
module Gitlab
class UserActivities
KEY = 'user/activities'
DEFAULT_PAGE_SIZE = 50
def self.record(user)
Gitlab::Redis.with do |redis|
redis.zadd(KEY, Time.now.to_i, user.username)
end
end
def self.query(*args)
new(*args).query
end
def initialize(from: 6.months.ago, page: 0, per_page: DEFAULT_PAGE_SIZE)
@from = from
@page = page
@per_page = per_page
end
def query
Gitlab::Redis.with do |redis|
redis.zrangebyscore(KEY, @from.to_i, Time.now.to_i, with_scores: true, limit: [offset, @per_page])
end
end
private
def offset
@page * @per_page
end
end
end
require 'spec_helper'
describe Gitlab::UserActivities, :redis, lib: true do
describe Gitlab::User::ActivitySet, :redis, lib: true do
let(:user) { create(:user) }
it 'shows the last user activities' do
......
......@@ -1103,18 +1103,18 @@ describe API::Users, api: true do
context "user activities", :redis do
it_behaves_like 'a paginated resources' do
let(:request) { get api("/users/activities", user) }
let(:request) { get api("/user/activities", admin) }
end
context 'last activities' do
it 'returns the last activities' do
user.record_activity
get api("/users/activities", admin)
get api("/user/activities", admin)
activity = json_response.first
activity = json_response
expect(activity['project_id'].to_i).to eq(project.id)
expect(activity).to eq('')
end
end
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment