foxx_generator
Version:
Generate Foxx APIs using Statecharts and Domain Driven Design
55 lines (43 loc) • 1.87 kB
JavaScript
(function () {
'use strict';
var Foxx = require('org/arangodb/foxx'),
_ = require('underscore'),
Graph = require('./foxx_generator/graph').Graph,
Generator,
StateFactory = require('./foxx_generator/state_factory').StateFactory,
TransitionFactory = require('./foxx_generator/transition_factory').TransitionFactory,
configureStates = require('./foxx_generator/configure_states').configureStates,
mediaTypes;
mediaTypes = {
'application/vnd.siren+json': require('./foxx_generator/siren').mediaType
};
Generator = function (name, options) {
var applicationContext = options.applicationContext,
graph = new Graph(name, applicationContext),
strategies = mediaTypes[options.mediaType].strategies;
this.controller = new Foxx.Controller(applicationContext, options);
this.states = {};
this.transitions = [];
this.stateFactory = new StateFactory(graph, this.transitions, this.states);
this.transitionFactory = new TransitionFactory(applicationContext, graph, this.controller, strategies);
};
_.extend(Generator.prototype, {
addStartState: function (opts) {
var name = '',
options = _.defaults({ type: 'start', controller: this.controller }, opts);
this.states[name] = this.stateFactory.create(name, options);
},
addState: function (name, opts) {
this.states[name] = this.stateFactory.create(name, opts);
},
defineTransition: function (name, opts) {
this.transitions[name] = this.transitionFactory.create(name, opts);
},
generate: function () {
configureStates(this.states);
_.each(this.states, function (state) { state.prepareTransitions(this.transitions, this.states); }, this);
_.each(this.states, function (state) { state.applyTransitions(); }, this);
}
});
exports.Generator = Generator;
}());