Skip to content

Commit

Permalink
Merge pull request #41 from OneraHub/ft-metamodel-index
Browse files Browse the repository at this point in the history
add GET meta_models index
  • Loading branch information
relf committed Jun 9, 2020
2 parents 1eec479 + 09b1618 commit 805cb64
Show file tree
Hide file tree
Showing 9 changed files with 128 additions and 4 deletions.
5 changes: 5 additions & 0 deletions app/controllers/api/v1/meta_models_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ class Api::V1::MetaModelsController < Api::ApiController

before_action :set_meta_model, only: [:show, :update, :destroy]

def index
@metamodels = policy_scope(MetaModel)
render json: @metamodels, status: status, each_serializer: MetaModelItemSerializer
end

# GET /api/v1/meta_models/1
def show
json_response @meta_model
Expand Down
10 changes: 10 additions & 0 deletions app/policies/meta_model_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,16 @@

class MetaModelPolicy < ApplicationPolicy

class Scope < Scope
def resolve
if user.admin?
scope
else
scope.joins(:discipline).where(disciplines: {analysis: AnalysisPolicy::Scope.new(user, Analysis).resolve.roots})
end
end
end

def show?
@record.analysis.public || @user.admin? || @user.has_role?(:owner, @record.analysis) || @user.has_role?(:member, @record.analysis)
end
Expand Down
13 changes: 13 additions & 0 deletions app/serializers/meta_model_item_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

class MetaModelItemSerializer < ActiveModel::Serializer
attributes :id, :name, :owner_email, :created_at

def name
object.analysis.name
end

def owner_email
object.analysis.owner.email
end
end
13 changes: 13 additions & 0 deletions app/serializers/meta_model_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

class MetaModelSerializer < ActiveModel::Serializer
attributes :id, :name, :owner, :created_at

def name
object.analysis.name
end

def owner
object.analysis.owner
end
end
1 change: 1 addition & 0 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
post 'openmdao_checking', to: 'openmdao_checking#create'
get 'exports/new'
end
resources :meta_models, only: [:index]
resources :operations, only: [:create]
resources :users, only: [:index, :update]
resources :user_roles, only: [:index, :update]
Expand Down
28 changes: 27 additions & 1 deletion spec/requests/api/v1/meta_models_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,37 @@
describe 'meta_model', type: :request do
fixtures :all

path '/api/v1/meta_models' do

get 'Get meta-models' do
tags 'Meta-Modeling'
produces 'application/json'
security [ Token: [] ]

response '200', 'List meta-models' do
schema type: :array,
items: {
type: :object,
properties: {
id: { type: :integer },
name: { type: :string },
owner_email: { type: :string },
created_at: { type: :string, format: :"date-time"}
},
required: [ 'id', 'name', 'owner_email', 'created_at' ]
}

let(:Authorization) { "Token FriendlyApiKey" }
run_test!
end
end
end

path '/api/v1/meta_models/{id}' do

put 'Predict using the metamodel' do
description "Compute y responses at given x points"
tags 'Meta Modeling'
tags 'Meta-Modeling'
consumes 'application/json'
produces 'application/json'
security [ Token: [] ]
Expand Down
2 changes: 1 addition & 1 deletion spec/swagger_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@
security: [{Token: []}],
tags: [
{ name: 'Multi-Disciplinary Analyses', description: 'Operations for using analyses created in WhatsOpt'},
{ name: 'Meta Modeling', description: 'Operations for using metamodels created in WhatsOpt'},
{ name: 'Meta-Modeling', description: 'Operations for using metamodels created in WhatsOpt'},
{ name: 'Optimization', description: 'Operations for using Onera SEGOMOE optimizer'}
],
externalDocs: {
Expand Down
35 changes: 33 additions & 2 deletions swagger/v1/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,43 @@ paths:
application/json:
schema:
"$ref": "#/components/schemas/Xdsm"
"/api/v1/meta_models":
get:
summary: Get meta-models
tags:
- Meta-Modeling
security:
- Token: []
responses:
'200':
description: List meta-models
content:
application/json:
schema:
type: array
items:
type: object
properties:
id:
type: integer
name:
type: string
owner_email:
type: string
created_at:
type: string
format: date-time
required:
- id
- name
- owner_email
- created_at
"/api/v1/meta_models/{id}":
put:
summary: Predict using the metamodel
description: Compute y responses at given x points
tags:
- Meta Modeling
- Meta-Modeling
security:
- Token: []
parameters:
Expand Down Expand Up @@ -403,7 +434,7 @@ security:
tags:
- name: Multi-Disciplinary Analyses
description: Operations for using analyses created in WhatsOpt
- name: Meta Modeling
- name: Meta-Modeling
description: Operations for using metamodels created in WhatsOpt
- name: Optimization
description: Operations for using Onera SEGOMOE optimizer
Expand Down
25 changes: 25 additions & 0 deletions test/controllers/api/v1/meta_models_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,37 @@ class Api::V1::MetaModelsControllerTest < ActionDispatch::IntegrationTest
@user = users(:user1)
@auth_headers = { "Authorization" => "Token " + @user.api_key }
@user2 = users(:user2)
@auth_headers2 = { "Authorization" => "Token " + @user2.api_key }
@user3 = users(:user3)
@auth_headers3 = { "Authorization" => "Token " + @user3.api_key }
end

teardown do
WhatsOpt::SurrogateProxy.shutdown_server
end

test "should get list of metamodels for user1" do
get api_v1_meta_models_url, as: :json, headers: @auth_headers
assert_response :success
mms = JSON.parse(response.body)
assert_equal 3, mms.count
assert_equal ["created_at", "id", "name", "owner_email"], mms.first.keys.sort
end

test "should get list of metamodels for user2" do
get api_v1_meta_models_url, as: :json, headers: @auth_headers2
assert_response :success
mms = JSON.parse(response.body)
assert_equal 3, mms.count # user2 is memeber of cicav_meta_model2
end

test "should get list of metamodels for user3" do
get api_v1_meta_models_url, as: :json, headers: @auth_headers3
assert_response :success
mms = JSON.parse(response.body)
assert_equal 2, mms.count # cicav_meta_model2 is private hence 2 instead of 3
end

test "should create a metamodel" do
assert_difference("Analysis.count", 1) do
assert_difference("Operation.count", 2) do # doe copy + metamodel
Expand Down

0 comments on commit 805cb64

Please sign in to comment.