From fe397e9d2ece0a8a5d9a1e4369a176ebfe1d9637 Mon Sep 17 00:00:00 2001
From: Moritz Schneider <scmoritz@student.ethz.ch>
Date: Sat, 2 Dec 2017 11:13:44 +0100
Subject: [PATCH] Rewrite auth.js using es6

---
 src/models/auth.js  | 180 +++++++++++++++++++++++---------------------
 src/views/layout.js |   8 +-
 src/views/login.js  |   9 ++-
 3 files changed, 104 insertions(+), 93 deletions(-)

diff --git a/src/models/auth.js b/src/models/auth.js
index 899cd181..bc45c1cb 100644
--- a/src/models/auth.js
+++ b/src/models/auth.js
@@ -3,105 +3,113 @@ import { log } from './log';
 
 const m = require('mithril');
 
-const auth = {
+const APISession = {
   username: '',
   token: '',
   etag: '',
-  error: '',
   id: '',
   authenticated: false,
   lastChecked: 0,
-  login(username, password) {
-    this.reloadLocalStorage();
+};
+
+export function getUsername() {
+  return APISession.username;
+}
+
+export function getToken() {
+  return APISession.token;
+}
+
+export function isLoggedIn() {
+  return APISession.authenticated;
+}
+
+function reloadLocalStorage() {
+  log('checking stored session');
+  if (localStorage.getItem('token') !== null) {
+    APISession.token = localStorage.token;
+    APISession.id = localStorage.id;
+    APISession.username = localStorage.username;
+    APISession.etag = localStorage.etag;
+    APISession.authenticated = true;
+  }
+}
+
+export function login(username, password) {
+  reloadLocalStorage();
+  return m.request({
+    method: 'POST',
+    url: `${apiUrl}/sessions`,
+    data: { username, password },
+  }).then((result) => {
+    const dt = new Date();
+    log('logged in!');
+    APISession.token = result.token;
+    APISession.etag = result._etag;
+    APISession.id = result._id;
+    APISession.authenticated = true;
+    APISession.username = username;
+    localStorage.setItem('token', result.token);
+    localStorage.setItem('username', username);
+    localStorage.setItem('id', result._id);
+    localStorage.setItem('etag', result._etag);
+    APISession.lastChecked = dt.getTime();
+  });
+}
+
+export function logout() {
+  reloadLocalStorage();
+  APISession.authenticated = false;
+  return m.request({
+    method: 'DELETE',
+    url: `${apiUrl}/sessions/${APISession.id}`,
+    headers: {
+      Authorization: `Token ${APISession.token}`,
+      'If-Match': APISession.etag,
+    },
+  }).then(() => {
+    log('logged out!');
+    APISession.token = '';
+    APISession.authenticated = false;
+    localStorage.removeItem('token');
+    localStorage.removeItem('username');
+    localStorage.removeItem('id');
+    localStorage.removeItem('etag');
+    // m.route.set('/login');
+  }).catch(() => {
+    APISession.authenticated = false;
+    // m.route.set('/login');
+  });
+}
+
+export function checkLogin() {
+  const dt = new Date();
+  reloadLocalStorage();
+  if (this.authenticated === true) {
+    log('no session found');
+    m.route.set('/login');
+    return new Promise(() => { });
+  }
+  if (dt.getTime() > this.lastChecked + 5000) {
     return m.request({
-      method: 'POST',
-      url: `${apiUrl}/sessions`,
-      data: { username, password },
+      method: 'GET',
+      url: `${apiUrl}/sessions/${this.token}`,
     }).then((result) => {
-      const dt = new Date();
-      log('logged in!');
-      this.token = result.token;
-      this.etag = result._etag;
-      this.id = result._id;
+      const dt2 = new Date();
+      log('session is still valid!');
       this.authenticated = true;
-      this.username = username;
-      localStorage.setItem('token', result.token);
-      localStorage.setItem('username', username);
-      localStorage.setItem('id', result._id);
-      localStorage.setItem('etag', result._etag);
-      this.lastChecked = dt.getTime();
-      m.route.set('/');
+      this.etag = result._etag;
+      this.lastChecked = dt2.getTime();
     }).catch((e) => {
-      this.error = e.message;
-    });
-  },
-  logout() {
-    this.reloadLocalStorage();
-    this.authenticated = false;
-    return m.request({
-      method: 'DELETE',
-      url: `${apiUrl}/sessions/${this.id}`,
-      headers: {
-        Authorization: `Token ${this.token}`,
-        'If-Match': this.etag,
-      },
-    }).then(() => {
-      log('logged out!');
-      this.token = '';
+      log('token is not valid');
+      log(e);
       this.authenticated = false;
-      this.error = '';
-      localStorage.removeItem('token');
+      localStorage.removeItem('session');
       localStorage.removeItem('username');
       localStorage.removeItem('id');
       localStorage.removeItem('etag');
       m.route.set('/login');
-    }).catch((e) => {
-      this.error = e.message;
-      this.authenticated = false;
-      m.route.set('/login');
     });
-  },
-  checkLogin() {
-    const dt = new Date();
-    auth.reloadLocalStorage();
-    if (this.authenticated === true) {
-      log('no session found');
-      m.route.set('/login');
-      return new Promise(() => { });
-    }
-    if (dt.getTime() > this.lastChecked + 5000) {
-      return m.request({
-        method: 'GET',
-        url: `${apiUrl}/sessions/${this.token}`,
-      }).then((result) => {
-        const dt2 = new Date();
-        log('session is still valid!');
-        this.authenticated = true;
-        this.etag = result._etag;
-        this.lastChecked = dt2.getTime();
-      }).catch((e) => {
-        log('token is not valid');
-        log(e);
-        this.authenticated = false;
-        localStorage.removeItem('session');
-        localStorage.removeItem('username');
-        localStorage.removeItem('id');
-        localStorage.removeItem('etag');
-        m.route.set('/login');
-      });
-    }
-    return new Promise(() => { });
-  },
-  reloadLocalStorage() {
-    log('checking stored session');
-    if (localStorage.getItem('token') !== null) {
-      this.token = localStorage.token;
-      this.id = localStorage.id;
-      this.username = localStorage.username;
-      this.etag = localStorage.etag;
-      this.authenticated = true;
-    }
-  },
-};
-
-module.exports = auth;
+  }
+  return new Promise(() => { });
+}
diff --git a/src/views/layout.js b/src/views/layout.js
index db6314b6..4e6a7e66 100644
--- a/src/views/layout.js
+++ b/src/views/layout.js
@@ -1,11 +1,11 @@
-import * as auth from '../models/auth';
+import { checkLogin, isLoggedIn, logout } from '../models/auth';
 
 const m = require('mithril');
 
 module.exports = {
-  oninit: auth.checkLogin,
+  oninit: checkLogin,
   view(vnode) {
-    if (auth.authenticated === false) {
+    if (isLoggedIn() === false) {
       return m('div', [
         m('nav', [
           m('a', { href: '/', oncreate: m.route.link }, 'AMIV'),
@@ -27,7 +27,7 @@ module.exports = {
         m('a', {
           href: '/',
           onclick: () => {
-            auth.logout();
+            logout().then(() => { m.route.set('/'); });
             return false;
           },
           oncreate: m.route.link,
diff --git a/src/views/login.js b/src/views/login.js
index eabc01a9..02d154f0 100644
--- a/src/views/login.js
+++ b/src/views/login.js
@@ -1,21 +1,24 @@
-import * as auth from '../models/auth';
+import { login } from '../models/auth';
 
 const m = require('mithril');
 
 module.exports = {
   username: '',
   password: '',
+  error: '',
   view() {
     return m('div', [
       m(
         'form', {
           onsubmit: (e) => {
             e.preventDefault();
-            auth.login(this.username, this.password);
+            login(this.username, this.password)
+              .then(() => { m.route.set('/'); })
+              .catch((err) => { this.error = err; });
           },
         },
         m('h3', 'Login'), [
-          m('p', auth.error),
+          m('p', this.error),
           m('input.input[type=text][placeholder=Username]', {
             oninput: m.withAttr('value', (value) => { this.username = value; }),
             value: this.username,
-- 
GitLab