Skip to content
This repository was archived by the owner on Feb 20, 2024. It is now read-only.

Commit 5caa45f

Browse files
Merge pull request #26 from solace-iot-team/mtn-0-1-5
Mtn 0 1 5
2 parents d06a24e + fd105fd commit 5caa45f

14 files changed

+211
-95
lines changed

ReleaseNotes.md

+13
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,19 @@
22

33
Solace Async API Management.
44

5+
## Version 0.1.6
6+
* [API-M Admin & Developer Portal](https://github.com/solace-iot-team/async-apim/tree/main/apim-portal): 0.1.6
7+
* [API-M Server OpenAPI](https://github.com/solace-iot-team/async-apim/blob/main/apim-server/server/common/api.yml): 0.1.0
8+
* [API-M Server](https://github.com/solace-iot-team/async-apim/tree/main/apim-server): 0.1.0
9+
* [API-M Connector OpenAPI](https://github.com/solace-iot-team/platform-api): 0.7.11
10+
11+
#### API-M Admin & Developer Portal
12+
**Fixes:**
13+
* **API Products**
14+
- added validation of business group information stored in the attributes. if business group not found, then API Product is categorized as a Recovered Asset.
15+
* **Organization:Asset Maintenance:API Products**
16+
- fixed recovery of API Products without any version information
17+
518
## Version 0.1.5
619
* [API-M Admin & Developer Portal](https://github.com/solace-iot-team/async-apim/tree/main/apim-portal): 0.1.5
720
* [API-M Server OpenAPI](https://github.com/solace-iot-team/async-apim/blob/main/apim-server/server/common/api.yml): 0.1.0

apim-portal/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "async-apim-portal",
3-
"version": "0.1.5",
3+
"version": "0.1.6",
44
"description": "Solace Async API Management Portal",
55
"repository": {
66
"type": "git",

apim-portal/src/admin-portal/components/MaintainApiProducts/MaintainApiProducts.tsx

-19
Original file line numberDiff line numberDiff line change
@@ -68,31 +68,12 @@ export const MaintainApiProducts: React.FC<IMaintainApiProductsProps> = (props:
6868
const [managedObjectEntityId, setManagedObjectEntityId] = React.useState<TAPEntityId>();
6969
const [managedObject_AllowedActions, setManagedObject_AllowedActions] = React.useState<TAPAdminPortalApiProductDisplay_AllowedActions>(APAdminPortalApiProductsDisplayService.get_Empty_AllowedActions());
7070

71-
// const [managedObjectHasReferences, setManagedObjectHasReferences] = React.useState<boolean>(false);
72-
7371
const [showListComponent, setShowListComponent] = React.useState<boolean>(false);
7472
const [showViewComponent, setShowViewComponent] = React.useState<boolean>(false);
7573
const [showEditComponent, setShowEditComponent] = React.useState<boolean>(false);
7674
const [showDeleteComponent, setShowDeleteComponent] = React.useState<boolean>(false);
7775
const [refreshCounter, setRefreshCounter] = React.useState<number>(0);
7876

79-
// const MaintainApiProducts_onNavigateToCommand = (e: MenuItemCommandParams): void => {
80-
// const funcName = 'MaintainApiProducts_onNavigateToCommand';
81-
// const logName = `${ComponentName}.${funcName}()`;
82-
// if(props.onNavigateToCommand === undefined) throw new Error(`${logName}: props.onNavigateToCommand === undefined`);
83-
// props.onNavigateToCommand(E_COMPONENT_STATE.MANAGED_OBJECT_LIST_RECOVER);
84-
// }
85-
86-
// const setBreadCrumbItemList = (itemList: Array<MenuItem>) => {
87-
// props.setBreadCrumbItemList([
88-
// {
89-
// label: 'Recover API Products',
90-
// command: ManageRecoverApiProducts_onNavigateToCommand
91-
// },
92-
// ...itemList
93-
// ]);
94-
// }
95-
9677
// * useEffect Hooks *
9778
React.useEffect(() => {
9879
setNewComponentState(E_COMPONENT_STATE.MANAGED_OBJECT_LIST_VIEW);

apim-portal/src/admin-portal/components/ManageApiProducts/DisplayApiProduct.tsx

+3-9
Original file line numberDiff line numberDiff line change
@@ -478,18 +478,12 @@ export const DisplayAdminPortalApiProduct: React.FC<IDisplayAdminPortalApiProduc
478478

479479
<ApiCallStatusError apiCallStatus={apiCallStatus} />
480480

481-
{/* <div>DEBUG: selectedVersion = {selectedVersion}</div> */}
481+
{/* <div>DEBUG: selectedVersion = '{selectedVersion}'</div>
482+
<div>DEBUG: managedObject.apVersionInfo={JSON.stringify(managedObject?.apVersionInfo)}</div> */}
482483

483-
{managedObject && selectedVersion && renderManagedObject() }
484+
{managedObject && selectedVersion !== undefined && renderManagedObject() }
484485

485486
</div>
486-
{/* DEBUG */}
487-
{/* <pre style={ { fontSize: '10px' }} >
488-
{JSON.stringify(managedObject, null, 2)}
489-
</pre> */}
490-
{/* <pre style={ { fontSize: '10px' }} >
491-
apSearchContent={JSON.stringify(managedObject?.apSearchContent.split(','), null, 2)}
492-
</pre> */}
493487
</React.Fragment>
494488
);
495489
}

apim-portal/src/admin-portal/components/ManageApiProducts/EditNewApiProduct/EditNewAccessAndStateForm.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ export const EditNewAccessAndStateForm: React.FC<IEditNewAccessAndStateFormProps
169169
required: "Select owning business group.",
170170
}}
171171
render={( { field, fieldState }) => {
172-
console.log(`${logName}: field=${JSON.stringify(field)}`);
172+
// console.log(`${logName}: field=${JSON.stringify(field)}`);
173173
return(
174174
<TreeSelect
175175
id={field.name}

apim-portal/src/admin-portal/components/ManageApiProducts/ListApiProducts.tsx

+6-14
Original file line numberDiff line numberDiff line change
@@ -155,20 +155,11 @@ export const ListApiProducts: React.FC<IListApiProductsProps> = (props: IListApi
155155
// const approvalTypeTemplate = (row: TManagedObject): string => {
156156
// return row.apApprovalType;
157157
// }
158-
// const businessGroupBodyTemplate = (row: TManagedObject): JSX.Element => {
159-
// return (
160-
// <div>
161-
// {row.apBusinessGroupInfo.apOwningBusinessGroupEntityId.displayName}
162-
// </div>
163-
// );
164-
// }
165-
158+
const businessGroupBodyTemplate = (row: TManagedObject): JSX.Element => {
159+
return (<div>{row.apBusinessGroupInfo.apOwningBusinessGroupEntityId.displayName}</div>);
160+
}
166161
const versionBodyTemplate = (row: TManagedObject): JSX.Element => {
167-
return (
168-
<div>
169-
{row.apVersionInfo.apLastVersion}
170-
</div>
171-
);
162+
return (<div>{row.apVersionInfo.apLastVersion}</div>);
172163
}
173164
const sharedBodyTemplate = (row: TManagedObject): JSX.Element => {
174165
const sharingEntityIdList: TAPEntityIdList = row.apBusinessGroupInfo.apBusinessGroupSharingList.map( (x) => {
@@ -198,6 +189,7 @@ export const ListApiProducts: React.FC<IListApiProductsProps> = (props: IListApi
198189
// const approvalTypeSortField = APAdminPortalApiProductsDisplayService.nameOf<TAPAdminPortalApiProductDisplay>('apApprovalType');
199190
const accessLevelSortField = APAdminPortalApiProductsDisplayService.nameOf<TAPAdminPortalApiProductDisplay>('apAccessLevel');
200191
const stateSortField = APAdminPortalApiProductsDisplayService.nameOf_ApLifecycleInfo('apLifecycleState');
192+
const businessGroupSortField = APAdminPortalApiProductsDisplayService.nameOf_ApBusinessGroupInfo_ApBusinessGroupDisplayReference_ApEntityId('displayName');
201193
return (
202194
<div className="card">
203195
<DataTable
@@ -229,7 +221,7 @@ export const ListApiProducts: React.FC<IListApiProductsProps> = (props: IListApi
229221
<Column header="State" headerStyle={{width: '7em'}} body={stateTemplate} bodyStyle={{ verticalAlign: 'top' }} sortField={stateSortField} sortable />
230222

231223
{/* <Column header="Approval" headerStyle={{width: '8em'}} body={approvalTypeTemplate} bodyStyle={{ verticalAlign: 'top' }} sortField={approvalTypeSortField} sortable /> */}
232-
{/* <Column header="Business Group" headerStyle={{width: '12em'}} body={businessGroupBodyTemplate} bodyStyle={{ verticalAlign: 'top' }} sortField={businessGroupSortField} sortable /> */}
224+
<Column header="Business Group" headerStyle={{width: '12em'}} body={businessGroupBodyTemplate} bodyStyle={{ verticalAlign: 'top' }} sortField={businessGroupSortField} sortable />
233225

234226
<Column header="Shared" body={sharedBodyTemplate} bodyStyle={{textAlign: 'left', verticalAlign: 'top' }} />
235227

apim-portal/src/admin-portal/components/ManageApiProducts/ViewApiProduct.tsx

+13-12
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,14 @@ export const ViewApiProduct: React.FC<IViewApiProductProps> = (props: IViewApiPr
3939
const logName = `${ComponentName}.${funcName}()`;
4040
let callState: TApiCallState = ApiCallState.getInitialCallState(E_CALL_STATE_ACTIONS.API_GET_API_PRODUCT, `retrieve details for api product: ${props.apiProductEntityId.displayName}`);
4141
try {
42-
const object: TAPAdminPortalApiProductDisplay = await APAdminPortalApiProductsDisplayService.apiGet_AdminPortalApApiProductDisplay({
42+
const apAdminPortalApiProductDisplay: TAPAdminPortalApiProductDisplay = await APAdminPortalApiProductsDisplayService.apiGet_AdminPortalApApiProductDisplay({
4343
organizationId: props.organizationId,
4444
apiProductId: props.apiProductEntityId.id,
4545
default_ownerId: userContext.apLoginUserDisplay.apEntityId.id,
4646
fetch_revision_list: true
4747
});
48-
setManagedObject(object);
48+
// console.log(`${logName}: apAdminPortalApiProductDisplay = ${JSON.stringify(apAdminPortalApiProductDisplay, null, 2)}`);
49+
setManagedObject(apAdminPortalApiProductDisplay);
4950
} catch(e) {
5051
APClientConnectorOpenApi.logError(logName, e);
5152
callState = ApiCallState.addErrorToApiCallState(e, callState);
@@ -94,16 +95,16 @@ export const ViewApiProduct: React.FC<IViewApiProductProps> = (props: IViewApiPr
9495
<React.Fragment>
9596
<div className="manage-api-products">
9697

97-
{ managedObject &&
98-
<DisplayAdminPortalApiProduct
99-
scope={E_DISPLAY_ADMIN_PORTAL_API_PRODUCT_SCOPE.VIEW_EXISTING}
100-
organizationId={props.organizationId}
101-
apAdminPortalApiProductDisplay={managedObject}
102-
onError={props.onError}
103-
onSuccess={props.onSuccess}
104-
onLoadingChange={props.onLoadingChange}
105-
/>
106-
}
98+
{ managedObject &&
99+
<DisplayAdminPortalApiProduct
100+
scope={E_DISPLAY_ADMIN_PORTAL_API_PRODUCT_SCOPE.VIEW_EXISTING}
101+
organizationId={props.organizationId}
102+
apAdminPortalApiProductDisplay={managedObject}
103+
onError={props.onError}
104+
onSuccess={props.onSuccess}
105+
onLoadingChange={props.onLoadingChange}
106+
/>
107+
}
107108

108109
</div>
109110
</React.Fragment>

apim-portal/src/admin-portal/displayServices/APAdminPortalApiProductsDisplayService.ts

+46-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
APApiProductsDisplayService,
1010
IAPApiProductDisplay,
1111
} from '../../displayServices/APApiProductsDisplayService';
12+
import APBusinessGroupsDisplayService, { TAPBusinessGroupDisplayList } from '../../displayServices/APBusinessGroupsDisplayService';
1213
import APEnvironmentsDisplayService, { TAPEnvironmentDisplayList } from '../../displayServices/APEnvironmentsDisplayService';
1314
import { TAPManagedAssetDisplay_BusinessGroupSharing } from '../../displayServices/APManagedAssetDisplayService';
1415
import APVersioningDisplayService, { IAPVersionInfo } from '../../displayServices/APVersioningDisplayService';
@@ -96,24 +97,40 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
9697
};
9798
}
9899

99-
private async create_ApAdminPortalApiProductDisplay_From_ApiEntities({ organizationId, connectorApiProduct, connectorRevisions, completeApEnvironmentDisplayList, default_ownerId, currentVersion }:{
100+
private async create_ApAdminPortalApiProductDisplay_From_ApiEntities({
101+
organizationId,
102+
connectorApiProduct,
103+
connectorRevisions,
104+
completeApEnvironmentDisplayList,
105+
default_ownerId,
106+
currentVersion,
107+
complete_ApBusinessGroupDisplayList,
108+
}:{
100109
organizationId: string;
101110
connectorApiProduct: APIProduct;
102111
connectorRevisions?: Array<string>;
103112
completeApEnvironmentDisplayList: TAPEnvironmentDisplayList;
104113
default_ownerId: string;
105114
currentVersion?: string;
115+
complete_ApBusinessGroupDisplayList: TAPBusinessGroupDisplayList;
106116
}): Promise<TAPAdminPortalApiProductDisplay> {
107-
117+
// const funcName = 'create_ApAdminPortalApiProductDisplay_From_ApiEntities';
118+
// const logName = `${this.ComponentName}.${funcName}()`;
119+
120+
// console.log(`${logName}: starting ...`);
121+
108122
const base: IAPApiProductDisplay = await this.create_ApApiProductDisplay_From_ApiEntities({
109123
organizationId: organizationId,
110124
connectorApiProduct: connectorApiProduct,
111125
connectorRevisions: connectorRevisions,
112126
completeApEnvironmentDisplayList: completeApEnvironmentDisplayList,
113127
default_ownerId: default_ownerId,
114128
currentVersion: currentVersion,
129+
complete_ApBusinessGroupDisplayList: complete_ApBusinessGroupDisplayList
115130
});
116131

132+
// console.log(`${logName}: base=${JSON.stringify(base.apVersionInfo, null, 2)}`);
133+
117134
const apAdminPortalApiProductDisplay: TAPAdminPortalApiProductDisplay = {
118135
...base,
119136
apAppReferenceEntityIdList: await this.apiGetList_AppReferenceEntityIdList({
@@ -156,7 +173,6 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
156173
public apiGetMaintainanceList_ApAdminPortalApiProductDisplayList = async({ organizationId, default_ownerId }:{
157174
organizationId: string;
158175
default_ownerId: string;
159-
// currentBusinessGroupId: string;
160176
}): Promise<TAPAdminPortalApiProductDisplayList> => {
161177

162178
const connectorApiProductList: Array<APIProduct> = await this.apiGetUnfilteredList_ConnectorApiProductList({
@@ -168,6 +184,12 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
168184
organizationId: organizationId
169185
});
170186

187+
// get the complete business group list for reference
188+
const complete_ApBusinessGroupDisplayList: TAPBusinessGroupDisplayList = await APBusinessGroupsDisplayService.apsGetList_ApBusinessGroupSystemDisplayList({
189+
organizationId: organizationId,
190+
fetchAssetReferences: false
191+
});
192+
171193
const apAdminPortalApiProductDisplayList: TAPAdminPortalApiProductDisplayList = [];
172194
for(const connectorApiProduct of connectorApiProductList) {
173195
const apVersionInfo: IAPVersionInfo = APVersioningDisplayService.create_ApVersionInfo_From_ApiEntities({ connectorMeta: connectorApiProduct.meta });
@@ -177,6 +199,7 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
177199
completeApEnvironmentDisplayList: complete_apEnvironmentDisplayList,
178200
default_ownerId: default_ownerId,
179201
currentVersion: apVersionInfo.apCurrentVersion,
202+
complete_ApBusinessGroupDisplayList: complete_ApBusinessGroupDisplayList
180203
});
181204

182205
// apply more filters if needed
@@ -212,6 +235,12 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
212235
organizationId: organizationId
213236
});
214237

238+
// get the complete business group list for reference
239+
const complete_ApBusinessGroupDisplayList: TAPBusinessGroupDisplayList = await APBusinessGroupsDisplayService.apsGetList_ApBusinessGroupSystemDisplayList({
240+
organizationId: organizationId,
241+
fetchAssetReferences: false
242+
});
243+
215244
const apAdminPortalApiProductDisplayList: TAPAdminPortalApiProductDisplayList = [];
216245
for(const connectorApiProduct of connectorApiProductList) {
217246
const apVersionInfo: IAPVersionInfo = APVersioningDisplayService.create_ApVersionInfo_From_ApiEntities({ connectorMeta: connectorApiProduct.meta });
@@ -221,6 +250,7 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
221250
completeApEnvironmentDisplayList: complete_apEnvironmentDisplayList,
222251
default_ownerId: default_ownerId,
223252
currentVersion: apVersionInfo.apCurrentVersion,
253+
complete_ApBusinessGroupDisplayList: complete_ApBusinessGroupDisplayList
224254
});
225255
// add only to list if this is a recoverable api product
226256
if(this.is_recovered_ApManagedAssetDisplay({ apManagedAssetDisplay: apAdminPortalApiProductDisplay })) {
@@ -255,6 +285,11 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
255285
const complete_apEnvironmentDisplayList: TAPEnvironmentDisplayList = await APEnvironmentsDisplayService.apiGetList_ApEnvironmentDisplay({
256286
organizationId: organizationId
257287
});
288+
// get the complete business group list for reference
289+
const complete_ApBusinessGroupDisplayList: TAPBusinessGroupDisplayList = await APBusinessGroupsDisplayService.apsGetList_ApBusinessGroupSystemDisplayList({
290+
organizationId: organizationId,
291+
fetchAssetReferences: false
292+
});
258293

259294
const apAdminPortalApiProductDisplayList: TAPAdminPortalApiProductDisplayList = [];
260295
for(const connectorApiProduct of connectorApiProductList) {
@@ -265,6 +300,7 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
265300
completeApEnvironmentDisplayList: complete_apEnvironmentDisplayList,
266301
default_ownerId: default_ownerId,
267302
currentVersion: apVersionInfo.apCurrentVersion,
303+
complete_ApBusinessGroupDisplayList: complete_ApBusinessGroupDisplayList
268304
});
269305
// if this is a recovered API product, don't add to list
270306
if(!this.is_recovered_ApManagedAssetDisplay({ apManagedAssetDisplay: apAdminPortalApiProductDisplay })) apAdminPortalApiProductDisplayList.push(apAdminPortalApiProductDisplay);
@@ -316,6 +352,7 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
316352
// get the revision list
317353
let connectorRevisions: Array<string> | undefined = undefined;
318354
if(fetch_revision_list) {
355+
// for old api products, could be empty list
319356
connectorRevisions = await ApiProductsService.listApiProductRevisions({
320357
organizationName: organizationId,
321358
apiProductName: apiProductId
@@ -326,6 +363,11 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
326363
const complete_apEnvironmentDisplayList: TAPEnvironmentDisplayList = await APEnvironmentsDisplayService.apiGetList_ApEnvironmentDisplay({
327364
organizationId: organizationId
328365
});
366+
// get the complete business group list for reference
367+
const complete_ApBusinessGroupDisplayList: TAPBusinessGroupDisplayList = await APBusinessGroupsDisplayService.apsGetList_ApBusinessGroupSystemDisplayList({
368+
organizationId: organizationId,
369+
fetchAssetReferences: false
370+
});
329371

330372
const apAdminPortalApiProductDisplay: TAPAdminPortalApiProductDisplay = await this.create_ApAdminPortalApiProductDisplay_From_ApiEntities({
331373
organizationId: organizationId,
@@ -334,6 +376,7 @@ class APAdminPortalApiProductsDisplayService extends APApiProductsDisplayService
334376
completeApEnvironmentDisplayList: complete_apEnvironmentDisplayList,
335377
default_ownerId: default_ownerId,
336378
currentVersion: revision,
379+
complete_ApBusinessGroupDisplayList: complete_ApBusinessGroupDisplayList
337380
});
338381
return apAdminPortalApiProductDisplay;
339382
}

0 commit comments

Comments
 (0)