mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-20 14:45:56 +08:00
Add equals team validations for project and folder
This commit is contained in:
parent
df2b8ab3df
commit
87b5552b27
|
@ -5,7 +5,6 @@ module Api
|
||||||
class ProjectFoldersController < BaseController
|
class ProjectFoldersController < BaseController
|
||||||
before_action :load_team
|
before_action :load_team
|
||||||
before_action :load_project_folder, only: %i(show update)
|
before_action :load_project_folder, only: %i(show update)
|
||||||
before_action :check_parent_folder, only: %i(create update)
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
project_folders = @team.project_folders
|
project_folders = @team.project_folders
|
||||||
|
@ -52,10 +51,6 @@ module Api
|
||||||
|
|
||||||
folder_params
|
folder_params
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_parent_folder
|
|
||||||
@team.project_folders.find(folder_params[:parent_folder_id]) if folder_params[:parent_folder_id]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,7 +9,6 @@ module Api
|
||||||
end
|
end
|
||||||
before_action :load_project, only: :activities
|
before_action :load_project, only: :activities
|
||||||
before_action :load_project_for_managing, only: %i(update)
|
before_action :load_project_for_managing, only: %i(update)
|
||||||
before_action :check_parent_folder, only: %i(create update)
|
|
||||||
|
|
||||||
def index
|
def index
|
||||||
projects = @team.projects
|
projects = @team.projects
|
||||||
|
@ -69,10 +68,6 @@ module Api
|
||||||
@project = @team.projects.find(params.require(:id))
|
@project = @team.projects.find(params.require(:id))
|
||||||
raise PermissionError.new(Project, :manage) unless can_manage_project?(@project)
|
raise PermissionError.new(Project, :manage) unless can_manage_project?(@project)
|
||||||
end
|
end
|
||||||
|
|
||||||
def check_parent_folder
|
|
||||||
@team.project_folders.find(project_params[:project_folder_id]) if project_params[:project_folder_id]
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -12,6 +12,7 @@ class Project < ApplicationRecord
|
||||||
uniqueness: { scope: :team_id, case_sensitive: false }
|
uniqueness: { scope: :team_id, case_sensitive: false }
|
||||||
validates :visibility, presence: true
|
validates :visibility, presence: true
|
||||||
validates :team, presence: true
|
validates :team, presence: true
|
||||||
|
validate :project_folder_team, if: -> { project_folder.present? }
|
||||||
|
|
||||||
belongs_to :created_by,
|
belongs_to :created_by,
|
||||||
foreign_key: 'created_by_id',
|
foreign_key: 'created_by_id',
|
||||||
|
@ -321,4 +322,12 @@ class Project < ApplicationRecord
|
||||||
ensure
|
ensure
|
||||||
report.destroy if report.present?
|
report.destroy if report.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def project_folder_team
|
||||||
|
return if project_folder.team_id == team_id
|
||||||
|
|
||||||
|
errors.add(:project_folder, I18n.t('activerecord.errors.models.project.attributes.project_folder.team'))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,8 +8,9 @@ class ProjectFolder < ApplicationRecord
|
||||||
length: { minimum: Constants::NAME_MIN_LENGTH,
|
length: { minimum: Constants::NAME_MIN_LENGTH,
|
||||||
maximum: Constants::NAME_MAX_LENGTH },
|
maximum: Constants::NAME_MAX_LENGTH },
|
||||||
uniqueness: { scope: :team_id, case_sensitive: false }
|
uniqueness: { scope: :team_id, case_sensitive: false }
|
||||||
|
validate :parent_folder_team, if: -> { parent_folder.present? }
|
||||||
|
|
||||||
before_validation :inherit_team_from_parent_folder, if: -> { team.blank? && parent_folder.present? }
|
before_validation :inherit_team_from_parent_folder, on: :create, if: -> { parent_folder.present? }
|
||||||
|
|
||||||
belongs_to :team, inverse_of: :project_folders, touch: true
|
belongs_to :team, inverse_of: :project_folders, touch: true
|
||||||
belongs_to :parent_folder, class_name: 'ProjectFolder', optional: true
|
belongs_to :parent_folder, class_name: 'ProjectFolder', optional: true
|
||||||
|
@ -87,4 +88,10 @@ class ProjectFolder < ApplicationRecord
|
||||||
def inherit_team_from_parent_folder
|
def inherit_team_from_parent_folder
|
||||||
self.team = parent_folder.team
|
self.team = parent_folder.team
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def parent_folder_team
|
||||||
|
return if parent_folder.team_id == team_id
|
||||||
|
|
||||||
|
errors.add(:parent_folder, I18n.t('activerecord.errors.models.project_folder.attributes.parent_folder'))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -96,6 +96,11 @@ en:
|
||||||
attributes:
|
attributes:
|
||||||
name:
|
name:
|
||||||
taken: "This project name has to be unique inside a team (this includes the archive)."
|
taken: "This project name has to be unique inside a team (this includes the archive)."
|
||||||
|
project_folder:
|
||||||
|
team: "Project folder and project should belongs to the same team"
|
||||||
|
project_folder:
|
||||||
|
attributes:
|
||||||
|
parent_folder: "Parent folder and folder should belongs to the same team"
|
||||||
view_state:
|
view_state:
|
||||||
attributes:
|
attributes:
|
||||||
viewable_id:
|
viewable_id:
|
||||||
|
|
|
@ -40,5 +40,27 @@ describe ProjectFolder, type: :model do
|
||||||
expect(project_folder).to validate_uniqueness_of(:name).scoped_to(:team_id).case_insensitive
|
expect(project_folder).to validate_uniqueness_of(:name).scoped_to(:team_id).case_insensitive
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#parent_folder_team' do
|
||||||
|
it 'should validate equals of team and parent_folder team' do
|
||||||
|
project_folder.save
|
||||||
|
parent_folder = create(:project_folder, name: 'Parent folder')
|
||||||
|
|
||||||
|
project_folder.update(parent_folder: parent_folder)
|
||||||
|
|
||||||
|
expect(project_folder.errors).to have_key(:parent_folder)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'Callbacks' do
|
||||||
|
describe 'inherit_team_from_parent_folder' do
|
||||||
|
it do
|
||||||
|
parent_folder = create(:project_folder, name: 'Parent folder')
|
||||||
|
project_folder.parent_folder = parent_folder
|
||||||
|
|
||||||
|
expect { project_folder.save }.to(change { project_folder.team })
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -67,5 +67,15 @@ describe Project, type: :model do
|
||||||
expect(project).to validate_uniqueness_of(:name).scoped_to(:team_id).case_insensitive
|
expect(project).to validate_uniqueness_of(:name).scoped_to(:team_id).case_insensitive
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#project_folder_team' do
|
||||||
|
it 'should validate equals of team and project_folder team' do
|
||||||
|
project_folder = create(:project_folder, name: 'Folder from another team')
|
||||||
|
project.project_folder = project_folder
|
||||||
|
project.save
|
||||||
|
|
||||||
|
expect(project.errors).to have_key(:project_folder)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -111,16 +111,6 @@ RSpec.describe 'Api::V1::ProjectFoldersController', type: :request do
|
||||||
expect(JSON.parse(response.body)['errors'].first['title']).to be_eql 'Validation error'
|
expect(JSON.parse(response.body)['errors'].first['title']).to be_eql 'Validation error'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when parent_folder not found' do
|
|
||||||
let(:parent_folder_id) { -1 }
|
|
||||||
|
|
||||||
it do
|
|
||||||
action
|
|
||||||
|
|
||||||
expect(response).to have_http_status 404
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -190,13 +180,15 @@ RSpec.describe 'Api::V1::ProjectFoldersController', type: :request do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when parent_folder not found' do
|
context 'when parent_folder belongs to another team' do
|
||||||
let(:parent_folder_id) { -1 }
|
let(:folder_from_another_team) { create(:project_folder) }
|
||||||
|
let(:parent_folder_id) { folder_from_another_team.id }
|
||||||
|
|
||||||
it do
|
it do
|
||||||
action
|
action
|
||||||
|
|
||||||
expect(response).to have_http_status(404)
|
expect(JSON.parse(response.body)['errors'].first['title']).to be_eql 'Validation error'
|
||||||
|
expect(response).to have_http_status 400
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,17 @@ RSpec.describe 'Api::V1::ProjectsController', type: :request do
|
||||||
expect(response).to have_http_status(201)
|
expect(response).to have_http_status(201)
|
||||||
expect(JSON.parse(response.body).dig('data', 'relationships', 'project_folder', 'data')).to be_truthy
|
expect(JSON.parse(response.body).dig('data', 'relationships', 'project_folder', 'data')).to be_truthy
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when folder from a different team' do
|
||||||
|
let(:project_folder) { create :project_folder, team: @teams.last }
|
||||||
|
|
||||||
|
it do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(JSON.parse(response.body)['errors'].first['title']).to be_eql 'Validation error'
|
||||||
|
expect(response).to have_http_status 400
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue