Commit 645e8d470559b07a22164c55b76195a60fb8b37b
1 parent
0f473674
Exists in
spb-stable
and in
3 other branches
Move services for collecting items to Finders
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
16 changed files
with
296 additions
and
238 deletions
Show diff stats
app/controllers/dashboard_controller.rb
| @@ -53,13 +53,13 @@ class DashboardController < ApplicationController | @@ -53,13 +53,13 @@ class DashboardController < ApplicationController | ||
| 53 | end | 53 | end |
| 54 | 54 | ||
| 55 | def merge_requests | 55 | def merge_requests |
| 56 | - @merge_requests = FilteringService.new.execute(MergeRequest, current_user, params) | 56 | + @merge_requests = MergeRequestsFinder.new.execute(current_user, params) |
| 57 | @merge_requests = @merge_requests.page(params[:page]).per(20) | 57 | @merge_requests = @merge_requests.page(params[:page]).per(20) |
| 58 | @merge_requests = @merge_requests.preload(:author, :target_project) | 58 | @merge_requests = @merge_requests.preload(:author, :target_project) |
| 59 | end | 59 | end |
| 60 | 60 | ||
| 61 | def issues | 61 | def issues |
| 62 | - @issues = FilteringService.new.execute(Issue, current_user, params) | 62 | + @issues = IssuesFinder.new.execute(current_user, params) |
| 63 | @issues = @issues.page(params[:page]).per(20) | 63 | @issues = @issues.page(params[:page]).per(20) |
| 64 | @issues = @issues.preload(:author, :project) | 64 | @issues = @issues.preload(:author, :project) |
| 65 | 65 |
app/controllers/groups_controller.rb
| @@ -47,13 +47,13 @@ class GroupsController < ApplicationController | @@ -47,13 +47,13 @@ class GroupsController < ApplicationController | ||
| 47 | end | 47 | end |
| 48 | 48 | ||
| 49 | def merge_requests | 49 | def merge_requests |
| 50 | - @merge_requests = FilteringService.new.execute(MergeRequest, current_user, params) | 50 | + @merge_requests = MergeRequestsFinder.new.execute(current_user, params) |
| 51 | @merge_requests = @merge_requests.page(params[:page]).per(20) | 51 | @merge_requests = @merge_requests.page(params[:page]).per(20) |
| 52 | @merge_requests = @merge_requests.preload(:author, :target_project) | 52 | @merge_requests = @merge_requests.preload(:author, :target_project) |
| 53 | end | 53 | end |
| 54 | 54 | ||
| 55 | def issues | 55 | def issues |
| 56 | - @issues = FilteringService.new.execute(Issue, current_user, params) | 56 | + @issues = IssuesFinder.new.execute(current_user, params) |
| 57 | @issues = @issues.page(params[:page]).per(20) | 57 | @issues = @issues.page(params[:page]).per(20) |
| 58 | @issues = @issues.preload(:author, :project) | 58 | @issues = @issues.preload(:author, :project) |
| 59 | 59 | ||
| @@ -100,7 +100,7 @@ class GroupsController < ApplicationController | @@ -100,7 +100,7 @@ class GroupsController < ApplicationController | ||
| 100 | end | 100 | end |
| 101 | 101 | ||
| 102 | def projects | 102 | def projects |
| 103 | - @projects ||= Projects::CollectService.new.execute(current_user, group: group) | 103 | + @projects ||= ProjectsFinder.new.execute(current_user, group: group) |
| 104 | end | 104 | end |
| 105 | 105 | ||
| 106 | def project_ids | 106 | def project_ids |
app/controllers/projects/issues_controller.rb
| @@ -121,7 +121,7 @@ class Projects::IssuesController < Projects::ApplicationController | @@ -121,7 +121,7 @@ class Projects::IssuesController < Projects::ApplicationController | ||
| 121 | def issues_filtered | 121 | def issues_filtered |
| 122 | params[:scope] = 'all' if params[:scope].blank? | 122 | params[:scope] = 'all' if params[:scope].blank? |
| 123 | params[:state] = 'opened' if params[:state].blank? | 123 | params[:state] = 'opened' if params[:state].blank? |
| 124 | - @issues = FilteringService.new.execute(Issue, current_user, params.merge(project_id: @project.id)) | 124 | + @issues = IssuesFinder.new.execute(current_user, params.merge(project_id: @project.id)) |
| 125 | end | 125 | end |
| 126 | 126 | ||
| 127 | # Since iids are implemented only in 6.1 | 127 | # Since iids are implemented only in 6.1 |
app/controllers/projects/merge_requests_controller.rb
| @@ -21,7 +21,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController | @@ -21,7 +21,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController | ||
| 21 | params[:scope] = 'all' if params[:scope].blank? | 21 | params[:scope] = 'all' if params[:scope].blank? |
| 22 | params[:state] = 'opened' if params[:state].blank? | 22 | params[:state] = 'opened' if params[:state].blank? |
| 23 | 23 | ||
| 24 | - @merge_requests = FilteringService.new.execute(MergeRequest, current_user, params.merge(project_id: @project.id)) | 24 | + @merge_requests = MergeRequestsFinder.new.execute(current_user, params.merge(project_id: @project.id)) |
| 25 | @merge_requests = @merge_requests.page(params[:page]).per(20) | 25 | @merge_requests = @merge_requests.page(params[:page]).per(20) |
| 26 | 26 | ||
| 27 | @sort = params[:sort].humanize | 27 | @sort = params[:sort].humanize |
app/controllers/projects/notes_controller.rb
| @@ -5,7 +5,7 @@ class Projects::NotesController < Projects::ApplicationController | @@ -5,7 +5,7 @@ class Projects::NotesController < Projects::ApplicationController | ||
| 5 | before_filter :authorize_admin_note!, only: [:update, :destroy] | 5 | before_filter :authorize_admin_note!, only: [:update, :destroy] |
| 6 | 6 | ||
| 7 | def index | 7 | def index |
| 8 | - @notes = Notes::LoadService.new(project, current_user, params).execute | 8 | + @notes = NotesFinder.new.execute(project, current_user, params) |
| 9 | 9 | ||
| 10 | notes_json = { notes: [] } | 10 | notes_json = { notes: [] } |
| 11 | 11 |
| @@ -0,0 +1,24 @@ | @@ -0,0 +1,24 @@ | ||
| 1 | +# Finders | ||
| 2 | + | ||
| 3 | +This type of classes responsible for collectiong items based on different conditions. | ||
| 4 | +To prevent lookup methods in models like this: | ||
| 5 | + | ||
| 6 | +``` | ||
| 7 | +class Project | ||
| 8 | + def issues_for_user_filtered_by(user, filter) | ||
| 9 | + # A lot of logic not related to project model itself | ||
| 10 | + end | ||
| 11 | +end | ||
| 12 | + | ||
| 13 | +issues = project.issues_for_user_filtered_by(user, params) | ||
| 14 | +``` | ||
| 15 | + | ||
| 16 | +Better use this: | ||
| 17 | + | ||
| 18 | +``` | ||
| 19 | +selector = Finders::Issues.new | ||
| 20 | + | ||
| 21 | +issues = selector.execute(project, user, filter) | ||
| 22 | +``` | ||
| 23 | + | ||
| 24 | +It will help keep models thiner |
| @@ -0,0 +1,137 @@ | @@ -0,0 +1,137 @@ | ||
| 1 | +# BaseFinder | ||
| 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 BaseFinder | ||
| 20 | + attr_accessor :current_user, :params | ||
| 21 | + | ||
| 22 | + def execute(current_user, params) | ||
| 23 | + @current_user = current_user | ||
| 24 | + @params = params | ||
| 25 | + | ||
| 26 | + items = init_collection | ||
| 27 | + items = by_scope(items) | ||
| 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 init_collection | ||
| 41 | + table_name = klass.table_name | ||
| 42 | + | ||
| 43 | + if project | ||
| 44 | + if project.public? || (current_user && current_user.can?(:read_project, project)) | ||
| 45 | + project.send(table_name) | ||
| 46 | + else | ||
| 47 | + [] | ||
| 48 | + end | ||
| 49 | + elsif current_user && params[:authorized_only].presence | ||
| 50 | + klass.of_projects(current_user.authorized_projects) | ||
| 51 | + else | ||
| 52 | + klass.of_projects(Project.accessible_to(current_user)) | ||
| 53 | + end | ||
| 54 | + end | ||
| 55 | + | ||
| 56 | + def by_scope(items) | ||
| 57 | + case params[:scope] | ||
| 58 | + when 'created-by-me', 'authored' then | ||
| 59 | + items.where(author_id: current_user.id) | ||
| 60 | + when 'all' then | ||
| 61 | + items | ||
| 62 | + when 'assigned-to-me' then | ||
| 63 | + items.where(assignee_id: current_user.id) | ||
| 64 | + else | ||
| 65 | + raise 'You must specify default scope' | ||
| 66 | + end | ||
| 67 | + end | ||
| 68 | + | ||
| 69 | + def by_state(items) | ||
| 70 | + case params[:state] | ||
| 71 | + when 'closed' | ||
| 72 | + items.closed | ||
| 73 | + when 'all' | ||
| 74 | + items | ||
| 75 | + when 'opened' | ||
| 76 | + items.opened | ||
| 77 | + else | ||
| 78 | + raise 'You must specify default state' | ||
| 79 | + end | ||
| 80 | + end | ||
| 81 | + | ||
| 82 | + def by_group(items) | ||
| 83 | + if params[:group_id].present? | ||
| 84 | + items = items.of_group(Group.find(params[:group_id])) | ||
| 85 | + end | ||
| 86 | + | ||
| 87 | + items | ||
| 88 | + end | ||
| 89 | + | ||
| 90 | + def by_project(items) | ||
| 91 | + if params[:project_id].present? | ||
| 92 | + items = items.of_projects(params[:project_id]) | ||
| 93 | + end | ||
| 94 | + | ||
| 95 | + items | ||
| 96 | + end | ||
| 97 | + | ||
| 98 | + def by_search(items) | ||
| 99 | + if params[:search].present? | ||
| 100 | + items = items.search(params[:search]) | ||
| 101 | + end | ||
| 102 | + | ||
| 103 | + items | ||
| 104 | + end | ||
| 105 | + | ||
| 106 | + def sort(items) | ||
| 107 | + items.sort(params[:sort]) | ||
| 108 | + end | ||
| 109 | + | ||
| 110 | + def by_milestone(items) | ||
| 111 | + if params[:milestone_id].present? | ||
| 112 | + items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) | ||
| 113 | + end | ||
| 114 | + | ||
| 115 | + items | ||
| 116 | + end | ||
| 117 | + | ||
| 118 | + def by_assignee(items) | ||
| 119 | + if params[:assignee_id].present? | ||
| 120 | + items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) | ||
| 121 | + end | ||
| 122 | + | ||
| 123 | + items | ||
| 124 | + end | ||
| 125 | + | ||
| 126 | + def by_label(items) | ||
| 127 | + if params[:label_name].present? | ||
| 128 | + items = items.tagged_with(params[:label_name]) | ||
| 129 | + end | ||
| 130 | + | ||
| 131 | + items | ||
| 132 | + end | ||
| 133 | + | ||
| 134 | + def project | ||
| 135 | + Project.where(id: params[:project_id]).first if params[:project_id].present? | ||
| 136 | + end | ||
| 137 | +end |
| @@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
| 1 | +# Finders::Issues class | ||
| 2 | +# | ||
| 3 | +# Used to filter Issues collections by set of params | ||
| 4 | +# | ||
| 5 | +# Arguments: | ||
| 6 | +# current_user - which user use | ||
| 7 | +# params: | ||
| 8 | +# scope: 'created-by-me' or 'assigned-to-me' or 'all' | ||
| 9 | +# state: 'open' or 'closed' or 'all' | ||
| 10 | +# group_id: integer | ||
| 11 | +# project_id: integer | ||
| 12 | +# milestone_id: integer | ||
| 13 | +# assignee_id: integer | ||
| 14 | +# search: string | ||
| 15 | +# label_name: string | ||
| 16 | +# sort: string | ||
| 17 | +# | ||
| 18 | +class IssuesFinder < BaseFinder | ||
| 19 | + def klass | ||
| 20 | + Issue | ||
| 21 | + end | ||
| 22 | +end |
| @@ -0,0 +1,22 @@ | @@ -0,0 +1,22 @@ | ||
| 1 | +# Finders::MergeRequest class | ||
| 2 | +# | ||
| 3 | +# Used to filter MergeRequests collections by set of params | ||
| 4 | +# | ||
| 5 | +# Arguments: | ||
| 6 | +# current_user - which user use | ||
| 7 | +# params: | ||
| 8 | +# scope: 'created-by-me' or 'assigned-to-me' or 'all' | ||
| 9 | +# state: 'open' or 'closed' or 'all' | ||
| 10 | +# group_id: integer | ||
| 11 | +# project_id: integer | ||
| 12 | +# milestone_id: integer | ||
| 13 | +# assignee_id: integer | ||
| 14 | +# search: string | ||
| 15 | +# label_name: string | ||
| 16 | +# sort: string | ||
| 17 | +# | ||
| 18 | +class MergeRequestsFinder < BaseFinder | ||
| 19 | + def klass | ||
| 20 | + MergeRequest | ||
| 21 | + end | ||
| 22 | +end |
| @@ -0,0 +1,17 @@ | @@ -0,0 +1,17 @@ | ||
| 1 | +class NotesFinder | ||
| 2 | + def execute(project, current_user, params) | ||
| 3 | + target_type = params[:target_type] | ||
| 4 | + target_id = params[:target_id] | ||
| 5 | + | ||
| 6 | + case target_type | ||
| 7 | + when "commit" | ||
| 8 | + project.notes.for_commit_id(target_id).not_inline.fresh | ||
| 9 | + when "issue" | ||
| 10 | + project.issues.find(target_id).notes.inc_author.fresh | ||
| 11 | + when "merge_request" | ||
| 12 | + project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh | ||
| 13 | + when "snippet" | ||
| 14 | + project.snippets.find(target_id).notes.fresh | ||
| 15 | + end | ||
| 16 | + end | ||
| 17 | +end |
| @@ -0,0 +1,63 @@ | @@ -0,0 +1,63 @@ | ||
| 1 | +class ProjectsFinder | ||
| 2 | + def execute(current_user, options) | ||
| 3 | + group = options[:group] | ||
| 4 | + | ||
| 5 | + if group | ||
| 6 | + group_projects(current_user, group) | ||
| 7 | + else | ||
| 8 | + all_projects(current_user) | ||
| 9 | + end | ||
| 10 | + end | ||
| 11 | + | ||
| 12 | + private | ||
| 13 | + | ||
| 14 | + def group_projects(current_user, group) | ||
| 15 | + if current_user | ||
| 16 | + if group.users.include?(current_user) | ||
| 17 | + # User is group member | ||
| 18 | + # | ||
| 19 | + # Return ALL group projects | ||
| 20 | + group.projects | ||
| 21 | + else | ||
| 22 | + projects_members = UsersProject.where( | ||
| 23 | + project_id: group.projects, | ||
| 24 | + user_id: current_user | ||
| 25 | + ) | ||
| 26 | + | ||
| 27 | + if projects_members.any? | ||
| 28 | + # User is a project member | ||
| 29 | + # | ||
| 30 | + # Return only: | ||
| 31 | + # public projects | ||
| 32 | + # internal projects | ||
| 33 | + # joined projects | ||
| 34 | + # | ||
| 35 | + group.projects.where( | ||
| 36 | + "projects.id IN (?) OR projects.visibility_level IN (?)", | ||
| 37 | + projects_members.pluck(:project_id), | ||
| 38 | + Project.public_and_internal_levels | ||
| 39 | + ) | ||
| 40 | + else | ||
| 41 | + # User has no access to group or group projects | ||
| 42 | + # | ||
| 43 | + # Return only: | ||
| 44 | + # public projects | ||
| 45 | + # internal projects | ||
| 46 | + # | ||
| 47 | + group.projects.public_and_internal_only | ||
| 48 | + end | ||
| 49 | + end | ||
| 50 | + else | ||
| 51 | + # Not authenticated | ||
| 52 | + # | ||
| 53 | + # Return only: | ||
| 54 | + # public projects | ||
| 55 | + group.projects.public_only | ||
| 56 | + end | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + def all_projects | ||
| 60 | + # TODO: implement | ||
| 61 | + raise 'Not implemented yet' | ||
| 62 | + end | ||
| 63 | +end |
app/models/ability.rb
| @@ -184,7 +184,7 @@ class Ability | @@ -184,7 +184,7 @@ class Ability | ||
| 184 | def group_abilities user, group | 184 | def group_abilities user, group |
| 185 | rules = [] | 185 | rules = [] |
| 186 | 186 | ||
| 187 | - if user.admin? || group.users.include?(user) || Projects::CollectService.new.execute(user, group: group).any? | 187 | + if user.admin? || group.users.include?(user) || ProjectsFinder.new.execute(user, group: group).any? |
| 188 | rules << :read_group | 188 | rules << :read_group |
| 189 | end | 189 | end |
| 190 | 190 |
app/services/filtering_service.rb
| @@ -1,138 +0,0 @@ | @@ -1,138 +0,0 @@ | ||
| 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 = init_collection | ||
| 28 | - items = by_scope(items) | ||
| 29 | - items = by_state(items) | ||
| 30 | - items = by_group(items) | ||
| 31 | - items = by_project(items) | ||
| 32 | - items = by_search(items) | ||
| 33 | - items = by_milestone(items) | ||
| 34 | - items = by_assignee(items) | ||
| 35 | - items = by_label(items) | ||
| 36 | - items = sort(items) | ||
| 37 | - end | ||
| 38 | - | ||
| 39 | - private | ||
| 40 | - | ||
| 41 | - def init_collection | ||
| 42 | - table_name = klass.table_name | ||
| 43 | - | ||
| 44 | - if project | ||
| 45 | - if project.public? || (current_user && current_user.can?(:read_project, project)) | ||
| 46 | - project.send(table_name) | ||
| 47 | - else | ||
| 48 | - [] | ||
| 49 | - end | ||
| 50 | - elsif current_user && params[:authorized_only].presence | ||
| 51 | - klass.of_projects(current_user.authorized_projects) | ||
| 52 | - else | ||
| 53 | - klass.of_projects(Project.accessible_to(current_user)) | ||
| 54 | - end | ||
| 55 | - end | ||
| 56 | - | ||
| 57 | - def by_scope(items) | ||
| 58 | - case params[:scope] | ||
| 59 | - when 'created-by-me', 'authored' then | ||
| 60 | - items.where(author_id: current_user.id) | ||
| 61 | - when 'all' then | ||
| 62 | - items | ||
| 63 | - when 'assigned-to-me' then | ||
| 64 | - items.where(assignee_id: current_user.id) | ||
| 65 | - else | ||
| 66 | - raise 'You must specify default scope' | ||
| 67 | - end | ||
| 68 | - end | ||
| 69 | - | ||
| 70 | - def by_state(items) | ||
| 71 | - case params[:state] | ||
| 72 | - when 'closed' | ||
| 73 | - items.closed | ||
| 74 | - when 'all' | ||
| 75 | - items | ||
| 76 | - when 'opened' | ||
| 77 | - items.opened | ||
| 78 | - else | ||
| 79 | - raise 'You must specify default state' | ||
| 80 | - end | ||
| 81 | - end | ||
| 82 | - | ||
| 83 | - def by_group(items) | ||
| 84 | - if params[:group_id].present? | ||
| 85 | - items = items.of_group(Group.find(params[:group_id])) | ||
| 86 | - end | ||
| 87 | - | ||
| 88 | - items | ||
| 89 | - end | ||
| 90 | - | ||
| 91 | - def by_project(items) | ||
| 92 | - if params[:project_id].present? | ||
| 93 | - items = items.of_projects(params[:project_id]) | ||
| 94 | - end | ||
| 95 | - | ||
| 96 | - items | ||
| 97 | - end | ||
| 98 | - | ||
| 99 | - def by_search(items) | ||
| 100 | - if params[:search].present? | ||
| 101 | - items = items.search(params[:search]) | ||
| 102 | - end | ||
| 103 | - | ||
| 104 | - items | ||
| 105 | - end | ||
| 106 | - | ||
| 107 | - def sort(items) | ||
| 108 | - items.sort(params[:sort]) | ||
| 109 | - end | ||
| 110 | - | ||
| 111 | - def by_milestone(items) | ||
| 112 | - if params[:milestone_id].present? | ||
| 113 | - items = items.where(milestone_id: (params[:milestone_id] == '0' ? nil : params[:milestone_id])) | ||
| 114 | - end | ||
| 115 | - | ||
| 116 | - items | ||
| 117 | - end | ||
| 118 | - | ||
| 119 | - def by_assignee(items) | ||
| 120 | - if params[:assignee_id].present? | ||
| 121 | - items = items.where(assignee_id: (params[:assignee_id] == '0' ? nil : params[:assignee_id])) | ||
| 122 | - end | ||
| 123 | - | ||
| 124 | - items | ||
| 125 | - end | ||
| 126 | - | ||
| 127 | - def by_label(items) | ||
| 128 | - if params[:label_name].present? | ||
| 129 | - items = items.tagged_with(params[:label_name]) | ||
| 130 | - end | ||
| 131 | - | ||
| 132 | - items | ||
| 133 | - end | ||
| 134 | - | ||
| 135 | - def project | ||
| 136 | - Project.where(id: params[:project_id]).first if params[:project_id].present? | ||
| 137 | - end | ||
| 138 | -end |
app/services/notes/load_service.rb
| @@ -1,20 +0,0 @@ | @@ -1,20 +0,0 @@ | ||
| 1 | -module Notes | ||
| 2 | - class LoadService < BaseService | ||
| 3 | - def execute | ||
| 4 | - target_type = params[:target_type] | ||
| 5 | - target_id = params[:target_id] | ||
| 6 | - | ||
| 7 | - | ||
| 8 | - @notes = case target_type | ||
| 9 | - when "commit" | ||
| 10 | - project.notes.for_commit_id(target_id).not_inline.fresh | ||
| 11 | - when "issue" | ||
| 12 | - project.issues.find(target_id).notes.inc_author.fresh | ||
| 13 | - when "merge_request" | ||
| 14 | - project.merge_requests.find(target_id).mr_and_commit_notes.inc_author.fresh | ||
| 15 | - when "snippet" | ||
| 16 | - project.snippets.find(target_id).notes.fresh | ||
| 17 | - end | ||
| 18 | - end | ||
| 19 | - end | ||
| 20 | -end |
app/services/projects/collect_service.rb
| @@ -1,69 +0,0 @@ | @@ -1,69 +0,0 @@ | ||
| 1 | -# Projects::CollectService class | ||
| 2 | -# | ||
| 3 | -# Used to collect projects user has access to | ||
| 4 | -# | ||
| 5 | -module Projects | ||
| 6 | - class CollectService | ||
| 7 | - def execute(current_user, options) | ||
| 8 | - group = options[:group] | ||
| 9 | - | ||
| 10 | - if group | ||
| 11 | - group_projects(current_user, group) | ||
| 12 | - else | ||
| 13 | - all_projects(current_user) | ||
| 14 | - end | ||
| 15 | - end | ||
| 16 | - | ||
| 17 | - private | ||
| 18 | - | ||
| 19 | - def group_projects(current_user, group) | ||
| 20 | - if current_user | ||
| 21 | - if group.users.include?(current_user) | ||
| 22 | - # User is group member | ||
| 23 | - # | ||
| 24 | - # Return ALL group projects | ||
| 25 | - group.projects | ||
| 26 | - else | ||
| 27 | - projects_members = UsersProject.where( | ||
| 28 | - project_id: group.projects, | ||
| 29 | - user_id: current_user | ||
| 30 | - ) | ||
| 31 | - | ||
| 32 | - if projects_members.any? | ||
| 33 | - # User is a project member | ||
| 34 | - # | ||
| 35 | - # Return only: | ||
| 36 | - # public projects | ||
| 37 | - # internal projects | ||
| 38 | - # joined projects | ||
| 39 | - # | ||
| 40 | - group.projects.where( | ||
| 41 | - "projects.id IN (?) OR projects.visibility_level IN (?)", | ||
| 42 | - projects_members.pluck(:project_id), | ||
| 43 | - Project.public_and_internal_levels | ||
| 44 | - ) | ||
| 45 | - else | ||
| 46 | - # User has no access to group or group projects | ||
| 47 | - # | ||
| 48 | - # Return only: | ||
| 49 | - # public projects | ||
| 50 | - # internal projects | ||
| 51 | - # | ||
| 52 | - group.projects.public_and_internal_only | ||
| 53 | - end | ||
| 54 | - end | ||
| 55 | - else | ||
| 56 | - # Not authenticated | ||
| 57 | - # | ||
| 58 | - # Return only: | ||
| 59 | - # public projects | ||
| 60 | - group.projects.public_only | ||
| 61 | - end | ||
| 62 | - end | ||
| 63 | - end | ||
| 64 | - | ||
| 65 | - def all_projects | ||
| 66 | - # TODO: implement | ||
| 67 | - raise 'Not implemented yet' | ||
| 68 | - end | ||
| 69 | -end |
config/application.rb
| @@ -12,7 +12,7 @@ module Gitlab | @@ -12,7 +12,7 @@ module Gitlab | ||
| 12 | # -- all .rb files in that directory are automatically loaded. | 12 | # -- all .rb files in that directory are automatically loaded. |
| 13 | 13 | ||
| 14 | # Custom directories with classes and modules you want to be autoloadable. | 14 | # Custom directories with classes and modules you want to be autoloadable. |
| 15 | - config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/models/concerns #{config.root}/app/models/project_services) | 15 | + config.autoload_paths += %W(#{config.root}/lib #{config.root}/app/finders #{config.root}/app/models/concerns #{config.root}/app/models/project_services) |
| 16 | 16 | ||
| 17 | # Only load the plugins named here, in the order given (default is alphabetical). | 17 | # Only load the plugins named here, in the order given (default is alphabetical). |
| 18 | # :all can be used as a placeholder for all plugins not explicitly named. | 18 | # :all can be used as a placeholder for all plugins not explicitly named. |
| @@ -64,7 +64,7 @@ module Gitlab | @@ -64,7 +64,7 @@ module Gitlab | ||
| 64 | config.assets.enabled = true | 64 | config.assets.enabled = true |
| 65 | config.assets.paths << Emoji.images_path | 65 | config.assets.paths << Emoji.images_path |
| 66 | config.assets.precompile << "emoji/*.png" | 66 | config.assets.precompile << "emoji/*.png" |
| 67 | - | 67 | + |
| 68 | # Version of your assets, change this if you want to expire all your assets | 68 | # Version of your assets, change this if you want to expire all your assets |
| 69 | config.assets.version = '1.0' | 69 | config.assets.version = '1.0' |
| 70 | 70 |