A simple starter-kit for developing DARRT-style APIs. DARRT is an acronym which stands for Data, Actions, Resources, Representations, & Transitions. The DARRT library is used in the book "Design and Build Great Web APIs" (https://pragprog.com/book/maapis/design-and-build-great-web-apis).
First, FORK this repo (or just copy the /dartt/
folder and the root
index.js
and package.json
files into your own project folder).
This project has a package.json
which identifies the following runtime dependencies:
body-parser
cors
ejs
express
You can use npm install
to update all dependencies. If you just copy the
files, be sure to install/update the dependencies yourself.
The project SHOULD work "out-of-the-box" as a simple CRUD-style API to manage
persons. To make this work for your own API needs, you only need to update
the files in the /darrt/
folder. See the steps below for details.
The /darrt/
folder holds the framework base files:
data.js
actions.js
resources.js
representations.js
transitions.js
These four files are the ones you'll edit to match your API needs.
There are two subfolders, too: /darrt/lib
and /darrt/representors/
. The
lib
folder holds the operational support files for managing the information
in your control files in the /darrt/
folder. The representors
folder holds
response representation templates (using ejs
) matched to media-type strings.
The representors in the base library are:
- application/json
- text/csv
- application/forms+json
- application/links+json (alpha)
- application/prag+sjon (beta)
You can edit these and add new representors for additional media types as needed.
This defines what state is passed back and forth
- properties (MUST include
id
,dateCreated
, &dateUpdated
; SHOULD includestatus
) - enums
- requireds
- defaults
This implements the internal functionality your service supports through a
series of exported functions. See the included actions.js
for examples.
This file contains the routes and calling routines for all the URLs in your
API and maps to the actions. This is the classic express.js-style
router.get(...)
, router.post(...)
set of operations that call the
exported actions.js
methods via a special operation (utils.handler(...)
).
See the included resources.js
for examples.
This file contains the response representations your service supports. This is
based on the representor pattern. See the darrt/representors/
folder for
built-in examples of a handful of media-type representors.
This file contains all the links and forms your service API will emit at
runtime. If you are only supporting application/json
or text/csv
or some
other format that has no hypermedia support, you can ignore this step.
The current project just stores the passed state on disk in the /data/
folder. This is handled by the /darrt/lib/components.js
and
/darrt/lib/storage.js
files. You can use this local storage approach or
update it to use more robust storage tooling yourself and just modify the
dependencies. NOTE that in this release, storage is implemented without
support for Promises. A future version will make storage fully 'then-able' to
make adding remote adpaters easy to do.
- Convert
if
andswitcH
statements to polymorphic function paradigm, or
"semantics-driven development".