walnut.js/lib/com.daplie.walnut/scripts/daplie.js

244 lines
7.5 KiB
JavaScript

'use strict';
window.addEventListener('error', function (err) {
console.error("Uncaught Exception:");
console.log(err);
});
// TODO where to place this?
var urlPrefix = './'; // or '/'
angular.module('yololiumApp', [
'ui.bootstrap'
, 'ui.router'
, 'oauth3'
, 'daplie'
, 'steve'
/*
'ngSanitize'
*/
]).config([
'$urlRouterProvider'
, '$stateProvider'
, '$httpProvider'
, 'stConfig'
, function ($urlRouterProvider, $stateProvider, $httpProvider, StApi) {
var rootTemplate = $('.ui-view-body').html();
// https://daplie.com/connect/#/authorization_dialog/state=9124678613152355&response_type=token&scope=*&client_id=ID__1a503bda47a3fe3a00543166333f&redirect_uri=https://oauth3.org/oauth3.html%3Fprovider_uri=https%253A%252F%252Foauth3.org&origin=&referer=https://oauth3.org/&host=oauth3.org
//$urlRouterProvider.otherwise('/');
$stateProvider
.state('root', {
url: '/'
, views: {
body: {
template: rootTemplate
, controller: [
'$scope'
, 'DaplieApiSession'
, 'DaplieApiRequest'
, function ($scope, DaplieApiSession, DaplieApiRequest) {
var MC = this;
MC.urlsafe = function (name) {
return name.toLowerCase().replace(/[^\-\w]/, '').replace(/s$/, '');
};
function prefetch(session) {
console.log('DEBUG prefetch');
// Prefetching
return DaplieApiRequest.profile(session).then(function (profile) {
console.log('DEBUG profile');
console.log(profile);
//DaplieApiRequest.stake(session, profile.homeStakeAppScopedId);
//DaplieApiRequest.ward(session, profile.homeStakeAppScopedId, profile.homeWardAppScopedId);
});
}
DaplieApiSession.checkSession(prefetch);
DaplieApiSession.onLogin($scope, prefetch);
}]
, controllerAs: 'MC'
}
}
})
.state('logout', {
url: '/logout/:browserState'
, views: {
body: {
template: ''
// DestroySessionController
, controller: [
'$window'
, '$stateParams'
, 'DaplieApiSession'
, function ($window, $stateParams, DaplieApiSession) {
DaplieApiSession.destroy().then(function () {
var state = $stateParams.browserState;
$window.location.href = '/oauth3.html#logout_callback=true&state=' + state;
});
}]
, controllerAs: 'DSC'
}
}
})
/*
.state('authorization-dialog', {
url: '/authorization_dialog/{query:.+}'
, views: {
body: {
templateUrl: urlPrefix + 'views/authorization-dialog.html'
, controller: 'AuthorizationDialogController as ADC'
}
}
})
*/
.state('authorization-dialog', {
url: '/authorization_dialog/'
, views: {
body: {
templateUrl: urlPrefix + 'views/authorization-dialog.html'
, controller: 'AuthorizationDialogController as ADC'
}
}
})
.state('account', {
url: '/account/'
, views: {
body: {
templateUrl: urlPrefix + 'views/my-account.html'
, controller: 'MyAccountController as MAC'
}
}
})
;
// send creds
$httpProvider.defaults.withCredentials = true;
// alternatively, register the interceptor via an anonymous factory?
$httpProvider.interceptors.push([ '$q', function($q) {
var recase = window.Recase.create({ exceptions: {} });
function isApiUrl(url) {
// TODO provide a list of known-good API urls in StApi and loop
return !/^https?:\/\//.test(url)
|| url.match(StApi.apiPrefix)
|| url.match(StApi.oauthPrefix)
;
}
return {
'request': function (config) {
if (config.data
&& isApiUrl(config.url)
&& /json/.test(config.headers['Content-Type'])
) {
config.data = recase.snakeCopy(config.data);
}
return config;
}
, 'requestError': function (rejection) {
return rejection;
}
, 'response': function (response) {
var config = response.config;
var err;
// our own API is snake_case (to match webApi / ruby convention)
// but we convert to camelCase for javascript convention
if (isApiUrl(config.url) && /json/.test(response.headers('Content-Type'))) {
response.data = recase.camelCopy(response.data);
if ('string' === typeof response.data.error) {
err = new Error(response.data.errorDescription);
err.code = response.data.error;
err.uri = response.data.errorUri;
return $q.reject(err);
}
if ('object' === typeof response.data.error) {
err = new Error(response.data.error.message);
err.code = response.data.error.code;
err.uri = response.data.error.uri;
/*
Object.keys(response.data.error).forEach(function (key) {
err[key] = response.data.error[key];
});
*/
return $q.reject(err);
}
}
return response;
}
, 'responseError': function (rejection) {
return rejection;
}
};
}]);
}]).run([
'$rootScope'
, '$timeout'
, '$q'
, '$http'
, '$modal'
, 'DaplieApi'
, 'DaplieApiSession'
, function ($rootScope, $timeout, $q, $http, $modal, DaplieApi, DaplieApiSession) {
return DaplieApi.init({
//appId: 'TEST_ID_871a371debefb91c919ca848'
//appId: 'ID__b5db805e27cc27a0ee8eddf42f46'
appId: 'oauth3.org'
, appVersion: '2.1.0'
, clientUri: 'oauth3.org'
, clientAgreeTos: 'oauth3.org/tos/draft'
, invokeLogin: function (opts) {
console.info('login invoked');
return $modal.open({
templateUrl: urlPrefix + 'views/login-v3.html'
, controller: 'LoginController3 as LC'
, backdrop: 'static'
, keyboard: true
, resolve: {
myLoginOptions: [function () {
return opts;
}]
}
}).result;
}
}).then(function (DaplieApiConfig) {
$rootScope.R = {};
// attach after angular is initialized so that angular errors
// don't annoy developers that forgot bower install
window.addEventListener('error', function (err) {
window.alert('Uncaught Exception: ' + (err.message || 'unknown error'));
});
// TODO get from config
$http.get((DaplieApiConfig.apiBaseUri || DaplieApiConfig.providerUri)
+ '/api/org.oauth3.provider' + '/public/apps'
).then(function (resp) {
$rootScope.R.ready = true;
$rootScope.R.apps = resp.data.result.filter(function (app) {
return app.live;
});
});
// normally we'd do a background login here, but daplie.com/connect is already
// is the provider, so no sense in doing that...
return DaplieApiSession.checkSession().then(function () {
$rootScope.rootReady = true;
$rootScope.rootDeveloperMode = DaplieApiConfig.developerMode;
$rootScope.R.dev = $rootScope.rootDeveloperMode;
}, function () {
$rootScope.rootReady = true;
$rootScope.rootDeveloperMode = DaplieApiConfig.developerMode;
$rootScope.R.dev = $rootScope.rootDeveloperMode;
});
});
}]);