2018-02-19 19:07:19 +01:00
|
|
|
import { StorageService } from '../abstractions/storage.service';
|
|
|
|
import { TokenService } from '../abstractions/token.service';
|
2018-05-18 21:26:46 +02:00
|
|
|
import { UserService as UserServiceAbstraction } from '../abstractions/user.service';
|
|
|
|
|
|
|
|
import { OrganizationData } from '../models/data/organizationData';
|
|
|
|
import { Organization } from '../models/domain/organization';
|
2018-01-09 23:37:50 +01:00
|
|
|
|
2018-08-14 21:12:10 +02:00
|
|
|
import { KdfType } from '../enums/kdfType';
|
|
|
|
|
2018-01-09 23:37:50 +01:00
|
|
|
const Keys = {
|
|
|
|
userId: 'userId',
|
|
|
|
userEmail: 'userEmail',
|
|
|
|
stamp: 'securityStamp',
|
2018-08-14 21:12:10 +02:00
|
|
|
kdf: 'kdf',
|
|
|
|
kdfIterations: 'kdfIterations',
|
2018-05-18 21:26:46 +02:00
|
|
|
organizationsPrefix: 'organizations_',
|
2018-01-09 23:37:50 +01:00
|
|
|
};
|
|
|
|
|
2018-05-18 21:26:46 +02:00
|
|
|
export class UserService implements UserServiceAbstraction {
|
2018-08-14 21:12:10 +02:00
|
|
|
private userId: string;
|
|
|
|
private email: string;
|
|
|
|
private stamp: string;
|
|
|
|
private kdf: KdfType;
|
|
|
|
private kdfIterations: number;
|
2018-01-09 23:37:50 +01:00
|
|
|
|
2018-08-14 21:12:10 +02:00
|
|
|
constructor(private tokenService: TokenService, private storageService: StorageService) { }
|
2018-01-09 23:37:50 +01:00
|
|
|
|
2018-08-14 21:12:10 +02:00
|
|
|
setInformation(userId: string, email: string, kdf: KdfType, kdfIterations: number): Promise<any> {
|
2018-01-09 23:37:50 +01:00
|
|
|
this.email = email;
|
|
|
|
this.userId = userId;
|
2018-08-14 21:12:10 +02:00
|
|
|
this.kdf = kdf;
|
|
|
|
this.kdfIterations = kdfIterations;
|
2018-01-09 23:37:50 +01:00
|
|
|
|
|
|
|
return Promise.all([
|
|
|
|
this.storageService.save(Keys.userEmail, email),
|
|
|
|
this.storageService.save(Keys.userId, userId),
|
2018-08-14 21:12:10 +02:00
|
|
|
this.storageService.save(Keys.kdf, kdf),
|
|
|
|
this.storageService.save(Keys.kdfIterations, kdfIterations),
|
2018-01-09 23:37:50 +01:00
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
setSecurityStamp(stamp: string): Promise<any> {
|
|
|
|
this.stamp = stamp;
|
|
|
|
return this.storageService.save(Keys.stamp, stamp);
|
|
|
|
}
|
|
|
|
|
|
|
|
async getUserId(): Promise<string> {
|
|
|
|
if (this.userId != null) {
|
|
|
|
return this.userId;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.userId = await this.storageService.get<string>(Keys.userId);
|
|
|
|
return this.userId;
|
|
|
|
}
|
|
|
|
|
|
|
|
async getEmail(): Promise<string> {
|
|
|
|
if (this.email != null) {
|
|
|
|
return this.email;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.email = await this.storageService.get<string>(Keys.userEmail);
|
|
|
|
return this.email;
|
|
|
|
}
|
|
|
|
|
|
|
|
async getSecurityStamp(): Promise<string> {
|
|
|
|
if (this.stamp != null) {
|
|
|
|
return this.stamp;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.stamp = await this.storageService.get<string>(Keys.stamp);
|
|
|
|
return this.stamp;
|
|
|
|
}
|
|
|
|
|
2018-08-14 21:12:10 +02:00
|
|
|
async getKdf(): Promise<KdfType> {
|
|
|
|
if (this.kdf != null) {
|
|
|
|
return this.kdf;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.kdf = await this.storageService.get<KdfType>(Keys.kdf);
|
|
|
|
return this.kdf;
|
|
|
|
}
|
|
|
|
|
|
|
|
async getKdfIterations(): Promise<number> {
|
|
|
|
if (this.kdfIterations != null) {
|
|
|
|
return this.kdfIterations;
|
|
|
|
}
|
|
|
|
|
|
|
|
this.kdfIterations = await this.storageService.get<number>(Keys.kdfIterations);
|
|
|
|
return this.kdfIterations;
|
|
|
|
}
|
|
|
|
|
2018-01-09 23:37:50 +01:00
|
|
|
async clear(): Promise<any> {
|
2018-05-18 21:26:46 +02:00
|
|
|
const userId = await this.getUserId();
|
|
|
|
|
2018-01-09 23:37:50 +01:00
|
|
|
await Promise.all([
|
|
|
|
this.storageService.remove(Keys.userId),
|
|
|
|
this.storageService.remove(Keys.userEmail),
|
|
|
|
this.storageService.remove(Keys.stamp),
|
2018-08-14 21:12:10 +02:00
|
|
|
this.storageService.remove(Keys.kdf),
|
|
|
|
this.storageService.remove(Keys.kdfIterations),
|
2018-05-18 21:26:46 +02:00
|
|
|
this.clearOrganizations(userId),
|
2018-01-09 23:37:50 +01:00
|
|
|
]);
|
|
|
|
|
|
|
|
this.userId = this.email = this.stamp = null;
|
2018-08-14 21:12:10 +02:00
|
|
|
this.kdf = null;
|
|
|
|
this.kdfIterations = null;
|
2018-01-09 23:37:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
async isAuthenticated(): Promise<boolean> {
|
|
|
|
const token = await this.tokenService.getToken();
|
|
|
|
if (token == null) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
const userId = await this.getUserId();
|
|
|
|
return userId != null;
|
|
|
|
}
|
2018-05-18 21:26:46 +02:00
|
|
|
|
|
|
|
async getOrganization(id: string): Promise<Organization> {
|
|
|
|
const userId = await this.getUserId();
|
|
|
|
const organizations = await this.storageService.get<{ [id: string]: OrganizationData; }>(
|
|
|
|
Keys.organizationsPrefix + userId);
|
|
|
|
if (organizations == null || !organizations.hasOwnProperty(id)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return new Organization(organizations[id]);
|
|
|
|
}
|
|
|
|
|
|
|
|
async getAllOrganizations(): Promise<Organization[]> {
|
|
|
|
const userId = await this.getUserId();
|
|
|
|
const organizations = await this.storageService.get<{ [id: string]: OrganizationData; }>(
|
|
|
|
Keys.organizationsPrefix + userId);
|
|
|
|
const response: Organization[] = [];
|
|
|
|
for (const id in organizations) {
|
|
|
|
if (organizations.hasOwnProperty(id)) {
|
|
|
|
response.push(new Organization(organizations[id]));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return response;
|
|
|
|
}
|
|
|
|
|
|
|
|
async replaceOrganizations(organizations: { [id: string]: OrganizationData; }): Promise<any> {
|
|
|
|
const userId = await this.getUserId();
|
|
|
|
await this.storageService.save(Keys.organizationsPrefix + userId, organizations);
|
|
|
|
}
|
|
|
|
|
|
|
|
async clearOrganizations(userId: string): Promise<any> {
|
|
|
|
await this.storageService.remove(Keys.organizationsPrefix + userId);
|
|
|
|
}
|
2018-01-09 23:37:50 +01:00
|
|
|
}
|