From 3fdfd27c427cb907a2d0c6c9d1000b60b12f006c Mon Sep 17 00:00:00 2001 From: Bob Van Landuyt Date: Tue, 5 Mar 2019 13:54:19 +0100 Subject: [PATCH 1/2] Add DesignManagement::Design model The design model will represent one single file uploaded to a `DesignCollection` linked to an issue. --- db/schema.rb | 11 ++++++++++ ee/app/models/design_management.rb | 7 ++++++ ee/app/models/design_management/design.rb | 13 +++++++++++ .../migrate/20190228134845_create_designs.rb | 11 ++++++++++ .../factories/design_management/designs.rb | 9 ++++++++ .../models/design_management/design_spec.rb | 22 +++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 ee/app/models/design_management.rb create mode 100644 ee/app/models/design_management/design.rb create mode 100644 ee/db/migrate/20190228134845_create_designs.rb create mode 100644 ee/spec/factories/design_management/designs.rb create mode 100644 ee/spec/models/design_management/design_spec.rb diff --git a/db/schema.rb b/db/schema.rb index 9a65135e6991e3..964a3ec891845a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1035,6 +1035,15 @@ t.index ["project_id", "status"], name: "index_deployments_on_project_id_and_status", using: :btree end + create_table "design_management_designs", id: :bigserial, force: :cascade do |t| + t.integer "project_id", null: false + t.integer "issue_id", null: false + t.string "filename", null: false + t.index ["issue_id", "filename"], name: "index_design_management_designs_on_issue_id_and_filename", unique: true, using: :btree + t.index ["issue_id"], name: "index_design_management_designs_on_issue_id", unique: true, using: :btree + t.index ["project_id"], name: "index_design_management_designs_on_project_id", using: :btree + end + create_table "draft_notes", id: :bigserial, force: :cascade do |t| t.integer "merge_request_id", null: false t.integer "author_id", null: false @@ -3405,6 +3414,8 @@ add_foreign_key "container_repositories", "projects" add_foreign_key "deploy_keys_projects", "projects", name: "fk_58a901ca7e", on_delete: :cascade add_foreign_key "deployments", "projects", name: "fk_b9a3851b82", on_delete: :cascade + add_foreign_key "design_management_designs", "issues", on_delete: :cascade + add_foreign_key "design_management_designs", "projects", on_delete: :cascade add_foreign_key "draft_notes", "merge_requests", on_delete: :cascade add_foreign_key "draft_notes", "users", column: "author_id", on_delete: :cascade add_foreign_key "environments", "projects", name: "fk_d1c8c1da6a", on_delete: :cascade diff --git a/ee/app/models/design_management.rb b/ee/app/models/design_management.rb new file mode 100644 index 00000000000000..743a70852ca90b --- /dev/null +++ b/ee/app/models/design_management.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +module DesignManagement + def self.table_name_prefix + 'design_management_' + end +end diff --git a/ee/app/models/design_management/design.rb b/ee/app/models/design_management/design.rb new file mode 100644 index 00000000000000..377a2a58a991a2 --- /dev/null +++ b/ee/app/models/design_management/design.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module DesignManagement + class Design < ApplicationRecord + belongs_to :project + belongs_to :issue + has_many :versions, class_name: 'DesignManagement::Version', inverse_of: :design + + validates :project, :issue, :filename, presence: true + validates :issue, uniqueness: true + validates :filename, uniqueness: { scope: :issue_id } + end +end diff --git a/ee/db/migrate/20190228134845_create_designs.rb b/ee/db/migrate/20190228134845_create_designs.rb new file mode 100644 index 00000000000000..3736bd8747bdfd --- /dev/null +++ b/ee/db/migrate/20190228134845_create_designs.rb @@ -0,0 +1,11 @@ +class CreateDesigns < ActiveRecord::Migration[5.0] + def change + create_table :design_management_designs, id: :bigserial do |t| + t.references :project, foreign_key: { on_delete: :cascade }, index: true, null: false + t.references :issue, foreign_key: { on_delete: :cascade }, index: { unique: true }, null: false + + t.string :filename, null: false + t.index [:issue_id, :filename], unique: true + end + end +end diff --git a/ee/spec/factories/design_management/designs.rb b/ee/spec/factories/design_management/designs.rb new file mode 100644 index 00000000000000..51b0350000b03e --- /dev/null +++ b/ee/spec/factories/design_management/designs.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :design, class: DesignManagement::Design do + issue + project { issue.project } + sequence(:filename) { |n| "homescreen-#{n}.jpg" } + end +end diff --git a/ee/spec/models/design_management/design_spec.rb b/ee/spec/models/design_management/design_spec.rb new file mode 100644 index 00000000000000..5b3c44f496d10b --- /dev/null +++ b/ee/spec/models/design_management/design_spec.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe DesignManagement::Design do + describe 'relations' do + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:issue) } + it { is_expected.to have_many(:versions) } + end + + describe 'validations' do + subject(:design) { build(:design) } + + it { is_expected.to be_valid } + it { is_expected.to validate_presence_of(:project) } + it { is_expected.to validate_presence_of(:issue) } + it { is_expected.to validate_presence_of(:filename) } + it { is_expected.to validate_uniqueness_of(:issue) } + it { is_expected.to validate_uniqueness_of(:filename).scoped_to(:issue_id) } + end +end -- GitLab From b465c62f9198f40039606687d62f22d0cf3840fa Mon Sep 17 00:00:00 2001 From: Bob Van Landuyt Date: Tue, 5 Mar 2019 13:56:59 +0100 Subject: [PATCH 2/2] Add DesignManagement::Version model The DesignManagement::Version will keep track of different versions of a design that were uploaded. Every time a new version gets uploaded we create a new version so we know the last commit that touched the file. It will also make it easy to track which version was commented on. --- db/schema.rb | 8 ++++++++ ee/app/models/design_management/version.rb | 20 +++++++++++++++++++ .../20190302144241_create_design_versions.rb | 8 ++++++++ .../factories/design_management/versions.rb | 8 ++++++++ .../models/design_management/version_spec.rb | 20 +++++++++++++++++++ 5 files changed, 64 insertions(+) create mode 100644 ee/app/models/design_management/version.rb create mode 100644 ee/db/migrate/20190302144241_create_design_versions.rb create mode 100644 ee/spec/factories/design_management/versions.rb create mode 100644 ee/spec/models/design_management/version_spec.rb diff --git a/db/schema.rb b/db/schema.rb index 964a3ec891845a..ffb8f36ffdc4a5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1044,6 +1044,13 @@ t.index ["project_id"], name: "index_design_management_designs_on_project_id", using: :btree end + create_table "design_management_versions", id: :bigserial, force: :cascade do |t| + t.bigint "design_management_design_id", null: false + t.binary "sha", null: false + t.index ["design_management_design_id"], name: "index_design_management_versions_on_design_management_design_id", using: :btree + t.index ["sha"], name: "index_design_management_versions_on_sha", unique: true, using: :btree + end + create_table "draft_notes", id: :bigserial, force: :cascade do |t| t.integer "merge_request_id", null: false t.integer "author_id", null: false @@ -3416,6 +3423,7 @@ add_foreign_key "deployments", "projects", name: "fk_b9a3851b82", on_delete: :cascade add_foreign_key "design_management_designs", "issues", on_delete: :cascade add_foreign_key "design_management_designs", "projects", on_delete: :cascade + add_foreign_key "design_management_versions", "design_management_designs", on_delete: :cascade add_foreign_key "draft_notes", "merge_requests", on_delete: :cascade add_foreign_key "draft_notes", "users", column: "author_id", on_delete: :cascade add_foreign_key "environments", "projects", name: "fk_d1c8c1da6a", on_delete: :cascade diff --git a/ee/app/models/design_management/version.rb b/ee/app/models/design_management/version.rb new file mode 100644 index 00000000000000..f23ad4abded447 --- /dev/null +++ b/ee/app/models/design_management/version.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module DesignManagement + class Version < ApplicationRecord + include ShaAttribute + + belongs_to :design, class_name: "DesignManagement::Design", foreign_key: 'design_management_design_id' + has_one :project, through: :design + has_one :issue, through: :design + + # This is a polymorphic association, so we can't count on FK's to delete the + # data + has_many :notes, as: :noteable, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent + + validates :sha, :design, presence: true + validates :sha, uniqueness: { case_sensitive: false } + + sha_attribute :sha + end +end diff --git a/ee/db/migrate/20190302144241_create_design_versions.rb b/ee/db/migrate/20190302144241_create_design_versions.rb new file mode 100644 index 00000000000000..40a4e85989b73f --- /dev/null +++ b/ee/db/migrate/20190302144241_create_design_versions.rb @@ -0,0 +1,8 @@ +class CreateDesignVersions < ActiveRecord::Migration[5.0] + def change + create_table :design_management_versions, id: :bigserial do |t| + t.references :design_management_design, foreign_key: { on_delete: :cascade }, type: :bigint, null: false, index: true + t.binary :sha, null: false, index: { unique: true }, limit: 20 + end + end +end diff --git a/ee/spec/factories/design_management/versions.rb b/ee/spec/factories/design_management/versions.rb new file mode 100644 index 00000000000000..37f231b8a9a288 --- /dev/null +++ b/ee/spec/factories/design_management/versions.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :design_version, class: DesignManagement::Version do + design + sequence(:sha) { |n| Digest::SHA1.hexdigest("commit-like-#{n}") } + end +end diff --git a/ee/spec/models/design_management/version_spec.rb b/ee/spec/models/design_management/version_spec.rb new file mode 100644 index 00000000000000..3182739ed56667 --- /dev/null +++ b/ee/spec/models/design_management/version_spec.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true +require 'rails_helper' + +describe DesignManagement::Version do + describe 'relations' do + it { is_expected.to belong_to(:design) } + it { is_expected.to have_one(:issue) } + it { is_expected.to have_one(:project) } + it { is_expected.to have_many(:notes).dependent(:delete_all) } + end + + describe 'validations' do + subject(:design_version) { build(:design_version) } + + it { is_expected.to be_valid } + it { is_expected.to validate_presence_of(:design) } + it { is_expected.to validate_presence_of(:sha) } + it { is_expected.to validate_uniqueness_of(:sha).case_insensitive } + end +end -- GitLab