diff --git a/README.md b/README.md index c9419ec..d9e93f6 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,11 @@ In Progress * [GunDB](https://gundb.io) Support * OpenID support +API +--- + +API docs are here https://git.daplie.com/Daplie/com.example.hello + Structure ===== @@ -69,12 +74,15 @@ Currently being tested with Ubuntu, Raspbian, and Debian on Digital Ocean, Raspb │ ├── boot │ ├── holepunch │ └── lib +├── etc +│ └── client-api-grants ├── node_modules ├── packages │ ├── apis │ ├── pages │ └── services └── var + └── sites ``` * `core` contains all walnut code @@ -243,3 +251,10 @@ The permissions: com.example.hello # refers to /srv/walnut/packages/pages/com.example.hello ''' ``` + +API +--- + +``` +req.apiUrlPrefix => https://api.example.com/api/tld.domain.pkg +``` diff --git a/install.sh b/install.sh index e41a8d9..e31fced 100755 --- a/install.sh +++ b/install.sh @@ -219,16 +219,19 @@ my_app_launchd_service="Library/LaunchDaemons/${my_app_pkg_name}.plist" # Install install_my_app() { + # This function shouldn't need to use $sudo_cmd because it is called immediately after + # /srv/walnut is chown-ed and we only mess with things in that directory. + #git clone git@git.daplie.com:Daplie/walnut.js.git #git clone https://git.daplie.com/Daplie/walnut.js.git /srv/walnut/core - sudo mkdir -p /srv/walnut/{core,lib,var,etc,node_modules} + mkdir -p /srv/walnut/{core,lib,var,etc,node_modules} rm -rf /srv/walnut/core/node_modules ln -sf ../node_modules /srv/walnut/core/node_modules - sudo mkdir -p /srv/walnut/var/sites - sudo mkdir -p /srv/walnut/etc/org.oauth3.consumer - sudo mkdir -p /srv/walnut/etc/org.oauth3.provider - sudo mkdir -p /srv/walnut/etc/client-api-grants - sudo mkdir -p /srv/walnut/packages/{rest,api,pages,services} + mkdir -p /srv/walnut/var/sites + mkdir -p /srv/walnut/etc/org.oauth3.consumer + mkdir -p /srv/walnut/etc/org.oauth3.provider + mkdir -p /srv/walnut/etc/client-api-grants + mkdir -p /srv/walnut/packages/{rest,api,pages,services} # backwards compat if [ -d /srv/walnut/packages/client-api-grants ]; then @@ -249,14 +252,14 @@ install_my_app() popd } -sudo mkdir -p /srv/walnut -sudo chown -R $(whoami) /srv/walnut +$sudo_cmd mkdir -p /srv/walnut +$sudo_cmd chown -R $(whoami) /srv/walnut install_my_app create_skeleton install_uninstaller install_service -sudo chown -R www-data:www-data /srv/walnut || true -sudo chown -R _www:_www /srv/walnut || true -sudo chmod -R ug+rwX /srv/walnut +$sudo_cmd chown -R www-data:www-data /srv/walnut || true +$sudo_cmd chown -R _www:_www /srv/walnut || true +$sudo_cmd chmod -R ug+rwX /srv/walnut diff --git a/lib/apis.js b/lib/apis.js index d0ae567..69690f7 100644 --- a/lib/apis.js +++ b/lib/apis.js @@ -318,6 +318,7 @@ module.exports.create = function (xconfx, apiFactories, apiDeps) { var _stripe_test; var _mandrill; var _mailchimp; + var _twilio; myApp.use('/', function preHandler(req, res, next) { return getSiteConfig(clientUrih).then(function (siteConfig) { Object.defineProperty(req, 'getSiteMailer', { @@ -429,6 +430,27 @@ module.exports.create = function (xconfx, apiFactories, apiDeps) { } }); + var caps = { + 'com.daplie.tel.twilio': function (/*opts*/) { + if (_twilio) { + return _twilio; + } + + var Twilio = require('twilio'); + _twilio = new Twilio.RestClient(siteConfig['twilio.com'].id, siteConfig['twilio.com'].auth); + return apiDeps.Promise.resolve(_twilio); + } + }; + req.getSiteCapability = function (capname, opts) { + if (caps[capname]) { + return caps[capname](opts); + } + return apiDeps.Promise.reject( + new Error("['" + req.clientApiUri + '/' + pkgId + "'] " + + "capability '" + capname + "' not implemented") + ); + }; + req._walnutOriginalUrl = req.url; // "/path/api/com.example/hello".replace(/.*\/api\//, '').replace(/([^\/]*\/+)/, '/') => '/hello' req.url = req.url.replace(/\/api\//, '').replace(/.*\/api\//, '').replace(/([^\/]*\/+)/, '/'); @@ -517,6 +539,12 @@ module.exports.create = function (xconfx, apiFactories, apiDeps) { var hasBeenHandled = false; // Existing (Deprecated) + Object.defineProperty(req, 'apiUrlPrefix', { + enumerable: true + , configurable: false + , writable: false + , value: 'https://' + clientApiUri + '/' + pkgId + }); Object.defineProperty(req, 'experienceId', { enumerable: true , configurable: false