mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-10-13 23:36:22 +08:00
Add Create and Update endpoints for experiments [SCI-4999]
This commit is contained in:
parent
5b564ed7d4
commit
0147e1aee1
3 changed files with 190 additions and 1 deletions
|
@ -8,6 +8,7 @@ module Api
|
||||||
before_action only: :show do
|
before_action only: :show do
|
||||||
load_experiment(:id)
|
load_experiment(:id)
|
||||||
end
|
end
|
||||||
|
before_action :load_experiment_for_managing, only: %i(update)
|
||||||
|
|
||||||
def index
|
def index
|
||||||
experiments = @project.experiments
|
experiments = @project.experiments
|
||||||
|
@ -19,6 +20,47 @@ module Api
|
||||||
def show
|
def show
|
||||||
render jsonapi: @experiment, serializer: ExperimentSerializer
|
render jsonapi: @experiment, serializer: ExperimentSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
raise PermissionError.new(Experiment, :create) unless can_create_experiments?(@project)
|
||||||
|
|
||||||
|
experiment = @project.experiments.create!(experiment_params.merge!(created_by: current_user,
|
||||||
|
last_modified_by: current_user))
|
||||||
|
|
||||||
|
render jsonapi: experiment, serializer: ExperimentSerializer, status: :created
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
@experiment.assign_attributes(experiment_params)
|
||||||
|
|
||||||
|
return render body: nil, status: :no_content unless @experiment.changed?
|
||||||
|
|
||||||
|
if @experiment.archived_changed?
|
||||||
|
if @experiment.archived?
|
||||||
|
@experiment.archived_by = current_user
|
||||||
|
@experiment.archived_on = DateTime.now
|
||||||
|
else
|
||||||
|
@experiment.restored_by = current_user
|
||||||
|
@experiment.restored_on = DateTime.now
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@experiment.last_modified_by = current_user
|
||||||
|
@experiment.save!
|
||||||
|
render jsonapi: @experiment, serializer: ExperimentSerializer, status: :ok
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def experiment_params
|
||||||
|
raise TypeError unless params.require(:data).require(:type) == 'experiments'
|
||||||
|
|
||||||
|
params.require(:data).require(:attributes).permit(:name, :description, :archived)
|
||||||
|
end
|
||||||
|
|
||||||
|
def load_experiment_for_managing
|
||||||
|
@experiment = @project.experiments.find(params.require(:id))
|
||||||
|
raise PermissionError.new(Experiment, :manage) unless can_manage_experiment?(@experiment)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -704,7 +704,7 @@ Rails.application.routes.draw do
|
||||||
get 'activities', to: 'projects#activities'
|
get 'activities', to: 'projects#activities'
|
||||||
resources :reports, only: %i(index show),
|
resources :reports, only: %i(index show),
|
||||||
path: 'reports', as: :reports
|
path: 'reports', as: :reports
|
||||||
resources :experiments, only: %i(index show) do
|
resources :experiments, only: %i(index show create update) do
|
||||||
resources :task_groups, only: %i(index show)
|
resources :task_groups, only: %i(index show)
|
||||||
resources :connections, only: %i(index show)
|
resources :connections, only: %i(index show)
|
||||||
resources :tasks, only: %i(index show create update) do
|
resources :tasks, only: %i(index show create update) do
|
||||||
|
|
|
@ -11,6 +11,8 @@ RSpec.describe "Api::V1::ExperimentsController", type: :request do
|
||||||
@valid_project = create(:project, name: Faker::Name.unique.name,
|
@valid_project = create(:project, name: Faker::Name.unique.name,
|
||||||
created_by: @user, team: @teams.first)
|
created_by: @user, team: @teams.first)
|
||||||
|
|
||||||
|
create(:user_project, :owner, user: @user, project: @valid_project)
|
||||||
|
|
||||||
@unaccessible_project = create(:project, name: Faker::Name.unique.name,
|
@unaccessible_project = create(:project, name: Faker::Name.unique.name,
|
||||||
created_by: @user, team: @teams.second)
|
created_by: @user, team: @teams.second)
|
||||||
|
|
||||||
|
@ -126,4 +128,149 @@ RSpec.describe "Api::V1::ExperimentsController", type: :request do
|
||||||
expect(hash_body['errors'][0]).to include('status': 404)
|
expect(hash_body['errors'][0]).to include('status': 404)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'POST experiment, #create' do
|
||||||
|
before :all do
|
||||||
|
@valid_headers['Content-Type'] = 'application/json'
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:action) do
|
||||||
|
post(
|
||||||
|
api_v1_team_project_experiments_path(
|
||||||
|
team_id: @valid_project.team.id,
|
||||||
|
project_id: @valid_project
|
||||||
|
),
|
||||||
|
params: request_body.to_json,
|
||||||
|
headers: @valid_headers
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when has valid params' do
|
||||||
|
let(:request_body) do
|
||||||
|
{
|
||||||
|
data: {
|
||||||
|
type: 'experiments',
|
||||||
|
attributes: {
|
||||||
|
name: 'Experiment name',
|
||||||
|
description: 'Experiment description'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates new experiment' do
|
||||||
|
expect { action }.to change { Experiment.count }.by(1)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns status 201' do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(response).to have_http_status 201
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns well formated response' do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(json).to match(
|
||||||
|
hash_including(
|
||||||
|
data: hash_including(
|
||||||
|
type: 'experiments',
|
||||||
|
attributes: hash_including(name: 'Experiment name', description: 'Experiment description')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when has missing param' do
|
||||||
|
let(:request_body) do
|
||||||
|
{
|
||||||
|
data: {
|
||||||
|
type: 'experiments',
|
||||||
|
attributes: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'renders 400' do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(response).to have_http_status(400)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'PATCH experiment, #update' do
|
||||||
|
before :all do
|
||||||
|
@valid_headers['Content-Type'] = 'application/json'
|
||||||
|
@experiment = @valid_project.experiments.first
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:action) do
|
||||||
|
patch(
|
||||||
|
api_v1_team_project_experiment_path(
|
||||||
|
team_id: @valid_project.team.id,
|
||||||
|
project_id: @valid_project.id,
|
||||||
|
id: @experiment.id
|
||||||
|
),
|
||||||
|
params: request_body.to_json,
|
||||||
|
headers: @valid_headers
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when has valid params' do
|
||||||
|
let(:request_body) do
|
||||||
|
{
|
||||||
|
data: {
|
||||||
|
type: 'experiments',
|
||||||
|
attributes: {
|
||||||
|
name: 'New experiment name',
|
||||||
|
description: 'New experiment description',
|
||||||
|
archived: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns status 200' do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(response).to have_http_status 200
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'returns well formated response' do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(json).to match(
|
||||||
|
hash_including(
|
||||||
|
data: hash_including(
|
||||||
|
type: 'experiments',
|
||||||
|
attributes: hash_including(
|
||||||
|
name: 'New experiment name', description: 'New experiment description', archived: true
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when has missing param' do
|
||||||
|
let(:request_body) do
|
||||||
|
{
|
||||||
|
data: {
|
||||||
|
type: 'experiments',
|
||||||
|
attributes: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'renders 400' do
|
||||||
|
action
|
||||||
|
|
||||||
|
expect(response).to have_http_status(400)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue