Commit ba770c43 authored by Bob Van Landuyt's avatar Bob Van Landuyt

Merge branch 'jcunha/refactor-snippets-class-methods' into 'master'

Standardize snippet class methods location

See merge request gitlab-org/gitlab!75383
parents 18c34a49 635e2e5d
...@@ -98,87 +98,108 @@ class Snippet < ApplicationRecord ...@@ -98,87 +98,108 @@ class Snippet < ApplicationRecord
mode: :per_attribute_iv, mode: :per_attribute_iv,
algorithm: 'aes-256-cbc' algorithm: 'aes-256-cbc'
def self.with_optional_visibility(value = nil) class << self
if value # Searches for snippets with a matching title, description or file name.
where(visibility_level: value) #
else # This method uses ILIKE on PostgreSQL.
all #
# query - The search query as a String.
#
# Returns an ActiveRecord::Relation.
def search(query)
fuzzy_search(query, [:title, :description, :file_name])
end end
end
def self.only_personal_snippets def parent_class
where(project_id: nil) ::Project
end end
def self.only_project_snippets def sanitized_file_name(file_name)
where.not(project_id: nil) file_name.gsub(/[^a-zA-Z0-9_\-\.]+/, '')
end end
def self.only_include_projects_visible_to(current_user = nil) def with_optional_visibility(value = nil)
levels = Gitlab::VisibilityLevel.levels_for_user(current_user) if value
where(visibility_level: value)
else
all
end
end
joins(:project).where(projects: { visibility_level: levels }) def only_personal_snippets
end where(project_id: nil)
end
def self.only_include_projects_with_snippets_enabled(include_private: false) def only_project_snippets
column = ProjectFeature.access_level_attribute(:snippets) where.not(project_id: nil)
levels = [ProjectFeature::ENABLED, ProjectFeature::PUBLIC] end
levels << ProjectFeature::PRIVATE if include_private def only_include_projects_visible_to(current_user = nil)
levels = Gitlab::VisibilityLevel.levels_for_user(current_user)
joins(project: :project_feature) joins(:project).where(projects: { visibility_level: levels })
.where(project_features: { column => levels }) end
end
def self.only_include_authorized_projects(current_user) def only_include_projects_with_snippets_enabled(include_private: false)
where( column = ProjectFeature.access_level_attribute(:snippets)
'EXISTS (?)', levels = [ProjectFeature::ENABLED, ProjectFeature::PUBLIC]
ProjectAuthorization
.select(1)
.where('project_id = snippets.project_id')
.where(user_id: current_user.id)
)
end
def self.for_project_with_user(project, user = nil) levels << ProjectFeature::PRIVATE if include_private
return none unless project.snippets_visible?(user)
if user && project.team.member?(user) joins(project: :project_feature)
project.snippets .where(project_features: { column => levels })
else
project.snippets.public_to_user(user)
end end
end
def self.visible_to_or_authored_by(user) def only_include_authorized_projects(current_user)
query = where(visibility_level: Gitlab::VisibilityLevel.levels_for_user(user)) where(
query.or(where(author_id: user.id)) 'EXISTS (?)',
end ProjectAuthorization
.select(1)
.where('project_id = snippets.project_id')
.where(user_id: current_user.id)
)
end
def self.reference_prefix def for_project_with_user(project, user = nil)
'$' return none unless project.snippets_visible?(user)
end
if user && project.team.member?(user)
project.snippets
else
project.snippets.public_to_user(user)
end
end
def visible_to_or_authored_by(user)
query = where(visibility_level: Gitlab::VisibilityLevel.levels_for_user(user))
query.or(where(author_id: user.id))
end
def reference_prefix
'$'
end
# Pattern used to extract `$123` snippet references from text # Pattern used to extract `$123` snippet references from text
# #
# This pattern supports cross-project references. # This pattern supports cross-project references.
def self.reference_pattern def reference_pattern
@reference_pattern ||= %r{ @reference_pattern ||= %r{
(#{Project.reference_pattern})? (#{Project.reference_pattern})?
#{Regexp.escape(reference_prefix)}(?<snippet>\d+) #{Regexp.escape(reference_prefix)}(?<snippet>\d+)
}x }x
end end
def self.link_reference_pattern def link_reference_pattern
@link_reference_pattern ||= super("snippets", /(?<snippet>\d+)/) @link_reference_pattern ||= super("snippets", /(?<snippet>\d+)/)
end end
def self.find_by_id_and_project(id:, project:) def find_by_id_and_project(id:, project:)
Snippet.find_by(id: id, project: project) Snippet.find_by(id: id, project: project)
end end
def self.max_file_limit def max_file_limit
MAX_FILE_COUNT MAX_FILE_COUNT
end
end end
def initialize(attributes = {}) def initialize(attributes = {})
...@@ -230,10 +251,6 @@ class Snippet < ApplicationRecord ...@@ -230,10 +251,6 @@ class Snippet < ApplicationRecord
super.to_s super.to_s
end end
def self.sanitized_file_name(file_name)
file_name.gsub(/[^a-zA-Z0-9_\-\.]+/, '')
end
def visibility_level_field def visibility_level_field
:visibility_level :visibility_level
end end
...@@ -371,23 +388,6 @@ class Snippet < ApplicationRecord ...@@ -371,23 +388,6 @@ class Snippet < ApplicationRecord
def multiple_files? def multiple_files?
list_files.size > 1 list_files.size > 1
end end
class << self
# Searches for snippets with a matching title, description or file name.
#
# This method uses ILIKE on PostgreSQL.
#
# query - The search query as a String.
#
# Returns an ActiveRecord::Relation.
def search(query)
fuzzy_search(query, [:title, :description, :file_name])
end
def parent_class
::Project
end
end
end end
Snippet.prepend_mod_with('Snippet') Snippet.prepend_mod_with('Snippet')
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