diff --git a/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwt.java b/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwt.java index cab8c7ba9c7..c89d71d1cff 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwt.java +++ b/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwt.java @@ -1,16 +1,11 @@ package tech.jhipster.lite.generator.client.angular.security.jwt.domain; -import java.util.List; import java.util.Map; public class AngularJwt { private AngularJwt() {} - public static List jwtDependencies() { - return List.of("ngx-webstorage"); - } - public static Map angularJwtFiles() { String primaryAppAuth = "app/auth"; String primaryAppLogin = "app/login"; diff --git a/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainService.java b/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainService.java index cacb45d940e..250af7e8d1f 100644 --- a/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainService.java +++ b/src/main/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainService.java @@ -38,15 +38,10 @@ public void addJwtAngular(Project project) { public void addAppJwtFiles(Project project) { project.addDefaultConfig(BASE_NAME); - addJwtDependencies(project); addAngularJwtFiles(project); updateAngularFilesForJwt(project); } - public void addJwtDependencies(Project project) { - AngularJwt.jwtDependencies().forEach(dependency -> addDependency(project, dependency)); - } - public void updateAngularFilesForJwt(Project project) { String oldHtml = "// jhipster-needle-angular-route"; String newHtml = @@ -59,11 +54,9 @@ public void updateAngularFilesForJwt(Project project) { projectRepository.replaceText(project, APP, APP_ROUTING_MODULE, oldHtml, newHtml); oldHtml = "import \\{ NgModule \\} from '@angular/core';"; - newHtml = - """ + newHtml = """ import { NgModule } from '@angular/core'; - import { ReactiveFormsModule } from '@angular/forms'; - import { NgxWebstorageModule } from 'ngx-webstorage';"""; + import { ReactiveFormsModule } from '@angular/forms';"""; projectRepository.replaceText(project, APP, APP_MODULE, oldHtml, newHtml); oldHtml = "import \\{ AppComponent \\} from './app.component';"; @@ -76,9 +69,7 @@ public void updateAngularFilesForJwt(Project project) { oldHtml = "imports: \\[" + angularCommonService.getAngularModules().stream().collect(Collectors.joining(", ")) + "\\],"; newHtml = - "imports: \\[" + - angularCommonService.getAngularModules().stream().collect(Collectors.joining(", ")) + - ", ReactiveFormsModule, NgxWebstorageModule.forRoot()\\],"; + "imports: \\[" + angularCommonService.getAngularModules().stream().collect(Collectors.joining(", ")) + ", ReactiveFormsModule\\],"; projectRepository.replaceText(project, APP, APP_MODULE, oldHtml, newHtml); oldHtml = "bootstrap: \\[AppComponent\\],"; @@ -111,15 +102,4 @@ public void addAngularJwtFiles(Project project) { .toList(); projectRepository.template(files); } - - private void addDependency(Project project, String dependency) { - npmService - .getVersion("angular", dependency) - .ifPresentOrElse( - version -> npmService.addDependency(project, dependency, version), - () -> { - throw new GeneratorException("Dependency not found: " + dependency); - } - ); - } } diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/account.service.spec.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/account.service.spec.ts.mustache index e9374472165..49a2c4370d2 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/account.service.spec.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/account.service.spec.ts.mustache @@ -1,7 +1,6 @@ import { RouterTestingModule } from '@angular/router/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { NgxWebstorageModule } from 'ngx-webstorage'; import { Account } from './account.model'; @@ -30,7 +29,7 @@ describe('Account Service', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([]), NgxWebstorageModule.forRoot()], + imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([])], }); service = TestBed.inject(AccountService); diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.spec.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.spec.ts.mustache index 99dcb0a8b80..d6bac35fcd4 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.spec.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.spec.ts.mustache @@ -1,30 +1,24 @@ import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { AuthServerProvider } from './auth-jwt.service'; -import { LocalStorageService, NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage'; describe('Auth JWT', () => { let service: AuthServerProvider; - let localStorageService: LocalStorageService; - let sessionStorageService: SessionStorageService; let httpMock: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + imports: [HttpClientTestingModule], }); httpMock = TestBed.inject(HttpTestingController); service = TestBed.inject(AuthServerProvider); - localStorageService = TestBed.inject(LocalStorageService); - sessionStorageService = TestBed.inject(SessionStorageService); }); describe('Login', () => { it('should clear session storage and save in local storage', () => { // GIVEN - localStorageService.store = jest.fn(); - sessionStorageService.clear = jest.fn(); + jest.spyOn(Storage.prototype, 'setItem'); // WHEN service.login({ username: 'John', password: '123' }).subscribe(); @@ -32,23 +26,20 @@ describe('Auth JWT', () => { // THEN httpMock.verify(); - expect(localStorageService.store).toHaveBeenCalledWith('authenticationToken', '1'); - expect(sessionStorageService.clear).toHaveBeenCalled(); + expect(localStorage.setItem).toHaveBeenCalledWith('authenticationToken', '1'); }); }); describe('Logout', () => { it('should clear storage', () => { // GIVEN - sessionStorageService.clear = jest.fn(); - localStorageService.clear = jest.fn(); + jest.spyOn(Storage.prototype, 'removeItem'); // WHEN service.logout().subscribe(); // THEN - expect(localStorageService.clear).toHaveBeenCalled(); - expect(sessionStorageService.clear).toHaveBeenCalled(); + expect(localStorage.removeItem).toHaveBeenCalledWith('authenticationToken'); }); }); }); diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.ts.mustache index a91925241d4..3d26629fed5 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth-jwt.service.ts.mustache @@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; import { Login } from '../login/login.model'; @@ -13,28 +12,22 @@ type JwtToken = { @Injectable({ providedIn: 'root' }) export class AuthServerProvider { constructor( - private http: HttpClient, - private localStorageService: LocalStorageService, - private sessionStorageService: SessionStorageService + private http: HttpClient ) {} login(credentials: Login): Observable { - return this.http - .post('api/authenticate', credentials) - .pipe(map(response => this.authenticateSuccess(response))); + return this.http.post('api/authenticate', credentials).pipe(map(response => this.authenticateSuccess(response))); } logout(): Observable { return new Observable(observer => { - this.localStorageService.clear('authenticationToken'); - this.sessionStorageService.clear('authenticationToken'); + localStorage.removeItem('authenticationToken'); observer.complete(); }); } private authenticateSuccess(response: JwtToken): void { const jwt = response.id_token; - this.localStorageService.store('authenticationToken', jwt); - this.sessionStorageService.clear('authenticationToken'); + localStorage.setItem('authenticationToken', jwt); } } diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.spec.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.spec.ts.mustache index 3727ac74045..33377be4172 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.spec.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.spec.ts.mustache @@ -2,34 +2,28 @@ import { getTestBed, TestBed } from '@angular/core/testing'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { LocalStorageService, NgxWebstorageModule, SessionStorageService } from 'ngx-webstorage'; - import { AuthServerProvider } from './auth-jwt.service'; import { AuthInterceptor } from './auth.interceptor'; describe('Auth Interceptor', () => { let service: AuthServerProvider; - let localStorageService: LocalStorageService; - let sessionStorageService: SessionStorageService; let injector: TestBed; let httpMock: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + imports: [HttpClientTestingModule], providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, - multi: true - } - ] + multi: true, + }, + ], }); injector = getTestBed(); httpMock = TestBed.inject(HttpTestingController); - localStorageService = TestBed.inject(LocalStorageService); - sessionStorageService = TestBed.inject(SessionStorageService); service = TestBed.inject(AuthServerProvider); }); @@ -41,20 +35,7 @@ describe('Auth Interceptor', () => { it('should add authorization header with localStorageService', () => { // GIVEN const token = 'azerty'; - localStorageService.retrieve = jest.fn(() => token); - - // WHEN - service.login({ username: 'John', password: '123' }).subscribe(); - - // THEN - const httpReq = httpMock.expectOne('api/authenticate'); - expect(httpReq.request.headers.has('Authorization')).toBe(true); - }); - - it('should add authorization header with sessionStorageService', () => { - // GIVEN - const token = 'azerty'; - sessionStorageService.retrieve = jest.fn(() => token); + Storage.prototype.getItem = jest.fn(() => token); // WHEN service.login({ username: 'John', password: '123' }).subscribe(); @@ -64,5 +45,4 @@ describe('Auth Interceptor', () => { expect(httpReq.request.headers.has('Authorization')).toBe(true); }); }); - }); diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.ts.mustache index b60094de777..8e25c2146e8 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/auth/auth.interceptor.ts.mustache @@ -1,18 +1,12 @@ import { Injectable } from '@angular/core'; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { LocalStorageService, SessionStorageService } from 'ngx-webstorage'; @Injectable() export class AuthInterceptor implements HttpInterceptor { - constructor( - private localStorageService: LocalStorageService, - private sessionStorageService: SessionStorageService - ) {} intercept(request: HttpRequest, next: HttpHandler): Observable> { - const token: string | null = - this.localStorageService.retrieve('authenticationToken') ?? this.sessionStorageService.retrieve('authenticationToken'); + const token: string | null = localStorage.getItem('authenticationToken'); if (token) { request = request.clone({ setHeaders: { diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.component.spec.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.component.spec.ts.mustache index 8a091ee582b..8b357e0a962 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.component.spec.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.component.spec.ts.mustache @@ -1,6 +1,5 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { NgxWebstorageModule } from 'ngx-webstorage'; import { FormBuilder } from '@angular/forms'; import { of, Subject } from 'rxjs'; import { LoginService } from './login.service'; @@ -27,7 +26,7 @@ describe('Login Component', () => { beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ declarations: [LoginComponent], - imports: [HttpClientTestingModule, NgxWebstorageModule.forRoot()], + imports: [HttpClientTestingModule], providers: [ FormBuilder, AccountService, @@ -61,7 +60,7 @@ describe('Login Component', () => { comp.ngOnInit(); // THEN - expect(comp.appName).toEqual('{{baseName}}'); + expect(comp.appName).toEqual('angularapp'); expect(mockAccountService.getAuthenticationState).toHaveBeenCalled(); // THEN diff --git a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.service.spec.ts.mustache b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.service.spec.ts.mustache index 66258114c64..7b3e68ee71b 100644 --- a/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.service.spec.ts.mustache +++ b/src/main/resources/generator/client/angular/security/jwt/src/main/webapp/app/login/login.service.spec.ts.mustache @@ -1,7 +1,6 @@ import { RouterTestingModule } from '@angular/router/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { NgxWebstorageModule } from 'ngx-webstorage'; import { LoginService } from './login.service'; import { AuthServerProvider } from '../auth/auth-jwt.service'; @@ -16,10 +15,8 @@ describe('Login Service', () => { beforeEach(() => { TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([]), NgxWebstorageModule.forRoot()], - providers: [ - AccountService, - ], + imports: [HttpClientTestingModule, RouterTestingModule.withRoutes([])], + providers: [AccountService], }); service = TestBed.inject(LoginService); diff --git a/src/main/resources/generator/dependencies/angular/package.json b/src/main/resources/generator/dependencies/angular/package.json index 462f83488f4..8625bd38a6c 100644 --- a/src/main/resources/generator/dependencies/angular/package.json +++ b/src/main/resources/generator/dependencies/angular/package.json @@ -11,7 +11,6 @@ "@angular/platform-browser-dynamic": "14.1.0", "@angular/router": "14.1.0", "keycloak-js": "18.0.1", - "ngx-webstorage": "10.0.1", "rxjs": "7.5.6", "tslib": "2.4.0", "zone.js": "0.11.7" diff --git a/src/test/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainServiceTest.java b/src/test/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainServiceTest.java index 362f0ba82da..d12100c59bf 100644 --- a/src/test/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainServiceTest.java +++ b/src/test/java/tech/jhipster/lite/generator/client/angular/security/jwt/domain/AngularJwtDomainServiceTest.java @@ -37,35 +37,10 @@ class AngularJwtDomainServiceTest { @Test void shouldAddJwtAngular() { Project project = tmpProjectWithPackageJson(); - when(npmService.getVersion(anyString(), anyString())).thenReturn(Optional.of("0.0.0")); assertThatCode(() -> angularJwtDomainService.addJwtAngular(project)).doesNotThrowAnyException(); } - @Test - void shouldNotAddJwtAngular() { - Project project = tmpProjectWithPackageJson(); - - assertThatThrownBy(() -> angularJwtDomainService.addJwtAngular(project)).isExactlyInstanceOf(GeneratorException.class); - } - - @Test - void shouldAddJwtDependencies() { - Project project = tmpProjectWithPackageJson(); - when(npmService.getVersion(anyString(), anyString())).thenReturn(Optional.of("0.0.0")); - - angularJwtDomainService.addJwtDependencies(project); - - verify(npmService, times(1)).addDependency(any(Project.class), anyString(), anyString()); - } - - @Test - void shouldNotAddJwtDependencies() { - Project project = tmpProjectWithPackageJson(); - - assertThatThrownBy(() -> angularJwtDomainService.addJwtDependencies(project)).isExactlyInstanceOf(GeneratorException.class); - } - @Test void shouldAddAngularJwtFiles() { Project project = tmpProjectWithPackageJson();