diff --git a/nae.json b/nae.json index 16dc91b4ba..f919d17fdd 100644 --- a/nae.json +++ b/nae.json @@ -24,7 +24,7 @@ "enable": false, "clientId": "dev-cluster-worker", "redirectUrl": "http://localhost:8081/realms/netgrif-cloud-testing/protocol/openid-connect/auth", - "refreshUrl": "http://localhost:8800/api/auth/login", + "refreshUrl": "http://localhost:8080/api/auth/login", "scopes": ["openid","email","profile","roles"] } }, diff --git a/projects/nae-example-app/src/app/app.component.ts b/projects/nae-example-app/src/app/app.component.ts index f63663c479..b8dd1cd273 100644 --- a/projects/nae-example-app/src/app/app.component.ts +++ b/projects/nae-example-app/src/app/app.component.ts @@ -28,7 +28,7 @@ export class AppComponent { translate.setTranslation('en', en, true); translate.setTranslation('sk', sk, true); - this.userService.user$.pipe(filter(u => !!u && u.id !== ''), take(1)).subscribe(() => { + this.userService.user$.pipe(filter(u => !!u && u.id !== '' && !u.isAnonymous()), take(1)).subscribe(() => { const allNets = allowedNetsFactory.createWithAllNets(); allNets.allowedNetsIdentifiers$.pipe(take(1)).subscribe(nets => { if (this.baseAllowedNets.allowedNets.length !== 0) { diff --git a/projects/netgrif-components-core/src/lib/authentication/anonymous/anonymous.service.spec.ts b/projects/netgrif-components-core/src/lib/authentication/anonymous/anonymous.service.spec.ts deleted file mode 100644 index 93ef00b802..0000000000 --- a/projects/netgrif-components-core/src/lib/authentication/anonymous/anonymous.service.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import {TestBed} from '@angular/core/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {HttpClientTestingModule} from '@angular/common/http/testing'; -import {RouterTestingModule} from '@angular/router/testing'; -import {AnonymousService} from './anonymous.service'; -import {ConfigurationService} from '../../configuration/configuration.service'; -import {TestConfigurationService} from '../../utility/tests/test-config'; - -describe('AnonymousService', () => { - let service: AnonymousService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [NoopAnimationsModule, HttpClientTestingModule, RouterTestingModule.withRoutes([])], - providers: [{provide: ConfigurationService, useClass: TestConfigurationService}] - }); - service = TestBed.inject(AnonymousService); - }); - - it('should be created', () => { - expect(service).toBeTruthy(); - }); - - afterEach(() => { - TestBed.resetTestingModule(); - }); -}); - diff --git a/projects/netgrif-components-core/src/lib/authentication/anonymous/anonymous.service.ts b/projects/netgrif-components-core/src/lib/authentication/anonymous/anonymous.service.ts deleted file mode 100644 index 2ed898ec8e..0000000000 --- a/projects/netgrif-components-core/src/lib/authentication/anonymous/anonymous.service.ts +++ /dev/null @@ -1,64 +0,0 @@ -import {Injectable, OnDestroy} from '@angular/core'; -import {ConfigurationService} from '../../configuration/configuration.service'; -import {NullStorage} from '../session/null-storage'; -import {BehaviorSubject, Observable} from 'rxjs'; - - -@Injectable({ - providedIn: 'root' -}) -export class AnonymousService implements OnDestroy { - - public static readonly JWT_BEARER_HEADER_DEFAULT = 'X-Jwt-Token'; - protected readonly _jwtHeader: string; - protected _storage: Storage; - protected _tokenSet: BehaviorSubject; - - constructor(protected _config: ConfigurationService) { - this._jwtHeader = this._config.get().providers.auth.jwtBearer ? - this._config.get().providers.auth.jwtBearer : AnonymousService.JWT_BEARER_HEADER_DEFAULT; - this._storage = this.resolveStorage(this._config.get().providers.auth['local']); - this._tokenSet = new BehaviorSubject(false); - } - - get jwtHeader(): string { - return this._jwtHeader; - } - - get tokenSet(): Observable { - return this._tokenSet.asObservable(); - } - - public getToken(): string { - return this._storage.getItem(this._jwtHeader); - } - - public setToken(token: string): void { - this._storage.setItem(this._jwtHeader, token); - if (!this._tokenSet.getValue()) - this._tokenSet.next(true); - } - - public removeToken(): void { - this._storage.removeItem(this._jwtHeader); - this._tokenSet.next(false); - } - - ngOnDestroy(): void { - localStorage.removeItem(this._jwtHeader); - this._tokenSet.complete(); - } - - protected resolveStorage(storage: string): any { - switch (storage) { - case 'local': - return localStorage; - case 'session': - return sessionStorage; - case 'null': - return new NullStorage(); - default: - return localStorage; - } - } -} diff --git a/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts b/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts index b6e1f2c204..771ad7eef8 100644 --- a/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts +++ b/projects/netgrif-components-core/src/lib/authentication/authentication.module.ts @@ -6,7 +6,7 @@ import {ProxyAuthenticationService} from './proxyAuthentication.service'; import {AuthenticationMethodService} from './services/authentication-method.service'; import {OverlayModule} from '@angular/cdk/overlay'; import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; -import {AnonymousAuthenticationInterceptor} from './services/anonymous-authentication-interceptor'; +// import {AnonymousAuthenticationInterceptor} from './services/anonymous-authentication-interceptor'; @NgModule({ @@ -22,7 +22,7 @@ import {AnonymousAuthenticationInterceptor} from './services/anonymous-authentic ], providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthenticationInterceptor, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: AnonymousAuthenticationInterceptor, multi: true }, + // { provide: HTTP_INTERCEPTORS, useClass: AnonymousAuthenticationInterceptor, multi: true }, { provide: AuthenticationMethodService, useClass: ProxyAuthenticationService}, // AuthenticationEffects ] diff --git a/projects/netgrif-components-core/src/lib/authentication/public-api.ts b/projects/netgrif-components-core/src/lib/authentication/public-api.ts index ecd362b905..f5ff8e8865 100644 --- a/projects/netgrif-components-core/src/lib/authentication/public-api.ts +++ b/projects/netgrif-components-core/src/lib/authentication/public-api.ts @@ -8,9 +8,7 @@ export * from './sign-up/public-api'; /* MODULES */ export * from './authentication.module'; -/* SERVICES */ -export * from './anonymous/anonymous.service'; -export * from './services/anonymous-authentication-interceptor' +// export * from './services/anonymous-authentication-interceptor' export * from './services/authentication-interceptor' export * from './proxyAuthentication.service' diff --git a/projects/netgrif-components-core/src/lib/authentication/services/anonymous-authentication-interceptor.spec.ts b/projects/netgrif-components-core/src/lib/authentication/services/anonymous-authentication-interceptor.spec.ts deleted file mode 100644 index 594f185f1d..0000000000 --- a/projects/netgrif-components-core/src/lib/authentication/services/anonymous-authentication-interceptor.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import {inject, TestBed} from '@angular/core/testing'; -import {ConfigurationService} from '../../configuration/configuration.service'; -import {TestConfigurationService} from '../../utility/tests/test-config'; -import {HTTP_INTERCEPTORS, HttpClient, HttpHeaders} from '@angular/common/http'; -import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'; -import {RouterTestingModule} from '@angular/router/testing'; -import {NoopAnimationsModule} from '@angular/platform-browser/animations'; -import {LoggerService} from '../../logger/services/logger.service'; -import {AnonymousService} from '../anonymous/anonymous.service'; -import {AnonymousAuthenticationInterceptor} from './anonymous-authentication-interceptor'; - -describe('AnonymousAuthenticationInterceptor', () => { - let service: AnonymousService; - let warnSpy: jasmine.Spy; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, NoopAnimationsModule, RouterTestingModule.withRoutes([])], - providers: [ - {provide: ConfigurationService, useClass: TestConfigurationService}, - AnonymousService, - { - provide: HTTP_INTERCEPTORS, - useClass: AnonymousAuthenticationInterceptor, - multi: true - } - ] - }); - service = TestBed.inject(AnonymousService); - warnSpy = spyOn(TestBed.inject(LoggerService), 'warn'); - }); - - describe('intercept HTTP request', () => { - it('should add JWT bearer to Headers', (done) => { - inject([HttpClient, HttpTestingController], - (http: HttpClient, mock: HttpTestingController) => { - - service.setToken('jwt-token'); - http.get('/api').subscribe(response => { - expect(response).toBeTruthy(); - done(); - }); - const request = mock.expectOne(req => (req.headers.has('X-Jwt-Token'))); - - request.flush({data: 'test'}, {headers: new HttpHeaders({'X-Jwt-Token': 'tokenos'})}); - mock.verify(); - })(); - }); - afterEach(inject([HttpTestingController], (mock: HttpTestingController) => { - mock.verify(); - TestBed.resetTestingModule(); - })); - }); - - afterEach(() => { - TestBed.resetTestingModule(); - }); -}); diff --git a/projects/netgrif-components-core/src/lib/authentication/services/anonymous-authentication-interceptor.ts b/projects/netgrif-components-core/src/lib/authentication/services/anonymous-authentication-interceptor.ts deleted file mode 100644 index f02ce95dc8..0000000000 --- a/projects/netgrif-components-core/src/lib/authentication/services/anonymous-authentication-interceptor.ts +++ /dev/null @@ -1,41 +0,0 @@ -import {Injectable} from '@angular/core'; -import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponse} from '@angular/common/http'; -import {Observable, throwError} from 'rxjs'; -import {catchError, tap} from 'rxjs/operators'; -import {AnonymousService} from '../anonymous/anonymous.service'; - -@Injectable() -export class AnonymousAuthenticationInterceptor implements HttpInterceptor { - - constructor(protected _anonymousService: AnonymousService) {} - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - const jwtAuthToken = this._anonymousService.getToken(); - - if (!this._anonymousService) { - next.handle(req); - } - - if (!!jwtAuthToken) { - req = req.clone({ - headers: req.headers.set(this._anonymousService.jwtHeader, jwtAuthToken) - }); - } - return next.handle(req).pipe( - tap(event => { - if (event instanceof HttpResponse) { - if (event.headers.has(this._anonymousService.jwtHeader)) { - this._anonymousService.setToken(event.headers.get(this._anonymousService.jwtHeader)); - } - } - }), - catchError(errorEvent => { - if (errorEvent instanceof HttpErrorResponse && errorEvent.status === 401) { - console.debug('Authentication token is invalid. Clearing session token'); - this._anonymousService.removeToken(); - } - return throwError(errorEvent); - }) - ); - } -} diff --git a/projects/netgrif-components-core/src/lib/authentication/services/authentication-interceptor.ts b/projects/netgrif-components-core/src/lib/authentication/services/authentication-interceptor.ts index 7e56051d92..3e90a7f9b1 100644 --- a/projects/netgrif-components-core/src/lib/authentication/services/authentication-interceptor.ts +++ b/projects/netgrif-components-core/src/lib/authentication/services/authentication-interceptor.ts @@ -11,7 +11,7 @@ import {Observable, throwError} from 'rxjs'; import {catchError, tap} from 'rxjs/operators'; import {SessionService} from '../session/services/session.service'; import {RedirectService} from '../../routing/redirect-service/redirect.service'; -import {AnonymousService} from '../anonymous/anonymous.service'; +// import {AnonymousService} from '../anonymous/anonymous.service'; import {SessionIdleTimerService} from "../session/services/session-idle-timer.service"; @Injectable() @@ -19,7 +19,7 @@ export class AuthenticationInterceptor implements HttpInterceptor { constructor(private _session: SessionService, private _redirect: RedirectService, - private _anonymousService: AnonymousService, + // private _anonymousService: AnonymousService, private idleTimerService: SessionIdleTimerService) { } @@ -37,7 +37,7 @@ export class AuthenticationInterceptor implements HttpInterceptor { return next.handle(req).pipe( tap(event => { if (event instanceof HttpResponse) { - if (event.headers.has(this._session.sessionHeader) && !event.headers.has(this._anonymousService.jwtHeader)) { + if (event.headers.has(this._session.sessionHeader)) { this._session.setVerifiedToken(event.headers.get(this._session.sessionHeader)); } } diff --git a/projects/netgrif-components-core/src/lib/authorization/permission/access.service.ts b/projects/netgrif-components-core/src/lib/authorization/permission/access.service.ts index d02b79728b..c96b47250c 100644 --- a/projects/netgrif-components-core/src/lib/authorization/permission/access.service.ts +++ b/projects/netgrif-components-core/src/lib/authorization/permission/access.service.ts @@ -37,7 +37,7 @@ export class AccessService { if (view.access !== 'private') { throw new Error(`Unknown access option '${view.access}'. Only 'public' or 'private' is allowed.`); } - return !this._userService.user.isEmpty(); + return !this._userService.user.isEmpty() && !this._userService.user.isAnonymous(); } if (!url) { diff --git a/projects/netgrif-components-core/src/lib/filter/models/filter.ts b/projects/netgrif-components-core/src/lib/filter/models/filter.ts index 9d26bdf1f8..74c4a722aa 100644 --- a/projects/netgrif-components-core/src/lib/filter/models/filter.ts +++ b/projects/netgrif-components-core/src/lib/filter/models/filter.ts @@ -71,6 +71,16 @@ export abstract class Filter { */ public abstract bodyContainsQuery(): boolean; + + /** + * Checks whether any of the filter bodies contains the `caseId` attribute. + * + * This method analyzes the body of the filter to determine if at least one of its parts includes a `caseId` field. + * + * @returns `true` if the `caseId` attribute exists in any of the filter bodies; otherwise, `false`. + */ + public abstract bodyContainsCaseId(): boolean; + /** * Returns the necessary request params for the filter. Default implementation returns an empty object. * The params are added on top of the request when sending it to the backend by the respective service methods. diff --git a/projects/netgrif-components-core/src/lib/filter/models/merged-filter.ts b/projects/netgrif-components-core/src/lib/filter/models/merged-filter.ts index 23a952c801..6118f49586 100644 --- a/projects/netgrif-components-core/src/lib/filter/models/merged-filter.ts +++ b/projects/netgrif-components-core/src/lib/filter/models/merged-filter.ts @@ -121,6 +121,13 @@ export class MergedFilter extends Filter { return this._filters.some(f => f.query !== undefined && f.query !== null); } + /** + * See [Filter.bodyContainsCaseId()]{@link Filter#bodyContainsCaseId} + */ + bodyContainsCaseId(): boolean { + return false; + } + /** * Returns the necessary request params for the filter. * @returns params with `operation` set to either `AND` or `OR` based on this object's `_operator` property. diff --git a/projects/netgrif-components-core/src/lib/filter/models/simple-filter.ts b/projects/netgrif-components-core/src/lib/filter/models/simple-filter.ts index 557d3d9e97..5d3e9cb447 100644 --- a/projects/netgrif-components-core/src/lib/filter/models/simple-filter.ts +++ b/projects/netgrif-components-core/src/lib/filter/models/simple-filter.ts @@ -102,6 +102,20 @@ export class SimpleFilter extends Filter { return this._filter.query !== undefined && this._filter.query !== null; } + /** + * See [Filter.bodyContainsCaseId()]{@link Filter#bodyContainsCaseId} + */ + bodyContainsCaseId(): boolean { + return !!this._filter + && !!this._filter['case'] + && ((!Array.isArray(this._filter['case']) + && !!this._filter['case'].id + && this._filter['case'].id.length > 0) + || (Array.isArray(this._filter['case']) + && this._filter['case'].length > 0)); + } + + /** * See [Filter.getRequestBody()]{@link Filter#getRequestBody} */ diff --git a/projects/netgrif-components-core/src/lib/groups/services/next-group.service.ts b/projects/netgrif-components-core/src/lib/groups/services/next-group.service.ts index 759a934fda..798da2387d 100644 --- a/projects/netgrif-components-core/src/lib/groups/services/next-group.service.ts +++ b/projects/netgrif-components-core/src/lib/groups/services/next-group.service.ts @@ -25,35 +25,14 @@ export class NextGroupService implements OnDestroy { protected _memberGroups$: BehaviorSubject>; protected _ownerGroups$: BehaviorSubject>; - private _userSub: Subscription; constructor(protected _userService: UserService, protected _caseResourceService: CaseResourceService) { this._ownerGroups$ = new BehaviorSubject>([]); this._memberGroups$ = new BehaviorSubject>([]); - this._userSub = this._userService.user$.pipe( - switchMap(user => { - if (!user || user.id === '') { - return of([]); - } - - const params = new HttpParams().set(PaginationParams.PAGE_SIZE, `${(user as any).nextGroups.length}`); - - return this._caseResourceService.searchCases(SimpleFilter.fromCaseQuery({id: (user as any).nextGroups}), params) - .pipe( - map(page => page.content ? page.content : []), - map(groups => groups.filter(group => group.author.fullName !== 'application engine')) - ); - }) - ).subscribe(groups => { - const ownerGroups = groups.filter(g => g.author.email === this._userService.user.email); - this._ownerGroups$.next(ownerGroups); - this._memberGroups$.next(groups); - }); } ngOnDestroy(): void { - this._userSub.unsubscribe(); this._memberGroups$.complete(); this._ownerGroups$.complete(); } diff --git a/projects/netgrif-components-core/src/lib/navigation/navigation-tree/abstract-navigation-tree.component.spec.ts b/projects/netgrif-components-core/src/lib/navigation/navigation-tree/abstract-navigation-tree.component.spec.ts index 1ed4b54e37..b56d68ead2 100644 --- a/projects/netgrif-components-core/src/lib/navigation/navigation-tree/abstract-navigation-tree.component.spec.ts +++ b/projects/netgrif-components-core/src/lib/navigation/navigation-tree/abstract-navigation-tree.component.spec.ts @@ -22,7 +22,6 @@ import {UserResourceService} from '../../resources/engine-endpoint/user-resource import {UserTransformer} from '../../authentication/models/user.transformer'; import {SessionService} from '../../authentication/session/services/session.service'; import {User} from '../../user/models/user'; -import {AnonymousService} from '../../authentication/anonymous/anonymous.service'; import {ActiveGroupService} from '../../groups/services/active-group.service'; import {TaskResourceService} from '../../resources/engine-endpoint/task-resource.service'; import {LanguageService} from '../../translate/language.service'; @@ -396,9 +395,9 @@ class TestUserService extends UserService { userTransform: UserTransformer, log: LoggerService, session: SessionService, - anonymousService: AnonymousService, + // anonymousService: AnonymousService, config: ConfigurationService) { - super(authService, userResource, userTransform, log, session, anonymousService, config); + super(authService, userResource, userTransform, log, session, config); } public setUser(user: User) { diff --git a/projects/netgrif-components-core/src/lib/public/factories/public-factory-resolver.ts b/projects/netgrif-components-core/src/lib/public/factories/public-factory-resolver.ts index f343dd8e0d..a2790c8b9d 100644 --- a/projects/netgrif-components-core/src/lib/public/factories/public-factory-resolver.ts +++ b/projects/netgrif-components-core/src/lib/public/factories/public-factory-resolver.ts @@ -15,7 +15,7 @@ export const publicFactoryResolver = (userService: UserService, sessionService: } else { router.navigate([url], {queryParams: redirectService.queryParams}); } - } else if (authService.isAuthenticated && userService.user.id !== '' && userService.user.email !== 'anonymous@netgrif.com') { + } else if (authService.isAuthenticated && !!userService.user && !userService.user.isAnonymous()) { return privateService; } else { return publicService; diff --git a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-case-resource.service.ts b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-case-resource.service.ts index 508dc2b606..07dad17ee5 100644 --- a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-case-resource.service.ts +++ b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-case-resource.service.ts @@ -16,23 +16,13 @@ export class PublicCaseResourceService extends CaseResourceService { super(provider, configService); } - /** - * Get all case data - * GET - * {{baseUrl}}/api/public/case/:id/data - */ - public getCaseData(caseID: string): Observable { - return this._resourceProvider.get$('public/case/' + caseID + '/data', this.SERVER_URL) - .pipe(map(r => this.changeType(r, undefined))); - } - /** * Create new case * POST * {{baseUrl}}/api/workflow/case */ public createCase(body: object): Observable { - return this._resourceProvider.post$('public/case/', this.SERVER_URL, body) + return this._resourceProvider.post$('workflow/public/case/', this.SERVER_URL, body) .pipe(map(r => this.changeType(r, undefined))); } } diff --git a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-petri-net-resource.service.ts b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-petri-net-resource.service.ts index 9b5f3b2e14..e2a07efe69 100644 --- a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-petri-net-resource.service.ts +++ b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-petri-net-resource.service.ts @@ -27,10 +27,10 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * * **Request Type:** GET * - * **Request URL:** {{baseUrl}}/api/public/petrinet/{id} + * **Request URL:** {{baseUrl}}/api/petrinet/public/{id} */ public getOneById(netId: string, params?: Params): Observable { - return this.provider.get$('public/petrinet/' + netId, this.SERVER_URL, params) + return this.provider.get$('petrinet/public/' + netId, this.SERVER_URL, params) .pipe(map(r => this.changeType(r, undefined))); } @@ -39,10 +39,10 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * * **Request Type:** GET * - * **Request URL:** {{baseUrl}}/api/public/petrinet/{identifier}/{version} + * **Request URL:** {{baseUrl}}/api/petrinet/public/{identifier}/{version} */ public getOne(identifier: string, version: string, params?: Params): Observable { - return this.provider.get$('public/petrinet/' + btoa(identifier) + '/' + version, this.SERVER_URL, params) + return this.provider.get$('petrinet/public/' + btoa(identifier) + '/' + version, this.SERVER_URL, params) .pipe(map(r => this.changeType(r, 'petriNetReferences'))); } @@ -54,7 +54,7 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * **Request URL:** {{baseUrl}}/api/petrinet/search */ public searchPetriNets(body: PetriNetRequestBody, params?: Params): Observable> { - return this._resourceProvider.post$('public/petrinet/search', this.SERVER_URL, body, params) + return this._resourceProvider.post$('petrinet/public/search', this.SERVER_URL, body, params) // .pipe(map(r => this.getResourcePage(r, 'petriNetReferences'))); .pipe(map(r => this.mapToPage(r))); } @@ -67,7 +67,7 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * **Request URL:** {{baseUrl}}/api/petrinet/{id}/roles */ public getPetriNetRoles(netId: string, params?: Params): Observable { - return this._resourceProvider.get$('public/petrinet/' + netId + '/roles', this.SERVER_URL, params) + return this._resourceProvider.get$('petrinet/public/' + netId + '/roles', this.SERVER_URL, params) .pipe(map(r => this.changeType(r, 'processRoles'))); } @@ -79,7 +79,7 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * **Request URL:** {{baseUrl}}/api/petrinet/{id}/transactions */ public getPetriNetTransactions(netId: string, params?: Params): Observable> { - return this._resourceProvider.get$('public/petrinet/' + netId + '/transactions', this.SERVER_URL, params) + return this._resourceProvider.get$('petrinet/public/' + netId + '/transactions', this.SERVER_URL, params) .pipe(map(r => this.changeType(r, 'transactions'))); } @@ -91,7 +91,7 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * **Request URL:** {{baseUrl}}/api/petrinet/data */ public getDataPetriNet(body: object): Observable { // TODO: response - return this._resourceProvider.post$('public/petrinet/data', this.SERVER_URL, body) + return this._resourceProvider.post$('petrinet/public/data', this.SERVER_URL, body) .pipe(map(r => this.changeType(r, undefined))); } @@ -103,7 +103,7 @@ export class PublicPetriNetResourceService extends PetriNetResourceService { * **Request URL:** {{baseUrl}}/api/petrinet/transitions */ public getPetriNetTransitions(netId: string): Observable> { - return this._resourceProvider.get$('public/petrinet/transitions', this.SERVER_URL, new HttpParams().set('ids', netId)) + return this._resourceProvider.get$('petrinet/public/transitions', this.SERVER_URL, new HttpParams().set('ids', netId)) .pipe(map(r => this.changeType(r, 'transitionReferences'))); } } diff --git a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-task-resource.service.ts b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-task-resource.service.ts index 9809009a72..6ba4e37d60 100644 --- a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-task-resource.service.ts +++ b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/public/public-task-resource.service.ts @@ -32,9 +32,9 @@ export class PublicTaskResourceService extends TaskResourceService { * Assign task * GET */ - // {{baseUrl}}/api/public/task/assign/:id + // {{baseUrl}}/api/task/public/assign/:id public assignTask(taskId: string): Observable { - return this._provider.get$('public/task/assign/' + taskId, this.SERVER_URL) + return this._provider.get$('task/public/assign/' + taskId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } @@ -42,9 +42,9 @@ export class PublicTaskResourceService extends TaskResourceService { * Cancel task * GET */ - // {{baseUrl}}/api/public/task/cancel/:id + // {{baseUrl}}/api/task/public/cancel/:id public cancelTask(taskId: string): Observable { - return this._provider.get$('public/task/cancel/' + taskId, this.SERVER_URL) + return this._provider.get$('task/public/cancel/' + taskId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } @@ -52,9 +52,9 @@ export class PublicTaskResourceService extends TaskResourceService { * Finish task * GET */ - // {{baseUrl}}/api/public/task/finish/:id + // {{baseUrl}}/api/task/public/finish/:id public finishTask(taskId: string): Observable { - return this._provider.get$('public/task/finish/' + taskId, this.SERVER_URL) + return this._provider.get$('task/public/finish/' + taskId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } @@ -62,9 +62,18 @@ export class PublicTaskResourceService extends TaskResourceService { * Get tasks of the case * GET */ - // {{baseUrl}}/api/public/task/case/:id + public getAllTasksByCases(caseIds: string[]): Observable> { + return this._resourceProvider.post$('task/public/case', this.SERVER_URL, caseIds) + .pipe(map(r => this.getResourcePage(r, 'tasks'))); + } + + /** + * Get tasks of the case + * GET + */ + // {{baseUrl}}/api/task/public/case/:id public getAllTasksByCase(caseId: string): Observable> { - return this._provider.get$('public/task/case/' + caseId, this.SERVER_URL) + return this._provider.get$('task/public/case/' + caseId, this.SERVER_URL) .pipe(map(r => this.changeType(r, undefined))); } @@ -77,9 +86,9 @@ export class PublicTaskResourceService extends TaskResourceService { * * @returns the raw backend response without any additional processing */ - // {{baseUrl}}/api/public/task/:id/data + // {{baseUrl}}/api/task/public/:id/data public rawGetData(taskId: string): Observable { - return this._provider.get$('public/task/' + taskId + '/data', this.SERVER_URL) + return this._provider.get$('task/public/' + taskId + '/data', this.SERVER_URL) .pipe(map(r => this.changeType(r, 'dataGroups'))); } @@ -87,9 +96,9 @@ export class PublicTaskResourceService extends TaskResourceService { * Set task data * POST */ - // {{baseUrl}}/api/public/task/:id/data + // {{baseUrl}}/api/task/public/:id/data public setData(taskId: string, body: TaskSetDataRequestBody): Observable { - return this._provider.post$('public/task/' + taskId + '/data', this.SERVER_URL, body) + return this._provider.post$('task/public/' + taskId + '/data', this.SERVER_URL, body) .pipe(map(r => this.changeType(r, undefined))); } @@ -101,7 +110,7 @@ export class PublicTaskResourceService extends TaskResourceService { * Attempting to use it will display a warning and remove the attribute from the request. * @param params Additional request parameters */ - // {{baseUrl}}/api/public/task/search + // {{baseUrl}}/api/task/public/search public getTasks(filterParam: Filter, params?: Params): Observable> { if (filterParam.type !== FilterType.TASK) { throw new Error('Provided filter doesn\'t have type TASK'); @@ -112,7 +121,7 @@ export class PublicTaskResourceService extends TaskResourceService { } params = ResourceProvider.combineParams(filterParam.getRequestParams(), params); - return this._provider.post$('public/task/search', this.SERVER_URL, filterParam.getRequestBody(), params) + return this._provider.post$('task/public/search', this.SERVER_URL, filterParam.getRequestBody(), params) .pipe(map(r => this.getResourcePage(r, 'tasks'))); } @@ -121,7 +130,7 @@ export class PublicTaskResourceService extends TaskResourceService { * GET */ public downloadFile(taskId: string, params: HttpParams): Observable { - const url = `public/task/${taskId}/file${params?.has("fileName") ? '/named' : ''}`; + const url = `task/public/${taskId}/file${params?.has("fileName") ? '/named' : ''}`; return this._resourceProvider.getBlob$(url, this.SERVER_URL, params).pipe( map(event => { switch (event.type) { @@ -143,7 +152,7 @@ export class PublicTaskResourceService extends TaskResourceService { */ public uploadFile(taskId: string, body: object, multipleFiles: boolean): Observable { - const url = `public/task/${taskId}/${multipleFiles ? 'files' : 'file'}`; + const url = `task/public/${taskId}/${multipleFiles ? 'files' : 'file'}`; return this._resourceProvider.postWithEvent$(url, this.SERVER_URL, body).pipe( map(event => { switch (event.type) { @@ -164,7 +173,7 @@ export class PublicTaskResourceService extends TaskResourceService { * DELETE */ public deleteFile(taskId: string, body: FileFieldRequest): Observable { - const url = `public/task/${taskId}/file${body.fileName ? '/named' : ''}`; + const url = `task/public/${taskId}/file${body.fileName ? '/named' : ''}`; return this._resourceProvider.delete$(url, this.SERVER_URL, {}, {}, 'json', body).pipe( map(r => this.changeType(r, undefined)) ); @@ -175,7 +184,7 @@ export class PublicTaskResourceService extends TaskResourceService { * GET */ public downloadFilePreview(taskId: string, params: HttpParams): Observable { - const url = `public/task/${taskId}/file_preview`; + const url = `task/public/${taskId}/file_preview`; return this._resourceProvider.getBlob$(url, this.SERVER_URL, params).pipe( map(event => { switch (event.type) { diff --git a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts index 6e55219f34..99aa7e1888 100644 --- a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts +++ b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.spec.ts @@ -153,8 +153,8 @@ describe('TaskResourceService', () => { it('should getAllTasksByCases', (done) => { inject([HttpTestingController], (httpMock: HttpTestingController) => { - service.getAllTasksByCases({}).subscribe(res => { - expect(res.length).toEqual(0); + service.getAllTasksByCases([]).subscribe(res => { + expect(res.content.length).toEqual(0); done(); }); diff --git a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.ts b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.ts index ce3918d8d3..0ca953b97f 100644 --- a/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.ts +++ b/projects/netgrif-components-core/src/lib/resources/engine-endpoint/task-resource.service.ts @@ -141,9 +141,9 @@ export class TaskResourceService extends AbstractResourceService implements Coun * POST */ // {{baseUrl}}/api/task/case - public getAllTasksByCases(body: object): Observable> { // TODO: ?? - return this._resourceProvider.post$('task/case', this.SERVER_URL, body) - .pipe(map(r => this.changeType(r, 'tasks'))); + public getAllTasksByCases(caseIds: string[]): Observable> { + return this._resourceProvider.post$('task/case', this.SERVER_URL, caseIds) + .pipe(map(r => this.getResourcePage(r, 'tasks'))); } /** @@ -312,7 +312,7 @@ export class TaskResourceService extends AbstractResourceService implements Coun */ public deleteFile(taskId: string, body?: FileFieldRequest): Observable { const url = `task/${taskId}/file${body?.fileName ? '/named' : ''}`; - return this._resourceProvider.delete$(url, this.SERVER_URL, {}, {}, 'json', body).pipe( + return this._resourceProvider.delete$(url , this.SERVER_URL, {}, {}, 'json', body).pipe( map(r => this.changeType(r, undefined)) ); } diff --git a/projects/netgrif-components-core/src/lib/task/services/assign-policy.service.ts b/projects/netgrif-components-core/src/lib/task/services/assign-policy.service.ts index 87a9d0444a..47111eabed 100644 --- a/projects/netgrif-components-core/src/lib/task/services/assign-policy.service.ts +++ b/projects/netgrif-components-core/src/lib/task/services/assign-policy.service.ts @@ -55,11 +55,8 @@ export class AssignPolicyService extends TaskHandlingService { if (!this._userService.isCurrentUserEmpty()) { this.performAssign(taskOpened, afterAction); } else { - race([ - this._userService.anonymousUser$, - this._userService.user$ - ]) - .pipe(filter(user => !this._userService.isUserEmpty(user))) + // this._userService.anonymousUser$, + this._userService.user$.pipe(filter(user => !this._userService.isUserEmpty(user))) .pipe(take(1)) .subscribe(user => this.performAssign(taskOpened, afterAction)); } diff --git a/projects/netgrif-components-core/src/lib/user/models/user.ts b/projects/netgrif-components-core/src/lib/user/models/user.ts index 86786fc2ca..bbc6c71fe3 100644 --- a/projects/netgrif-components-core/src/lib/user/models/user.ts +++ b/projects/netgrif-components-core/src/lib/user/models/user.ts @@ -60,4 +60,8 @@ export class User implements IUser { return !!this.impersonated; } + public isAnonymous(): boolean { + return this.authorities.length === 1 && this.authorities[0].includes('ANONYMOUS'); + } + } diff --git a/projects/netgrif-components-core/src/lib/user/services/user-preference.service.ts b/projects/netgrif-components-core/src/lib/user/services/user-preference.service.ts index c2b9f8201e..f05bcd1012 100644 --- a/projects/netgrif-components-core/src/lib/user/services/user-preference.service.ts +++ b/projects/netgrif-components-core/src/lib/user/services/user-preference.service.ts @@ -19,9 +19,7 @@ export class UserPreferenceService implements OnDestroy { protected _preferences: Preferences; protected _preferencesChanged$: Subject; protected _sub: Subscription; - protected _subAnonym: Subscription; public _drawerWidthChanged$: Subject; - protected _anonym: boolean; constructor(protected _userService: UserService, protected _userResourceService: UserResourceService, @@ -31,7 +29,6 @@ export class UserPreferenceService implements OnDestroy { this._preferences = this._emptyPreferences(); this._preferencesChanged$ = new Subject(); this._drawerWidthChanged$ = new Subject(); - this._anonym = false; this._sub = this._userService.user$.subscribe(loggedUser => { if (loggedUser && loggedUser.id !== '') { @@ -47,22 +44,6 @@ export class UserPreferenceService implements OnDestroy { } }); - this._subAnonym = this._userService.anonymousUser$.subscribe(loggedUser => { - if (loggedUser && loggedUser.id !== '') { - this._userResourceService.getPublicPreferences().subscribe(prefs => { - this._preferences = this._emptyPreferences(); - Object.assign(this._preferences, prefs); - this._preferencesChanged$.next(); - this._anonym = true; - } - ); - } else { - this._preferences = this._emptyPreferences(); - this._preferencesChanged$.next(); - this._anonym = false; - } - }); - this._drawerWidthChanged$.asObservable().pipe( debounceTime(DRAWER_DEBOUNCE) ).subscribe(newWidth => { @@ -125,15 +106,9 @@ export class UserPreferenceService implements OnDestroy { } protected _savePreferences(): void { - if (!this._anonym) { - this._userResourceService.setPreferences(this._preferences).subscribe(resultMessage => { - this.resultMessage(resultMessage); - }); - } else { - this._userResourceService.setPublicPreferences(this._preferences).subscribe(resultMessage => { - this.resultMessage(resultMessage); - }); - } + this._userResourceService.setPreferences(this._preferences).subscribe(resultMessage => { + this.resultMessage(resultMessage); + }); } protected resultMessage(resultMessage): void { diff --git a/projects/netgrif-components-core/src/lib/user/services/user.service.ts b/projects/netgrif-components-core/src/lib/user/services/user.service.ts index 2ef8a10529..d808240288 100644 --- a/projects/netgrif-components-core/src/lib/user/services/user.service.ts +++ b/projects/netgrif-components-core/src/lib/user/services/user.service.ts @@ -12,7 +12,6 @@ import {LoggerService} from '../../logger/services/logger.service'; import {HttpErrorResponse} from '@angular/common/http'; import {SessionService} from '../../authentication/session/services/session.service'; import {UserResource} from '../../resources/interface/user-resource'; -import {AnonymousService} from '../../authentication/anonymous/anonymous.service'; @Injectable({ @@ -22,11 +21,8 @@ export class UserService implements OnDestroy { protected _user: User; protected _userChange$: ReplaySubject; - protected _anonymousUserChange$: ReplaySubject; protected _loginCalled: boolean; protected _subAuth: Subscription; - protected _subAnonym: Subscription; - private _publicLoadCalled: boolean; public readonly GLOBAL_ROLE_PREFIX = 'global_'; @@ -35,12 +31,10 @@ export class UserService implements OnDestroy { protected _userTransform: UserTransformer, protected _log: LoggerService, protected _session: SessionService, - protected _anonymousService: AnonymousService, protected _config: ConfigurationService) { this._user = this.emptyUser(); this._loginCalled = false; this._userChange$ = new ReplaySubject(1); - this._anonymousUserChange$ = new ReplaySubject(1); this._config.loaded$ .pipe( filter(loaded => loaded), @@ -56,14 +50,6 @@ export class UserService implements OnDestroy { } }); }); - this._subAnonym = this._anonymousService.tokenSet.subscribe(token => { - if (token) { - this.loadPublicUser(); - } else { - this.clearUser(); - this.publishAnonymousUserChange(); - } - }); }); } @@ -79,15 +65,10 @@ export class UserService implements OnDestroy { return this.anonymousUser; } - get anonymousUser$(): Observable { - return this._anonymousUserChange$.asObservable(); - } ngOnDestroy(): void { this._userChange$.complete(); - this._anonymousUserChange$.complete(); this._subAuth.unsubscribe(); - this._subAnonym.unsubscribe(); } /** @@ -186,7 +167,7 @@ export class UserService implements OnDestroy { } protected emptyUser() { - return new User('', '', '', '', '', '', [], [], [], []); + return new User('', '', '', '', '', '', ['ANONYMOUS'], [], [], []); } protected loadUser(): void { @@ -206,19 +187,6 @@ export class UserService implements OnDestroy { }); } - public loadPublicUser(): void { - this._userResource.getPublicLoggedUser().pipe(take(1)).subscribe((user: UserResource) => { - if (user) { - const backendUser = {...user, id: user.id.toString()}; - this._user = this._userTransform.transform(backendUser); - this.publishAnonymousUserChange(); - } - }, error => { - this._log.error('Loading logged user has failed! Initialisation has not be completed successfully!', error); - this._publicLoadCalled = false; - }); - } - public clearUser() { this._user = this.emptyUser(); } @@ -234,8 +202,4 @@ export class UserService implements OnDestroy { protected publishUserChange(): void { this._userChange$.next(this.user); } - - protected publishAnonymousUserChange(): void { - this._anonymousUserChange$.next(this.user); - } } diff --git a/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.spec.ts b/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.spec.ts index 89198b8369..83732a92aa 100644 --- a/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.spec.ts +++ b/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.spec.ts @@ -89,7 +89,7 @@ describe('TaskViewService', () => { // NAE-968 it('should process second filter change before first filter call returns', fakeAsync(() => { let tasks: Array; - + console.log(service); service.tasks$.subscribe(receivedTasks => { tasks = receivedTasks; }); @@ -173,4 +173,8 @@ class MyResources { getTasks(): Observable> { return this.returnResponse(); } + + public getAllTasksByCases(caseIds: string[]): Observable> { + return this.returnResponse(); + } } diff --git a/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.ts b/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.ts index 77e251da3d..58668ff24e 100644 --- a/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.ts +++ b/projects/netgrif-components-core/src/lib/view/task-view/service/task-view.service.ts @@ -222,7 +222,10 @@ export class TaskViewService extends AbstractSortableViewComponent implements On this._loading$.on(requestContext.filter); let request: Observable>; - if (requestContext.filter.bodyContainsQuery() || this._preferredEndpoint === TaskEndpoint.ELASTIC) { + if (this._userService.user.isAnonymous()) { + const caseIds = Array.isArray(requestContext.filter.getRequestBody()['case']) ? requestContext.filter.getRequestBody()['case'][0].id : [requestContext.filter.getRequestBody()['case']?.id ?? '']; + request = this._taskService.getAllTasksByCases(caseIds).pipe(take(1)); + } else if (requestContext.filter.bodyContainsQuery() || this._preferredEndpoint === TaskEndpoint.ELASTIC) { request = timer(200).pipe( switchMap(() => this._taskService.searchTask(requestContext.filter, params).pipe(take(1))) );