244 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			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; | ||
|  |     }); | ||
|  |   }); | ||
|  | }]); |