diff --git a/config.json b/config.json index f0cf22f..35df830 100644 --- a/config.json +++ b/config.json @@ -2,11 +2,28 @@ "port": 3000, "pathToContent": "./src/", "mode": "development", + "controlPlane": { + "url": "https://127.0.0.1:9443/api/am/devportal/v3", + "disableCertValidation": true, + "pathToCertificate": "../api-developer-portal/conf/security/client-truststore.pem" + }, "db": { "username": "postgres", "password": "postgres", "database": "devportal", "host": "localhost", "dialect": "postgres" - } -} + }, + "providerURL": { + "AWS": "https://aws.amazon.com" + }, + "identityProvider": {}, + "roleClaim": "roles", + "orgIDClaim": "organizationID", + "groupsClaim": "groups", + "adminRole": "admin", + "subscriberRole": "Internal/subscriber", + "superAdminRole": "superAdmin", + "authenticatedPages": [], + "authorizedPages": [] +} \ No newline at end of file diff --git a/mock/AccommodationAPI/apiMetadata.json b/mock/AccommodationAPI/apiMetadata.json index 9c55375..1e1abf5 100644 --- a/mock/AccommodationAPI/apiMetadata.json +++ b/mock/AccommodationAPI/apiMetadata.json @@ -18,6 +18,20 @@ "api-icon": "https://devportal-content.s3.amazonaws.com/ACBOrganization/resources/images/hotel-availability.jpeg" } }, + "subscriptionPolicies": [ + { + "policyName": "Gold" + }, + { + "policyName": "Silver" + }, + { + "policyName": "Bronze" + }, + { + "policyName": "Unlimited" + } + ], "serverUrl": { "sandboxUrl": "https://accommodation.api.sandbox.abc.com", "productionUrl": "https://accommodation.api.abc.com" diff --git a/mock/Applications/DefaultApplication/AllKeyManagers.json b/mock/Applications/DefaultApplication/AllKeyManagers.json new file mode 100644 index 0000000..b707e74 --- /dev/null +++ b/mock/Applications/DefaultApplication/AllKeyManagers.json @@ -0,0 +1,177 @@ +{ + "count": 2, + "list": [ + { + "id": "aa899ef9-df1a-44c6-940c-dfe1bc2a8c5a", + "name": "Resident Key Manager", + "type": "default", + "displayName": null, + "description": "This is Resident Key Manager", + "enabled": true, + "availableGrantTypes": [ + "refresh_token", + "urn:ietf:params:oauth:grant-type:saml2-bearer", + "password", + "client_credentials", + "iwa:ntlm", + "urn:ietf:params:oauth:grant-type:device_code", + "authorization_code", + "urn:ietf:params:oauth:grant-type:token-exchange", + "urn:ietf:params:oauth:grant-type:jwt-bearer" + ], + "tokenEndpoint": "https://localhost:9443/oauth2/token", + "revokeEndpoint": "https://localhost:9443/oauth2/revoke", + "userInfoEndpoint": null, + "enableTokenGeneration": true, + "enableTokenEncryption": false, + "enableTokenHashing": false, + "enableOAuthAppCreation": true, + "enableMapOAuthConsumerApps": false, + "applicationConfiguration": [ + { + "name": "application_access_token_expiry_time", + "label": "Application Access Token Expiry Time ", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type Application Access Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, + { + "name": "user_access_token_expiry_time", + "label": "User Access Token Expiry Time ", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type User Access Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, + { + "name": "refresh_token_expiry_time", + "label": "Refresh Token Expiry Time ", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type Refresh Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, + { + "name": "id_token_expiry_time", + "label": "Id Token Expiry Time", + "type": "input", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type ID Token Expiry Time in seconds ", + "values": [], + "default": "N/A" + }, + { + "name": "pkceMandatory", + "label": "Enable PKCE", + "type": "checkbox", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Enable PKCE", + "values": [], + "default": "false" + }, + { + "name": "pkceSupportPlain", + "label": "Support PKCE Plain text", + "type": "checkbox", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "S256 is recommended, plain text too can be used.", + "values": [], + "default": "false" + }, + { + "name": "bypassClientCredentials", + "label": "Public client", + "type": "checkbox", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Allow authentication without the client secret.", + "values": [], + "default": "false" + } + ], + "alias": null, + "additionalProperties": {}, + "tokenType": "DIRECT" + }, + { + "id": "94d37d2f-7d83-471c-87f7-9421692ddeaa", + "name": "dummy", + "type": "Auth0", + "displayName": "dummy", + "description": "", + "enabled": true, + "availableGrantTypes": [], + "tokenEndpoint": "https://localhost:9443/admin/settings/key-managers/create", + "revokeEndpoint": "https://localhost:9443/admin/settings/key-managers/create", + "userInfoEndpoint": null, + "enableTokenGeneration": true, + "enableTokenEncryption": false, + "enableTokenHashing": false, + "enableOAuthAppCreation": true, + "enableMapOAuthConsumerApps": true, + "applicationConfiguration": [ + { + "name": "app_type", + "label": "Application Type", + "type": "select", + "required": false, + "mask": false, + "multiple": false, + "tooltip": "Type of the application to create", + "values": [ + "regular_web", + "native", + "spa", + "non_interactive" + ], + "default": "regular_web" + }, + { + "name": "token_endpoint_auth_method", + "label": "Token Endpoint Authentication Method", + "type": "select", + "required": true, + "mask": true, + "multiple": false, + "tooltip": "How to Authenticate Token Endpoint", + "values": [ + "client_secret_basic", + "client_secret_post" + ], + "default": "client_secret_basic" + }, + { + "name": "audience_of_api", + "label": "Audience of the API", + "type": "text", + "required": true, + "mask": false, + "multiple": false, + "tooltip": "The audience of the API which intended to use this application", + "values": [], + "default": "" + } + ], + "alias": null, + "additionalProperties": {}, + "tokenType": "DIRECT" + } + ] +} \ No newline at end of file diff --git a/mock/Applications/DefaultApplication/DefaultApplication.json b/mock/Applications/DefaultApplication/DefaultApplication.json new file mode 100644 index 0000000..57341b0 --- /dev/null +++ b/mock/Applications/DefaultApplication/DefaultApplication.json @@ -0,0 +1,17 @@ +{ + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d836", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "tokenType": "JWT", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 1, + "keys": [], + "attributes": {}, + "subscriptionScopes": [], + "owner": "admin", + "hashEnabled": false, + "createdTime": "1731993412405", + "updatedTime": "1731993412405" +} \ No newline at end of file diff --git a/mock/Applications/applications.json b/mock/Applications/applications.json new file mode 100644 index 0000000..0eed6e1 --- /dev/null +++ b/mock/Applications/applications.json @@ -0,0 +1,166 @@ +{ + "count": 2, + "list": [ + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d831", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "554791bd-783e-45cb-b77c-88dba3766362", + "name": "New Application", + "throttlingPolicy": "10PerMin", + "description": "This is a sample description", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731994070857", + "updatedTime": "1731994070857" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d833", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d834", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d835", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d836", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d837", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d838", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d839", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d840", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + }, + { + "applicationId": "49231188-5d7e-46e1-9651-7e7905d4d841", + "name": "DefaultApplication", + "throttlingPolicy": "Unlimited", + "description": "This is the default application", + "status": "APPROVED", + "groups": [], + "subscriptionCount": 0, + "attributes": {}, + "owner": "admin", + "tokenType": "JWT", + "createdTime": "1731993412405", + "updatedTime": "1731993412405" + } + ], + "pagination": { + "offset": 0, + "limit": 25, + "total": 2, + "next": "", + "previous": "" + } +} \ No newline at end of file diff --git a/mock/Applications/throttlingPolicies.json b/mock/Applications/throttlingPolicies.json new file mode 100644 index 0000000..0891a6e --- /dev/null +++ b/mock/Applications/throttlingPolicies.json @@ -0,0 +1,124 @@ +{ + "count": 4, + "list": [ + { + "name": "10PerMin", + "description": "Allows 10 request per minute", + "policyLevel": "APPLICATION", + "attributes": {}, + "requestCount": 10, + "dataUnit": null, + "unitTime": 1, + "timeUnit": "min", + "rateLimitCount": 0, + "rateLimitTimeUnit": null, + "quotaPolicyType": "REQUESTCOUNT", + "tierPlan": null, + "stopOnQuotaReach": true, + "monetizationAttributes": { + "billingType": null, + "billingCycle": null, + "fixedPrice": null, + "pricePerRequest": null, + "currencyType": null + }, + "throttlingPolicyPermissions": { + "type": "ALLOW", + "roles": [ + "Internal/everyone" + ] + } + }, + { + "name": "20PerMin", + "description": "Allows 20 request per minute", + "policyLevel": "APPLICATION", + "attributes": {}, + "requestCount": 20, + "dataUnit": null, + "unitTime": 1, + "timeUnit": "min", + "rateLimitCount": 0, + "rateLimitTimeUnit": null, + "quotaPolicyType": "REQUESTCOUNT", + "tierPlan": null, + "stopOnQuotaReach": true, + "monetizationAttributes": { + "billingType": null, + "billingCycle": null, + "fixedPrice": null, + "pricePerRequest": null, + "currencyType": null + }, + "throttlingPolicyPermissions": { + "type": "ALLOW", + "roles": [ + "Internal/everyone" + ] + } + }, + { + "name": "50PerMin", + "description": "Allows 50 request per minute", + "policyLevel": "APPLICATION", + "attributes": {}, + "requestCount": 50, + "dataUnit": null, + "unitTime": 1, + "timeUnit": "min", + "rateLimitCount": 0, + "rateLimitTimeUnit": null, + "quotaPolicyType": "REQUESTCOUNT", + "tierPlan": null, + "stopOnQuotaReach": true, + "monetizationAttributes": { + "billingType": null, + "billingCycle": null, + "fixedPrice": null, + "pricePerRequest": null, + "currencyType": null + }, + "throttlingPolicyPermissions": { + "type": "ALLOW", + "roles": [ + "Internal/everyone" + ] + } + }, + { + "name": "Unlimited", + "description": "Allows unlimited requests", + "policyLevel": "APPLICATION", + "attributes": {}, + "requestCount": 2147483647, + "dataUnit": null, + "unitTime": 0, + "timeUnit": "ms", + "rateLimitCount": 0, + "rateLimitTimeUnit": null, + "quotaPolicyType": null, + "tierPlan": "FREE", + "stopOnQuotaReach": true, + "monetizationAttributes": { + "billingType": null, + "billingCycle": null, + "fixedPrice": null, + "pricePerRequest": null, + "currencyType": null + }, + "throttlingPolicyPermissions": { + "type": "ALLOW", + "roles": [ + "Internal/everyone" + ] + } + } + ], + "pagination": { + "offset": 0, + "limit": 25, + "total": 4, + "next": "", + "previous": "" + } +} \ No newline at end of file diff --git a/mock/CountriesAPI/apiMetadata.json b/mock/CountriesAPI/apiMetadata.json index c702664..23d8a97 100644 --- a/mock/CountriesAPI/apiMetadata.json +++ b/mock/CountriesAPI/apiMetadata.json @@ -21,6 +21,20 @@ "description": "Allows up to 1000 requests per day." } ], + "subscriptionPolicies": [ + { + "policyName": "Gold" + }, + { + "policyName": "Silver" + }, + { + "policyName": "Bronze" + }, + { + "policyName": "Unlimited" + } + ], "serverUrl": { "sandboxUrl": "https://countries.trevorblades.com/graphql", "productionUrl": "https://countries.trevorblades.com/graphql" diff --git a/mock/IdentityProvider/identityProvider.json b/mock/IdentityProvider/identityProvider.json new file mode 100644 index 0000000..5d1523f --- /dev/null +++ b/mock/IdentityProvider/identityProvider.json @@ -0,0 +1,13 @@ +{ + "name": "IS", + "issuer": "https://127.0.0.1:9443/oauth2/token", + "authorizationURL": "https://localhost:9443/oauth2/authorize", + "tokenURL": "https://127.0.0.1:9443/oauth2/token", + "userInfoURL": "https://localhost:9443/oauth2/userinfo", + "clientId": "ClientId", + "callbackURL": "http://localhost:3000/ACME/callback", + "scope": "openid email profile apim:subscribe role", + "signUpURL": "", + "logoutURL": "https://localhost:9443/oidc/logout", + "logoutRedirectURI": "http://localhost:3000/ACME" +} \ No newline at end of file diff --git a/mock/LeisureActivitiesAPI/apiMetadata.json b/mock/LeisureActivitiesAPI/apiMetadata.json index 83166e4..b022bd9 100644 --- a/mock/LeisureActivitiesAPI/apiMetadata.json +++ b/mock/LeisureActivitiesAPI/apiMetadata.json @@ -18,6 +18,20 @@ "api-icon": "https://devportal-content.s3.amazonaws.com/ACBOrganization/resources/images/leisure.jpeg" } }, + "subscriptionPolicies": [ + { + "policyName": "Gold" + }, + { + "policyName": "Silver" + }, + { + "policyName": "Bronze" + }, + { + "policyName": "Unlimited" + } + ], "serverUrl": { "sandboxUrl": "https://leisure.api.sandbox.abc.com", "productionUrl": "https://leisure.api.abc.com" diff --git a/mock/NavigationAPI/apiMetadata.json b/mock/NavigationAPI/apiMetadata.json index 1f024c5..8dade51 100644 --- a/mock/NavigationAPI/apiMetadata.json +++ b/mock/NavigationAPI/apiMetadata.json @@ -21,6 +21,20 @@ "description": "Limits requests to 500 per hour." } ], + "subscriptionPolicies": [ + { + "policyName": "Gold" + }, + { + "policyName": "Silver" + }, + { + "policyName": "Bronze" + }, + { + "policyName": "Unlimited" + } + ], "serverUrl": { "sandboxUrl": "https://sandbox.acme.com/api/v1/navigation", "productionUrl": "https://api.acme.com/v1/navigation" diff --git a/mock/Organization/organizations.json b/mock/Organization/organizations.json new file mode 100644 index 0000000..c8699a5 --- /dev/null +++ b/mock/Organization/organizations.json @@ -0,0 +1,32 @@ +[ + { + "orgId": "4454545", + "orgName": "ACME", + "businessOwner": "Joe", + "businessOwnerContact": "0112345678", + "businessOwnerEmail": "joe@gmail.com", + "devPortalURLIdentifier": "ACME", + "roleClaimName": "roles", + "groupsClaimName": "groups", + "organizationClaimName": "organizationID", + "organizationIdentifier": "ACME", + "adminRole": "admin", + "subscriberRole": "subscriber", + "superAdminRole": "superAdmin" + }, + { + "orgId": "4454545", + "orgName": "DEPT", + "businessOwner": "Jane", + "businessOwnerContact": "0112345678", + "businessOwnerEmail": "joe@gmail.com", + "devPortalURLIdentifier": "DEPT", + "roleClaimName": "roles", + "groupsClaimName": "groups", + "organizationClaimName": "organizationID", + "organizationIdentifier": "DEPT", + "adminRole": "admin", + "subscriberRole": "subscriber", + "superAdminRole": "superAdmin" + } +] \ No newline at end of file diff --git a/mock/subscriptions.json b/mock/subscriptions.json new file mode 100644 index 0000000..e8bbc42 --- /dev/null +++ b/mock/subscriptions.json @@ -0,0 +1,9 @@ +[{ + "apiName": "AccommodationAPI", + "applicationName": "DefaultApplication", + "throttlingTier": "Unlimited" +}, { + "apiName": "CountriesAPI", + "applicationName": "New Application", + "throttlingTier": "Gold" +}] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 754624a..ee3b706 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "devportal-webapp": "^1.0.65" + "devportal-webapp": "^1.0.70" }, "bin": { "app": "src/app.js" @@ -1938,6 +1938,16 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, + "node_modules/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2436,22 +2446,25 @@ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/devportal-webapp": { - "version": "1.0.65", - "resolved": "https://registry.npmjs.org/devportal-webapp/-/devportal-webapp-1.0.65.tgz", - "integrity": "sha512-BvpDSEVU2iazHNfjtOzBhcogMwOjpO/8SdIQBRhD3TURRG3PMdzC0owc5lPqTiaIzFnWPPkrRp7r95qkNyJ2Kg==", + "version": "1.0.70", + "resolved": "https://registry.npmjs.org/devportal-webapp/-/devportal-webapp-1.0.70.tgz", + "integrity": "sha512-jpVJNhH2FObIIzck1DAaYTfOEv4zsjM3eV7NSQnp2aJ3F+63bmX3kM2TayfGohxzdF4RCY5mIL3eE/BLVtzS2Q==", "dependencies": { "@asyncapi/react-component": "^2.3.4", + "axios": "^1.7.8", "bootstrap-icons": "^1.11.3", "chokidar": "^3.6.0", "crypto": "^1.0.1", "express": "^4.21.0", "express-handlebars": "^7.1.3", "express-session": "^1.18.0", + "express-validator": "^7.2.0", "fs-extra": "^11.2.0", "graphiql": "^3.7.1", "graphql": "^16.9.0", "handlebars": "^4.7.8", "hbs": "^4.2.0", + "https": "^1.0.0", "js-yaml": "^4.1.0", "jsonwebtoken": "^9.0.2", "marked": "^13.0.3", @@ -2794,6 +2807,18 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==" }, + "node_modules/express-validator": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.0.tgz", + "integrity": "sha512-I2ByKD8panjtr8Y05l21Wph9xk7kk64UMyvJCl/fFM/3CTJq8isXYPLeKW/aZBCdb/LYNv63PwhY8khw8VWocA==", + "dependencies": { + "lodash": "^4.17.21", + "validator": "~13.12.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2898,6 +2923,25 @@ "node": ">= 0.8" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -3514,6 +3558,11 @@ "npm": ">=1.3.7" } }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" + }, "node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -5149,6 +5198,11 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", diff --git a/package.json b/package.json index 71f7f99..339ac3e 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "homepage": "https://github.com/api-developer-portal#readme", "dependencies": { - "devportal-webapp": "^1.0.65" + "devportal-webapp": "^1.0.70" }, "bin": { "app": "src/app.js" diff --git a/src/pages/api-landing/page.hbs b/src/pages/api-landing/page.hbs index d4919ca..011213c 100644 --- a/src/pages/api-landing/page.hbs +++ b/src/pages/api-landing/page.hbs @@ -1,6 +1,7 @@
{{> api-detail-banner }} {{> api-content }} + {{> subscription-plans }} {{> tryout-banner }} {{> community}}
\ No newline at end of file diff --git a/src/pages/api-landing/partials/api-detail-banner.hbs b/src/pages/api-landing/partials/api-detail-banner.hbs index 9a7dc55..f05c36a 100644 --- a/src/pages/api-landing/partials/api-detail-banner.hbs +++ b/src/pages/api-landing/partials/api-detail-banner.hbs @@ -25,6 +25,7 @@ {{else}} Download {{/in}} + Subscribe diff --git a/src/pages/api-landing/partials/subscription-plans.hbs b/src/pages/api-landing/partials/subscription-plans.hbs new file mode 100644 index 0000000..0aec0ed --- /dev/null +++ b/src/pages/api-landing/partials/subscription-plans.hbs @@ -0,0 +1,21 @@ +
+
+
+

Available Subscription Plans

+
+
+ {{#each subscriptionPlans}} +
+
+
+
{{name}}
+

Tier plan: {{tierPlan}}

+

{{description}}

+ Subscribe +
+
+
+ {{/each}} +
+
\ No newline at end of file diff --git a/src/partials/footer.hbs b/src/partials/footer.hbs index 4811011..e5eb020 100644 --- a/src/partials/footer.hbs +++ b/src/partials/footer.hbs @@ -1,4 +1,4 @@ - +