Skip to content

Commit b26ccb0

Browse files
thquadrichard-cox
authored andcommitted
Admin and users can create endpoint with same url (#4876)
Signed-off-by: Thomas Quandt <[email protected]>
1 parent 9b3fd3e commit b26ccb0

File tree

6 files changed

+62
-43
lines changed

6 files changed

+62
-43
lines changed

src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
<h1 class="create-endpoint__section-title">{{endpoint.definition.label}} Information</h1>
33
<mat-form-field>
44
<input matInput id="name" name="name" formControlName="nameField" placeholder="Name"
5-
[appUnique]="registerForm.value.overwriteEndpointsField ? (existingAdminEndpoints | async)?.names : (existingEndpoints | async)?.names">
5+
[appUnique]="(customEndpoints | async)?.names">
66
<mat-error *ngIf="registerForm.controls.nameField.errors?.required">Name is required</mat-error>
77
<mat-error *ngIf="registerForm.controls.nameField.errors?.appUnique">Name is not unique</mat-error>
88
</mat-form-field>
99
<mat-form-field novalidate>
1010
<input matInput id="url" name="url" formControlName="urlField" type="url" required placeholder="Endpoint Address"
1111
pattern="{{urlValidation}}"
12-
[appUnique]="registerForm.value.overwriteEndpointsField ? (existingAdminEndpoints | async)?.urls : (existingEndpoints | async)?.urls">
12+
[appUnique]="(customEndpoints | async)?.urls">
1313
<mat-error *ngIf="registerForm.controls.urlField.errors?.required">URL is required</mat-error>
1414
<mat-error *ngIf="registerForm.controls.urlField.errors?.pattern">Invalid API URL</mat-error>
1515
<mat-error *ngIf="registerForm.controls.urlField.errors?.appUnique">URL is not unique</mat-error>
1616
</mat-form-field>
17-
<mat-checkbox matInput *appUserPermission="overwritePermission | async" name="overwriteEndpoints"
17+
<mat-checkbox matInput *ngIf="userEndpointsAndIsAdmin | async" name="overwriteEndpoints"
1818
formControlName="overwriteEndpointsField" (change)="toggleOverwriteEndpoints()"
1919
[ngClass]="{'hide': fixedUrl, 'show': !fixedUrl}">Automatically overwrite user endpoints
2020
</mat-checkbox>

src/frontend/packages/core/src/features/endpoints/create-endpoint/create-endpoint-cf-step-1/create-endpoint-cf-step-1.component.ts

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@ import { ActivatedRoute } from '@angular/router';
44
import { Observable } from 'rxjs';
55
import { filter, map, pairwise } from 'rxjs/operators';
66

7-
import { getFullEndpointApiUrl } from '../../../../../../store/src/endpoint-utils';
87
import { entityCatalog } from '../../../../../../store/src/entity-catalog/entity-catalog';
98
import {
109
StratosCatalogEndpointEntity,
1110
} from '../../../../../../store/src/entity-catalog/entity-catalog-entity/entity-catalog-entity';
1211
import { ActionState } from '../../../../../../store/src/reducers/api-request-reducer/types';
1312
import { stratosEntityCatalog } from '../../../../../../store/src/stratos-entity-catalog';
14-
import { StratosCurrentUserPermissions } from '../../../../core/permissions/stratos-user-permissions.checker';
1513
import { getIdFromRoute } from '../../../../core/utils.service';
1614
import { IStepperStep, StepOnNextFunction } from '../../../../shared/components/stepper/step/step.component';
1715
import { SessionService } from '../../../../shared/services/session.service';
16+
import { CurrentUserPermissionsService } from '../../../../core/permissions/current-user-permissions.service';
1817
import { SnackBarService } from '../../../../shared/services/snackbar.service';
1918
import { ConnectEndpointConfig } from '../../connect.service';
2019
import { getSSOClientRedirectURI } from '../../endpoint-helpers';
@@ -63,9 +62,10 @@ export class CreateEndpointCfStep1Component extends CreateEndpointHelperComponen
6362
private fb: FormBuilder,
6463
activatedRoute: ActivatedRoute,
6564
private snackBarService: SnackBarService,
66-
sessionService: SessionService
65+
sessionService: SessionService,
66+
currentUserPermissionsService: CurrentUserPermissionsService
6767
) {
68-
super(sessionService);
68+
super(sessionService, currentUserPermissionsService);
6969

7070
this.registerForm = this.fb.group({
7171
nameField: ['', [Validators.required]],
@@ -78,24 +78,6 @@ export class CreateEndpointCfStep1Component extends CreateEndpointHelperComponen
7878
overwriteEndpointsField: [false, []],
7979
});
8080

81-
const currentPage$ = stratosEntityCatalog.endpoint.store.getAll.getPaginationMonitor().currentPage$;
82-
this.existingAdminEndpoints = currentPage$.pipe(
83-
map(endpoints => ({
84-
names: endpoints.filter(ep => ep.creator.admin).map(ep => ep.name),
85-
urls: endpoints.filter(ep => ep.creator.admin).map(ep => getFullEndpointApiUrl(ep)),
86-
}))
87-
);
88-
this.existingEndpoints = currentPage$.pipe(
89-
map(endpoints => ({
90-
names: endpoints.map(ep => ep.name),
91-
urls: endpoints.map(ep => getFullEndpointApiUrl(ep)),
92-
}))
93-
);
94-
95-
this.overwritePermission = this.sessionService.userEndpointsNotDisabled().pipe(
96-
map(enabled => enabled ? [StratosCurrentUserPermissions.EDIT_ADMIN_ENDPOINT] : [])
97-
);
98-
9981
const epType = getIdFromRoute(activatedRoute, 'type');
10082
const epSubType = getIdFromRoute(activatedRoute, 'subtype');
10183
this.endpoint = entityCatalog.getEndpoint(epType, epSubType);
Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import { Observable } from 'rxjs';
1+
import { Observable, combineLatest } from 'rxjs';
22
import { map } from 'rxjs/operators';
33

44
import { getFullEndpointApiUrl } from '../../../../../store/src/endpoint-utils';
55
import { stratosEntityCatalog } from '../../../../../store/src/stratos-entity-catalog';
6+
import { CurrentUserPermissionsService } from '../../../core/permissions/current-user-permissions.service';
67
import { StratosCurrentUserPermissions } from '../../../core/permissions/stratos-user-permissions.checker';
78
import { SessionService } from '../../../shared/services/session.service';
89

@@ -13,29 +14,61 @@ type EndpointObservable = Observable<{
1314

1415
export class CreateEndpointHelperComponent {
1516

16-
overwritePermission: Observable<StratosCurrentUserPermissions[]>;
17-
existingEndpoints: EndpointObservable;
18-
existingAdminEndpoints: EndpointObservable;
17+
userEndpointsAndIsAdmin: Observable<boolean>;
18+
customEndpoints: EndpointObservable;
1919

2020
constructor(
21-
public sessionService: SessionService
21+
public sessionService: SessionService,
22+
public currentUserPermissionsService: CurrentUserPermissionsService
2223
) {
2324
const currentPage$ = stratosEntityCatalog.endpoint.store.getAll.getPaginationMonitor().currentPage$;
24-
this.existingAdminEndpoints = currentPage$.pipe(
25+
const existingAdminEndpoints = currentPage$.pipe(
2526
map(endpoints => ({
2627
names: endpoints.filter(ep => ep.creator.admin).map(ep => ep.name),
2728
urls: endpoints.filter(ep => ep.creator.admin).map(ep => getFullEndpointApiUrl(ep)),
2829
}))
2930
);
30-
this.existingEndpoints = currentPage$.pipe(
31+
const existingUserEndpoints = currentPage$.pipe(
32+
map(endpoints => ({
33+
names: endpoints.filter(ep => !ep.creator.admin).map(ep => ep.name),
34+
urls: endpoints.filter(ep => !ep.creator.admin).map(ep => getFullEndpointApiUrl(ep)),
35+
}))
36+
);
37+
const existingEndpoints = currentPage$.pipe(
3138
map(endpoints => ({
3239
names: endpoints.map(ep => ep.name),
3340
urls: endpoints.map(ep => getFullEndpointApiUrl(ep)),
3441
}))
3542
);
3643

37-
this.overwritePermission = this.sessionService.userEndpointsNotDisabled().pipe(
38-
map(enabled => enabled ? [StratosCurrentUserPermissions.EDIT_ADMIN_ENDPOINT] : [])
44+
const isAdmin = this.currentUserPermissionsService.can(StratosCurrentUserPermissions.EDIT_ADMIN_ENDPOINT);
45+
const userEndpointsNotDisabled = this.sessionService.userEndpointsNotDisabled();
46+
47+
this.userEndpointsAndIsAdmin = combineLatest([
48+
isAdmin,
49+
userEndpointsNotDisabled
50+
]).pipe(
51+
map(([admin, userEndpoints]) => admin && userEndpoints)
3952
);
53+
54+
this.customEndpoints = combineLatest([
55+
userEndpointsNotDisabled,
56+
isAdmin,
57+
existingEndpoints,
58+
existingAdminEndpoints,
59+
existingUserEndpoints
60+
]).pipe(
61+
map(([userEndpointsEnabled, admin, endpoints, adminEndpoints, userEndpoints]) => {
62+
if (userEndpointsEnabled){
63+
if (admin){
64+
return adminEndpoints;
65+
}else{
66+
return userEndpoints;
67+
}
68+
}
69+
return endpoints;
70+
})
71+
);
72+
4073
}
4174
}

src/frontend/packages/git/src/shared/components/git-registration/git-registration.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ <h3>Select the type of {{gitTypes[epSubType].label}} to register</h3>
1919
<div *ngIf="showEndpointFields" class="select-step__endpoint-form">
2020
<mat-form-field>
2121
<input matInput id="name" name="name" formControlName="nameField" placeholder="Name"
22-
[appUnique]="registerForm.value.overwriteEndpointsField ? (existingAdminEndpoints | async)?.names : (existingEndpoints | async)?.names">
22+
[appUnique]="(customEndpoints | async)?.names">
2323
<mat-error *ngIf="registerForm.controls.nameField.errors?.required">Name is required</mat-error>
2424
<mat-error *ngIf="registerForm.controls.nameField.errors?.appUnique">Name is not unique</mat-error>
2525
</mat-form-field>
2626
<mat-form-field novalidate>
2727
<input matInput id="url" name="url" formControlName="urlField" type="url" required
2828
placeholder="Endpoint Address" pattern="{{urlValidation}}"
29-
[appUnique]="registerForm.value.overwriteEndpointsField ? (existingAdminEndpoints | async)?.urls : (existingEndpoints | async)?.urls">
29+
[appUnique]="(customEndpoints | async)?.urls">
3030
<mat-error *ngIf="registerForm.controls.urlField.errors?.required">URL is required</mat-error>
3131
<mat-error *ngIf="registerForm.controls.urlField.errors?.pattern">Invalid API URL</mat-error>
3232
<mat-error *ngIf="registerForm.controls.urlField.errors?.appUnique">URL is not unique</mat-error>
3333
</mat-form-field>
34-
<mat-checkbox matInput *appUserPermission="overwritePermission | async" name="overwriteEndpoints"
34+
<mat-checkbox matInput *ngIf="userEndpointsAndIsAdmin | async" name="overwriteEndpoints"
3535
formControlName="overwriteEndpointsField" (change)="toggleOverwriteEndpoints()"
3636
[ngClass]="{'hide': fixedUrl, 'show': !fixedUrl}">Automatically overwrite user endpoints
3737
</mat-checkbox>

src/frontend/packages/git/src/shared/components/git-registration/git-registration.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { getIdFromRoute } from '../../../../../core/src/core/utils.service';
1212
import { ConnectEndpointConfig } from '../../../../../core/src/features/endpoints/connect.service';
1313
import { StepOnNextFunction } from '../../../../../core/src/shared/components/stepper/step/step.component';
1414
import { SessionService } from '../../../../../core/src/shared/services/session.service';
15+
import { CurrentUserPermissionsService } from '../../../../../core/src/core/permissions/current-user-permissions.service';
1516
import { SnackBarService } from '../../../../../core/src/shared/services/snackbar.service';
1617
import { getFullEndpointApiUrl } from '../../../../../store/src/endpoint-utils';
1718
import { entityCatalog } from '../../../../../store/src/public-api';
@@ -76,8 +77,9 @@ export class GitRegistrationComponent extends CreateEndpointHelperComponent impl
7677
private snackBarService: SnackBarService,
7778
private endpointsService: EndpointsService,
7879
public sessionService: SessionService,
80+
public currentUserPermissionsService: CurrentUserPermissionsService
7981
) {
80-
super(sessionService);
82+
super(sessionService, currentUserPermissionsService);
8183
this.epSubType = getIdFromRoute(activatedRoute, 'subtype');
8284
const githubLabel = entityCatalog.getEndpoint(GIT_ENDPOINT_TYPE, GIT_ENDPOINT_SUB_TYPES.GITHUB).definition.label || 'Github';
8385
const gitlabLabel = entityCatalog.getEndpoint(GIT_ENDPOINT_TYPE, GIT_ENDPOINT_SUB_TYPES.GITLAB).definition.label || 'Gitlab';

src/jetstream/cnsi.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,18 +149,18 @@ func (p *portalProxy) DoRegisterEndpoint(cnsiName string, apiEndpoint string, sk
149149
}
150150
// check if we've already got this APIEndpoint in this DB
151151
for _, duplicate := range duplicateEndpoints {
152-
// cant create same admin endpoint
153-
if len(duplicate.Creator) == 0 {
152+
// cant create same system endpoint
153+
if len(duplicate.Creator) == 0 && isAdmin {
154154
return interfaces.CNSIRecord{}, interfaces.NewHTTPShadowError(
155155
http.StatusBadRequest,
156-
"Can not register same admin endpoint multiple times",
157-
"Can not register same admin endpoint multiple times",
156+
"Can not register same system endpoint multiple times",
157+
"Can not register same system endpoint multiple times",
158158
)
159159
}
160160

161161
// cant create same user endpoint
162162
// can create same user endpoint if overwriteEndpoint true
163-
if duplicate.Creator == userId || isAdmin && !overwriteEndpoints {
163+
if duplicate.Creator == userId {
164164
return interfaces.CNSIRecord{}, interfaces.NewHTTPShadowError(
165165
http.StatusBadRequest,
166166
"Can not register same endpoint multiple times",
@@ -169,6 +169,7 @@ func (p *portalProxy) DoRegisterEndpoint(cnsiName string, apiEndpoint string, sk
169169
}
170170
}
171171

172+
/*
172173
if isAdmin && overwriteEndpoints {
173174
for _, duplicate := range duplicateEndpoints {
174175
log.Infof("An administrator is registering an endpoint with the same API URL ('%+v') as an endpoint administrator's. The existing duplicate endpoint ('%+v') will be removed", apiEndpoint, duplicate.GUID)
@@ -182,6 +183,7 @@ func (p *portalProxy) DoRegisterEndpoint(cnsiName string, apiEndpoint string, sk
182183
}
183184
}
184185
}
186+
*/
185187

186188
}
187189

0 commit comments

Comments
 (0)