Add logic for fetching device tokens and using them to resume session
This commit is contained in:
parent
294b312641
commit
2ab5c7a6f5
@ -442,12 +442,23 @@ export class AppComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const stat: any = await this.session.stat();
|
let stat: any = await this.session.stat();
|
||||||
|
|
||||||
|
if ( !stat.authenticated_user ) {
|
||||||
|
if ( !this.api.isOffline ) {
|
||||||
|
await this.api.resumeSession();
|
||||||
|
stat = await this.session.stat();
|
||||||
|
|
||||||
if ( !stat.authenticated_user ) {
|
if ( !stat.authenticated_user ) {
|
||||||
window.location.href = `${stat.system_base}start`;
|
window.location.href = `${stat.system_base}start`;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
await this.db.purge();
|
||||||
|
window.location.href = `${stat.system_base}start`;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.session.appName = stat.app_name;
|
this.session.appName = stat.app_name;
|
||||||
this.session.systemBase = stat.system_base;
|
this.session.systemBase = stat.system_base;
|
||||||
|
@ -158,6 +158,46 @@ export class ApiService {
|
|||||||
return `${this.baseEndpoint.endsWith('/') ? this.baseEndpoint.slice(0, -1) : this.baseEndpoint}${endpoint}`;
|
return `${this.baseEndpoint.endsWith('/') ? this.baseEndpoint.slice(0, -1) : this.baseEndpoint}${endpoint}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getDeviceToken(): Promise<string> {
|
||||||
|
return new Promise(async (res, rej) => {
|
||||||
|
const tokenKV = await this.db.getKeyValue('device_token');
|
||||||
|
if ( !tokenKV.data && this.isOffline ) {
|
||||||
|
return rej(new ResourceNotAvailableOfflineError());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( tokenKV.data ) {
|
||||||
|
const expDate = new Date(tokenKV.data.expiration_date);
|
||||||
|
if (expDate > new Date()) {
|
||||||
|
return res(tokenKV.data.token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.get(`/session/device-token`).subscribe({
|
||||||
|
next: async result => {
|
||||||
|
tokenKV.data = result.data;
|
||||||
|
await tokenKV.save();
|
||||||
|
res(result.data.token);
|
||||||
|
},
|
||||||
|
error: rej,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public resumeSession(): Promise<void> {
|
||||||
|
return new Promise(async (res, rej) => {
|
||||||
|
if ( !this.isOffline ) {
|
||||||
|
this.getDeviceToken().then(token => {
|
||||||
|
this.post(`/session/resume/${token}`).subscribe({
|
||||||
|
next: result => {
|
||||||
|
res();
|
||||||
|
},
|
||||||
|
error: rej,
|
||||||
|
});
|
||||||
|
}).catch(rej);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public getMenuItems(): Promise<any[]> {
|
public getMenuItems(): Promise<any[]> {
|
||||||
return new Promise(async (res, rej) => {
|
return new Promise(async (res, rej) => {
|
||||||
await this.db.createSchemata();
|
await this.db.createSchemata();
|
||||||
@ -193,6 +233,7 @@ export class ApiService {
|
|||||||
public getSessionData(): Promise<any> {
|
public getSessionData(): Promise<any> {
|
||||||
return new Promise(async (res, rej) => {
|
return new Promise(async (res, rej) => {
|
||||||
const sessionKV = await this.db.getKeyValue('session_data');
|
const sessionKV = await this.db.getKeyValue('session_data');
|
||||||
|
const authenticatedUserKV = await this.db.getKeyValue('authenticated_user');
|
||||||
|
|
||||||
// If offline, just return the locally cached session data
|
// If offline, just return the locally cached session data
|
||||||
if ( this.isOffline ) {
|
if ( this.isOffline ) {
|
||||||
@ -205,6 +246,16 @@ export class ApiService {
|
|||||||
|
|
||||||
// Otherwise, fetch the session data from the server and cache it locally
|
// Otherwise, fetch the session data from the server and cache it locally
|
||||||
this.get('/session').subscribe(async result => {
|
this.get('/session').subscribe(async result => {
|
||||||
|
// If the locally logged in user is not the one in the server session, purge everything and reset
|
||||||
|
if (
|
||||||
|
authenticatedUserKV.data
|
||||||
|
&& authenticatedUserKV.data?.user?.id
|
||||||
|
&& authenticatedUserKV.data.user.id !== result.data.user.id
|
||||||
|
) {
|
||||||
|
await this.cleanSession(result.data);
|
||||||
|
return res(result.data);
|
||||||
|
}
|
||||||
|
|
||||||
sessionKV.data = result.data;
|
sessionKV.data = result.data;
|
||||||
await sessionKV.save();
|
await sessionKV.save();
|
||||||
res(sessionKV.data);
|
res(sessionKV.data);
|
||||||
@ -212,6 +263,22 @@ export class ApiService {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected async cleanSession(data: any) {
|
||||||
|
await this.db.purge();
|
||||||
|
await new Promise((res, rej) => {
|
||||||
|
this.stat().subscribe({
|
||||||
|
next: res,
|
||||||
|
error: rej,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const sessionKV = await this.db.getKeyValue('session_data');
|
||||||
|
sessionKV.data = data;
|
||||||
|
await sessionKV.save();
|
||||||
|
|
||||||
|
await this.getDeviceToken();
|
||||||
|
}
|
||||||
|
|
||||||
public saveSessionData(data: any): Promise<void> {
|
public saveSessionData(data: any): Promise<void> {
|
||||||
return new Promise(async (res, rej) => {
|
return new Promise(async (res, rej) => {
|
||||||
// Update the local session data
|
// Update the local session data
|
||||||
|
Loading…
Reference in New Issue
Block a user