team_fastlane-base_service 1.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 195fc359676df3324652ec431e1ca0ad5443816ab8009bb2068eb07d0dca78e9
4
+ data.tar.gz: c55fb78490e3e26f353ba669072b4227e7d87b96f24e5f38b4de572e5659cd82
5
+ SHA512:
6
+ metadata.gz: '094b279ed57eda10e552dd02a2c0e7fd5978ee8a8184f8facd5a808c5658be58513e2158618bfcc49400e00374628dfc36aaab051af64d3b12668e057b9fe8f3'
7
+ data.tar.gz: 8c79dbfb2e36760f9a60f6d5dae5290caa7d4508255e4230ddae592c19a3f83832c254d8bcb1de5e75e2b6f64961e453638c8709f5d16d5c095b47ee6e3cbfc1
data/CHANGELOG.adoc ADDED
@@ -0,0 +1,64 @@
1
+ = Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on https://keepachangelog.com[Keep a Changelog],
6
+ and this project adheres to https://semver.org[Semantic Versioning].
7
+
8
+ == Unreleased
9
+
10
+ == [1.0.0] - 2023-08-01
11
+ === Changed
12
+ Renamed and restructured for release on rubygems
13
+
14
+ == [0.3.0] - 2023-06-20
15
+ === Added
16
+ - New method for handling validation errors
17
+
18
+ == [0.2.1] - 2022-10-13
19
+ === Changed
20
+ - Health check uses the connection pool now instead of creating a new connection
21
+
22
+ == [0.2.0] - 2022-06-03
23
+ === Added
24
+ - Default behavior for parameter filtering
25
+
26
+ == [0.1.1] - 2022-03-29
27
+ === Updated
28
+ - olive_branch version updated to 4.0.1
29
+
30
+ == [0.1.0]- 2022-01-03
31
+ === Removed
32
+ - the rubymine debug mode fix seems to be no longer necessary
33
+
34
+ == [0.0.7]- 2021-09-07
35
+ === Changed
36
+ - Revert change of 0.0.6 and inherit from ActionController::Base again. It wasn't working correctly in our setup.
37
+
38
+ == [0.0.6]- 2021-05-17
39
+ === Changed
40
+ - Inherit from ApplicationController instead of ActionController::Base
41
+ (link:https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsapplicationcontroller[Rubocop]).
42
+
43
+ == [0.0.5]- 2021-04-27
44
+ === Changed
45
+ - Updated olive_branch dependency to v4.0.0.
46
+
47
+ == [0.0.4] - 2020-01-13
48
+ === Added
49
+ - Save from ArgumentError with `unprocessable_entity` method.
50
+
51
+ == [0.0.3] - 2020-07-22
52
+ === Added
53
+ - Added response method `no_content`.
54
+
55
+ === Changed
56
+ - Use json instead of raw text body for error responses `not_found` and `unprocessable_entity`.
57
+
58
+ == [0.0.2] - 2020-07-21
59
+ === Added
60
+ - Added response methods `created` and `unprocessable_entity`.
61
+
62
+ == [0.0.1] - 2020-06-16
63
+ === Added
64
+ - Initial gem version with the extracted api controllers and health check.
data/README.adoc ADDED
@@ -0,0 +1,39 @@
1
+ = Team Fastlane Base Service
2
+
3
+ A service base for a ruby micro service
4
+
5
+ == Installation
6
+
7
+ As described by the link:../README.adoc[main readme].
8
+
9
+ == Usage
10
+
11
+ === Health Check
12
+
13
+ You can use the link:../bin/health_check[health_check] executable to provide a method of checking the health of the server (database included).
14
+ For example within a docker file like this:
15
+
16
+ [source, Dockerfile]
17
+ ----
18
+ HEALTHCHECK --interval=30s --timeout=30s --start-period=30s --retries=3 CMD [ "bundle", "exec", "health_check" ]
19
+ ----
20
+
21
+ This makes use of an exposed endpoint called `/health_check`, which you can only use for a custom ping to check for it.
22
+
23
+ === Performance Logging
24
+
25
+ There is an easy to use performance logging (please only use in development) included. Simply add `with_measure` around the block you want to measure.
26
+
27
+ The result will be added to the rails time stamp log output.
28
+
29
+ === Default responses
30
+
31
+ This also provides some default json responses to be used in your controller. See link:./app/controllers/concerns/responses.rb[responses.rb] for more details.
32
+
33
+ To use these responses let your `ApplicationController` inherit from `ApiBaseController` and you are set.
34
+
35
+ === Parameter handling
36
+
37
+ You get automatically camelCase to snake_case transformation for the request and the reverse for responses via the olive_branch gem.
38
+
39
+ There will be a default parameter filtering enabled. It filters passwords of various key names in development and everything in production.
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApiBaseController < ActionController::Base
4
+ include PerformanceLogging
5
+ include Responses
6
+
7
+ rescue_from ArgumentError, with: :unprocessable_entity
8
+ rescue_from StandardError, with: :technical_error
9
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PerformanceLogging
4
+ extend ActiveSupport::Concern
5
+
6
+ attr_internal :runtimes
7
+
8
+ protected
9
+
10
+ def with_measure(key)
11
+ result = nil
12
+ self.runtimes ||= {}
13
+ runtimes[key] = Benchmark.ms { result = yield }
14
+ result
15
+ end
16
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Responses
4
+ extend ActiveSupport::Concern
5
+
6
+ protected
7
+
8
+ def bad_request(errors = {})
9
+ render json: errors, status: :bad_request
10
+ end
11
+
12
+ def created(body = {})
13
+ render json: body, status: :created
14
+ end
15
+
16
+ def no_content
17
+ render json: {}, status: :no_content
18
+ end
19
+
20
+ def not_found(body = {})
21
+ render json: body, status: :not_found
22
+ end
23
+
24
+ def ok(content = {})
25
+ render json: content, status: :ok
26
+ end
27
+
28
+ def technical_error(error, status: :internal_server_error)
29
+ Rails.logger.error("#{error.message}\n#{error.backtrace.join("\n")}")
30
+ response = {error: 'Something technical went wrong. Please try again later'}
31
+ if Rails.env.development?
32
+ response[:exception] = "#{error.class.name} : #{error.message}"
33
+ response[:trace] = error.backtrace[0, 10]
34
+ end
35
+ render json: response, status: status
36
+ end
37
+
38
+ def unprocessable_entity(body = {})
39
+ render json: body, status: :unprocessable_entity
40
+ end
41
+
42
+ def unauthorized(error)
43
+ technical_error(error, status: :unauthorized)
44
+ end
45
+
46
+ def validation_error(error)
47
+ Rails.logger.warn("Malformed Request: #{error.message}") if Rails.env.production?
48
+ unprocessable_entity(exception: "#{error.class.name}: #{error.message}")
49
+ end
50
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class HealthCheckController < ApiBaseController
4
+ def check
5
+ return bad_request unless ActiveRecord::Base.connection_pool.with_connection(&:active?)
6
+
7
+ ok
8
+ end
9
+
10
+ private
11
+
12
+ def bad_request(_errors = {})
13
+ render plain: 'Health Check failed', status: :bad_request
14
+ end
15
+
16
+ def ok(_content = {})
17
+ render plain: 'Health Check OK', status: :ok
18
+ end
19
+ end
data/bin/health_check ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'net/http'
5
+
6
+ port = ENV.fetch('PORT', 3000)
7
+
8
+ health_check = Net::HTTP.get_response(URI("http://127.0.0.1:#{port}/health_check"))
9
+ raise health_check.body if health_check.code.to_i != 200
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'olive_branch'
4
+
5
+ rails_routes = ->(env) { env['PATH_INFO'].match(%r{^/rails}) }
6
+
7
+ Rails.application.middleware.use OliveBranch::Middleware,
8
+ inflection: 'camel',
9
+ exclude_params: rails_routes,
10
+ exclude_response: rails_routes,
11
+ content_type_check: ->(_) { true }
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Be sure to restart your server when you modify this file.
4
+
5
+ # Configure sensitive parameters which will be filtered from the log file.
6
+ Rails.application.config.filter_parameters += %i[passw secret token _key crypt salt certificate otp ssn]
7
+
8
+ Rails.application.config.filter_parameters += [/.*/] if Rails.env.production?
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PerformanceLogger
4
+ extend ActiveSupport::Concern
5
+
6
+ private
7
+
8
+ def append_info_to_payload(payload)
9
+ super
10
+ payload[:runtimes] = runtimes
11
+ end
12
+
13
+ class_methods do
14
+ def log_process_action(payload)
15
+ super.concat(runtime_messages(payload[:runtimes]))
16
+ end
17
+
18
+ def runtime_messages(runtimes)
19
+ runtimes&.map { |key, runtime| format("#{key.to_s.camelize}: %.1fms", runtime.to_f) } || []
20
+ end
21
+ end
22
+ end
23
+
24
+ ActiveSupport.on_load(:action_controller) { include PerformanceLogger }
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ Rails.application.routes.draw do
4
+ get '/health_check', to: 'health_check#check'
5
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module TeamFastlane
4
+ module BaseService
5
+ VERSION = '1.0.0'
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'team_fastlane/base_service/version'
4
+
5
+ module TeamFastlane
6
+ module BaseService
7
+ class Engine < Rails::Engine
8
+ end
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: team_fastlane-base_service
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Team Fastlane
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-08-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: olive_branch
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.1
27
+ description:
28
+ email:
29
+ executables:
30
+ - health_check
31
+ extensions: []
32
+ extra_rdoc_files:
33
+ - README.adoc
34
+ - CHANGELOG.adoc
35
+ files:
36
+ - CHANGELOG.adoc
37
+ - README.adoc
38
+ - app/controllers/api_base_controller.rb
39
+ - app/controllers/concerns/performance_logging.rb
40
+ - app/controllers/concerns/responses.rb
41
+ - app/controllers/health_check_controller.rb
42
+ - bin/health_check
43
+ - config/initializers/camelizer.rb
44
+ - config/initializers/filter_parameter_logging.rb
45
+ - config/initializers/performance_logger.rb
46
+ - config/routes.rb
47
+ - lib/team_fastlane/base_service.rb
48
+ - lib/team_fastlane/base_service/version.rb
49
+ homepage:
50
+ licenses:
51
+ - MIT
52
+ metadata:
53
+ rubygems_mfa_required: 'true'
54
+ post_install_message:
55
+ rdoc_options: []
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '2.7'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ requirements: []
69
+ rubygems_version: 3.4.10
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: Gem for an internal project
73
+ test_files: []