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;
 | |
|     });
 | |
|   });
 | |
| }]);
 |