Ravn::Tactical::ServiceV1::

Bolts module

:nocov:

Public Class Methods

included( app )

Add bolts-related routes to the given app.

   # File lib/ravn/tactical/service_v1/bolts.rb
18 def self::included( app )
19     super
20 
21     self.log.info "Mounting bolt endpoints."
22     self.mount( app )
23 end
mount( app )

Mount bolt endpoints in the given app.

   # File lib/ravn/tactical/service_v1/bolts.rb
27 def self::mount( app )
28     app.hash_branch( :v1, 'bolts' ) do |r|
29 
30         # GET /api/v1/bolts
31         # POST /api/v1/bolts
32         r.is do
33             r.get( &self.method(:get_bolts) )
34             r.post( &self.method(:upload_bolt_package) )
35         end
36 
37     end
38 end

Protected Instance Methods

check_bolt_package( upload )

Check and validate the bolt package in the given upload. Returns the Ravn::Tactical::BoltPackage on success, and raises an exception that translates to a 4xx error if there’s a problem.

    # File lib/ravn/tactical/service_v1/bolts.rb
103 def check_bolt_package( upload )
104     self.log.info "Checking bolt package upload: %s (%s)" % [ upload[:filename], upload[:type] ]
105 
106     tempfile = upload[:tempfile]
107     package = Ravn::Tactical::BoltPackage.load( tempfile.path )
108     package.validate
109 
110     return package
111 end
get_bolts()

Fetch the collection of bolts that are available for this kit.

   # File lib/ravn/tactical/service_v1/bolts.rb
50 def get_bolts
51     self.log.info "Fetching bolts from the current bolt package"
52 
53     unless Ravn::Tactical::BoltPackage.exists?
54         return []
55     end
56 
57     package = Ravn::Tactical::BoltPackage.load
58 
59     # :TODO: Merge with draft bolts from all missions?
60 
61     present( package.bolts.values )
62 end
upload_bolt_package()

Import a new BoltPackage from an uploaded file.

   # File lib/ravn/tactical/service_v1/bolts.rb
66 def upload_bolt_package
67     self.log.debug "Package param is: %p" % [ request.params['package'] ]
68     upload = typecast_params.file!( 'package' )
69 
70     # :TODO: Sanity-check other stuff in `upload'?
71     # {
72     #     filename: "exported-bolts.yml",
73     #     type: "application/yaml",
74     #     name: "package",
75     #     tempfile: #<Tempfile:/var/folders/sf/4ddx_0rd1bn351_f_4knqk440000gn/T/RackMultipart20240508-27775-37svta.yml>,
76     #     head: "content-disposition: form-data; name=\"package\"; filename=\"exported-bolts.yml\"\r\ncontent-type: application/yaml\r\ncontent-length: 6418\r\n"
77     # }
78 
79     package = check_bolt_package( upload )
80     package.write_as_default( replace: true )
81 
82     response.status = :accepted
83 
84     return { status: 'Package updated.', timestamp: package.timestamp }
85 rescue Ravn::Tactical::BoltPackageError => err
86     self.log.error "Invalid bolt package uploaded: %s." % [ err.message ]
87 
88     body = { error: 'Invalid bolt package' }
89     body[:details] = err.message
90 
91     response.status = :unprocessable_entity
92     return body
93 end