Skip to content

Commit

Permalink
WIP for #344
Browse files Browse the repository at this point in the history
  • Loading branch information
oharsta committed Feb 4, 2025
1 parent 1c0c0d2 commit a45a144
Show file tree
Hide file tree
Showing 8 changed files with 53 additions and 36 deletions.
3 changes: 1 addition & 2 deletions client/src/__tests__/utils/Manage.test.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import {mergeProvidersProvisioningsRoles, reduceApplicationFromUserRoles} from "../../utils/Manage";
import applications from "./applications.json";
import roles from "./roles.json";
import userRoles from "./userRoles.json";

test("mergeProvidersProvisioningsRoles", () => {
const results = mergeProvidersProvisioningsRoles(applications.providers, applications.provisionings, roles);
const results = mergeProvidersProvisioningsRoles(applications.providers, applications.provisionings);
expect(results.length).toEqual(6);
});

Expand Down
4 changes: 4 additions & 0 deletions client/src/__tests__/utils/applications.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
"OrganizationName:en": "SURF bv",
"logo": "https://static.surfconext.nl/media/idp/surfconext.png",
"name:en": "Calendar EN",
"roleCount": 3,
"id": "5",
"_id": "5"
},
Expand All @@ -102,6 +103,7 @@
"OrganizationName:en": "SURF bv",
"logo": "https://static.surfconext.nl/media/idp/surfconext.png",
"name:en": "Cloud EN",
"roleCount": 3,
"id": "6",
"_id": "6"
},
Expand All @@ -113,6 +115,7 @@
"institutionGuid": "ad93daef-0911-e511-80d0-005056956c1a",
"OrganizationName:en": "SURF bv",
"name:en": "Wiki EN",
"roleCount": 3,
"id": "1",
"_id": "1"
},
Expand All @@ -125,6 +128,7 @@
"OrganizationName:en": "SURF bv",
"logo": "https://static.surfconext.nl/media/idp/surfconext.png",
"name:en": "Network EN",
"roleCount": 3,
"id": "2",
"_id": "2"
},
Expand Down
18 changes: 3 additions & 15 deletions client/src/tabs/Applications.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,26 +24,16 @@ const Applications = () => {
navigate("/404");
return;
}
Promise.all([allApplications(), rolesByApplication(true)])
allApplications()
.then(res => {
const mergedApps = mergeProvidersProvisioningsRoles(
res[0].providers, res[0].provisionings, res[1].content);
res.providers, res.provisionings);
setApplications(mergedApps);
setSearching(false);
})
},
[]) // eslint-disable-line react-hooks/exhaustive-deps

const openRole = (e, role) => {
const path = `/roles/${role.id}`
if (e.metaKey || e.ctrlKey) {
window.open(path, '_blank');
} else {
stopEvent(e);
navigate(path);
}
};

const openApplication = (e, application) => {
const path = `/applications/${application.id}`
if (e.metaKey || e.ctrlKey) {
Expand Down Expand Up @@ -77,9 +67,7 @@ const Applications = () => {
{
key: "roles",
header: I18n.t("applications.roles"),
mapper: application => <ul>{application.roles.map((role, index) => <li key={index}>
<a href="/" onClick={e => openRole(e, role)}>{role.name}</a>
</li>)}</ul>
mapper: application => application.roleCount
},
{
key: "provisionings",
Expand Down
11 changes: 8 additions & 3 deletions client/src/tabs/Applications.scss
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,30 @@ div.mod-applications {
}

&.name {
width: 25%;
width: 30%;
}

&.organization {
width: 25%;
}

&.roles {
width: 25%;
width: 15%;
text-align: center;
}

&.provisionings {
width: 20%;
width: 25%;
}
}
}

tbody {
td {
&.roles {
text-align: center;
}

a {
font-weight: normal;
}
Expand Down
18 changes: 3 additions & 15 deletions client/src/utils/Manage.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export const deriveRemoteApplicationAttributes = (application, locale) => {
}
}

export const mergeProvidersProvisioningsRoles = (providers, provisionings, roles, locale = "en") => {
export const mergeProvidersProvisioningsRoles = (providers, provisionings, locale = "en") => {
/**
* We want the following structure for the providers, provisionings and roles:
*
Expand All @@ -84,11 +84,7 @@ export const mergeProvidersProvisioningsRoles = (providers, provisionings, roles
* "type": "oidc10_rp",
* "organization": "SURF bv",
* "url": "https://default-url-calendar.org",
* "roles": [
* "id": 3920,
* "name": "Mail",
* "landingPage": "https://landingpage.com"
* ],
* "roleCount": 5,
* "provisionings": [
* "name": "SCIM Hardewijk"
* "provisioningType": "scim",
Expand All @@ -102,15 +98,7 @@ export const mergeProvidersProvisioningsRoles = (providers, provisionings, roles
type: provider.type,
organization: locale === "en" ? provider["OrganizationName:en"] || provider["OrganizationName:nl"] : provider["OrganizationName:nl"] || provider["OrganizationName:en"],
url: provider.url,
roles: roles
.filter(role => role.applicationUsages.some(appUsage => appUsage.application.manageId === provider.id))
.map(role => ({
id: role.id,
name: role.name,
landingPage: role.applicationUsages.find(appUsage => appUsage.application.manageId === provider.id).landingPage
}))
.sort((r1, r2) => r1.name.localeCompare(r2.name))
,
roleCount: provider.roleCount,
provisionings: provisionings
.filter(prov => prov.applications.some(app => app.id === provider.id))
.map(prov => ({
Expand Down
7 changes: 7 additions & 0 deletions server/src/main/java/access/api/ManageController.java
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,13 @@ public ResponseEntity<Map<String, List<Map<String, Object>>>> applications(@Para
entry.getValue().stream().map(Application::getManageId).collect(Collectors.toList())))
.flatMap(Collection::stream)
.toList();
//Convert to map with key = manage_id and value = role_count
Map<String, Long> applicationsPerManageId = applicationRepository.countByApplications().stream()
.collect(Collectors.toMap(m -> (String) m.get("manage_id"), m -> (Long) m.get("role_count")));
providers.forEach(provider -> {
Long roleCount = applicationsPerManageId.getOrDefault(provider.get("id"), 0L);
provider.put("roleCount", roleCount);
});
List<Map<String, Object>> provisionings = manage.provisioning(applications.stream()
.map(Application::getManageId)
.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,28 @@

import access.manage.EntityType;
import access.model.Application;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;
import java.util.Optional;

@Repository
public interface ApplicationRepository extends JpaRepository<Application, Long> {

Optional<Application> findByManageIdAndManageType(String manageId, EntityType manageType);

List<Application> findByManageIdIn(List<String> manageId);
@Query(value = """
SELECT count(r.id) as role_count, apps.manage_id as manage_id FROM roles r
INNER JOIN application_usages au ON au.role_id = r.id
INNER JOIN applications apps ON apps.id = au.application_id
GROUP BY apps.manage_id
""",
nativeQuery = true)
List<Map<String, Object>> countByApplications();

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import access.model.Application;
import org.junit.jupiter.api.Test;

import java.util.List;
import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;

class ApplicationRepositoryTest extends AbstractTest {
Expand All @@ -14,4 +17,15 @@ void findByManageIdAndManageType() {
Application application = applicationRepository.findByManageIdAndManageType("2", EntityType.SAML20_SP).get();
assertEquals("2", application.getManageId());
}

@Test
void countByApplications() {
List<Map<String, Object>> applications = applicationRepository.countByApplications();
Map<String, Object> application = applications.stream()
.filter(m -> m.get("manage_id").equals("5"))
.findFirst()
.get();
assertEquals(2L, application.get("role_count"));
}

}

0 comments on commit a45a144

Please sign in to comment.