forked from coolaj86/walnut.js
		
	
		
			
				
	
	
		
			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;
 | 
						|
    });
 | 
						|
  });
 | 
						|
}]);
 |