ducky/web

Paddy 2015-07-07 Parent:275a83e4c02e Child:13d27b50d79e

17:313780205e39 Go to Latest

ducky/web/src/models/me.js

Use our "production" config values. Use config values for our hosted test instance of the services. These aren't actually production values, but they're at least _live_ values.

History
paddy@0 1 import Model from 'ampersand-model'
paddy@0 2 import Sync from 'ampersand-sync'
paddy@0 3 import qs from 'qs'
paddy@0 4 import config from '../config'
paddy@0 5 import isObject from 'lodash.isobject'
paddy@2 6 import jwtDecode from 'jwt-decode'
paddy@14 7 import localStore from '../helpers/local-storage'
paddy@14 8 import debounce from 'lodash.debounce'
paddy@0 9
paddy@0 10 export default Model.extend({
paddy@0 11 url: config.urlBase + '/token',
paddy@0 12 ajaxConfig: {
paddy@0 13 headers: {
paddy@0 14 'Content-Type': 'application/x-www-form-urlencoded',
paddy@0 15 'Authorization': 'Basic ' + btoa(config.clientID + ':' + config.clientSecret),
paddy@0 16 }
paddy@0 17 },
paddy@0 18
paddy@0 19 props: {
paddy@0 20 access_token: 'string',
paddy@0 21 refresh_token: 'string',
paddy@0 22 expires_in: 'int',
paddy@0 23 token_created: 'date',
paddy@2 24 profileID: 'string',
paddy@0 25 },
paddy@0 26
paddy@14 27 profile() {
paddy@14 28 return new Promise((resolve, reject) => {
paddy@14 29 app.profiles.getOrFetch(this.profileID, (err, model) => {
paddy@14 30 if (err) {
paddy@14 31 reject(err)
paddy@14 32 } else {
paddy@14 33 resolve(model)
paddy@14 34 }
paddy@14 35 })
paddy@14 36 })
paddy@14 37 },
paddy@14 38
paddy@0 39 derived: {
paddy@0 40 loggedIn () {
paddy@0 41 return !!this.access_token
paddy@0 42 },
paddy@14 43 tokenExpires () {
paddy@14 44 let d = this.token_created
paddy@14 45 d.setSeconds(d.getSeconds() + this.expires_in)
paddy@14 46 return d
paddy@14 47 },
paddy@0 48 needsRefresh () {
paddy@14 49 return !!this.refresh_token && (new Date() >= this.tokenExpires)
paddy@0 50 },
paddy@14 51 },
paddy@14 52
paddy@14 53 initialize() {
paddy@14 54 this.debouncedWriteToCache = debounce(this.writeToCache, 250)
paddy@0 55 },
paddy@0 56
paddy@0 57 login (email, password) {
paddy@0 58 let options = {
paddy@0 59 data: qs.stringify({
paddy@0 60 'username': email,
paddy@0 61 'password': password,
paddy@0 62 'grant_type': 'password',
paddy@0 63 }),
paddy@0 64 }
paddy@0 65 let moc = this
paddy@0 66 options.success = function(resp) {
paddy@0 67 if (!resp.access_token) {
paddy@0 68 return false
paddy@0 69 }
paddy@0 70 let serverAttrs = moc.parse(resp, options)
paddy@0 71 serverAttrs.token_created = new Date()
paddy@0 72 if (options.wait) serverAttrs = assign({}, serverAttrs)
paddy@0 73 if (isObject(serverAttrs) && !moc.set(serverAttrs, options)) {
paddy@0 74 return false
paddy@0 75 }
paddy@2 76 const token = jwtDecode(moc.access_token)
paddy@2 77 moc.profileID = token.sub
paddy@0 78 moc.trigger('sync', moc, resp, options)
paddy@0 79 }
paddy@0 80 options.error = function(resp) {
paddy@0 81 moc.trigger('error', moc, resp, options)
paddy@0 82 }
paddy@0 83 let sync = Sync('create', moc, options)
paddy@0 84 },
paddy@0 85
paddy@0 86 writeToCache () {
paddy@14 87 const data = JSON.stringify(this)
paddy@14 88 localStore.set('me', data)
paddy@14 89 },
paddy@14 90
paddy@14 91 load () {
paddy@14 92 let moc = this
paddy@14 93 localStore.get('me').catch((err) => {
paddy@14 94 console.error(err)
paddy@14 95 }).then((resp) => {
paddy@14 96 if (resp) {
paddy@14 97 const loaded = this.parse(JSON.parse(resp))
paddy@14 98 moc.set(loaded, {silent: true})
paddy@14 99 }
paddy@14 100 })
paddy@14 101 return this
paddy@0 102 },
paddy@0 103
paddy@0 104 logout () {
paddy@14 105 localStore.remove('me')
paddy@0 106 },
paddy@0 107
paddy@0 108 })