Skip to content
This repository was archived by the owner on Jan 22, 2026. It is now read-only.

Commit a6e4d71

Browse files
committed
Inject EntityService<E> into EntityAuthorizationService
- Adapt project, tool, data catalog authorization service and guard
1 parent cc43fec commit a6e4d71

19 files changed

+176
-99
lines changed
Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import { Injectable } from '@angular/core';
2-
import { Observable } from 'rxjs';
3-
import { filter, mapTo } from 'rxjs/operators';
2+
import { DataCatalog } from 'models/entities/data-catalog.model';
43
import { UserPermissionDataService } from 'components/auth/user-permission-data.service';
54
import { EntityAuthorizationService } from 'components/authorization/entity-authorization.service';
5+
import { DataCatalogService } from './data-catalog.service';
66
import config from '../app.constants';
77

88
@Injectable()
9-
export class DataCatalogAuthorizationService extends EntityAuthorizationService {
9+
export class DataCatalogAuthorizationService extends EntityAuthorizationService<DataCatalog> {
1010
// TODO Find a way to not have to inject the service in the child service, only the parent service.
11-
static parameters = [UserPermissionDataService];
12-
constructor(protected userPermissionDataService: UserPermissionDataService) {
13-
super(userPermissionDataService);
11+
static parameters = [UserPermissionDataService, DataCatalogService];
12+
constructor(
13+
protected userPermissionDataService: UserPermissionDataService,
14+
protected entityService: DataCatalogService
15+
) {
16+
super(userPermissionDataService, entityService);
1417
}
1518

1619
getEntityType(): string {
@@ -20,13 +23,4 @@ export class DataCatalogAuthorizationService extends EntityAuthorizationService
2023
getCreateActionPermissionType(): string {
2124
return config.actionPermissionTypes.CREATE_DATA_CATALOG.value;
2225
}
23-
24-
// TODO Remove when DataCatalog can be made private
25-
/** @override */
26-
canRead(catalogId: string): Observable<boolean> {
27-
return this.userPermissionDataService.permissions().pipe(
28-
filter(auth => !!auth),
29-
mapTo(true)
30-
);
31-
}
3226
}

client/app/data-catalog/data-catalog-guard.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import { Injectable } from '@angular/core';
22
import { Router } from '@angular/router';
33
import { DataCatalogAuthorizationService } from './data-catalog-authorization.service';
44
import { EntityGuard } from 'components/authorization/entity-guard.service';
5+
import { DataCatalog } from 'models/entities/data-catalog.model';
56

67
@Injectable()
7-
export class DataCatalogGuard extends EntityGuard {
8+
export class DataCatalogGuard extends EntityGuard<DataCatalog> {
89
static parameters = [Router, DataCatalogAuthorizationService];
910
constructor(protected router: Router, protected authorizationService: DataCatalogAuthorizationService) {
1011
super(router, authorizationService);

client/app/data-catalog/data-catalog.module.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,7 @@ export const ROUTES: Routes = [
3939
{
4040
path: 'data-catalogs/:id',
4141
component: DataCatalogComponent,
42-
canActivate: [AuthGuard, DataCatalogGuard],
43-
data: { authorization: EntityAuthorizationTypes.READ },
42+
canActivate: [AuthGuard],
4443
},
4544
{
4645
path: 'data-catalogs/:id/discussion',

client/app/data-catalog/data-catalog.service.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import { DataCatalog } from 'models/entities/data-catalog.model';
88
import { Patch } from 'models/patch.model';
99
import { QueryListResponse } from 'models/query-list-response.model';
1010
import { EntityAttachment } from 'models/entities/entity-attachment.model';
11+
import { StringValue } from 'models/string-value.model';
12+
import config from '../app.constants';
1113

1214
@Injectable()
1315
export class DataCatalogService implements EntityService<DataCatalog> {
@@ -38,6 +40,15 @@ export class DataCatalogService implements EntityService<DataCatalog> {
3840
return this.httpClient.delete(`/api/data-catalogs/${dataCatalog._id}`).pipe(map(() => dataCatalog));
3941
}
4042

43+
isPublic(id: string): Observable<boolean> {
44+
// TODO Restore meaningful code when data catalogs fully support ACL
45+
// For now data catalogs are considered public
46+
return of(true);
47+
// return this.httpClient
48+
// .get<StringValue>(`/api/data-catalogs/${id}/visibility`)
49+
// .pipe(map(res => res.value === config.entityVisibility.PUBLIC.value));
50+
}
51+
4152
makePublic(entity: DataCatalog): Observable<DataCatalog> {
4253
throw new Error('Method not implemented.');
4354
}

client/app/project/project-authorization.service.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { Injectable } from '@angular/core';
2+
import { Project } from 'models/entities/project.model';
23
import { UserPermissionDataService } from 'components/auth/user-permission-data.service';
34
import { EntityAuthorizationService } from 'components/authorization/entity-authorization.service';
5+
import { ProjectService } from './project.service';
46
import config from '../app.constants';
57

68
@Injectable()
7-
export class ProjectAuthorizationService extends EntityAuthorizationService {
9+
export class ProjectAuthorizationService extends EntityAuthorizationService<Project> {
810
// TODO Find a way to not have to inject the service in the child service, only the parent service.
9-
static parameters = [UserPermissionDataService];
10-
constructor(protected userPermissionDataService: UserPermissionDataService) {
11-
super(userPermissionDataService);
11+
static parameters = [UserPermissionDataService, ProjectService];
12+
constructor(
13+
protected userPermissionDataService: UserPermissionDataService,
14+
protected entityService: ProjectService
15+
) {
16+
super(userPermissionDataService, entityService);
1217
}
1318

1419
getEntityType(): string {

client/app/project/project-guard.service.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Injectable } from '@angular/core';
22
import { Router } from '@angular/router';
3-
import { ProjectAuthorizationService } from './project-authorization.service';
3+
import { Project } from 'models/entities/project.model';
44
import { EntityGuard } from 'components/authorization/entity-guard.service';
5+
import { ProjectAuthorizationService } from './project-authorization.service';
56

67
@Injectable()
7-
export class ProjectGuard extends EntityGuard {
8+
export class ProjectGuard extends EntityGuard<Project> {
89
static parameters = [Router, ProjectAuthorizationService];
910
constructor(protected router: Router, protected authorizationService: ProjectAuthorizationService) {
1011
super(router, authorizationService);

client/app/project/project.module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ export const ROUTES: Routes = [
6565
{
6666
path: 'projects/:id',
6767
component: ProjectComponent,
68-
canActivate: [AuthGuard/*, ProjectGuard*/],
69-
// data: { authorization: EntityAuthorizationTypes.READ }, // TODO Need to add a step to check whether a project is public
68+
canActivate: [AuthGuard, ProjectGuard],
69+
data: { authorization: EntityAuthorizationTypes.READ },
7070
children: [
7171
{ path: '', redirectTo: 'home', pathMatch: 'full' },
7272
{ path: 'home', component: ProjectHomeComponent },

client/app/project/project.service.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { BooleanValue } from './../../../shared/interfaces/boolean-value.model';
12
import { Injectable } from '@angular/core';
23
import { Observable, of } from 'rxjs';
34
import { debounceTime, distinctUntilChanged, map, switchMap, tap } from 'rxjs/operators';
@@ -10,6 +11,8 @@ import { EntityVisibility, Entity } from 'models/entities/entity.model';
1011
import { EntityService } from 'components/entity/entity.service';
1112
import { QueryListResponse } from 'models/query-list-response.model';
1213
import { EntityAttachment } from 'models/entities/entity-attachment.model';
14+
import { StringValue } from 'models/string-value.model';
15+
import config from '../app.constants';
1316

1417
@Injectable()
1518
export class ProjectService implements EntityService<Project> {
@@ -40,6 +43,12 @@ export class ProjectService implements EntityService<Project> {
4043
return this.httpClient.delete(`/api/projects/${project._id}`).pipe(map(() => project));
4144
}
4245

46+
isPublic(id: string): Observable<boolean> {
47+
return this.httpClient
48+
.get<StringValue>(`/api/projects/${id}/visibility`)
49+
.pipe(map(res => res.value === config.entityVisibility.PUBLIC.value));
50+
}
51+
4352
makePublic(entity: Project): Observable<Project> {
4453
return this.httpClient.patch<Project>(`/api/projects/${entity._id}/visibility/public`, []);
4554
}
Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
import { Injectable } from '@angular/core';
2-
import { Observable } from 'rxjs';
3-
import { filter, mapTo } from 'rxjs/operators';
2+
import { Tool } from 'models/entities/tool.model';
43
import { UserPermissionDataService } from 'components/auth/user-permission-data.service';
54
import { EntityAuthorizationService } from 'components/authorization/entity-authorization.service';
5+
import { ToolService } from './tool.service';
66
import config from '../app.constants';
77

88
@Injectable()
9-
export class ToolAuthorizationService extends EntityAuthorizationService {
9+
export class ToolAuthorizationService extends EntityAuthorizationService<Tool> {
1010
// TODO Find a way to not have to inject the service in the child service, only the parent service.
11-
static parameters = [UserPermissionDataService];
12-
constructor(protected userPermissionDataService: UserPermissionDataService) {
13-
super(userPermissionDataService);
11+
static parameters = [UserPermissionDataService, ToolService];
12+
constructor(protected userPermissionDataService: UserPermissionDataService, protected entityService: ToolService) {
13+
super(userPermissionDataService, entityService);
1414
}
1515

1616
getEntityType(): string {
@@ -20,13 +20,4 @@ export class ToolAuthorizationService extends EntityAuthorizationService {
2020
getCreateActionPermissionType(): string {
2121
return config.actionPermissionTypes.CREATE_TOOL.value;
2222
}
23-
24-
// TODO Remove when Tool can be made private
25-
/** @override */
26-
canRead(toolId: string): Observable<boolean> {
27-
return this.userPermissionDataService.permissions().pipe(
28-
filter(auth => !!auth),
29-
mapTo(true)
30-
);
31-
}
3223
}

client/app/tool/tool-guard.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import { Injectable } from '@angular/core';
22
import { Router } from '@angular/router';
33
import { ToolAuthorizationService } from './tool-authorization.service';
44
import { EntityGuard } from 'components/authorization/entity-guard.service';
5+
import { Tool } from 'models/entities/tool.model';
56

67
@Injectable()
7-
export class ToolGuard extends EntityGuard {
8+
export class ToolGuard extends EntityGuard<Tool> {
89
static parameters = [Router, ToolAuthorizationService];
910
constructor(protected router: Router, protected authorizationService: ToolAuthorizationService) {
1011
super(router, authorizationService);

0 commit comments

Comments
 (0)