diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-01-15 16:16:23 +0200 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2014-01-15 16:16:23 +0200 |
commit | 5e96ee341c0b0ed933e1e939ca3302965a44913b (patch) | |
tree | e80ad3f7284eacdc0068fed74c0257be5030d236 /app | |
parent | 1fc42d9934fbf511db2a28e980b298c019a217a7 (diff) | |
download | gitlab-ce-5e96ee341c0b0ed933e1e939ca3302965a44913b.tar.gz |
Implement FilteringService
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'app')
-rw-r--r-- | app/services/filtering_service.rb | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/app/services/filtering_service.rb b/app/services/filtering_service.rb new file mode 100644 index 00000000000..f8adeb20ff7 --- /dev/null +++ b/app/services/filtering_service.rb @@ -0,0 +1,119 @@ +# FilteringService class +# +# Used to filter Issues and MergeRequests collections by set of params +# +# Arguments: +# klass - actual class like Issue or MergeRequest +# current_user - which user use +# params: +# scope: 'created-by-me' or 'assigned-to-me' or 'all' +# state: 'open' or 'closed' or 'all' +# group_id: integer +# project_id: integer +# milestone_id: integer +# assignee_id: integer +# search: string +# label_name: string +# sort: string +# +class FilteringService + attr_accessor :klass, :current_user, :params + + def execute(klass, current_user, params) + @klass = klass + @current_user = current_user + @params = params + + items = by_scope + items = by_state(items) + items = by_group(items) + items = by_project(items) + items = by_search(items) + items = by_milestone(items) + items = by_assignee(items) + items = by_label(items) + items = sort(items) + end + + private + + def by_scope + table_name = klass.table_name + + case params[:scope] + when 'created-by-me', 'authored' then + current_user.send(table_name) + when 'all' then + klass.of_projects(current_user.authorized_projects.pluck(:id)) + when 'assigned-to-me' then + current_user.send("assigned_#{table_name}") + else + raise 'You must specify default scope' + end + end + + def by_state(items) + case params[:state] + when 'closed' + items.closed + when 'all' + items + when 'opened' + items.opened + else + raise 'You must specify default state' + end + end + + def by_group(items) + if params[:group_id].present? + items = items.of_group(Group.find(params[:group_id])) + end + + items + end + + def by_project(items) + if params[:project_id].present? + items = items.of_projects(params[:project_id]) + end + + items + end + + def by_search(items) + if params[:search].present? + items = items.search(params[:search]) + end + + items + end + + def sort(items) + items.sort(params[:sort]) + end + + def by_milestone(items) + if params[:milestone_id].present? + items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) + end + + items + end + + def by_assignee(items) + if params[:assignee_id].present? + items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) + end + + items + end + + def by_label(items) + if params[:label_name].present? + items = items.tagged_with(params[:label_name]) + end + + items + end +end |