Creating a service backend endpoint for http://va.gov is a common task for developers. Due to the complexity of integrating with legacy VA REST or SOAP applications we've developed a pattern for making these connections. To show the parts of the process that are automated, we've written a Rails generator that creates an example 'Hello, World!' endpoint for you.

Generating an Endpoint

Generating an endpoint is similar to using the built in Rails generators that create models, controllers, or migrations for you. The first step is to ensure you're in the root directory of the vets-api project. From there you'll run rails generate module <module_name>. The <module_name> option is the name of the Rails Engine or module that the endpoint will live within. It's also used as a Ruby namespace for the classes that are generated. If your module's name is 'foo' you'd run the command below to generate an endpoint:

rails generate module foo

What gets generated

An endpoint on http://va.gov consists of a controller, model, serializer, and service classes. In addition some configuration files are generated. Other existing configuration files, such the main config/routes.rb file, are modified. When the command runs the first section of the output lists the generated and modified files:

create  modules/foo/lib/foo/engine.rb
create  modules/foo/lib/foo/version.rb
create  modules/foo/lib/foo.rb
create  modules/foo/Rakefile
create  modules/foo/README.rdoc
create  modules/foo/bin/rails
chmod  modules/foo/bin/rails
create  modules/foo/spec/spec_helper.rb
create  modules/foo/config/routes.rb
create  modules/foo/foo.gemspec
create  modules/foo/Gemfile
insert  spec/spec_helper.rb
insert  spec/simplecov_helper.rb
insert  Gemfile
insert  config/routes.rb
run  bundle install from "."
🙌 new module generated at ./modules/foo
CODE

Note that you may need to scroll up within the terminal to see the list of files. The bundle command is run for you to ensure the module is installed in the host application, and its output is bookended by the generator's messages.