diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-12-20 16:37:47 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-12-20 16:37:47 +0300 |
commit | aee0a117a889461ce8ced6fcf73207fe017f1d99 (patch) | |
tree | 891d9ef189227a8445d83f35c1b0fc99573f4380 /app/models/snippet.rb | |
parent | 8d46af3258650d305f53b819eabf7ab18d22f59e (diff) |
Add latest changes from gitlab-org/gitlab@14-6-stable-eev14.6.0-rc42
Diffstat (limited to 'app/models/snippet.rb')
-rw-r--r-- | app/models/snippet.rb | 169 |
1 files changed, 88 insertions, 81 deletions
diff --git a/app/models/snippet.rb b/app/models/snippet.rb index dd76f2c3c84..6a8123b3c08 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -98,87 +98,115 @@ class Snippet < ApplicationRecord mode: :per_attribute_iv, algorithm: 'aes-256-cbc' - def self.with_optional_visibility(value = nil) - if value - where(visibility_level: value) - else - all + 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 - end - def self.only_personal_snippets - where(project_id: nil) - end + def parent_class + ::Project + end - def self.only_project_snippets - where.not(project_id: nil) - end + def sanitized_file_name(file_name) + file_name.gsub(/[^a-zA-Z0-9_\-\.]+/, '') + end - def self.only_include_projects_visible_to(current_user = nil) - levels = Gitlab::VisibilityLevel.levels_for_user(current_user) + def with_optional_visibility(value = nil) + if value + where(visibility_level: value) + else + all + end + end - joins(:project).where(projects: { visibility_level: levels }) - end + def only_personal_snippets + where(project_id: nil) + end - def self.only_include_projects_with_snippets_enabled(include_private: false) - column = ProjectFeature.access_level_attribute(:snippets) - levels = [ProjectFeature::ENABLED, ProjectFeature::PUBLIC] + def only_project_snippets + where.not(project_id: nil) + 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) - .where(project_features: { column => levels }) - end + joins(:project).where(projects: { visibility_level: levels }) + end - def self.only_include_authorized_projects(current_user) - where( - 'EXISTS (?)', - ProjectAuthorization - .select(1) - .where('project_id = snippets.project_id') - .where(user_id: current_user.id) - ) - end + def only_include_projects_with_snippets_enabled(include_private: false) + column = ProjectFeature.access_level_attribute(:snippets) + levels = [ProjectFeature::ENABLED, ProjectFeature::PUBLIC] - def self.for_project_with_user(project, user = nil) - return none unless project.snippets_visible?(user) + levels << ProjectFeature::PRIVATE if include_private - if user && project.team.member?(user) - project.snippets - else - project.snippets.public_to_user(user) + joins(project: :project_feature) + .where(project_features: { column => levels }) end - end - def self.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 only_include_authorized_projects(current_user) + where( + 'EXISTS (?)', + ProjectAuthorization + .select(1) + .where('project_id = snippets.project_id') + .where(user_id: current_user.id) + ) + end - def self.reference_prefix - '$' - end + def for_project_with_user(project, user = nil) + return none unless project.snippets_visible?(user) + + if user && project.team.member?(user) + project.snippets + else + project.snippets.public_to_user(user) + end + end - # Pattern used to extract `$123` snippet references from text - # - # This pattern supports cross-project references. - def self.reference_pattern - @reference_pattern ||= %r{ + 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 + # + # This pattern supports cross-project references. + def reference_pattern + @reference_pattern ||= %r{ (#{Project.reference_pattern})? #{Regexp.escape(reference_prefix)}(?<snippet>\d+) }x - end + end - def self.link_reference_pattern - @link_reference_pattern ||= super("snippets", /(?<snippet>\d+)/) - end + def link_reference_pattern + @link_reference_pattern ||= super("snippets", /(?<snippet>\d+)/) + end - def self.find_by_id_and_project(id:, project:) - Snippet.find_by(id: id, project: project) - end + def find_by_id_and_project(id:, project:) + Snippet.find_by(id: id, project: project) + end + + def find_by_project_title_trunc_created_at(project, title, created_at) + where(project: project, title: title) + .find_by( + "date_trunc('second', created_at at time zone :tz) at time zone :tz = :created_at", + tz: created_at.zone, created_at: created_at) + end - def self.max_file_limit - MAX_FILE_COUNT + def max_file_limit + MAX_FILE_COUNT + end end def initialize(attributes = {}) @@ -230,10 +258,6 @@ class Snippet < ApplicationRecord super.to_s end - def self.sanitized_file_name(file_name) - file_name.gsub(/[^a-zA-Z0-9_\-\.]+/, '') - end - def visibility_level_field :visibility_level end @@ -371,23 +395,6 @@ class Snippet < ApplicationRecord def multiple_files? list_files.size > 1 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 Snippet.prepend_mod_with('Snippet') |