Commit 5e96ee341c0b0ed933e1e939ca3302965a44913b
1 parent
1fc42d99
Exists in
spb-stable
and in
3 other branches
Implement FilteringService
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
1 changed file
with
119 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,119 @@ |
| 1 | +# FilteringService class | |
| 2 | +# | |
| 3 | +# Used to filter Issues and MergeRequests collections by set of params | |
| 4 | +# | |
| 5 | +# Arguments: | |
| 6 | +# klass - actual class like Issue or MergeRequest | |
| 7 | +# current_user - which user use | |
| 8 | +# params: | |
| 9 | +# scope: 'created-by-me' or 'assigned-to-me' or 'all' | |
| 10 | +# state: 'open' or 'closed' or 'all' | |
| 11 | +# group_id: integer | |
| 12 | +# project_id: integer | |
| 13 | +# milestone_id: integer | |
| 14 | +# assignee_id: integer | |
| 15 | +# search: string | |
| 16 | +# label_name: string | |
| 17 | +# sort: string | |
| 18 | +# | |
| 19 | +class FilteringService | |
| 20 | + attr_accessor :klass, :current_user, :params | |
| 21 | + | |
| 22 | + def execute(klass, current_user, params) | |
| 23 | + @klass = klass | |
| 24 | + @current_user = current_user | |
| 25 | + @params = params | |
| 26 | + | |
| 27 | + items = by_scope | |
| 28 | + items = by_state(items) | |
| 29 | + items = by_group(items) | |
| 30 | + items = by_project(items) | |
| 31 | + items = by_search(items) | |
| 32 | + items = by_milestone(items) | |
| 33 | + items = by_assignee(items) | |
| 34 | + items = by_label(items) | |
| 35 | + items = sort(items) | |
| 36 | + end | |
| 37 | + | |
| 38 | + private | |
| 39 | + | |
| 40 | + def by_scope | |
| 41 | + table_name = klass.table_name | |
| 42 | + | |
| 43 | + case params[:scope] | |
| 44 | + when 'created-by-me', 'authored' then | |
| 45 | + current_user.send(table_name) | |
| 46 | + when 'all' then | |
| 47 | + klass.of_projects(current_user.authorized_projects.pluck(:id)) | |
| 48 | + when 'assigned-to-me' then | |
| 49 | + current_user.send("assigned_#{table_name}") | |
| 50 | + else | |
| 51 | + raise 'You must specify default scope' | |
| 52 | + end | |
| 53 | + end | |
| 54 | + | |
| 55 | + def by_state(items) | |
| 56 | + case params[:state] | |
| 57 | + when 'closed' | |
| 58 | + items.closed | |
| 59 | + when 'all' | |
| 60 | + items | |
| 61 | + when 'opened' | |
| 62 | + items.opened | |
| 63 | + else | |
| 64 | + raise 'You must specify default state' | |
| 65 | + end | |
| 66 | + end | |
| 67 | + | |
| 68 | + def by_group(items) | |
| 69 | + if params[:group_id].present? | |
| 70 | + items = items.of_group(Group.find(params[:group_id])) | |
| 71 | + end | |
| 72 | + | |
| 73 | + items | |
| 74 | + end | |
| 75 | + | |
| 76 | + def by_project(items) | |
| 77 | + if params[:project_id].present? | |
| 78 | + items = items.of_projects(params[:project_id]) | |
| 79 | + end | |
| 80 | + | |
| 81 | + items | |
| 82 | + end | |
| 83 | + | |
| 84 | + def by_search(items) | |
| 85 | + if params[:search].present? | |
| 86 | + items = items.search(params[:search]) | |
| 87 | + end | |
| 88 | + | |
| 89 | + items | |
| 90 | + end | |
| 91 | + | |
| 92 | + def sort(items) | |
| 93 | + items.sort(params[:sort]) | |
| 94 | + end | |
| 95 | + | |
| 96 | + def by_milestone(items) | |
| 97 | + if params[:milestone_id].present? | |
| 98 | + items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) | |
| 99 | + end | |
| 100 | + | |
| 101 | + items | |
| 102 | + end | |
| 103 | + | |
| 104 | + def by_assignee(items) | |
| 105 | + if params[:assignee_id].present? | |
| 106 | + items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) | |
| 107 | + end | |
| 108 | + | |
| 109 | + items | |
| 110 | + end | |
| 111 | + | |
| 112 | + def by_label(items) | |
| 113 | + if params[:label_name].present? | |
| 114 | + items = items.tagged_with(params[:label_name]) | |
| 115 | + end | |
| 116 | + | |
| 117 | + items | |
| 118 | + end | |
| 119 | +end | ... | ... |