diff --git a/smp-angular/src/app/edit/edit-group/edit-group.component.html b/smp-angular/src/app/edit/edit-group/edit-group.component.html index 6d312986d90e6d3b8be5ccfab8a77c9a29e219d7..7437b134c52e1cce7fe8605f423ae59a544c83f7 100644 --- a/smp-angular/src/app/edit/edit-group/edit-group.component.html +++ b/smp-angular/src/app/edit/edit-group/edit-group.component.html @@ -16,7 +16,7 @@ </mat-tab> <mat-tab> <ng-template mat-tab-label><smp-label icon="article" label="Resources"></smp-label></ng-template> - <group-resource-panel + <group-resource-panel #groupResourcePanel [domainResourceDefs]="_selectedDomainResourceDef" [domain]="selectedDomain" [group]="selectedGroup" @@ -47,7 +47,7 @@ <mat-select placeholder="Select group" matTooltip="Select group." id="group_id" - [value]="selectedGroup" + [(value)]="selectedGroup" required> <mat-option *ngFor="let group of groupList" [value]="group">{{group.groupName}}</mat-option> diff --git a/smp-angular/src/app/edit/edit-group/edit-group.component.ts b/smp-angular/src/app/edit/edit-group/edit-group.component.ts index adde53c8a6017339228de883ddd11aa668e29081..4f645f5bda18f00bf82fe2440efe773276205dc5 100644 --- a/smp-angular/src/app/edit/edit-group/edit-group.component.ts +++ b/smp-angular/src/app/edit/edit-group/edit-group.component.ts @@ -1,4 +1,4 @@ -import {AfterViewInit, Component, Input, ViewChild} from '@angular/core'; +import {AfterViewInit, Component, EventEmitter, Input, Output, ViewChild} from '@angular/core'; import {BeforeLeaveGuard} from "../../window/sidenav/navigation-on-leave-guard"; import {MatPaginator} from "@angular/material/paginator"; import {AlertMessageService} from "../../common/alert-message/alert-message.service"; @@ -8,6 +8,8 @@ import {EditGroupService} from "./edit-group.service"; import {GroupRo} from "../../common/model/group-ro.model"; import {MemberTypeEnum} from "../../common/enums/member-type.enum"; import {ResourceDefinitionRo} from "../../system-settings/admin-extension/resource-definition-ro.model"; +import {GroupResourcePanelComponent} from "./group-resource-panel/group-resource-panel.component"; +import {MembershipPanelComponent} from "../../common/panels/membership-panel/membership-panel.component"; @Component({ @@ -16,6 +18,10 @@ import {ResourceDefinitionRo} from "../../system-settings/admin-extension/resour styleUrls: ['./edit-group.component.css'] }) export class EditGroupComponent implements AfterViewInit, BeforeLeaveGuard { + + @Output() onSelectedGroup: EventEmitter<GroupRo> = new EventEmitter<GroupRo>(); + + groupMembershipType: MemberTypeEnum = MemberTypeEnum.GROUP; domainList: DomainRo[] = []; groupList: GroupRo[] = []; diff --git a/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts b/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts index 3b7d1b88376d32520f040495806cdd23a4fbe777..60e31262f708e6583aba6a64a2c6ee8db45e5abd 100644 --- a/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts +++ b/smp-angular/src/app/edit/edit-group/group-resource-panel/group-resource-panel.component.ts @@ -22,6 +22,8 @@ import {VisibilityEnum} from "../../../common/enums/visibility.enum"; }) export class GroupResourcePanelComponent implements BeforeLeaveGuard { + + title: string = "Group resources"; private _group: GroupRo; @Input() resource: ResourceRo; @@ -47,7 +49,7 @@ export class GroupResourcePanelComponent implements BeforeLeaveGuard { } this._group = value; this.title = "Group resources" + (!!this._group?": [" +this._group.groupName+"]":"") - if (!!value) { + if (!!this._group) { this.loadGroupResources(); } else { this.isLoadingResults = false; @@ -122,7 +124,7 @@ export class GroupResourcePanelComponent implements BeforeLeaveGuard { group: this._group, domain: this.domain, domainResourceDefs: this.domainResourceDefs, - formTitle: "Group details dialog" + formTitle: "Resource details dialog" } }).afterClosed().subscribe(value => { this.refresh(); diff --git a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html index 75e7b4a7e8d8d69db2d9ca6b1fc5c3fbdd5426bd..6acdab838e64ce39a44230bc1b039b90a0155ee2 100644 --- a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html +++ b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html @@ -24,7 +24,7 @@ </mat-form-field> <mat-form-field style="width: 100%"> - <mat-label>Group description</mat-label> + <mat-label>Resource scheme</mat-label> <input id="identifierScheme_id" type="text" matInput formControlName="identifierScheme" > @@ -32,7 +32,7 @@ <mat-form-field style="width:100%"> - <mat-label>Group visibility</mat-label> + <mat-label>Resource visibility</mat-label> <mat-select placeholder="Resource visibility" formControlName="visibility" matTooltip="Resource visibility." diff --git a/smp-angular/src/app/edit/edit-resources/edit-resource.component.html b/smp-angular/src/app/edit/edit-resources/edit-resource.component.html index ea6047654c858afa01d54cfafe77872541e3f69c..532a7898ce8cbd4bd590c3a5b83f629c1d4cac11 100644 --- a/smp-angular/src/app/edit/edit-resources/edit-resource.component.html +++ b/smp-angular/src/app/edit/edit-resources/edit-resource.component.html @@ -50,7 +50,7 @@ <mat-select placeholder="Select domain" matTooltip="Select domain." id="domain_id" - [value]="selectedDomain" + [(value)]="selectedDomain" required> <mat-option *ngFor="let domain of domainList" [value]="domain" @@ -66,7 +66,7 @@ <mat-select placeholder="Select group" matTooltip="Select group." id="group_id" - [value]="selectedGroup" + [(value)]="selectedGroup" required> <mat-option *ngFor="let group of groupList" [value]="group">{{group.groupName}}</mat-option> diff --git a/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts b/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts index 620b490673685561d565c5c99e31b1b8ac2a676b..9d7f5fc6adadb440b44b68d3fddeb0b09a2e2925 100644 --- a/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts +++ b/smp-angular/src/app/edit/edit-resources/edit-resource.component.ts @@ -113,7 +113,7 @@ export class EditResourceComponent implements AfterViewInit, BeforeLeaveGuard { } refreshResources() { - if (!this.selectedGroup) { + if (!this._selectedGroup) { this.updateResourceList([]); return; } @@ -127,8 +127,6 @@ export class EditResourceComponent implements AfterViewInit, BeforeLeaveGuard { }, (error: any) => { this.alertService.error(error.error?.errorDescription) }); - - } refreshDomainsResourceDefinitions() { diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBDomain.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBDomain.java index fb791616ff095fb7aa8948ff90d06f1599c2b302..43ea855ca694339b32eeb2869b4199545009c4dc 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBDomain.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/model/DBDomain.java @@ -42,30 +42,30 @@ import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*; query = "update SMP_DOMAIN set SIGNATURE_KEY_ALIAS=:alias " + "WHERE SML_CLIENT_KEY_ALIAS IS null") -@NamedQuery(name = QUERY_DOMAIN_BY_USER_ROLES_COUNT, query = "SELECT count(c) FROM DBDomain c JOIN DBDomainMember dm ON c.id = dm.domain.id " + +@NamedQuery(name = QUERY_DOMAIN_BY_USER_ROLES_COUNT, query = "SELECT count( distinct c) FROM DBDomain c JOIN DBDomainMember dm ON c.id = dm.domain.id " + " WHERE dm.role in (:membership_roles) and dm.user.id= :user_id") -@NamedQuery(name = QUERY_DOMAIN_BY_USER_ROLES, query = "SELECT c FROM DBDomain c JOIN DBDomainMember dm ON c.id = dm.domain.id " + +@NamedQuery(name = QUERY_DOMAIN_BY_USER_ROLES, query = "SELECT distinct c FROM DBDomain c JOIN DBDomainMember dm ON c.id = dm.domain.id " + " WHERE dm.role in (:membership_roles) and dm.user.id= :user_id") -@NamedQuery(name = QUERY_DOMAIN_BY_USER_GROUP_ROLES_COUNT, query = "SELECT count(d) FROM DBDomain d " + +@NamedQuery(name = QUERY_DOMAIN_BY_USER_GROUP_ROLES_COUNT, query = "SELECT count( distinct d) FROM DBDomain d " + " JOIN DBGroup g ON d.id = g.domain.id " + " JOIN DBGroupMember gm ON g.id = gm.group.id " + " WHERE gm.role in (:membership_roles) and gm.user.id= :user_id") -@NamedQuery(name = QUERY_DOMAIN_BY_USER_GROUP_ROLES, query = "SELECT d FROM DBDomain d " + +@NamedQuery(name = QUERY_DOMAIN_BY_USER_GROUP_ROLES, query = "SELECT distinct d FROM DBDomain d " + " JOIN DBGroup g ON d.id = g.domain.id " + " JOIN DBGroupMember gm ON g.id = gm.group.id " + " WHERE gm.role in (:membership_roles) and gm.user.id= :user_id") -@NamedQuery(name = QUERY_DOMAIN_BY_USER_RESOURCE_ROLES_COUNT, query = "SELECT count(d) FROM DBDomain d " + +@NamedQuery(name = QUERY_DOMAIN_BY_USER_RESOURCE_ROLES_COUNT, query = "SELECT count(distinct d) FROM DBDomain d " + " JOIN DBGroup g ON d.id = g.domain.id " + " JOIN DBResource r ON g.id = r.group.id " + " JOIN DBResourceMember rm ON r.id = rm.resource.id " + " WHERE rm.role in (:membership_roles) and rm.user.id= :user_id") -@NamedQuery(name = QUERY_DOMAIN_BY_USER_RESOURCE_ROLES, query = "SELECT d FROM DBDomain d " + +@NamedQuery(name = QUERY_DOMAIN_BY_USER_RESOURCE_ROLES, query = "SELECT distinct d FROM DBDomain d " + " JOIN DBGroup g ON d.id = g.domain.id " + " JOIN DBResource r ON g.id = r.group.id " + " JOIN DBResourceMember rm ON r.id = rm.resource.id " + diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIGroupPublicService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIGroupPublicService.java index 53c37efd16691d7a324a905613e7e2cb5f69ad91..cd9168f4c3b0725e4263f49d1e5f7016d6f80150 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIGroupPublicService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIGroupPublicService.java @@ -5,9 +5,11 @@ import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; import eu.europa.ec.edelivery.smp.data.model.DBDomain; import eu.europa.ec.edelivery.smp.data.model.DBGroup; import eu.europa.ec.edelivery.smp.data.model.user.DBGroupMember; +import eu.europa.ec.edelivery.smp.data.model.user.DBResourceMember; import eu.europa.ec.edelivery.smp.data.model.user.DBUser; import eu.europa.ec.edelivery.smp.data.ui.GroupRO; import eu.europa.ec.edelivery.smp.data.ui.MemberRO; +import eu.europa.ec.edelivery.smp.data.ui.ResourceRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; @@ -101,7 +103,7 @@ public class UIGroupPublicService extends UIServiceBase<DBGroup, GroupRO> { } @Transactional - public GroupRO createGroupForDomain(Long domainId, GroupRO groupRO) { + public GroupRO createGroupForDomain(GroupRO groupRO, Long domainId, Long userId) { LOG.info("create group [{}] to domain [{}]", groupRO, domainId); Optional<DBGroup> optGroup = groupDao.getGroupByNameAndDomain(groupRO.getGroupName(), domainId); @@ -118,6 +120,13 @@ public class UIGroupPublicService extends UIServiceBase<DBGroup, GroupRO> { // to get ID for conversion groupDao.persistFlushDetach(group); + // create first member as admin user + DBUser user = userDao.find(userId); + DBGroupMember dbMember = new DBGroupMember(); + dbMember.setRole(MembershipRoleType.ADMIN); + dbMember.setGroup(group); + dbMember.setUser(user); + groupMemberDao.persist(dbMember); return conversionService.convert(group, GroupRO.class); } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditController.java index 94d03743f4b3b7d025c420ec18d473bd3c173e9a..6b9bba221d1ab4a9471d8f989e91c6bb4cc3778c 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditController.java @@ -90,7 +90,8 @@ public class GroupEditController { @RequestBody GroupRO group) { logAdminAccess("putGroupForDomain"); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - return uiGroupPublicService.createGroupForDomain(domainId, group); + Long userId = SessionSecurityUtils.decryptEntityId(userEncId); + return uiGroupPublicService.createGroupForDomain(group, domainId, userId); } @PostMapping(path = SUB_CONTEXT_PATH_EDIT_GROUP_UPDATE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE) diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditController.java index 8e2e346e9d41d9f2991b76bc117368b0a09f3c30..581305b6d3368fc63208f4b5f94d9b470a5e6c7a 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditController.java @@ -51,7 +51,7 @@ public class ResourceEditController { */ @GetMapping(produces = MimeTypeUtils.APPLICATION_JSON_VALUE) @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) " + - "and @smpAuthorizationService.isAnyGroupResourceAdministrator(#groupEncId)") + "and (@smpAuthorizationService.isGroupAdministrator(#groupEncId) or @smpAuthorizationService.isAnyGroupResourceAdministrator(#groupEncId))") public ServiceResult<ResourceRO> getResourcesForGroup(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId,