Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion frontend/src/app/app.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { provideHttpClient } from '@angular/common/http';
import { ChangeDetectorRef } from '@angular/core';
import { ChangeDetectorRef, signal } from '@angular/core';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { MatDialogModule } from '@angular/material/dialog';
import { MatMenuModule } from '@angular/material/menu';
Expand Down Expand Up @@ -44,9 +44,12 @@ describe('AppComponent', () => {
const authCast = new Subject<any>();
const userCast = new Subject<any>();

const isAuthenticatedSignal = signal(false);
const mockAuthService = {
cast: authCast,
logOutUser: vi.fn().mockReturnValue(of(true)),
isAuthenticated: isAuthenticatedSignal.asReadonly(),
setAuthenticated: (value: boolean) => isAuthenticatedSignal.set(value),
};
Comment thread
gugu marked this conversation as resolved.

const mockUserService = {
Expand Down
4 changes: 4 additions & 0 deletions frontend/src/app/app.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ export class AppComponent {
localStorage.setItem('token_expiration', expirationTime.toISOString());
expirationToken = expirationTime.toISOString();
}
this._auth.setAuthenticated(true);

this.router.navigate(['/connections-list']);

Expand All @@ -236,6 +237,7 @@ export class AppComponent {
const expirationInterval = differenceInMilliseconds(expirationTime, currantTime);
console.log('expirationInterval', expirationInterval);
if (expirationInterval > 0) {
this._auth.setAuthenticated(true);
console.log('App component, session restoration');
this.initializeUserSession();

Expand Down Expand Up @@ -355,6 +357,7 @@ export class AppComponent {
this._user.setIsDemo(false);
this.currentUser = null;
localStorage.removeItem('token_expiration');
this._auth.setAuthenticated(false);
this.router.navigate(['/registration']);
});
}
Expand All @@ -375,6 +378,7 @@ export class AppComponent {
this._auth.logOutUser().subscribe(() => {
this.setUserLoggedIn(null);
localStorage.removeItem('token_expiration');
this._auth.setAuthenticated(false);

if (this.isSaas) {
if (!isTokenExpired) window.location.href = 'https://rocketadmin.com/';
Expand Down
16 changes: 15 additions & 1 deletion frontend/src/app/services/auth.service.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Injectable, signal } from '@angular/core';
import * as Sentry from '@sentry/angular';
import { BehaviorSubject, EMPTY } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
Expand All @@ -16,12 +16,19 @@ export class AuthService {
private auth = new BehaviorSubject<any>('');
public cast = this.auth.asObservable();

private _isAuthenticated = signal<boolean>(AuthService._hasValidSessionToken());
public readonly isAuthenticated = this._isAuthenticated.asReadonly();

constructor(
private _http: HttpClient,
private _notifications: NotificationsService,
private _configuration: ConfigurationService,
) {}

setAuthenticated(value: boolean): void {
this._isAuthenticated.set(value);
}

signUpUser(userData: NewAuthUser) {
const config = this._configuration.getConfig();
return this._http.post<any>(config.saasURL + '/saas/user/register', userData).pipe(
Expand Down Expand Up @@ -328,4 +335,11 @@ export class AuthService {
}),
);
}

private static _hasValidSessionToken(): boolean {
const exp = localStorage.getItem('token_expiration');
if (!exp) return false;
const expiration = new Date(exp);
return !isNaN(expiration.getTime()) && expiration.getTime() > Date.now();
}
}
4 changes: 3 additions & 1 deletion frontend/src/app/services/users.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { PolicyAction, PolicyActionGroup } from 'src/app/lib/cedar-policy-items'
import { groupNameForAction, PERMISSION_GROUP_ORDER } from 'src/app/lib/permission-display';
import { GroupUser, Permissions, UserGroup, UserGroupInfo } from 'src/app/models/user';
import { ApiService } from './api.service';
import { AuthService } from './auth.service';
import { NotificationsService } from './notifications.service';

export type GroupUpdateEvent =
Expand All @@ -21,6 +22,7 @@ export type GroupUpdateEvent =
})
export class UsersService {
private _api = inject(ApiService);
private _auth = inject(AuthService);
private _http = inject(HttpClient);
private _notifications = inject(NotificationsService);

Expand Down Expand Up @@ -48,7 +50,7 @@ export class UsersService {

private _availablePermissionsResource: HttpResourceRef<{ actions: PolicyAction[] } | undefined> = this._api.resource<{
actions: PolicyAction[];
}>(() => '/permissions/available');
}>(() => (this._auth.isAuthenticated() ? '/permissions/available' : undefined));

public readonly availablePermissions = computed<PolicyAction[]>(
() => this._availablePermissionsResource.value()?.actions ?? [],
Expand Down
Loading