Update userService

This commit is contained in:
Matthias 2021-08-28 16:27:41 +02:00
parent f3dbffd669
commit b2ba9638e2
2 changed files with 77 additions and 35 deletions

View File

@ -1,30 +1,52 @@
import axios from 'axios'; import axios from 'axios';
import { AuthPayload } from '@/types'; import { AuthPayload, AuthStorage } from '@/types';
const AUTH_REFRESH_TOKEN = 'auth_ref_token'; const AUTH_LOGIN_INFO = 'auth_login_info';
const AUTH_ACCESS_TOKEN = 'auth_access_token';
const AUTH_API_URL = 'auth_api_url';
const APIBASE = '/api/v1'; const APIBASE = '/api/v1';
export class UserService { export class UserService {
private setAPIUrl(apiurl: string): void { private storeLoginInfo(loginInfo: AuthStorage): void {
localStorage.setItem(AUTH_API_URL, JSON.stringify(apiurl)); localStorage.setItem(AUTH_LOGIN_INFO, JSON.stringify(loginInfo));
} }
private setAccessToken(token: string): void { private setAccessToken(token: string): void {
localStorage.setItem(AUTH_ACCESS_TOKEN, JSON.stringify(token)); const loginInfo = this.getLoginInfo();
loginInfo.accessToken = token;
this.storeLoginInfo(loginInfo);
} }
private setRefreshTokens(refreshToken: string): void { private getLoginInfo(): AuthStorage {
localStorage.setItem(AUTH_REFRESH_TOKEN, JSON.stringify(refreshToken)); const info = JSON.parse(localStorage.getItem(AUTH_LOGIN_INFO) || '{}');
if ('apiUrl' in info && 'refreshToken' in info) {
return info;
}
return {
apiUrl: '',
refreshToken: '',
accessToken: '',
};
}
public getAccessToken(): string {
return this.getLoginInfo().accessToken;
}
private getRefreshToken() {
return this.getLoginInfo().refreshToken;
}
public loggedIn() {
return this.getLoginInfo().refreshToken !== '';
}
private getAPIUrl(): string {
return this.getLoginInfo().apiUrl;
} }
public logout(): void { public logout(): void {
console.log('Logging out'); console.log('Logging out');
localStorage.removeItem(AUTH_REFRESH_TOKEN); localStorage.removeItem(AUTH_LOGIN_INFO);
localStorage.removeItem(AUTH_ACCESS_TOKEN);
localStorage.removeItem(AUTH_API_URL);
} }
public async login(auth: AuthPayload) { public async login(auth: AuthPayload) {
@ -36,19 +58,19 @@ export class UserService {
auth: { ...auth }, auth: { ...auth },
}, },
); );
console.log(result.data); if (result.data.access_token && result.data.refresh_token) {
if (result.data.access_token) { const obj: AuthStorage = {
this.setAPIUrl(auth.url); apiUrl: auth.url,
this.setAccessToken(result.data.access_token); accessToken: result.data.access_token || '',
} refreshToken: result.data.refresh_token || '',
if (result.data.refresh_token) { };
this.setRefreshTokens(result.data.refresh_token); this.storeLoginInfo(obj);
} }
} }
public refreshToken(): Promise<string> { public refreshToken(): Promise<string> {
console.log('Refreshing token...'); console.log('Refreshing token...');
const token = JSON.parse(localStorage.getItem(AUTH_REFRESH_TOKEN) || '{}'); const token = this.getRefreshToken();
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios axios
.post( .post(
@ -78,15 +100,6 @@ export class UserService {
}); });
} }
public loggedIn() {
return localStorage.getItem(AUTH_ACCESS_TOKEN) !== null;
}
private getAPIUrl(): string {
const apiUrl = JSON.parse(localStorage.getItem(AUTH_API_URL) || '{}');
return typeof apiUrl === 'object' ? '' : apiUrl;
}
public getBaseUrl(): string { public getBaseUrl(): string {
const baseURL = this.getAPIUrl(); const baseURL = this.getAPIUrl();
if (baseURL === null) { if (baseURL === null) {
@ -99,17 +112,40 @@ export class UserService {
return `${baseURL}${APIBASE}`; return `${baseURL}${APIBASE}`;
} }
getAccessToken(): string { /**
return JSON.parse(localStorage.getItem(AUTH_ACCESS_TOKEN) || '{}'); * Call on startup to migrate old login info to new login
*/
public migrateLogin() {
const AUTH_REFRESH_TOKEN = 'auth_ref_token'; // Legacy key - do not use
const AUTH_ACCESS_TOKEN = 'auth_access_token';
const AUTH_API_URL = 'auth_api_url';
const apiUrl = JSON.parse(localStorage.getItem(AUTH_API_URL) || '{}');
const refreshToken = JSON.parse(localStorage.getItem(AUTH_REFRESH_TOKEN) || '{}');
const accessToken = JSON.parse(localStorage.getItem(AUTH_ACCESS_TOKEN) || '{}');
if (
typeof apiUrl === 'string' &&
typeof refreshToken === 'string' &&
typeof accessToken === 'string'
) {
const loginInfo: AuthStorage = {
apiUrl,
refreshToken,
accessToken,
};
this.storeLoginInfo(loginInfo);
} }
getRefreshToken() { localStorage.removeItem(AUTH_REFRESH_TOKEN);
return JSON.parse(localStorage.getItem(AUTH_REFRESH_TOKEN) || '{}'); localStorage.removeItem(AUTH_ACCESS_TOKEN);
localStorage.removeItem(AUTH_API_URL);
} }
} }
export function useUserService() { export function useUserService() {
return new UserService(); const userservice = new UserService();
userservice.migrateLogin();
return userservice;
} }
export default useUserService(); export default useUserService();

View File

@ -3,3 +3,9 @@ export interface AuthPayload {
username: string; username: string;
password: string; password: string;
} }
export interface AuthStorage {
apiUrl: string;
refreshToken: string;
accessToken: string;
}