# frozen_string_literal: true #-- copyright # OpenProject is an open source project management software. # Copyright (C) the OpenProject GmbH # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License version 3. # # OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: # Copyright (C) 2006-2013 Jean-Philippe Lang # Copyright (C) 2010-2013 the ChiliProject Team # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ class GiteaPullRequest < ApplicationRecord LABEL_KEYS = %w[color name].freeze has_and_belongs_to_many :work_packages belongs_to :gitea_user, optional: true belongs_to :merged_by, optional: true, class_name: "GiteaUser" enum :state, { open: "open", closed: "closed", merged: "merged" } validates :gitea_html_url, :number, :repository, :state, :title, :gitea_updated_at, presence: true validates :body, presence: { unless: :partial? } validate :validate_labels_schema scope :without_work_package, -> { where.missing(:work_packages) } def self.find_by_gitea_identifiers(url:, id: nil, initialize: false) raise ArgumentError, "needs a url" if url.blank? found = find_by(gitea_html_url: url) found || (new(gitea_id: id, gitea_html_url: url) if initialize) end def partial? [body].all?(&:nil?) end private def validate_labels_schema return if labels.nil? return if labels.all? { |label| label.keys.sort == LABEL_KEYS } errors.add(:labels, :invalid_schema) end end