diff --git a/src/api/apim-config/content-types/apim-config/schema.json b/src/api/apim-config/content-types/apim-config/schema.json index 7e5fbcb..70128a0 100644 --- a/src/api/apim-config/content-types/apim-config/schema.json +++ b/src/api/apim-config/content-types/apim-config/schema.json @@ -41,7 +41,7 @@ "environmentId": { "type": "string" }, - "platform": { + "provider": { "type": "enumeration", "enum": [ "MuleSoft", diff --git a/src/api/apim-config/controllers/apim-config.js b/src/api/apim-config/controllers/apim-config.js index 504bd43..dec66a5 100644 --- a/src/api/apim-config/controllers/apim-config.js +++ b/src/api/apim-config/controllers/apim-config.js @@ -13,6 +13,10 @@ module.exports = createCoreController('api::apim-config.apim-config', ({strapi}) where: {slug} }) + if (!entity) { + return ctx.notFound('Configuration not found'); + } + const sanitizedEntity = await this.sanitizeOutput(entity); return this.transformResponse(sanitizedEntity); } diff --git a/src/api/library-api/content-types/library-api/schema.json b/src/api/library-api/content-types/library-api/schema.json index 304873f..835e4ef 100644 --- a/src/api/library-api/content-types/library-api/schema.json +++ b/src/api/library-api/content-types/library-api/schema.json @@ -20,6 +20,9 @@ "slug": { "type": "uid" }, + "provider": { + "type": "string" + }, "description": { "type": "text" }, @@ -50,13 +53,19 @@ }, "openDocType": { "type": "enumeration", - "enum": ["api", "asyncapi"], + "enum": [ + "api", + "asyncapi" + ], "required": true, "default": "api" }, "openDocFormat": { "type": "enumeration", - "enum": ["json", "yaml"], + "enum": [ + "json", + "yaml" + ], "required": true, "default": "json" }, @@ -108,4 +117,4 @@ ] } } -} +} \ No newline at end of file diff --git a/src/api/library-api/controllers/library-api.js b/src/api/library-api/controllers/library-api.js index 042f701..7574a28 100644 --- a/src/api/library-api/controllers/library-api.js +++ b/src/api/library-api/controllers/library-api.js @@ -44,24 +44,13 @@ module.exports = createCoreController('api::library-api.library-api', ({ strapi return response; }, + async find(ctx) { + await strapi.service('api::library-api.library-api').syncFromIntegrator(); + return await super.find(ctx); + }, + async findOne(ctx) { const response = await super.findOne(ctx); - - const entity = response?.data; - const attrs = entity?.attributes; - - if (attrs?.openDoc && attrs?.openDocFormat) { - try { - attrs.openDocParsed = parseOpenDoc( - attrs.openDoc, - attrs.openDocFormat - ); - } catch (err) { - attrs.openDocParsed = null; - attrs.openDocParseError = err.message; - } - } - return response; }, }) diff --git a/src/api/library-api/services/library-api.js b/src/api/library-api/services/library-api.js index c7030eb..bf51cb2 100644 --- a/src/api/library-api/services/library-api.js +++ b/src/api/library-api/services/library-api.js @@ -1,2 +1,53 @@ +'use strict'; + const { createCoreService } = require('@strapi/strapi').factories; -module.exports = createCoreService('api::library-api.library-api') \ No newline at end of file +const axios = require('axios'); + +module.exports = createCoreService('api::library-api.library-api', ({ strapi }) => ({ + async syncFromIntegrator() { + const configs = await strapi.db.query('api::apim-config.apim-config').findMany({ + where: { active: true } + }); + + const integratorUrl = process.env.INTEGRATOR_URL; + const integratorApiKey = process.env.INTEGRATOR_KONG_API_KEY; + + for (const config of configs) { + try { + const response = await axios.get(`${integratorUrl}/list-apis`, { + headers: { + 'x-apimanager-id': config.provider, + 'apiKey': integratorApiKey + } + }); + + const externalApis = response.data; + + for (const api of externalApis) { + const existing = await strapi.db.query('api::library-api.library-api').findOne({ + where: { slug: api.slug } + }); + + const data = { + ...api, + provider: config.provider, + publishedAt: new Date(), + }; + + if (existing) { + await strapi.db.query('api::library-api.library-api').update({ + where: { id: existing.id }, + data + }); + } else { + await strapi.db.query('api::library-api.library-api').create({ + data + }); + } + } + } catch (error) { + strapi.log.error(`Error ${config.provider}: ${error.message}`); + } + } + } +})); \ No newline at end of file diff --git a/src/extensions/documentation/documentation/1.0.0/full_documentation.json b/src/extensions/documentation/documentation/1.0.0/full_documentation.json index 3ecd12d..d90085a 100644 --- a/src/extensions/documentation/documentation/1.0.0/full_documentation.json +++ b/src/extensions/documentation/documentation/1.0.0/full_documentation.json @@ -6133,6 +6133,9 @@ "slug": { "type": "string" }, + "provider": { + "type": "string" + }, "description": { "type": "string" }, @@ -7589,6 +7592,9 @@ "slug": { "type": "string" }, + "provider": { + "type": "string" + }, "description": { "type": "string" }, @@ -7796,6 +7802,9 @@ "slug": { "type": "string" }, + "provider": { + "type": "string" + }, "description": { "type": "string" }, @@ -8738,6 +8747,9 @@ "slug": { "type": "string" }, + "provider": { + "type": "string" + }, "description": { "type": "string" }, diff --git a/types/generated/contentTypes.d.ts b/types/generated/contentTypes.d.ts index 307c8fa..bf6cfc5 100644 --- a/types/generated/contentTypes.d.ts +++ b/types/generated/contentTypes.d.ts @@ -458,7 +458,7 @@ export interface ApiApimConfigApimConfig extends Struct.CollectionTypeSchema { Schema.Attribute.Private; name: Schema.Attribute.String; organizationId: Schema.Attribute.String; - platform: Schema.Attribute.Enumeration<['MuleSoft', 'Azure']> & + provider: Schema.Attribute.Enumeration<['MuleSoft', 'Azure']> & Schema.Attribute.Required & Schema.Attribute.DefaultTo<'MuleSoft'>; publishedAt: Schema.Attribute.DateTime; @@ -649,6 +649,7 @@ export interface ApiLibraryApiLibraryApi extends Struct.CollectionTypeSchema { Schema.Attribute.DefaultTo<'api'>; openDocUrl: Schema.Attribute.String; products: Schema.Attribute.Relation<'manyToMany', 'api::product.product'>; + provider: Schema.Attribute.String; publish: Schema.Attribute.Enumeration<['publicado', 'noPublicado']>; publishedAt: Schema.Attribute.DateTime; qualityRating: Schema.Attribute.Enumeration<['A', 'B', 'C', 'D', 'E']>;