flutter 0.1.0.pre.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.overcommit.yml +8 -0
- data/.rubocop.yml +10 -0
- data/CHANGELOG.md +6 -0
- data/CODE_OF_CONDUCT.md +84 -0
- data/Gemfile +35 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +21 -0
- data/README.md +134 -0
- data/Rakefile +24 -0
- data/TODO.md +30 -0
- data/integration_tests/minitest/grape_app/.gitignore +67 -0
- data/integration_tests/minitest/grape_app/.ruby-version +1 -0
- data/integration_tests/minitest/grape_app/Gemfile +17 -0
- data/integration_tests/minitest/grape_app/Gemfile.lock +89 -0
- data/integration_tests/minitest/grape_app/README.md +2 -0
- data/integration_tests/minitest/grape_app/Rakefile +9 -0
- data/integration_tests/minitest/grape_app/api/api.rb +34 -0
- data/integration_tests/minitest/grape_app/api/routes/api_helpers.rb +12 -0
- data/integration_tests/minitest/grape_app/api/routes/change_request/api.rb +69 -0
- data/integration_tests/minitest/grape_app/api/routes/change_request/response_entity.rb +18 -0
- data/integration_tests/minitest/grape_app/api/routes/event/api.rb +121 -0
- data/integration_tests/minitest/grape_app/api/routes/event/response_entity.rb +41 -0
- data/integration_tests/minitest/grape_app/api/routes/project/api.rb +59 -0
- data/integration_tests/minitest/grape_app/api/routes/project/response_entity.rb +13 -0
- data/integration_tests/minitest/grape_app/api/routes/property/api.rb +78 -0
- data/integration_tests/minitest/grape_app/api/routes/property/response_entity.rb +31 -0
- data/integration_tests/minitest/grape_app/api/routes/trackable_object/api.rb +64 -0
- data/integration_tests/minitest/grape_app/api/routes/trackable_object/response_entity.rb +24 -0
- data/integration_tests/minitest/grape_app/api/routes/tracking_spec/api.rb +88 -0
- data/integration_tests/minitest/grape_app/api/routes/tracking_spec/response_entity.rb +17 -0
- data/integration_tests/minitest/grape_app/api/routes/tracking_spec/spec_response.rb +19 -0
- data/integration_tests/minitest/grape_app/api/routes/user/api.rb +22 -0
- data/integration_tests/minitest/grape_app/api/routes/user/response_entity.rb +12 -0
- data/integration_tests/minitest/grape_app/app/app.rb +30 -0
- data/integration_tests/minitest/grape_app/app/change_request/endpoint.rb +24 -0
- data/integration_tests/minitest/grape_app/app/change_request/generate_system_changes.rb +25 -0
- data/integration_tests/minitest/grape_app/app/change_request/service.rb +79 -0
- data/integration_tests/minitest/grape_app/app/event/endpoint.rb +78 -0
- data/integration_tests/minitest/grape_app/app/event/service.rb +68 -0
- data/integration_tests/minitest/grape_app/app/event/validator.rb +108 -0
- data/integration_tests/minitest/grape_app/app/project/endpoint.rb +24 -0
- data/integration_tests/minitest/grape_app/app/project/service.rb +42 -0
- data/integration_tests/minitest/grape_app/app/property/endpoint.rb +39 -0
- data/integration_tests/minitest/grape_app/app/property/service.rb +56 -0
- data/integration_tests/minitest/grape_app/app/trackable_object/endpoint.rb +38 -0
- data/integration_tests/minitest/grape_app/app/trackable_object/service.rb +49 -0
- data/integration_tests/minitest/grape_app/app/trackable_object/validator.rb +40 -0
- data/integration_tests/minitest/grape_app/app/tracking_spec/endpoint.rb +58 -0
- data/integration_tests/minitest/grape_app/app/tracking_spec/expand_tracking_spec_events.rb +91 -0
- data/integration_tests/minitest/grape_app/app/tracking_spec/service.rb +51 -0
- data/integration_tests/minitest/grape_app/app/tracking_spec/validator.rb +61 -0
- data/integration_tests/minitest/grape_app/app/utils/errors/api_exceptions.rb +10 -0
- data/integration_tests/minitest/grape_app/app/utils/errors/service_exceptions.rb +12 -0
- data/integration_tests/minitest/grape_app/app/versioned_entity/entity.rb +110 -0
- data/integration_tests/minitest/grape_app/app/versioned_entity/service.rb +47 -0
- data/integration_tests/minitest/grape_app/app/versioned_entity/validator.rb +61 -0
- data/integration_tests/minitest/grape_app/app/versioned_entity_snapshot/entity.rb +32 -0
- data/integration_tests/minitest/grape_app/config/boot.rb +9 -0
- data/integration_tests/minitest/grape_app/config.ru +3 -0
- data/integration_tests/minitest/grape_app/db/proto/change_request.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/common/doc.rb +86 -0
- data/integration_tests/minitest/grape_app/db/proto/event.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/event_snapshot.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/project.rb +21 -0
- data/integration_tests/minitest/grape_app/db/proto/property.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/property_snapshot.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/trackable_object.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/trackable_object_snapshot.rb +10 -0
- data/integration_tests/minitest/grape_app/db/proto/tracking_spec.rb +10 -0
- data/integration_tests/minitest/grape_app/test/api/functional/event_test.rb +186 -0
- data/integration_tests/minitest/grape_app/test/api/functional/property_test.rb +197 -0
- data/integration_tests/minitest/grape_app/test/api/functional/trackable_object_test.rb +134 -0
- data/integration_tests/minitest/grape_app/test/api/functional/tracking_spec_test.rb +56 -0
- data/integration_tests/minitest/grape_app/test/api/functional/user_test.rb +24 -0
- data/integration_tests/minitest/grape_app/test/api/functional/versioned_entity_helper.rb +157 -0
- data/integration_tests/minitest/grape_app/test/fixtures/change_requests.rb +83 -0
- data/integration_tests/minitest/grape_app/test/fixtures/event_snapshots.rb +105 -0
- data/integration_tests/minitest/grape_app/test/fixtures/events.rb +58 -0
- data/integration_tests/minitest/grape_app/test/fixtures/properties.rb +66 -0
- data/integration_tests/minitest/grape_app/test/fixtures/property_snapshots.rb +124 -0
- data/integration_tests/minitest/grape_app/test/fixtures/sample_tracking_spec.json +125 -0
- data/integration_tests/minitest/grape_app/test/fixtures/trackable_objects.rb +58 -0
- data/integration_tests/minitest/grape_app/test/fixtures/trackable_objects_snapshots.rb +61 -0
- data/integration_tests/minitest/grape_app/test/fixtures/tracking_specs.rb +22 -0
- data/integration_tests/minitest/grape_app/test/test_helper.rb +15 -0
- data/lib/flutter/config.rb +24 -0
- data/lib/flutter/minitest.rb +83 -0
- data/lib/flutter/parser.rb +82 -0
- data/lib/flutter/persistence.rb +152 -0
- data/lib/flutter/rspec.rb +66 -0
- data/lib/flutter/tracker.rb +133 -0
- data/lib/flutter/version.rb +5 -0
- data/lib/flutter.rb +12 -0
- data/lib/minitest/flutter_plugin.rb +16 -0
- data/sig/flutter.rbs +4 -0
- metadata +187 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require_relative '../api_helpers'
|
|
2
|
+
require_relative './response_entity'
|
|
3
|
+
require 'ostruct'
|
|
4
|
+
|
|
5
|
+
module Skee::API::Routes::User
|
|
6
|
+
class API < Grape::API
|
|
7
|
+
helpers Skee::API::Routes::APIHelpers
|
|
8
|
+
|
|
9
|
+
resource :users do
|
|
10
|
+
desc 'Authenticate a user'
|
|
11
|
+
params do
|
|
12
|
+
requires :username, type: String, desc: 'username of the user'
|
|
13
|
+
requires :password, type: String, desc: 'password of the user'
|
|
14
|
+
end
|
|
15
|
+
post ':authenticate' do
|
|
16
|
+
response = OpenStruct.new({ username: params[:username], access_token: '123' })
|
|
17
|
+
present response,
|
|
18
|
+
with: Skee::API::Routes::User::ResponseEntity
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Skee
|
|
2
|
+
module API
|
|
3
|
+
module Routes
|
|
4
|
+
module User
|
|
5
|
+
class ResponseEntity < Grape::Entity
|
|
6
|
+
expose :username, documentation: {type: 'String', desc: 'Username of the user'}
|
|
7
|
+
expose :access_token, documentation: {type: 'String', desc: 'AccessToken for the user'}
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require_relative './utils/errors/api_exceptions'
|
|
2
|
+
require_relative './utils/errors/service_exceptions'
|
|
3
|
+
|
|
4
|
+
require_relative '../db/proto/project'
|
|
5
|
+
require_relative '../db/proto/change_request'
|
|
6
|
+
|
|
7
|
+
require_relative '../db/proto/event'
|
|
8
|
+
require_relative '../db/proto/event_snapshot'
|
|
9
|
+
require_relative '../db/proto/trackable_object'
|
|
10
|
+
require_relative '../db/proto/trackable_object_snapshot'
|
|
11
|
+
require_relative '../db/proto/property'
|
|
12
|
+
require_relative '../db/proto/property_snapshot'
|
|
13
|
+
|
|
14
|
+
module Skee
|
|
15
|
+
module App
|
|
16
|
+
DB = Skee::DB::Proto
|
|
17
|
+
DB_MAPPING_ENTITY = {
|
|
18
|
+
change_request: Skee::DB::Proto::ChangeRequest,
|
|
19
|
+
event: Skee::DB::Proto::Event,
|
|
20
|
+
project: Skee::DB::Proto::Project,
|
|
21
|
+
trackable_object: Skee::DB::Proto::TrackableObject,
|
|
22
|
+
property: Skee::DB::Proto::Property,
|
|
23
|
+
}.freeze
|
|
24
|
+
DB_MAPPING_ENTITY_SNAPSHOT = {
|
|
25
|
+
event: Skee::DB::Proto::EventSnapshot,
|
|
26
|
+
trackable_object: Skee::DB::Proto::TrackableObjectSnapshot,
|
|
27
|
+
property: Skee::DB::Proto::PropertySnapshot,
|
|
28
|
+
}.freeze
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require_relative './service'
|
|
2
|
+
module Skee::App::ChangeRequest
|
|
3
|
+
class Endpoint
|
|
4
|
+
def self.list
|
|
5
|
+
Service.list
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.get(params)
|
|
9
|
+
Service.get(params)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.create(params)
|
|
13
|
+
Service.create(params)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.update(params)
|
|
17
|
+
Service.update(params)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.delete(params)
|
|
21
|
+
Service.delete(params)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Skee
|
|
2
|
+
module App
|
|
3
|
+
module ChangeRequest
|
|
4
|
+
class GenerateSystemChanges
|
|
5
|
+
def initialize(change_request)
|
|
6
|
+
@change_request = change_request
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def call
|
|
10
|
+
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def create_new_change
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def update_existing_change
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
require_relative '../../db/proto/change_request'
|
|
2
|
+
module Skee
|
|
3
|
+
module App
|
|
4
|
+
module ChangeRequest
|
|
5
|
+
class Service
|
|
6
|
+
DB = Skee::DB::Proto
|
|
7
|
+
|
|
8
|
+
def self.list
|
|
9
|
+
DB::ChangeRequest.all
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.get(params)
|
|
13
|
+
DB::ChangeRequest.find(params[:id])
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.create(params)
|
|
17
|
+
# add any validation or filtering logic here to
|
|
18
|
+
# derive fields from params
|
|
19
|
+
fields = {
|
|
20
|
+
identifier: params[:identifier],
|
|
21
|
+
project_id: params[:project_id],
|
|
22
|
+
base_tracking_spec_id: params[:base_tracking_spec_id],
|
|
23
|
+
status: params[:status],
|
|
24
|
+
name: params[:name],
|
|
25
|
+
description: params[:description],
|
|
26
|
+
change_set: params[:change_set]
|
|
27
|
+
}
|
|
28
|
+
DB::ChangeRequest.create(fields)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.update(params)
|
|
32
|
+
# send valid fields excluding id
|
|
33
|
+
fields = {
|
|
34
|
+
identifier: params[:identifier],
|
|
35
|
+
project_id: params[:project_id],
|
|
36
|
+
base_tracking_spec_id: params[:base_tracking_spec_id],
|
|
37
|
+
status: params[:status],
|
|
38
|
+
name: params[:name],
|
|
39
|
+
description: params[:description],
|
|
40
|
+
change_set: params[:change_set]
|
|
41
|
+
}.compact
|
|
42
|
+
change_request = DB::ChangeRequest.find(params[:id])
|
|
43
|
+
change_request.update(fields)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.update_change_set(params)
|
|
47
|
+
change_request = DB::ChangeRequest.find(params[:id])
|
|
48
|
+
existing_change_set = change_request.change_set
|
|
49
|
+
params[:changes].each do |entity, change_hash|
|
|
50
|
+
existing_change_set[entity] ||= {}
|
|
51
|
+
change_hash.each do |prev_id, new_id|
|
|
52
|
+
if prev_id
|
|
53
|
+
existing_change_set[entity][prev_id] = new_id
|
|
54
|
+
else
|
|
55
|
+
existing_change_set[entity][nil] ||= []
|
|
56
|
+
existing_change_set[entity][nil] << new_id
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.remove_from_change_set(id:, entity:, entity_id:)
|
|
63
|
+
change_request = DB::ChangeRequest.find(id)
|
|
64
|
+
existing_change_set = change_request.change_set
|
|
65
|
+
if existing_change_set[entity].values.include?(entity_id)
|
|
66
|
+
existing_change_set[entity].delete_if {|_,value| value == entity_id}
|
|
67
|
+
elsif existing_change_set[entity][nil].include?(entity_id)
|
|
68
|
+
existing_change_set[entity][nil].delete(entity_id)
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.delete(params)
|
|
73
|
+
change_request = DB::ChangeRequest.find(params[:id])
|
|
74
|
+
change_request.delete
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
require_relative './service'
|
|
2
|
+
module Skee::App::Event
|
|
3
|
+
class Endpoint
|
|
4
|
+
|
|
5
|
+
ERRORS = Skee::App::Utils::Errors
|
|
6
|
+
|
|
7
|
+
def self.list
|
|
8
|
+
Service.list
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.get(params)
|
|
12
|
+
Service.get(params)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.create(params)
|
|
16
|
+
Service.create(formatted_params(params))
|
|
17
|
+
rescue ERRORS::RecordNotFoundException,
|
|
18
|
+
ERRORS::NotAllowedToUpdate,
|
|
19
|
+
ERRORS::UniquenessViolationException => e
|
|
20
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.update(params)
|
|
24
|
+
Service.update(formatted_params(params))
|
|
25
|
+
rescue ERRORS::RecordNotFoundException,
|
|
26
|
+
ERRORS::NotAllowedToUpdate,
|
|
27
|
+
ERRORS::UniquenessViolationException => e
|
|
28
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.update_payload_keys(params)
|
|
32
|
+
Service.update_payload_keys(formatted_params(params))
|
|
33
|
+
rescue ERRORS::RecordNotFoundException,
|
|
34
|
+
ERRORS::NotAllowedToUpdate,
|
|
35
|
+
ERRORS::UniquenessViolationException => e
|
|
36
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def self.remove_payload_keys(params)
|
|
40
|
+
Service.remove_payload_keys(formatted_params(params))
|
|
41
|
+
rescue ERRORS::RecordNotFoundException,
|
|
42
|
+
ERRORS::NotAllowedToUpdate,
|
|
43
|
+
ERRORS::UniquenessViolationException => e
|
|
44
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.add_payload_keys(params)
|
|
48
|
+
Service.add_payload_keys(formatted_params(params))
|
|
49
|
+
rescue ERRORS::RecordNotFoundException,
|
|
50
|
+
ERRORS::NotAllowedToUpdate,
|
|
51
|
+
ERRORS::UniquenessViolationException => e
|
|
52
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def self.remove(params)
|
|
56
|
+
Service.remove(params)
|
|
57
|
+
rescue ERRORS::RecordNotFoundException,
|
|
58
|
+
ERRORS::NotAllowedToUpdate,
|
|
59
|
+
ERRORS::UniquenessViolationException => e
|
|
60
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
def self.formatted_params(params)
|
|
66
|
+
existing_payload = params[:payload]
|
|
67
|
+
return params unless existing_payload
|
|
68
|
+
|
|
69
|
+
new_payload = existing_payload.map do |payload|
|
|
70
|
+
key = payload[:key]
|
|
71
|
+
payload.delete(:key)
|
|
72
|
+
[key, payload]
|
|
73
|
+
end.to_h
|
|
74
|
+
params[:payload] = new_payload
|
|
75
|
+
params
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require_relative '../../app/versioned_entity/service'
|
|
2
|
+
require_relative 'validator'
|
|
3
|
+
module Skee
|
|
4
|
+
module App
|
|
5
|
+
module Event
|
|
6
|
+
class Service < Skee::App::VersionedEntityService
|
|
7
|
+
def self.entity
|
|
8
|
+
:event
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.create_fields_keys
|
|
12
|
+
%i(
|
|
13
|
+
change_request_id
|
|
14
|
+
previous_snapshot_id
|
|
15
|
+
is_removed
|
|
16
|
+
name
|
|
17
|
+
description
|
|
18
|
+
payload
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.update_fields_keys
|
|
23
|
+
%i(
|
|
24
|
+
id
|
|
25
|
+
change_request_id
|
|
26
|
+
is_removed
|
|
27
|
+
name
|
|
28
|
+
description
|
|
29
|
+
payload
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.create(params)
|
|
34
|
+
Skee::App::Event::Validator.new(params).validate_create_params
|
|
35
|
+
super(params)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.add_payload_keys(params)
|
|
39
|
+
Skee::App::Event::Validator.new(params).validate_add_payload_key_params
|
|
40
|
+
event = Skee::App::Event::Service.get(id: params[:id])
|
|
41
|
+
new_payload = event.versioned_entity_snapshot.payload.merge(params[:payload])
|
|
42
|
+
params[:payload] = new_payload
|
|
43
|
+
update(params)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def self.update_payload_keys(params)
|
|
47
|
+
Skee::App::Event::Validator.new(params).validate_update_payload_key_params
|
|
48
|
+
event = Skee::App::Event::Service.get(id: params[:id])
|
|
49
|
+
new_payload = event.versioned_entity_snapshot.payload.merge(params[:payload])
|
|
50
|
+
params[:payload] = new_payload
|
|
51
|
+
update(params)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def self.remove_payload_keys(params)
|
|
55
|
+
Skee::App::Event::Validator.new(params).validate_remove_payload_key_params
|
|
56
|
+
event = Skee::App::Event::Service.get(id: params[:id])
|
|
57
|
+
keys_for_removal = params[:payload_keys]
|
|
58
|
+
new_payload = event.versioned_entity_snapshot.payload.map { |key, value|
|
|
59
|
+
[key, value] unless keys_for_removal.include?(key)
|
|
60
|
+
}.compact.to_h
|
|
61
|
+
params[:payload] = new_payload
|
|
62
|
+
params.delete(:payload_keys)
|
|
63
|
+
update(params)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require_relative '../../app/change_request/service'
|
|
2
|
+
require_relative '../../app/tracking_spec/service'
|
|
3
|
+
module Skee
|
|
4
|
+
module App
|
|
5
|
+
module Event
|
|
6
|
+
class Validator
|
|
7
|
+
def initialize(params)
|
|
8
|
+
@params = params
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
ERRORS = Utils::Errors
|
|
12
|
+
|
|
13
|
+
def validate_create_params
|
|
14
|
+
validate_change_request_status
|
|
15
|
+
validate_payload
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def validate_add_payload_key_params
|
|
19
|
+
validate_change_request_status
|
|
20
|
+
validate_non_duplicate_keys
|
|
21
|
+
validate_payload
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def validate_update_payload_key_params
|
|
25
|
+
validate_change_request_status
|
|
26
|
+
validate_key_exists(@params[:payload].keys)
|
|
27
|
+
validate_payload
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def validate_remove_payload_key_params
|
|
31
|
+
validate_change_request_status
|
|
32
|
+
validate_key_exists(@params[:payload_keys])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
def validate_payload
|
|
38
|
+
payload = @params[:payload]
|
|
39
|
+
return unless payload
|
|
40
|
+
|
|
41
|
+
payload.each do |_, value|
|
|
42
|
+
validate_reference_entity_and_type(value)
|
|
43
|
+
validate_properties_exist_on_trackable_object(value)
|
|
44
|
+
validate_selected_property_ids_exist(value)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def validate_reference_entity_and_type(payload_value)
|
|
49
|
+
reference_entity_id = payload_value[:reference_entity_id]
|
|
50
|
+
reference_entity_type = payload_value[:reference_entity_type]
|
|
51
|
+
|
|
52
|
+
reference_entity = if reference_entity_type == 'trackable_object'
|
|
53
|
+
Skee::App::TrackableObject::Service.get(id: reference_entity_id, change_request_id: @params[:change_request_id])
|
|
54
|
+
else
|
|
55
|
+
Skee::App::Property::Service.get(id: reference_entity_id, change_request_id: @params[:change_request_id])
|
|
56
|
+
end
|
|
57
|
+
return if reference_entity
|
|
58
|
+
|
|
59
|
+
raise ERRORS::NotAllowedToUpdate.new('Invalid parameter: Reference entity does not exist')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def validate_properties_exist_on_trackable_object(payload_value)
|
|
63
|
+
return if payload_value[:reference_entity_type] != 'trackable_object'
|
|
64
|
+
trackable_object = Skee::App::TrackableObject::Service.get(id: payload_value[:reference_entity_id], change_request_id: @params[:change_request_id])
|
|
65
|
+
return if (payload_value[:selected_property_ids] - trackable_object.versioned_entity_snapshot.property_ids).empty?
|
|
66
|
+
raise ERRORS::NotAllowedToUpdate.new('Invalid parameter: Selected properties not present on trackable object')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def validate_selected_property_ids_exist(payload_value)
|
|
70
|
+
selected_property_ids = payload_value[:selected_property_ids]
|
|
71
|
+
selected_properties = Skee::App::Property::Service.list(ids: selected_property_ids, change_request_id: @params[:change_request_id])
|
|
72
|
+
return if (selected_properties.map{|property| property.versioned_entity.id} - selected_property_ids).empty?
|
|
73
|
+
raise ERRORS::NotAllowedToUpdate.new('Invalid parameter: Selected properties do not exist')
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def validate_non_duplicate_keys
|
|
77
|
+
# check that key is unique
|
|
78
|
+
# check that reference_entity_id exists for the corresponding reference_entity_type
|
|
79
|
+
# check that selected_property_ids exist
|
|
80
|
+
common_keys = event.versioned_entity_snapshot.payload.keys & @params[:payload].keys
|
|
81
|
+
return if common_keys.empty?
|
|
82
|
+
raise ERRORS::NotAllowedToUpdate.new("Invalid keys: Keys #{common_keys.join(',')} already exist")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def validate_key_exists(payload_keys)
|
|
86
|
+
existing_keys = event.versioned_entity_snapshot.payload.keys
|
|
87
|
+
payload_keys.each do |key|
|
|
88
|
+
next if existing_keys.include?(key)
|
|
89
|
+
raise ERRORS::NotAllowedToUpdate.new("Invalid keys: Not allowed to update non-existent key #{key}")
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def validate_change_request_status
|
|
94
|
+
raise ERRORS::RecordNotFoundException.new('Invalid change request') unless change_request
|
|
95
|
+
raise ERRORS::NotAllowedToUpdate.new('Invalid change request') if change_request.status != 'open'
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def event
|
|
99
|
+
@event ||= Skee::App::Event::Service.get(id: @params[:id], change_request_id: @params[:change_request_id])
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def change_request
|
|
103
|
+
@change_request ||= Skee::App::ChangeRequest::Service.get(id: @params[:change_request_id])
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require_relative './service'
|
|
2
|
+
module Skee::App::Project
|
|
3
|
+
class Endpoint
|
|
4
|
+
def self.list
|
|
5
|
+
Service.list
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.get(params)
|
|
9
|
+
Service.get(params)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.create(params)
|
|
13
|
+
Service.create(params)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.update(params)
|
|
17
|
+
Service.update(params)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.delete(params)
|
|
21
|
+
Service.delete(params)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require_relative '../../db/proto/project'
|
|
2
|
+
module Skee
|
|
3
|
+
module App
|
|
4
|
+
module Project
|
|
5
|
+
class Service
|
|
6
|
+
DB = Skee::DB::Proto
|
|
7
|
+
|
|
8
|
+
def self.list
|
|
9
|
+
DB::Project.all
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.get(params)
|
|
13
|
+
DB::Project.find(params[:id])
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.create(params)
|
|
17
|
+
# add any validation or filtering logic here to
|
|
18
|
+
fields = {
|
|
19
|
+
name: params[:name],
|
|
20
|
+
description: params[:description]
|
|
21
|
+
}
|
|
22
|
+
DB::Project.create(fields)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.update(params)
|
|
26
|
+
# send valid fields excluding id
|
|
27
|
+
fields = {
|
|
28
|
+
name: params[:name],
|
|
29
|
+
description: params[:description]
|
|
30
|
+
}
|
|
31
|
+
project = DB::Project.find(params[:id])
|
|
32
|
+
project.update(fields)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.delete(params)
|
|
36
|
+
project = DB::Project.find(params[:id])
|
|
37
|
+
project.delete
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_relative './service'
|
|
2
|
+
module Skee::App::Property
|
|
3
|
+
class Endpoint
|
|
4
|
+
|
|
5
|
+
ERRORS = Skee::App::Utils::Errors
|
|
6
|
+
|
|
7
|
+
def self.list
|
|
8
|
+
Service.list
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.get(params)
|
|
12
|
+
Service.get(params)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.create(params)
|
|
16
|
+
Service.create(params)
|
|
17
|
+
rescue ERRORS::RecordNotFoundException,
|
|
18
|
+
ERRORS::NotAllowedToUpdate,
|
|
19
|
+
ERRORS::UniquenessViolationException => e
|
|
20
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.update(params)
|
|
24
|
+
Service.update(params)
|
|
25
|
+
rescue ERRORS::RecordNotFoundException,
|
|
26
|
+
ERRORS::NotAllowedToUpdate,
|
|
27
|
+
ERRORS::UniquenessViolationException => e
|
|
28
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.remove(params)
|
|
32
|
+
Service.remove(params)
|
|
33
|
+
rescue ERRORS::RecordNotFoundException,
|
|
34
|
+
ERRORS::NotAllowedToUpdate,
|
|
35
|
+
ERRORS::UniquenessViolationException => e
|
|
36
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require_relative '../../app/versioned_entity/service'
|
|
2
|
+
module Skee
|
|
3
|
+
module App
|
|
4
|
+
module Property
|
|
5
|
+
class Service < Skee::App::VersionedEntityService
|
|
6
|
+
def self.entity
|
|
7
|
+
:property
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.create_fields_keys
|
|
11
|
+
%i(
|
|
12
|
+
change_request_id
|
|
13
|
+
previous_snapshot_id
|
|
14
|
+
is_removed
|
|
15
|
+
name
|
|
16
|
+
property_of
|
|
17
|
+
description
|
|
18
|
+
is_nullable
|
|
19
|
+
data_type
|
|
20
|
+
additional_instructions
|
|
21
|
+
data_format_id
|
|
22
|
+
regex_validation
|
|
23
|
+
)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.update_fields_keys
|
|
27
|
+
%i(
|
|
28
|
+
change_request_id
|
|
29
|
+
is_removed
|
|
30
|
+
id
|
|
31
|
+
name
|
|
32
|
+
description
|
|
33
|
+
is_nullable
|
|
34
|
+
data_type
|
|
35
|
+
additional_instructions
|
|
36
|
+
data_format_id
|
|
37
|
+
regex_validation
|
|
38
|
+
)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.create(params)
|
|
42
|
+
new_property = super(params)
|
|
43
|
+
if params[:property_of] == :trackable_object
|
|
44
|
+
parent_reference_id = params[:parent_reference_id]
|
|
45
|
+
Skee::App::TrackableObject::Service.add_property(
|
|
46
|
+
change_request_id: params[:change_request_id],
|
|
47
|
+
id: parent_reference_id,
|
|
48
|
+
property_id: new_property.versioned_entity.id
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
new_property
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require_relative './service'
|
|
2
|
+
module Skee::App::TrackableObject
|
|
3
|
+
class Endpoint
|
|
4
|
+
ERRORS = Skee::App::Utils::Errors
|
|
5
|
+
|
|
6
|
+
def self.list
|
|
7
|
+
Service.list
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.get(params)
|
|
11
|
+
Service.get(params)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.create(params)
|
|
15
|
+
Service.create(params)
|
|
16
|
+
rescue ERRORS::RecordNotFoundException,
|
|
17
|
+
ERRORS::NotAllowedToUpdate,
|
|
18
|
+
ERRORS::UniquenessViolationException => e
|
|
19
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.update(params)
|
|
23
|
+
Service.update(params)
|
|
24
|
+
rescue ERRORS::RecordNotFoundException,
|
|
25
|
+
ERRORS::NotAllowedToUpdate,
|
|
26
|
+
ERRORS::UniquenessViolationException => e
|
|
27
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.remove(params)
|
|
31
|
+
Service.remove(params)
|
|
32
|
+
rescue ERRORS::RecordNotFoundException,
|
|
33
|
+
ERRORS::NotAllowedToUpdate,
|
|
34
|
+
ERRORS::UniquenessViolationException => e
|
|
35
|
+
raise ERRORS::ValidationError.new(e.message)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|