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

112 lines
2.6 KiB
JavaScript
Raw Normal View History

import { HOST, HEADERS } from "../utils/constants";
2020-01-20 17:27:18 +05:00
export default class User {
/**
*
* @param {import("../api").default} db
*/
constructor(db) {
this._db = db;
2020-04-16 03:32:07 +05:00
this._context = db.context;
2020-01-20 17:27:18 +05:00
}
get() {
return this._context.read("user");
2020-01-20 17:27:18 +05:00
}
async key() {
const user = await this.get();
return { key: user.key, salt: user.salt };
}
async set(user) {
if (!user) return;
user = { ...(await this.get()), ...user };
await this._context.write("user", user);
}
2020-01-20 17:27:18 +05:00
async login(username, password) {
let response = await authRequest("oauth/token", {
username,
password,
2020-04-07 19:05:00 +05:00
grant_type: "password",
2020-01-20 17:27:18 +05:00
});
const key = await this._context.deriveKey(password, response.payload.salt);
let user = userFromResponse(response, key);
await this._context.write("user", user);
2020-01-20 17:27:18 +05:00
}
2020-02-11 16:28:28 +05:00
async token() {
2020-02-12 02:09:08 +05:00
let user = await this.get();
2020-02-11 16:28:28 +05:00
if (!user) return;
2020-03-19 14:30:05 +05:00
if (!user.accessToken) {
return await this._context.remove("user");
2020-03-19 14:30:05 +05:00
}
2020-02-12 02:09:08 +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,
2020-04-07 19:05:00 +05:00
grant_type: "refresh_token",
2020-01-20 17:27:18 +05:00
});
2020-04-11 11:28:17 +05:00
user = {
...user,
2020-03-19 14:30:05 +05:00
accessToken: response.access_token,
refreshToken: response.refresh_token,
2020-04-11 11:28:17 +05:00
expiry: Date.now() + response.expiry * 100,
};
await this._context.write("user", user);
2020-01-20 17:27:18 +05:00
}
logout() {
this._db.ev.publish("clear");
return this._context.clear();
}
2020-01-20 17:27:18 +05:00
async signup(username, email, password) {
let response = await authRequest("auth/register", {
username,
password,
2020-04-07 19:05:00 +05:00
email,
2020-01-20 17:27:18 +05:00
});
const key = await this._context.deriveKey(password, response.payload.salt);
let user = userFromResponse(response, key);
await this._context.write("user", user);
}
}
function userFromResponse(response, key) {
let user = {
...response.payload,
accessToken: response.access_token,
refreshToken: response.refresh_token,
scopes: response.scopes,
2020-04-11 11:28:17 +05:00
expiry: Date.now() + response.expiry * 100,
key,
};
return user;
}
async function authRequest(endpoint, data) {
let response = await fetch(`${HOST}${endpoint}`, {
method: "POST",
headers: HEADERS,
2020-04-07 19:05:00 +05:00
body: JSON.stringify(data),
});
2020-04-07 19:05:00 +05:00
if (response.ok) {
let result = await response.json();
2020-04-07 19:05:00 +05:00
/* TODO if (result.error) {
throw new Error(result.error);
2020-04-07 19:05:00 +05:00
} */
return result;
}
2020-04-07 19:05:00 +05:00
let json = await response.json();
2020-04-07 19:05:00 +05:00
let error =
json.error ||
`Request failed with status code: ${response.status} ${response.statusText}.`;
throw new Error(error);
2020-01-20 17:27:18 +05:00
}