Files
notesnook/packages/core/models/user.js

99 lines
2.2 KiB
JavaScript
Raw Normal View History

import { HOST, HEADERS } from "../utils/constants";
import StorageInterface from "../database/storage";
import fetch from "node-fetch";
2020-01-20 17:27:18 +05:00
export default class User {
/**
*
* @param {StorageInterface} context
*/
constructor(context) {
this.context = context;
2020-01-20 17:27:18 +05:00
}
2020-02-11 16:28:28 +05:00
async get() {
return this.context.read("user");
2020-01-20 17:27:18 +05:00
}
async login(username, password) {
let response = await authRequest("oauth/token", {
username,
password,
grant_type: "password"
});
let user = userFromResponse(response);
await this.context.write("user", user);
2020-01-20 17:27:18 +05:00
}
2020-02-11 16:28:28 +05:00
async token() {
let user = await this.user();
2020-02-11 16:28:28 +05:00
if (!user) return;
2020-01-20 17:27:18 +05:00
if (user.expiry < Date.now()) {
2020-02-11 16:28:28 +05:00
return user.accessToken;
2020-01-20 17:27:18 +05:00
}
let response = await authRequest("oauth/token", {
refresh_token: user.refreshToken,
grant_type: "refresh_token"
});
var dt = new Date();
dt.setDate(dt.getDate() + 1);
user = {
...user,
2020-01-20 17:27:18 +05:00
accessToken: response.accessToken,
refreshToken: response.refreshToken,
expiry: dt.getTime()
};
await this.context.write("user", user);
2020-02-11 16:28:28 +05:00
return user.accessToken;
2020-01-20 17:27:18 +05:00
}
logout() {
this.context.clear();
}
2020-01-20 17:27:18 +05:00
async signup(username, email, password) {
let response = await authRequest("auth/register", {
username,
password,
email
});
let user = userFromResponse(response);
await this.context.write(user.username, user);
}
}
function userFromResponse(response) {
var dt = new Date();
dt.setDate(dt.getDate() + 1);
let user = {
...response.payload,
accessToken: response.accessToken,
refreshToken: response.refreshToken,
scopes: response.scopes,
expiry: dt.getTime()
};
return user;
}
async function authRequest(endpoint, data) {
let response = await fetch(`${HOST}${endpoint}`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify(data)
});
if (response.ok) {
let result = await response.json();
if (result.error) {
throw new Error(result.error);
}
return result;
}
let json = await response.json();
if (json.error) {
throw new Error(json.error);
} else {
let error = `Request failed with status code: ${response.status} ${response.statusText}.`;
throw new Error(error);
2020-01-20 17:27:18 +05:00
}
}