@finos/legend-application-marketplace
Version:
Legend Marketplace application core
315 lines • 11.9 kB
JavaScript
/**
* Copyright (c) 2020-present, Goldman Sachs
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { V1_AccessPointGroupReference, V1_AdhocTeam, V1_AppDirOrganizationalScope, V1_ContractState, V1_UnknownOrganizationalScopeType, V1_UserApprovalStatus, } from '@finos/legend-graph';
import { prettyCONSTName, } from '@finos/legend-shared';
export var GridTiemStatus;
(function (GridTiemStatus) {
GridTiemStatus["SUCCESS"] = "success";
GridTiemStatus["ERROR"] = "error";
GridTiemStatus["INFO"] = "info";
})(GridTiemStatus || (GridTiemStatus = {}));
const inValidContractState = [
V1_ContractState.DRAFT,
V1_ContractState.REJECTED,
V1_ContractState.CLOSED,
];
const idxLabel = (idx) => {
return ` (${idx + 1})`;
};
export const convertMutilGridItemDetail = (details) => {
if (details.length > 1) {
details.forEach((gridItems, idx) => {
gridItems.forEach((item) => {
item.name = `${item.name}${idxLabel(idx)}`;
});
});
}
return details.flat();
};
export const dataContractContainsDataProduct = (dataProduct, dataProdcutDeploymentID, dataContract) => {
if (inValidContractState.includes(dataContract.state)) {
return false;
}
const contractResource = dataContract.resource;
if (contractResource instanceof V1_AccessPointGroupReference &&
dataProdcutDeploymentID) {
const sameDID = Number(dataProdcutDeploymentID) ===
contractResource.dataProduct.owner.appDirId;
// revisit name
const isName = contractResource.dataProduct.name === dataProduct.name;
const hasGroup = dataProduct.accessPointGroups
.map((e) => e.id)
.includes(contractResource.accessPointGroup);
return sameDID && isName && hasGroup;
}
return false;
};
// Assume contract already part of data product
export const dataContractContainsAccessGroup = (group, dataContract) => {
const contractResource = dataContract.resource;
if (contractResource instanceof V1_AccessPointGroupReference) {
return contractResource.accessPointGroup === group.id;
}
return false;
};
export const isMemberOfContract = (user, contract) => {
const consumer = contract.consumer;
if (consumer instanceof V1_AdhocTeam) {
return consumer.users.some((e) => e.name === user);
}
return false;
};
export const isContractCompleted = (contract) => {
return contract.state === V1_ContractState.COMPLETED;
};
export const isContractInTerminalState = (contract) => {
return [
V1_ContractState.CLOSED,
V1_ContractState.COMPLETED,
V1_ContractState.REJECTED,
].includes(contract.state);
};
const CONTRACT_GRID_NAME = Object.freeze({
CONTRACT_ID: 'Contract ID',
CONTRACT_DESCRIPTION: 'Contract Description',
CONTRACT_VERSION: 'Contract Version',
CONTRACT_STATE: 'Contract State',
CONTRACT_DATA_PRODUCT_ID: 'Contract Data Product ID',
CONTRACT_DATA_PRODUCT: 'Contract Data Product',
CONTRACT_DATA_PRODUCT_DID: 'Contract Data Product DID',
CONTRACT_ACCESS_GROUP: 'Contract Access Group',
CONTRACT_ACCESS_POINTS: 'Contract Access Points',
CONTRACT_CONSUMER_NAME: 'Contract Consumer Name',
CONTRACT_CONSUMER_LEVEL: 'Contract Consumer Level',
CONTRACT_MEMBER_ID: 'Contract Member ID',
CONTRACT_MEMBER_TYPE: 'Contract Member Type',
CONTRACT_MEMBER_STATUS: 'Contract Member Status',
CONTRACT_MEMBER_NAME: 'Contract Member Name',
CONTRACT_APP_DID: 'Contract App DID',
CONTRACT_APP_LEVEL: 'Contract App Level',
});
export const buildDataContractDetail = (dataContract, options) => {
const applicationIdUrlCallBack = options?.openApplicationIdHandler;
const directoryUrl = options?.openDirectoryHandler;
const openContractHandler = options?.externalReference?.openContractHandler;
const contractDetails = [
{
name: CONTRACT_GRID_NAME.CONTRACT_ID,
value: dataContract.guid,
onClick: openContractHandler
? () => openContractHandler(dataContract.guid)
: undefined,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_DESCRIPTION,
value: dataContract.description,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_VERSION,
value: dataContract.version,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_STATE,
value: prettyCONSTName(dataContract.state),
},
];
const accessPointGroupRef = dataContract.resource;
let dataProductDetails = [];
if (accessPointGroupRef instanceof V1_AccessPointGroupReference) {
dataProductDetails = [
{
name: CONTRACT_GRID_NAME.CONTRACT_DATA_PRODUCT_ID,
value: accessPointGroupRef.dataProduct.guid,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_DATA_PRODUCT,
value: accessPointGroupRef.dataProduct.name,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_DATA_PRODUCT_DID,
value: accessPointGroupRef.dataProduct.owner.appDirId,
onClick: applicationIdUrlCallBack
? () => applicationIdUrlCallBack(accessPointGroupRef.dataProduct.owner.appDirId.toString())
: undefined,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_ACCESS_GROUP,
value: accessPointGroupRef.accessPointGroup,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_ACCESS_POINTS,
value: accessPointGroupRef.dataProduct.accessPoints
.map((ap) => ap.name)
.join(', '),
},
];
}
const org = dataContract.consumer;
let orgDetails = [];
if (org instanceof V1_AppDirOrganizationalScope) {
orgDetails = convertMutilGridItemDetail(org.appDirNode.map((value) => [
{
name: CONTRACT_GRID_NAME.CONTRACT_APP_DID,
value: value.appDirId.toString(),
},
{
name: CONTRACT_GRID_NAME.CONTRACT_APP_LEVEL,
value: value.level.toString(),
},
]));
}
else if (org instanceof V1_AdhocTeam) {
orgDetails = convertMutilGridItemDetail(org.users.map((user) => {
return [
{
name: CONTRACT_GRID_NAME.CONTRACT_CONSUMER_NAME,
value: user.name,
onClick: directoryUrl ? () => directoryUrl(user.name) : undefined,
},
];
}));
}
const contractMembers = convertMutilGridItemDetail(dataContract.members.map((member) => [
{
name: CONTRACT_GRID_NAME.CONTRACT_MEMBER_ID,
value: member.guid,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_MEMBER_NAME,
value: member.user.name,
},
{
name: CONTRACT_GRID_NAME.CONTRACT_MEMBER_TYPE,
value: member.user.userType.toString(),
},
{
name: CONTRACT_GRID_NAME.CONTRACT_MEMBER_STATUS,
value: member.status.toString(),
},
]));
return [
...contractDetails,
...dataProductDetails,
...orgDetails,
...contractMembers,
];
};
const getGridInfoFromTaskStatus = (status) => {
switch (status) {
case V1_UserApprovalStatus.APPROVED:
return GridTiemStatus.SUCCESS;
case V1_UserApprovalStatus.DENIED:
return GridTiemStatus.ERROR;
case V1_UserApprovalStatus.PENDING:
return GridTiemStatus.INFO;
default:
return undefined;
}
};
export const TYPE_GRID_ITEM = Object.freeze({
TASK_ID: 'Task ID',
TASK_STATUS: 'Task Status',
TASK_CONSUMER: 'Task Consumer',
TASK_ASSIGNEE: 'Task Assignee',
});
export const buildTaskGridItemDetail = (task, assignees, contract, openContractHandler, openDirectoryHandler, openApplicationIdHandler) => {
const taskAssignees = convertMutilGridItemDetail(assignees?.map((name) => [
{
name: TYPE_GRID_ITEM.TASK_ASSIGNEE,
value: name,
onClick: openDirectoryHandler
? () => openDirectoryHandler(name)
: undefined,
},
]) ?? []);
return [
{
name: TYPE_GRID_ITEM.TASK_ID,
value: task.taskId,
},
{
name: TYPE_GRID_ITEM.TASK_STATUS,
value: task.status.toString(),
status: getGridInfoFromTaskStatus(task.status),
},
{
name: TYPE_GRID_ITEM.TASK_CONSUMER,
value: task.consumer,
onClick: openDirectoryHandler
? () => openDirectoryHandler(task.consumer)
: undefined,
},
...taskAssignees,
...(contract && openContractHandler
? buildDataContractDetail(contract, {
openDirectoryHandler,
openApplicationIdHandler,
externalReference: {
openContractHandler,
},
})
: []),
];
};
export const getUserById = async (userId, userSearchService) => (await userSearchService.executeSearch(userId)).filter((_user) => _user.id === userId)[0];
export const stringifyOrganizationalScope = (scope) => {
if (scope instanceof V1_AppDirOrganizationalScope) {
return scope.appDirNode
.map((node) => `${node.level}: ${node.appDirId}`)
.join(', ');
}
else if (scope instanceof V1_AdhocTeam) {
return scope.users.map((user) => user.name).join(', ');
}
else if (scope instanceof V1_UnknownOrganizationalScopeType) {
return JSON.stringify(scope.content);
}
return '';
};
export const isContractStateComplete = (currentContractState, stateToCheck) => {
switch (stateToCheck) {
case V1_ContractState.DRAFT:
return [
V1_ContractState.CLOSED,
V1_ContractState.COMPLETED,
V1_ContractState.OPEN_FOR_PRIVILEGE_MANAGER_APPROVAL,
V1_ContractState.PENDING_DATA_OWNER_APPROVAL,
V1_ContractState.REJECTED,
].includes(currentContractState);
case V1_ContractState.OPEN_FOR_PRIVILEGE_MANAGER_APPROVAL:
return [
V1_ContractState.CLOSED,
V1_ContractState.COMPLETED,
V1_ContractState.PENDING_DATA_OWNER_APPROVAL,
V1_ContractState.REJECTED,
].includes(currentContractState);
case V1_ContractState.PENDING_DATA_OWNER_APPROVAL:
return [
V1_ContractState.CLOSED,
V1_ContractState.COMPLETED,
V1_ContractState.REJECTED,
].includes(currentContractState);
case V1_ContractState.CLOSED:
return [V1_ContractState.CLOSED].includes(currentContractState);
case V1_ContractState.COMPLETED:
return [V1_ContractState.COMPLETED].includes(currentContractState);
case V1_ContractState.REJECTED:
return [V1_ContractState.REJECTED].includes(currentContractState);
default:
return false;
}
};
//# sourceMappingURL=LakehouseUtils.js.map