blsk_ruby_core_api 0.1.7 → 0.1.8

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/src/application.rb +47 -0
  3. data/src/application_configuration.rb +42 -0
  4. data/src/application_service.rb +10 -0
  5. data/src/application_status.rb +0 -0
  6. data/src/bluesky_service_core.rb +13 -0
  7. data/src/cassandra/cassandra_configuration.rb +5 -0
  8. data/{lib/cassandra/abstracted_cassandra_repository.rb → src/cassandra/cassandra_dao.rb} +1 -1
  9. data/src/cassandra/cassandra_service.rb +30 -0
  10. data/src/cassandra/index.rb +3 -0
  11. data/src/config.yml +27 -0
  12. data/src/consul/consul_configuration.rb +15 -0
  13. data/src/consul/consul_rest.rb +14 -0
  14. data/src/consul/consul_service.rb +41 -0
  15. data/src/consul/index.rb +3 -0
  16. data/{lib → src}/ioc/container.rb +0 -0
  17. data/src/ioc/index.rb +2 -0
  18. data/{lib → src}/ioc/injector.rb +26 -1
  19. data/src/models/index.rb +1 -0
  20. data/{lib/model → src/models}/model.rb +0 -0
  21. data/{lib/rest/rest_common_error.rb → src/rest/errors/common_error.rb} +5 -1
  22. data/src/rest/index.rb +5 -0
  23. data/src/rest/models/response_model.rb +35 -0
  24. data/src/rest/rest_base.rb +57 -0
  25. data/src/rest/rest_configuration.rb +4 -0
  26. data/src/rest/rest_service.rb +11 -0
  27. data/{lib/decoractors → src/security/decorators}/authenticate.rb +4 -5
  28. data/src/security/index.rb +2 -0
  29. data/{lib → src}/security/security_context_holder.rb +0 -0
  30. data/src/validation/decorators/valid.rb +34 -0
  31. data/src/validation/index.rb +1 -0
  32. metadata +36 -25
  33. data/lib/app_service.rb +0 -20
  34. data/lib/application_configuration.rb +0 -56
  35. data/lib/blsk_ruby_core_api.rb +0 -41
  36. data/lib/cassandra/cassandra_configuration.rb +0 -10
  37. data/lib/cassandra/cassandra_service.rb +0 -35
  38. data/lib/consul/consul_configuration.rb +0 -39
  39. data/lib/consul/consul_service.rb +0 -33
  40. data/lib/decoractors/valid.rb +0 -35
  41. data/lib/rest/rest_base.rb +0 -73
  42. data/lib/rest/rest_configuration.rb +0 -10
  43. data/lib/rest/rest_error_handler.rb +0 -33
  44. data/lib/rest/rest_response_model.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed6885f230796c1b7f0664cea542b2aec244866bdebb9a79f35d86686c7a4d8b
4
- data.tar.gz: d644be1e38c280fc3ae580e236d3fb22f3d2c50c7c0a9d0afb1c7750181a868b
3
+ metadata.gz: 0fe7e0229df8e0580b3039705f41eb4af7d2b2d6a871d145b5625f49e170230c
4
+ data.tar.gz: e6d1b9449833e454492a84336b79cb521d0d356ee5daa0b4e02e175536535c2a
5
5
  SHA512:
6
- metadata.gz: 3610e147b375a010883c0b740aa03b9dae3c29fbc2897f97874d6b622bff1c49317a7a59523d6bf0576629cbc2ef97441e199dd14f27c7dbc324d115678f8cbd
7
- data.tar.gz: 47e1cb86ed3d348c83cde044661b658b0e1f614358ee14ce32c3169486d93f4825c5c92e1fbe0272624b4d22e034debcdf554807888c19169fa866dfdcf675b6
6
+ metadata.gz: 125a0ad82c6bfaa33495d1e43fa35606e1fec7a76139ce24ee5e04414ca2277f1adeee332f928e82e563028be232fb2576bf8db99b25920ec8e7dfb105674206
7
+ data.tar.gz: 2072564a283c4a484e7940c1866e3bdf2320e30b4aedde1ab7223da23c5aed503410fe5f849d6f74df4f95d44d8d068644b5408e95f95f8c8fdefc1710e9f895
@@ -0,0 +1,47 @@
1
+ require 'yaml'
2
+ require_relative 'application_configuration'
3
+ require_relative 'application_service'
4
+
5
+
6
+
7
+ class Application
8
+ DEFAULT_SERVICES = [ConsulService, CassandraService]
9
+
10
+ def initialize(config_path='', rests=[], services=[])
11
+ @config = get_config(config_path)
12
+ @rests = rests
13
+ @services = services
14
+ end
15
+
16
+ def get_config(config_path='')
17
+ file = File.expand_path( config_path )
18
+ unless File.file? file
19
+ file = File.expand_path( File.join File.dirname(__FILE__), "./config.yml" )
20
+ end
21
+
22
+ YAML.load_file(file)
23
+ end
24
+
25
+ def start
26
+ puts 'starting application'
27
+ Container.register('application_configuration', ApplicationConfiguration.new(@config))
28
+ application_service = DEFAULT_SERVICES + @services
29
+ application_service.each do |service|
30
+ service_name = service.name[0, 1].downcase + service.name[1..-1]
31
+ Container.register(Inflector.underscore(service_name), service.extend(Injector).new.start)
32
+ end
33
+ start_rest_service
34
+ end
35
+
36
+ def start_rest_service
37
+ rests = @rests
38
+ Container.register('rest', RestService.start(rests))
39
+ return Container['rest']
40
+ end
41
+
42
+ def stop
43
+ consul_service.stop
44
+ cassandra_service.stop
45
+ # Container['application_service'].stop
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ require_relative 'cassandra/cassandra_configuration'
2
+ require_relative 'consul/consul_configuration'
3
+ require_relative 'rest/rest_configuration'
4
+
5
+ class LogConfiguration < Model
6
+ attribute :host, String.default('localhost')
7
+ attribute :port, Integer.default(24224)
8
+ end
9
+
10
+ class ApplicationConfiguration < Model
11
+ attribute :name, String.default('bluesky-seed-service')
12
+ attribute :host, String.default('127.0.0.1')
13
+ attribute :tags, Array.default(['seed'])
14
+ attribute :cassandra, CassandraConfiguration
15
+ attribute :consul, ConsulConfiguration
16
+ attribute :rest, RestConfiguration
17
+ attribute :log, LogConfiguration
18
+
19
+ def cassandra_config
20
+ {
21
+ hosts: cassandra.hosts,
22
+ port: cassandra.port
23
+ }
24
+ end
25
+
26
+ def consul_service_config
27
+ {
28
+ name: name,
29
+ id: name,
30
+ port: consul.port,
31
+ check: {
32
+ id: name,
33
+ name: name,
34
+ http: "http://#{host}:#{rest.port}#{consul.service.health_check_path}",
35
+ tls_skip_verify: false,
36
+ method: "GET",
37
+ interval: consul.service.health_check_interval,
38
+ timeout: "1s"
39
+ }
40
+ }
41
+ end
42
+ end
@@ -0,0 +1,10 @@
1
+ require_relative 'consul/consul_service'
2
+ require_relative 'cassandra/cassandra_service'
3
+
4
+ class ApplicationService
5
+ def start
6
+ end
7
+
8
+ def stop
9
+ end
10
+ end
File without changes
@@ -0,0 +1,13 @@
1
+ require 'bundler/setup'
2
+ require 'sinatra/base'
3
+ require 'request_store'
4
+
5
+ require_relative 'ioc/index'
6
+ require_relative 'models/index'
7
+ require_relative 'application'
8
+ require_relative 'rest/index'
9
+ require_relative 'cassandra/index'
10
+ require_relative 'consul/index'
11
+ require_relative 'security/index'
12
+ require_relative 'validation/index'
13
+
@@ -0,0 +1,5 @@
1
+ class CassandraConfiguration < Model
2
+ attribute :hosts, Array.default(['172.16.15.3'])
3
+ attribute :port, Integer.default(9042)
4
+ attribute :keyspace, String.default('ltran_test')
5
+ end
@@ -1,4 +1,4 @@
1
- module AbstractedCassandraRepository
1
+ module CassandraDao
2
2
  def find_by_id(id=nil, keyspace_name=nil, table_name=nil)
3
3
  # puts 'find_by_id'
4
4
  if keyspace_name && table_name
@@ -0,0 +1,30 @@
1
+ require 'cassandra'
2
+ require 'query_builder'
3
+ require_relative 'cassandra_dao'
4
+
5
+ class CassandraService
6
+ include CassandraDao
7
+
8
+ attr_accessor :cassandra_cluster
9
+
10
+ def initialize
11
+ # puts 'init cassandra'
12
+ self.cassandra_cluster = Cassandra.cluster(Container['application_configuration'].cassandra_config)
13
+ end
14
+
15
+ def start
16
+ # puts 'start cassandra, create cluster'
17
+ if !cassandra_cluster
18
+ cassandra_cluster = Cassandra.cluster(Container['application_configuration'].cassandra_config)
19
+ end
20
+ return self
21
+ end
22
+
23
+ def stop
24
+ # puts 'stop cassandra'
25
+ if cassandra_cluster
26
+ # puts 'closing'
27
+ cassandra_cluster.close
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'cassandra_configuration'
2
+ require_relative 'cassandra_dao'
3
+ require_relative 'cassandra_service'
data/src/config.yml ADDED
@@ -0,0 +1,27 @@
1
+ name: "bluesky-seed-service"
2
+ host: "127.0.0.1"
3
+ tags:
4
+ - "seed"
5
+
6
+ rest:
7
+ port: 8080
8
+ context: '/api'
9
+
10
+ consul:
11
+ host: "localhost" #'172.16.15.3'
12
+ port: 8500
13
+ service:
14
+ health_check_path: "/health_check"
15
+ health_check_interval: 10s
16
+ client:
17
+ service_watch_interval: 10s
18
+
19
+ cassandra:
20
+ hosts:
21
+ - "172.16.15.3"
22
+ port: 9042
23
+ keyspace: "ltran_test"
24
+
25
+ log:
26
+ host: "localhost"
27
+ port: 24224
@@ -0,0 +1,15 @@
1
+ class ConsulClientConfig < Model
2
+ attribute :service_watch_interval, String.default("10s")
3
+ end
4
+
5
+ class ConsulServiceConfig < Model
6
+ attribute :health_check_path, String.default("/health-check")
7
+ attribute :health_check_interval, String.default("10s")
8
+ end
9
+
10
+ class ConsulConfiguration < Model
11
+ attribute :host, String.default("localhost")
12
+ attribute :port, Integer.default(8500)
13
+ attribute :service, ConsulServiceConfig
14
+ attribute :client, ConsulClientConfig
15
+ end
@@ -0,0 +1,14 @@
1
+ require_relative '../rest/rest_base'
2
+
3
+ class ConsulRest < RestBase
4
+ # Health Check for Consul, run when start Consul
5
+ def self.start_consul_check_http(url)
6
+ get url do
7
+ 'The service is healthy!'
8
+ end
9
+ end
10
+ #Register the routes here
11
+ def self.init_routes
12
+ return self
13
+ end
14
+ end
@@ -0,0 +1,41 @@
1
+ require 'diplomat'
2
+ require_relative 'consul_configuration'
3
+ require_relative 'consul_rest'
4
+
5
+ class ConsulService
6
+ attr_accessor :consul_service_data
7
+
8
+ def initialize(option=nil)
9
+ # puts 'init consul'
10
+ self.consul_service_data = Container['application_configuration'].consul_service_config
11
+ end
12
+
13
+ def start
14
+ # puts 'start consul'
15
+ consul_configuration = Container['application_configuration'].consul
16
+ consul_service_data = Container['application_configuration'].consul_service_config if consul_service_data.nil?
17
+
18
+ Diplomat.configure do |config|
19
+ # Set up a custom Consul URL
20
+ config.url = "http://#{consul_configuration.host}:#{consul_configuration.port.to_s}"
21
+ # Set up a custom Faraday Middleware
22
+ # config.middleware = MyCustomMiddleware
23
+ # Connect into consul with custom access token (ACL)
24
+ # config.acl_token = "qwertyui-asdf-zxcv-1234-123456789012"
25
+ # Set extra Faraday configuration options
26
+ # config.options = {ssl: { version: :TLSv1_2 }}
27
+ end
28
+ Diplomat::Service.register(consul_service_data)
29
+
30
+ # start url for consul to check health
31
+ consul_check_route = consul_configuration.service.health_check_path
32
+ ConsulRest.start_consul_check_http(consul_check_route)
33
+ return self
34
+ end
35
+
36
+ def stop
37
+ # puts 'stop consul'
38
+ consul_service_id = Container['application_configuration'].name
39
+ Diplomat::Service.deregister(consul_service_id)
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ require_relative 'consul_configuration'
2
+ require_relative 'consul_rest'
3
+ require_relative 'consul_service'
File without changes
data/src/ioc/index.rb ADDED
@@ -0,0 +1,2 @@
1
+ require_relative 'container'
2
+ require_relative 'injector'
@@ -17,11 +17,36 @@ module Injector
17
17
 
18
18
  def decorate name, decorators
19
19
  if @@decorators[name].nil?
20
- @@decorators[name] = []
20
+ @@decorators[name] = {:is_processed => false, :decorators => []}
21
21
  end
22
22
  @@decorators[name] = {:is_processed => false, :decorators => decorators}
23
23
  end
24
24
 
25
+ def validate name, decorators=[]
26
+ if @@decorators[name].nil?
27
+ @@decorators[name] = {:is_processed => false, :decorators => []}
28
+ end
29
+ @@decorators[name][:is_processed] = false
30
+ @@decorators[name][:decorators] << Validator.validate_model
31
+ if decorators.any?
32
+ decorators.each do |decorator|
33
+ @@decorators[name][:decorators] << decorator
34
+ end
35
+ end
36
+ end
37
+
38
+ def authorize name, decorators=[]
39
+ if @@decorators[name].nil?
40
+ @@decorators[name] = {:is_processed => false, :decorators => []}
41
+ end
42
+ @@decorators[name][:is_processed] = false
43
+ if decorators.any?
44
+ decorators.each do |decorator|
45
+ @@decorators[name][:decorators] << decorator
46
+ end
47
+ end
48
+ end
49
+
25
50
  def method_added(name)
26
51
  super
27
52
  orig_method = instance_method(name)
@@ -0,0 +1 @@
1
+ require_relative 'model'
File without changes
@@ -1,25 +1,29 @@
1
1
  module CommonError
2
2
  class InvalidToken < Exception
3
+ # Status Code 401
3
4
  def initialize(msg = 'InvalidToken')
4
5
  super
5
6
  end
6
7
  end
7
8
 
8
9
  class PermissionDenied < Exception
10
+ # Status Code 403
9
11
  def initialize(msg = 'PermissionDenied')
10
12
  super
11
13
  end
12
14
  end
13
15
 
14
16
  class EntityNotFound < Exception
17
+ # Status Code 404
15
18
  def initialize(msg = 'EntityNotFound')
16
19
  super
17
20
  end
18
21
  end
19
22
 
20
23
  class InvalidData < Exception
24
+ # Status Code 422
21
25
  def initialize(msg = 'InvalidData')
22
26
  super
23
27
  end
24
28
  end
25
- end
29
+ end
data/src/rest/index.rb ADDED
@@ -0,0 +1,5 @@
1
+ require_relative 'errors/common_error'
2
+ require_relative 'models/response_model'
3
+ require_relative 'rest_configuration'
4
+ require_relative 'rest_base'
5
+ require_relative 'rest_service'
@@ -0,0 +1,35 @@
1
+ class ResponseModel < Model
2
+ attribute :status, String.optional
3
+ attribute :status_code, Integer.optional
4
+
5
+ def self.ok
6
+ response_model = ResponseModel.new({status: 'OK', status_code: 200})
7
+ response_model
8
+ end
9
+
10
+ def response(data=nil)
11
+ attributes[:data] = data unless data.nil?
12
+ attributes
13
+ end
14
+
15
+ def self.failed(errors=nil)
16
+ response_model = ResponseModel.new({status: 'FAILED', status_code: 401})
17
+ response_model.attributes[:errors] = errors if !errors.nil? && errors.any?
18
+ response_model
19
+ end
20
+
21
+ def status(status_message='OK')
22
+ self.attributes[:status] = status_message
23
+ self
24
+ end
25
+
26
+ def status_code(status_code=200)
27
+ self.attributes[:status_code] = status_code
28
+ self
29
+ end
30
+
31
+ def raise_error(exception_class)
32
+ RestBase.init_and_raise_error(exception_class, self.attributes[:status_code], attributes)
33
+ end
34
+
35
+ end
@@ -0,0 +1,57 @@
1
+ require 'sinatra/base'
2
+ require "sinatra/namespace"
3
+ require_relative 'errors/common_error'
4
+ require_relative 'models/response_model'
5
+
6
+
7
+ class RestBase < Sinatra::Base
8
+ register Sinatra::Namespace
9
+
10
+ set :server, :puma
11
+ disable :raise_errors
12
+ disable :show_exceptions
13
+ set :dump_errors, true
14
+ set :show_exceptions, :after_handler
15
+
16
+ before '/*' do
17
+ # puts 'before routes - set local thread'
18
+ RequestStore.store[:user] = "Nhuan Lai" #get the user by access_token
19
+ if request.env['CONTENT_TYPE'] == 'application/json'
20
+ body_content = JSON.load(request.body)
21
+ request.params[:body] = JSON.parse( body_content ) unless body_content.nil?
22
+ end
23
+ end
24
+
25
+ after '/*' do
26
+ response.body = response.body.to_json
27
+ end
28
+
29
+ # for handling error
30
+ def self.init_and_raise_error(exception_class, status_code, response_model)
31
+ error exception_class do
32
+ status status_code
33
+ response_model
34
+ end
35
+ raise exception_class
36
+ end
37
+
38
+ # register the routes here
39
+ def self.init_routes
40
+ # # Example API route
41
+ # namespace Container["application_configuration"].rest.context do
42
+ # get '/seed_1' do
43
+ # 'Seed 1 API'
44
+ # end
45
+ # end
46
+ return self
47
+ end
48
+ end
49
+
50
+ # # Example for handling response
51
+ # get '/health' do
52
+ # # success case
53
+ # ResponseModel.ok.response
54
+ # # error case
55
+ # errors = ['errors_block']
56
+ # ResponseModel.failed(errors).status_code(422).raise_error(CommonError::InvalidData)
57
+ # end
@@ -0,0 +1,4 @@
1
+ class RestConfiguration < Model
2
+ attribute :port, Integer.default(8080)
3
+ attribute :context, String.default('/')
4
+ end
@@ -0,0 +1,11 @@
1
+ class RestService
2
+
3
+ def self.start(rests=nil)
4
+ return Sinatra.new {
5
+ rests.each {|a| use a.init_routes}
6
+ not_found do
7
+ ResponseModel.failed.status_code(404).raise_error(CommonError::EntityNotFound)
8
+ end
9
+ }
10
+ end
11
+ end
@@ -1,8 +1,7 @@
1
- require_relative '../rest/rest_base'
2
- require_relative '../security/security_context_holder'
1
+ require_relative '../security_context_holder'
3
2
 
4
- module Authenticator
5
- def has_roles roles
3
+ class Authenticator
4
+ def self.has_roles roles
6
5
  lambda {|*args, &blk|
7
6
  # puts 'has_roles'
8
7
  check_role = true # check role here and return true/false
@@ -14,7 +13,7 @@ module Authenticator
14
13
  }
15
14
  end
16
15
 
17
- def authenticate isAuthorized
16
+ def self.authenticate isAuthorized
18
17
  lambda {|self_model, *args, &blk|
19
18
  # puts "isAuthorized"
20
19
  # check authentication and authorization here, then return true/false
@@ -0,0 +1,2 @@
1
+ require_relative 'security_context_holder'
2
+ require_relative 'decorators/authenticate'
File without changes
@@ -0,0 +1,34 @@
1
+ class Validator
2
+ def self.validate_model params={}
3
+ lambda {|self_model, *args, &blk|
4
+ # puts "Validate"
5
+ seed_model = args[0]
6
+ valid_result = check_validate(seed_model) # check validation and return [true]/[false, errors]
7
+ if valid_result[0]
8
+ true
9
+ else
10
+ ResponseModel
11
+ .new({status: 'FAILED', status_code: 422})
12
+ .error(CommonError::InvalidData, valid_result[1])
13
+ end
14
+ }
15
+ end
16
+
17
+ def self.check_validate(seed_model)
18
+ errors = seed_model.validate
19
+ if errors.empty?
20
+ [true]
21
+ else
22
+ errors_response = convert_errors_response(errors)
23
+ [false, errors_response]
24
+ end
25
+ end
26
+
27
+ def self.convert_errors_response(error_list)
28
+ errors = []
29
+ error_list.each do |key, value|
30
+ errors << {field: key, message: value}
31
+ end
32
+ errors
33
+ end
34
+ end
@@ -0,0 +1 @@
1
+ require_relative 'decorators/valid'
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blsk_ruby_core_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
- - Fusin Thang
7
+ - blsk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
@@ -250,31 +250,42 @@ dependencies:
250
250
  - - ">="
251
251
  - !ruby/object:Gem::Version
252
252
  version: 3.7.0
253
- description: Sample Core API gem
254
- email: fusinthang@gmail.com
253
+ description: Code Skeleton for blsk Service Core
254
+ email: support@blsk.com
255
255
  executables: []
256
256
  extensions: []
257
257
  extra_rdoc_files: []
258
258
  files:
259
- - lib/app_service.rb
260
- - lib/application_configuration.rb
261
- - lib/blsk_ruby_core_api.rb
262
- - lib/cassandra/abstracted_cassandra_repository.rb
263
- - lib/cassandra/cassandra_configuration.rb
264
- - lib/cassandra/cassandra_service.rb
265
- - lib/consul/consul_configuration.rb
266
- - lib/consul/consul_service.rb
267
- - lib/decoractors/authenticate.rb
268
- - lib/decoractors/valid.rb
269
- - lib/ioc/container.rb
270
- - lib/ioc/injector.rb
271
- - lib/model/model.rb
272
- - lib/rest/rest_base.rb
273
- - lib/rest/rest_common_error.rb
274
- - lib/rest/rest_configuration.rb
275
- - lib/rest/rest_error_handler.rb
276
- - lib/rest/rest_response_model.rb
277
- - lib/security/security_context_holder.rb
259
+ - src/application.rb
260
+ - src/application_configuration.rb
261
+ - src/application_service.rb
262
+ - src/application_status.rb
263
+ - src/bluesky_service_core.rb
264
+ - src/cassandra/cassandra_configuration.rb
265
+ - src/cassandra/cassandra_dao.rb
266
+ - src/cassandra/cassandra_service.rb
267
+ - src/cassandra/index.rb
268
+ - src/config.yml
269
+ - src/consul/consul_configuration.rb
270
+ - src/consul/consul_rest.rb
271
+ - src/consul/consul_service.rb
272
+ - src/consul/index.rb
273
+ - src/ioc/container.rb
274
+ - src/ioc/index.rb
275
+ - src/ioc/injector.rb
276
+ - src/models/index.rb
277
+ - src/models/model.rb
278
+ - src/rest/errors/common_error.rb
279
+ - src/rest/index.rb
280
+ - src/rest/models/response_model.rb
281
+ - src/rest/rest_base.rb
282
+ - src/rest/rest_configuration.rb
283
+ - src/rest/rest_service.rb
284
+ - src/security/decorators/authenticate.rb
285
+ - src/security/index.rb
286
+ - src/security/security_context_holder.rb
287
+ - src/validation/decorators/valid.rb
288
+ - src/validation/index.rb
278
289
  homepage: http://rubygems.org/gems/blsk_ruby_core_api
279
290
  licenses:
280
291
  - MIT
@@ -282,7 +293,7 @@ metadata: {}
282
293
  post_install_message:
283
294
  rdoc_options: []
284
295
  require_paths:
285
- - lib
296
+ - src
286
297
  required_ruby_version: !ruby/object:Gem::Requirement
287
298
  requirements:
288
299
  - - ">="
@@ -298,5 +309,5 @@ rubyforge_project:
298
309
  rubygems_version: 2.7.7
299
310
  signing_key:
300
311
  specification_version: 4
301
- summary: Sample Core Api
312
+ summary: blsk Service Core
302
313
  test_files: []
data/lib/app_service.rb DELETED
@@ -1,20 +0,0 @@
1
- require_relative 'consul/consul_service'
2
- require_relative 'cassandra/cassandra_service'
3
-
4
- class AppService
5
- include Inject['consul_service', 'cassandra_service']
6
-
7
- injector
8
-
9
- def start
10
- # puts 'start app_service'
11
- consul_service.start
12
- cassandra_service.start
13
- end
14
-
15
- def stop
16
- # puts 'stop app_service'
17
- consul_service.stop
18
- cassandra_service.stop
19
- end
20
- end
@@ -1,56 +0,0 @@
1
- require 'securerandom'
2
-
3
- module ApplicationConfiguration
4
- def config
5
- {
6
- rest: config_rest,
7
- consul: config_consul,
8
- cassandra: config_cassandra
9
- }
10
- end
11
-
12
- def config_consul
13
- config_consul = {
14
- port: 8500,
15
- path: "http://localhost",
16
- consul_service_data: {
17
- name: "Service-1",
18
- id: "Service1",
19
- port: 9292,
20
- check: {
21
- id: "bluesky-api",
22
- name: "HTTP Health Check API on port 9292",
23
- http: "http://localhost:9292/health-check-new",
24
- tls_skip_verify: false,
25
- method: "GET",
26
- interval: "10s",
27
- timeout: "1s"
28
- }
29
- }
30
- }
31
- config_consul[:consul_service_data][:port] = config_rest[:port]
32
- config_consul[:consul_service_data][:check][:http] = "http://#{config_rest[:host]}:#{config_rest[:port].to_s}/#{random_name}"
33
- config_consul
34
- end
35
-
36
- def config_rest
37
- {
38
- host: 'localhost',
39
- port: 9292,
40
- path: '/api/v1'
41
- }
42
- end
43
-
44
- def config_cassandra
45
- {
46
- # user_name: '', # turn on if any
47
- # password: '', # turn on if any
48
- hosts: ['172.16.15.3'],
49
- port: 9042
50
- }
51
- end
52
-
53
- def random_name
54
- "health-check-#{SecureRandom.urlsafe_base64(8)}"
55
- end
56
- end
@@ -1,41 +0,0 @@
1
- require 'bundler/setup'
2
- require 'sinatra/base'
3
- require 'request_store'
4
-
5
- require_relative 'application_configuration'
6
- require_relative 'app_service'
7
- require_relative 'rest/rest_base'
8
- require_relative 'decoractors/authenticate'
9
- require_relative 'decoractors/valid'
10
- require_relative 'model/model'
11
- # Dir["#{File.dirname(__FILE__)}/**/*.rb"].each {|file| require file }
12
-
13
-
14
- class Application
15
- extend ApplicationConfiguration
16
-
17
- def initialize(rests=[], config={})
18
- @config = config
19
- @rests = rests
20
- end
21
-
22
- def init_rest_service
23
- rests = @rests
24
- return Sinatra.new {
25
- rests.each {|a| use a}
26
- not_found do
27
- JSON RestBase.error_response('EntityNotFound')
28
- end
29
- }
30
- end
31
-
32
- def start
33
- puts 'start'
34
- Container['app_service'].start
35
- init_rest_service
36
- end
37
-
38
- def stop
39
- Container['app_service'].stop
40
- end
41
- end
@@ -1,10 +0,0 @@
1
- module CassandraConfiguration
2
- extend ApplicationConfiguration
3
-
4
- CONFIG = {
5
- # user_name: '', # turn on if any
6
- # password: '', # turn on if any
7
- hosts: [],
8
- port: 9042
9
- }.merge( CassandraConfiguration.config_cassandra )
10
- end
@@ -1,35 +0,0 @@
1
- require 'cassandra'
2
- require 'query_builder'
3
- require_relative '../ioc/injector'
4
- require_relative 'cassandra_configuration'
5
- require_relative 'abstracted_cassandra_repository'
6
-
7
- class CassandraService
8
- extend CassandraConfiguration
9
- include AbstractedCassandraRepository
10
-
11
- injector
12
-
13
- attr_accessor :cassandra_cluster
14
-
15
- def initialize
16
- # puts 'init cassandra'
17
- self.cassandra_cluster = Cassandra.cluster(CassandraConfiguration::CONFIG)
18
- end
19
-
20
- def start
21
- # puts 'start cassandra, create cluster'
22
- if !cassandra_cluster
23
- cassandra_cluster = Cassandra.cluster(CassandraConfiguration::CONFIG)
24
- end
25
- cassandra_cluster
26
- end
27
-
28
- def stop
29
- # puts 'stop cassandra'
30
- if cassandra_cluster
31
- # puts 'closing'
32
- cassandra_cluster.close
33
- end
34
- end
35
- end
@@ -1,39 +0,0 @@
1
- require 'diplomat'
2
-
3
- module ConsulConfiguration
4
- extend ApplicationConfiguration
5
-
6
- CONFIG = {
7
- port: 8500,
8
- path: "http://localhost",
9
- consul_service_data: {
10
- name: "Service-1",
11
- id: "Service1",
12
- port: 9292,
13
- check: {
14
- id: "bluesky-api",
15
- name: "HTTP Health Check API on port 9292",
16
- http: "http://localhost:9292/health-check",
17
- tls_skip_verify: false,
18
- method: "GET",
19
- interval: "10s",
20
- timeout: "1s"
21
- }
22
- }
23
- }.merge( ConsulConfiguration.config_consul )
24
-
25
- def configure
26
- Diplomat.configure do |config|
27
- # Set up a custom Consul URL
28
- config.url = "#{CONFIG[:path]}:#{CONFIG[:port].to_s}"
29
- # Set up a custom Faraday Middleware
30
- # config.middleware = MyCustomMiddleware
31
- # Connect into consul with custom access token (ACL)
32
- # config.acl_token = "qwertyui-asdf-zxcv-1234-123456789012"
33
- # Set extra Faraday configuration options
34
- # config.options = {ssl: { version: :TLSv1_2 }}
35
- end
36
-
37
- CONFIG[:consul_service_data]
38
- end
39
- end
@@ -1,33 +0,0 @@
1
- require 'diplomat'
2
- require_relative '../ioc/injector'
3
- require_relative 'consul_configuration'
4
- require_relative '../rest/rest_base'
5
-
6
- class ConsulService
7
- extend ConsulConfiguration
8
-
9
- injector
10
-
11
- attr_accessor :consul_service_data
12
-
13
- def initialize(option=nil)
14
- # puts 'init consul'
15
- self.consul_service_data = ConsulService.configure
16
- end
17
-
18
- def start
19
- # puts 'start consul'
20
- consul_service_data = ConsulConfiguration::CONFIG[:consul_service_data] if consul_service_data.nil?
21
- Diplomat::Service.register(consul_service_data)
22
-
23
- # start url for consul to check health
24
- consul_check_route = "/" + consul_service_data[:check][:http].split('/').last
25
- RestBase.start_consul_check_http(consul_check_route)
26
- end
27
-
28
- def stop
29
- # puts 'stop consul'
30
- consul_service_id = self.consul_service_data.try(:id) || ConsulConfiguration::CONFIG[:consul_service_data][:id]
31
- Diplomat::Service.deregister(consul_service_id)
32
- end
33
- end
@@ -1,35 +0,0 @@
1
- require_relative '../rest/rest_base'
2
-
3
- module Validator
4
- def validate params={}
5
- lambda {|self_model, *args, &blk|
6
- # puts "Validate"
7
- seed_model = args[0]
8
- self_rest = args [1]
9
- valid_result = check_validate(seed_model, self_rest) # check validation and return [true]/[false, errors]
10
- if valid_result[0]
11
- true
12
- else
13
- valid_result[2].response_with_error(CommonError::InvalidData, valid_result[1])
14
- end
15
- }
16
- end
17
-
18
- def check_validate(seed_model, self_rest)
19
- errors = seed_model.validate
20
- if errors.empty?
21
- [true]
22
- else
23
- errors_response = convert_errors_response(errors)
24
- [false, errors_response, self_rest]
25
- end
26
- end
27
-
28
- def convert_errors_response(error_list)
29
- errors = []
30
- error_list.each do |key, value|
31
- errors << {field: key, message: value}
32
- end
33
- errors
34
- end
35
- end
@@ -1,73 +0,0 @@
1
- require 'sinatra/base'
2
- require "sinatra/namespace"
3
- require_relative 'rest_configuration'
4
- require_relative 'rest_error_handler'
5
- require_relative 'rest_common_error'
6
- require_relative 'rest_response_model'
7
-
8
-
9
- class RestApplication < Sinatra::Base
10
- set :server, :puma
11
- disable :raise_errors
12
- disable :show_exceptions
13
-
14
- set :dump_errors, true
15
- set :show_exceptions, :after_handler
16
-
17
- register Sinatra::Namespace
18
-
19
- configure :production do
20
- # ...
21
- end
22
-
23
- configure :development do
24
- # ...
25
- end
26
- end
27
-
28
- class RestBase < RestApplication
29
- extend ::RestConfiguration
30
- extend ::RestResponseModel
31
-
32
- before '/*' do
33
- # puts 'before routes - set local thread'
34
- RequestStore.store[:user] = "Nhuan Lai" #get the user by access_token
35
-
36
- if request.env['CONTENT_TYPE'] == 'application/json'
37
- body_content = JSON.load(request.body)
38
- request.params[:body] = JSON.parse( body_content ) unless body_content.nil?
39
- end
40
- end
41
-
42
- after '/*' do
43
- response.body = response.body.to_json
44
- end
45
-
46
- # Health Check for Consul, run when start Consul
47
- def self.start_consul_check_http(url)
48
- get url do
49
- 'The service is healthy!'
50
- end
51
- end
52
- # # API route
53
- # namespace RestConfiguration::CONFIG[:path] do
54
- # get '/seed_1' do
55
- # 'Seed 1 API'
56
- # end
57
- # get '/seed_2' do
58
- # 'Seed 2 API'
59
- # end
60
- # end
61
-
62
- # # Example for handling error
63
- # get '/health' do
64
- # errors = [
65
- # {
66
- # field: 'error field',
67
- # code: 'error code',
68
- # message: 'error message'
69
- # }
70
- # ]
71
- # response_with_error(CommonError::InvalidData, errors)
72
- # end
73
- end
@@ -1,10 +0,0 @@
1
- module RestConfiguration
2
- extend ApplicationConfiguration
3
-
4
- CONFIG = {
5
- host: 'localhost',
6
- port: 9292,
7
- path: '/api/v1'
8
- }.merge( RestConfiguration.config_rest )
9
-
10
- end
@@ -1,33 +0,0 @@
1
- require 'sinatra/base'
2
- require_relative 'rest_common_error'
3
- require_relative 'rest_response_model'
4
-
5
-
6
- class RestApplication < Sinatra::Base
7
- extend ::RestResponseModel
8
-
9
- error CommonError::InvalidToken do
10
- status 401
11
- RestApplication.error_response('InvalidToken')
12
- end
13
-
14
- error CommonError::PermissionDenied do
15
- status 403
16
- RestApplication.error_response('PermissionDenied')
17
- end
18
-
19
- error CommonError::EntityNotFound do
20
- status 404
21
- RestApplication.error_response('EntityNotFound')
22
- end
23
-
24
- error CommonError::InvalidData do
25
- status 422
26
- RestApplication.error_response('InvalidData', @errors)
27
- end
28
-
29
- def response_with_error(exception_class, errors=[])
30
- @errors = errors if !errors.empty?
31
- raise exception_class
32
- end
33
- end
@@ -1,17 +0,0 @@
1
- module RestResponseModel
2
- def success_response(data=nil)
3
- response = {
4
- status: 'OK'
5
- }
6
- response[:data] = data if data
7
- response
8
- end
9
-
10
- def error_response(error_code='FAILED', errors=[])
11
- response = {
12
- status: error_code
13
- }
14
- response[:errors] = errors if !errors.nil? && errors.any?
15
- response
16
- end
17
- end