From ccf5a5557c3c9baa1f32352312deae968de19670 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Sat, 14 Oct 2023 17:06:22 +0530 Subject: [PATCH 01/12] adoptors added --- .gitignore | 1 + config/adoptors/adoptors.yml | 31 ++++++++++++++++++++++++ pages/casestudies/index.js | 46 ++++++++++++++++++++++++++++++++++++ scripts/adoptors/index.js | 25 ++++++++++++++++++++ scripts/index.js | 2 ++ 5 files changed, 105 insertions(+) create mode 100644 config/adoptors/adoptors.yml create mode 100644 scripts/adoptors/index.js diff --git a/.gitignore b/.gitignore index 97f8c2038030..0b234a0c84e1 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ node_modules out config/posts.json config/case-studies.json +config/adoptors.json public/rss.xml .env.local yarn.lock diff --git a/config/adoptors/adoptors.yml b/config/adoptors/adoptors.yml new file mode 100644 index 000000000000..836afe2f5eec --- /dev/null +++ b/config/adoptors/adoptors.yml @@ -0,0 +1,31 @@ +- companyName: Reiffeisen Bank + useCase: Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster. + resources: + videoLink: https://www.youtube.com/watch?v=_MwzLZMwFN8 + videoTitle: From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps + +- companyName: LEGO Group + useCase: Broker management, where developers do not access to the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents. + resources: + videoLink: https://www.youtube.com/watch?v=m8I0fYjx6Cc + videoTitle: Documentation as Configuration for Management of Apache Pulsar + +- companyName: LEGO Group + useCase: Define, document and distribute event-driven APIs. Ensuring consistency and governance + resources: + videoLink: https://www.youtube.com/watch?v=qjarcJQVLOg + videoTitle: Cross-Domain Events with AsyncAPI and AWS + +- companyName: Bank of New Zealand + useCase: Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs. + resources: + videoLink: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ + videoTitle: Self-service Events & Decentralised Governance with AsyncAPI :- A Real World Example + +- companyName: Zora Robotics + useCase: Documenting lot products public MQTT API and building a developers portal. + resources: + videoLink: https://www.youtube.com/watch?v=yjHgT0n2BtA + videoTitle: Buliding and managing an extensive API for Robotics and loT + docs: https://docs.zorabots.be/dev-mqtt-docs/latest/index.html + docsTitle: Buliding and managing an extensive API for Robotics and loT \ No newline at end of file diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index a4f30e5995ce..722546535c0f 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -4,6 +4,7 @@ import Paragraph from '../../components/typography/Paragraph'; import TextLink from '../../components/typography/TextLink'; import Heading from "../../components/typography/Heading"; import CaseStudiesList from "../../config/case-studies.json"; +import AdoptorsList from "../../config/adoptors.json" export default function Casestudies() { const description = @@ -41,7 +42,52 @@ export default function Casestudies() { + +
+
+ + Adoptors + + + Check out how different companies use AsyncAPI and what problems they solve. + + + Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that + writing an official case study might be time consuming and requires too much internal paper work. + Let's make sure we can atleast capture a use case that is already a great learning information for the + community. + +
+
+ +
+ + + + + + + + + + {AdoptorsList[0].map((entry, index) => ( + + + + + + ))} + +
Company nameUse CaseResources
{entry.companyName}{entry.useCase} + +
+
); } diff --git a/scripts/adoptors/index.js b/scripts/adoptors/index.js new file mode 100644 index 000000000000..d9a57a775c84 --- /dev/null +++ b/scripts/adoptors/index.js @@ -0,0 +1,25 @@ +const { readdir, writeFile, readFile } = require('fs').promises; +const { convertToJson } = require('../utils'); +const { resolve } = require('path'); + +const dirWithAdoptors = 'config/adoptors'; +module.exports = async function buildAdoptorsList() { + let files = await readdir(dirWithAdoptors); + let AdoptorsList = []; + try { + for (let file of files) { + const AdoptorsFileName = [dirWithAdoptors, file].join('/'); + const AdoptorsContent = await readFile(AdoptorsFileName, 'utf-8'); + const jsonContent = convertToJson(AdoptorsContent); + + AdoptorsList.push(jsonContent); + await writeFile( + resolve(__dirname, '../../config', 'adoptors.json'), + JSON.stringify(AdoptorsList) + ) + } + } catch (err) { + console.log(err); + throw err + } +}; \ No newline at end of file diff --git a/scripts/index.js b/scripts/index.js index 0634672c55f2..366a9796c068 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -1,6 +1,7 @@ const rssFeed = require('./build-rss'); const buildPostList = require('./build-post-list'); const buildCaseStudiesList = require('./casestudies'); +const buildAdoptorsList = require('./adoptors') async function start() { await buildPostList(); @@ -17,6 +18,7 @@ async function start() { 'jobs/rss.xml' ); await buildCaseStudiesList(); + await buildAdoptorsList(); } start(); \ No newline at end of file From fb17b2c6f0c1b9caed7180e820e52ef3fde36c66 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Mon, 16 Oct 2023 21:05:23 +0530 Subject: [PATCH 02/12] yaml and ui changes --- config/adopters.json | 1 + config/adopters/adoptors.yml | 31 +++++++++++++++++++++++++++++++ config/adoptors/adoptors.yml | 31 ------------------------------- pages/casestudies/index.js | 20 +++++++++++++------- scripts/adopters/index.js | 25 +++++++++++++++++++++++++ scripts/adoptors/index.js | 25 ------------------------- scripts/index.js | 4 ++-- 7 files changed, 72 insertions(+), 65 deletions(-) create mode 100644 config/adopters.json create mode 100644 config/adopters/adoptors.yml delete mode 100644 config/adoptors/adoptors.yml create mode 100644 scripts/adopters/index.js delete mode 100644 scripts/adoptors/index.js diff --git a/config/adopters.json b/config/adopters.json new file mode 100644 index 000000000000..ee5c28f95809 --- /dev/null +++ b/config/adopters.json @@ -0,0 +1 @@ +[[{"companyName":"Reiffeisen Bank","useCase":"Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster.","resources":[{"title":"Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps","link":"https://www.youtube.com/watch?v=_MwzLZMwFN8"}]},{"companyName":"LEGO Group","useCase":"Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents.","resources":[{"title":"Video - Documentation as Configuration for Management of Apache Pulsar","link":"https://www.youtube.com/watch?v=m8I0fYjx6Cc"}]},{"companyName":"LEGO Group","useCase":"Define, document and distribute event-driven APIs. Ensuring consistency and governance","resources":[{"title":"Video - Cross-Domain Events with AsyncAPI and AWS","link":"https://www.youtube.com/watch?v=qjarcJQVLOg"}]},{"companyName":"Bank of New Zealand","useCase":"Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs.","resources":[{"title":"Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example","link":"https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/"}]},{"companyName":"Zora Robotics","useCase":"Documenting lot products public MQTT API and building a developers portal.","resources":[{"title":"Video - Buliding and managing an extensive API for Robotics and loT","link":"https://www.youtube.com/watch?v=yjHgT0n2BtA"},{"title":"Docs - Buliding and managing an extensive API for Robotics and loT","link":"https://docs.zorabots.be/dev-mqtt-docs/latest/index.html"}]}]] \ No newline at end of file diff --git a/config/adopters/adoptors.yml b/config/adopters/adoptors.yml new file mode 100644 index 000000000000..af56cedd014a --- /dev/null +++ b/config/adopters/adoptors.yml @@ -0,0 +1,31 @@ +- companyName: Reiffeisen Bank + useCase: Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster. + resources: + - title: "Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps" + link: https://www.youtube.com/watch?v=_MwzLZMwFN8 + +- companyName: LEGO Group + useCase: Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents. + resources: + - title: "Video - Documentation as Configuration for Management of Apache Pulsar" + link: https://www.youtube.com/watch?v=m8I0fYjx6Cc + +- companyName: LEGO Group + useCase: Define, document and distribute event-driven APIs. Ensuring consistency and governance + resources: + - title: "Video - Cross-Domain Events with AsyncAPI and AWS" + link: https://www.youtube.com/watch?v=qjarcJQVLOg + +- companyName: Bank of New Zealand + useCase: Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs. + resources: + - title: "Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example" + link: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ + +- companyName: Zora Robotics + useCase: Documenting lot products public MQTT API and building a developers portal. + resources: + - title: "Video - Buliding and managing an extensive API for Robotics and loT" + link: https://www.youtube.com/watch?v=yjHgT0n2BtA + - title: "Docs - Buliding and managing an extensive API for Robotics and loT" + link: https://docs.zorabots.be/dev-mqtt-docs/latest/index.html diff --git a/config/adoptors/adoptors.yml b/config/adoptors/adoptors.yml deleted file mode 100644 index 836afe2f5eec..000000000000 --- a/config/adoptors/adoptors.yml +++ /dev/null @@ -1,31 +0,0 @@ -- companyName: Reiffeisen Bank - useCase: Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster. - resources: - videoLink: https://www.youtube.com/watch?v=_MwzLZMwFN8 - videoTitle: From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps - -- companyName: LEGO Group - useCase: Broker management, where developers do not access to the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents. - resources: - videoLink: https://www.youtube.com/watch?v=m8I0fYjx6Cc - videoTitle: Documentation as Configuration for Management of Apache Pulsar - -- companyName: LEGO Group - useCase: Define, document and distribute event-driven APIs. Ensuring consistency and governance - resources: - videoLink: https://www.youtube.com/watch?v=qjarcJQVLOg - videoTitle: Cross-Domain Events with AsyncAPI and AWS - -- companyName: Bank of New Zealand - useCase: Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs. - resources: - videoLink: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ - videoTitle: Self-service Events & Decentralised Governance with AsyncAPI :- A Real World Example - -- companyName: Zora Robotics - useCase: Documenting lot products public MQTT API and building a developers portal. - resources: - videoLink: https://www.youtube.com/watch?v=yjHgT0n2BtA - videoTitle: Buliding and managing an extensive API for Robotics and loT - docs: https://docs.zorabots.be/dev-mqtt-docs/latest/index.html - docsTitle: Buliding and managing an extensive API for Robotics and loT \ No newline at end of file diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index 722546535c0f..09e6f9dd4013 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -4,7 +4,7 @@ import Paragraph from '../../components/typography/Paragraph'; import TextLink from '../../components/typography/TextLink'; import Heading from "../../components/typography/Heading"; import CaseStudiesList from "../../config/case-studies.json"; -import AdoptorsList from "../../config/adoptors.json" +import AdoptersList from "../../config/adopters.json" export default function Casestudies() { const description = @@ -46,7 +46,7 @@ export default function Casestudies() {
- Adoptors + Adopters Check out how different companies use AsyncAPI and what problems they solve. @@ -71,23 +71,29 @@ export default function Casestudies() { - {AdoptorsList[0].map((entry, index) => ( + {AdoptersList[0].map((entry, index) => ( {entry.companyName} {entry.useCase} ))} + ); } + + diff --git a/scripts/adopters/index.js b/scripts/adopters/index.js new file mode 100644 index 000000000000..220e097966ef --- /dev/null +++ b/scripts/adopters/index.js @@ -0,0 +1,25 @@ +const { readdir, writeFile, readFile } = require('fs').promises; +const { convertToJson } = require('../utils'); +const { resolve } = require('path'); + +const dirWithAdopters = 'config/adopters'; +module.exports = async function buildAdoptersList() { + let files = await readdir(dirWithAdopters); + let AdoptersList = []; + try { + for (let file of files) { + const AdoptersFileName = [dirWithAdopters, file].join('/'); + const AdoptersContent = await readFile(AdoptersFileName, 'utf-8'); + const jsonContent = convertToJson(AdoptersContent); + + AdoptersList.push(jsonContent); + await writeFile( + resolve(__dirname, '../../config', 'adopters.json'), + JSON.stringify(AdoptersList) + ) + } + } catch (err) { + console.log(err); + throw err + } +}; \ No newline at end of file diff --git a/scripts/adoptors/index.js b/scripts/adoptors/index.js deleted file mode 100644 index d9a57a775c84..000000000000 --- a/scripts/adoptors/index.js +++ /dev/null @@ -1,25 +0,0 @@ -const { readdir, writeFile, readFile } = require('fs').promises; -const { convertToJson } = require('../utils'); -const { resolve } = require('path'); - -const dirWithAdoptors = 'config/adoptors'; -module.exports = async function buildAdoptorsList() { - let files = await readdir(dirWithAdoptors); - let AdoptorsList = []; - try { - for (let file of files) { - const AdoptorsFileName = [dirWithAdoptors, file].join('/'); - const AdoptorsContent = await readFile(AdoptorsFileName, 'utf-8'); - const jsonContent = convertToJson(AdoptorsContent); - - AdoptorsList.push(jsonContent); - await writeFile( - resolve(__dirname, '../../config', 'adoptors.json'), - JSON.stringify(AdoptorsList) - ) - } - } catch (err) { - console.log(err); - throw err - } -}; \ No newline at end of file diff --git a/scripts/index.js b/scripts/index.js index 366a9796c068..bde2c22b7e79 100644 --- a/scripts/index.js +++ b/scripts/index.js @@ -1,7 +1,7 @@ const rssFeed = require('./build-rss'); const buildPostList = require('./build-post-list'); const buildCaseStudiesList = require('./casestudies'); -const buildAdoptorsList = require('./adoptors') +const buildAdoptersList = require('./adopters') async function start() { await buildPostList(); @@ -18,7 +18,7 @@ async function start() { 'jobs/rss.xml' ); await buildCaseStudiesList(); - await buildAdoptorsList(); + await buildAdoptersList(); } start(); \ No newline at end of file From 531467dbd56461a64f962b7064ddac9896c68ecc Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Wed, 18 Oct 2023 13:40:18 +0530 Subject: [PATCH 03/12] code updated --- .gitignore | 2 +- config/adopters.json | 1 - config/adopters/adopters.yml | 1 + config/adopters/adoptors.yml | 31 ------------------------------- pages/casestudies/index.js | 4 ++-- scripts/adopters/index.js | 8 ++------ 6 files changed, 6 insertions(+), 41 deletions(-) delete mode 100644 config/adopters.json create mode 100644 config/adopters/adopters.yml delete mode 100644 config/adopters/adoptors.yml diff --git a/.gitignore b/.gitignore index 0b234a0c84e1..efdccd6316cb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ node_modules out config/posts.json config/case-studies.json -config/adoptors.json +config/adopters.json public/rss.xml .env.local yarn.lock diff --git a/config/adopters.json b/config/adopters.json deleted file mode 100644 index ee5c28f95809..000000000000 --- a/config/adopters.json +++ /dev/null @@ -1 +0,0 @@ -[[{"companyName":"Reiffeisen Bank","useCase":"Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster.","resources":[{"title":"Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps","link":"https://www.youtube.com/watch?v=_MwzLZMwFN8"}]},{"companyName":"LEGO Group","useCase":"Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents.","resources":[{"title":"Video - Documentation as Configuration for Management of Apache Pulsar","link":"https://www.youtube.com/watch?v=m8I0fYjx6Cc"}]},{"companyName":"LEGO Group","useCase":"Define, document and distribute event-driven APIs. Ensuring consistency and governance","resources":[{"title":"Video - Cross-Domain Events with AsyncAPI and AWS","link":"https://www.youtube.com/watch?v=qjarcJQVLOg"}]},{"companyName":"Bank of New Zealand","useCase":"Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs.","resources":[{"title":"Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example","link":"https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/"}]},{"companyName":"Zora Robotics","useCase":"Documenting lot products public MQTT API and building a developers portal.","resources":[{"title":"Video - Buliding and managing an extensive API for Robotics and loT","link":"https://www.youtube.com/watch?v=yjHgT0n2BtA"},{"title":"Docs - Buliding and managing an extensive API for Robotics and loT","link":"https://docs.zorabots.be/dev-mqtt-docs/latest/index.html"}]}]] \ No newline at end of file diff --git a/config/adopters/adopters.yml b/config/adopters/adopters.yml new file mode 100644 index 000000000000..672ce66dba80 --- /dev/null +++ b/config/adopters/adopters.yml @@ -0,0 +1 @@ +[{"companyName":"Reiffeisen Bank","useCase":"Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster.","resources":[{"title":"Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps","link":"https://www.youtube.com/watch?v=_MwzLZMwFN8"}]},{"companyName":"LEGO Group","useCase":"Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents.","resources":[{"title":"Video - Documentation as Configuration for Management of Apache Pulsar","link":"https://www.youtube.com/watch?v=m8I0fYjx6Cc"}]},{"companyName":"LEGO Group","useCase":"Define, document and distribute event-driven APIs. Ensuring consistency and governance","resources":[{"title":"Video - Cross-Domain Events with AsyncAPI and AWS","link":"https://www.youtube.com/watch?v=qjarcJQVLOg"}]},{"companyName":"Bank of New Zealand","useCase":"Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs.","resources":[{"title":"Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example","link":"https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/"}]},{"companyName":"Zora Robotics","useCase":"Documenting lot products public MQTT API and building a developers portal.","resources":[{"title":"Video - Buliding and managing an extensive API for Robotics and loT","link":"https://www.youtube.com/watch?v=yjHgT0n2BtA"},{"title":"Docs - Buliding and managing an extensive API for Robotics and loT","link":"https://docs.zorabots.be/dev-mqtt-docs/latest/index.html"}]}] \ No newline at end of file diff --git a/config/adopters/adoptors.yml b/config/adopters/adoptors.yml deleted file mode 100644 index af56cedd014a..000000000000 --- a/config/adopters/adoptors.yml +++ /dev/null @@ -1,31 +0,0 @@ -- companyName: Reiffeisen Bank - useCase: Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster. - resources: - - title: "Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps" - link: https://www.youtube.com/watch?v=_MwzLZMwFN8 - -- companyName: LEGO Group - useCase: Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents. - resources: - - title: "Video - Documentation as Configuration for Management of Apache Pulsar" - link: https://www.youtube.com/watch?v=m8I0fYjx6Cc - -- companyName: LEGO Group - useCase: Define, document and distribute event-driven APIs. Ensuring consistency and governance - resources: - - title: "Video - Cross-Domain Events with AsyncAPI and AWS" - link: https://www.youtube.com/watch?v=qjarcJQVLOg - -- companyName: Bank of New Zealand - useCase: Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs. - resources: - - title: "Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example" - link: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ - -- companyName: Zora Robotics - useCase: Documenting lot products public MQTT API and building a developers portal. - resources: - - title: "Video - Buliding and managing an extensive API for Robotics and loT" - link: https://www.youtube.com/watch?v=yjHgT0n2BtA - - title: "Docs - Buliding and managing an extensive API for Robotics and loT" - link: https://docs.zorabots.be/dev-mqtt-docs/latest/index.html diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index 09e6f9dd4013..aebd929c2500 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -52,9 +52,9 @@ export default function Casestudies() { Check out how different companies use AsyncAPI and what problems they solve. - Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that + Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that writing an official case study might be time consuming and requires too much internal paper work. - Let's make sure we can atleast capture a use case that is already a great learning information for the + Let's make sure we can at least capture a use case that is already a great learning information for the community.
diff --git a/scripts/adopters/index.js b/scripts/adopters/index.js index 220e097966ef..6f5ae48fc19b 100644 --- a/scripts/adopters/index.js +++ b/scripts/adopters/index.js @@ -2,14 +2,10 @@ const { readdir, writeFile, readFile } = require('fs').promises; const { convertToJson } = require('../utils'); const { resolve } = require('path'); -const dirWithAdopters = 'config/adopters'; module.exports = async function buildAdoptersList() { - let files = await readdir(dirWithAdopters); let AdoptersList = []; try { - for (let file of files) { - const AdoptersFileName = [dirWithAdopters, file].join('/'); - const AdoptersContent = await readFile(AdoptersFileName, 'utf-8'); + const AdoptersContent = await readFile('config/adopters/adopters.yml', 'utf-8'); const jsonContent = convertToJson(AdoptersContent); AdoptersList.push(jsonContent); @@ -18,7 +14,7 @@ module.exports = async function buildAdoptersList() { JSON.stringify(AdoptersList) ) } - } catch (err) { + catch (err) { console.log(err); throw err } From b0b538e939473922a50af0702dcb2d98617343fb Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Wed, 25 Oct 2023 22:02:02 +0530 Subject: [PATCH 04/12] code and data updates --- config/adopters/adopters.yml | 48 +++++++++++++++++++++++++++++++++++- pages/casestudies/index.js | 2 +- scripts/adopters/index.js | 27 +++++++++----------- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/config/adopters/adopters.yml b/config/adopters/adopters.yml index 672ce66dba80..5dae9fb1c946 100644 --- a/config/adopters/adopters.yml +++ b/config/adopters/adopters.yml @@ -1 +1,47 @@ -[{"companyName":"Reiffeisen Bank","useCase":"Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster.","resources":[{"title":"Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps","link":"https://www.youtube.com/watch?v=_MwzLZMwFN8"}]},{"companyName":"LEGO Group","useCase":"Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents.","resources":[{"title":"Video - Documentation as Configuration for Management of Apache Pulsar","link":"https://www.youtube.com/watch?v=m8I0fYjx6Cc"}]},{"companyName":"LEGO Group","useCase":"Define, document and distribute event-driven APIs. Ensuring consistency and governance","resources":[{"title":"Video - Cross-Domain Events with AsyncAPI and AWS","link":"https://www.youtube.com/watch?v=qjarcJQVLOg"}]},{"companyName":"Bank of New Zealand","useCase":"Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs.","resources":[{"title":"Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example","link":"https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/"}]},{"companyName":"Zora Robotics","useCase":"Documenting lot products public MQTT API and building a developers portal.","resources":[{"title":"Video - Buliding and managing an extensive API for Robotics and loT","link":"https://www.youtube.com/watch?v=yjHgT0n2BtA"},{"title":"Docs - Buliding and managing an extensive API for Robotics and loT","link":"https://docs.zorabots.be/dev-mqtt-docs/latest/index.html"}]}] \ No newline at end of file +- companyName: Reiffeisen Bank + useCase: Continuous Integration and Continuous Delivery (CI/CD) pipeline based on GitOps to deploy a topology built on Async API definitions using a Kubernetes operator to an Apache Pulsar cluster. + resources: + - title: Video - From an AsyncAPI Definition to a Deployed Pulsar Topology Via GitOps + link: https://www.youtube.com/watch?v=_MwzLZMwFN8 + +- companyName: LEGO Group + useCase: Broker management, where developers do not access the management console themselves, but rely on uploading AsyncAPI documents to a self service API that provisions access and topics specified in documents. + resources: + - title: Video - Documentation as Configuration for Management of Apache Pulsar + link: https://www.youtube.com/watch?v=m8I0fYjx6Cc + +- companyName: LEGO Group + useCase: Define, document and distribute event-driven APIs. Ensuring consistency and governance + resources: + - title: Video - Cross-Domain Events with AsyncAPI and AWS + link: https://www.youtube.com/watch?v=qjarcJQVLOg + +- companyName: Bank of New Zealand + useCase: Decentralized company-wide governance strategy for API. A self service for publishing APIs and docs. + resources: + - title: "Video - Self-service Events & Decentralised Governance with AsyncAPI: A Real World Example" + link: https://www.confluent.io/events/kafka-summit-apac-2021/self-service-events-and-decentralised-governance-with-asyncapi-a-real-world/ + +- companyName: Zora Robotics + useCase: Documenting lot products public MQTT API and building a developers portal. + resources: + - title: Video - Buliding and managing an extensive API for Robotics and loT + link: https://www.youtube.com/watch?v=yjHgT0n2BtA + - title: Docs - Buliding and managing an extensive API for Robotics and loT + link: https://docs.zorabots.be/dev-mqtt-docs/latest/index.html + +- companyName: Walmart + useCase: Managing a central API Hub for internal teams. Using AsyncAPI for events discoverability an visibility in a single place. AsyncAPI also enabled company-wide governance on asynchronous APIs. + resources: + - title: Video - Time For AsyncAPI Specification + link: https://www.youtube.com/watch?v=SxTpGRaNIPo + +- companyName: eBay + useCase: Enabling partners to build with eBay through asynchronous communication. Public AsyncAPI documents enable code generation and faster integration. It also enables governance and standardisation. + resources: + - title: "Video - AsyncAPI 2.0: Enabling the Event-Driven World" + link: https://www.youtube.com/watch?v=SxTpGRaNIPo + - title: "Article - AsyncAPI 2.0: Enabling the Event-Driven World" + link: https://innovation.ebayinc.com/tech/engineering/asyncapi-2-0-enabling-the-event-driven-world/ + - title: Docs - Overview of Notification API with public AsyncAPI documents + link: https://developer.ebay.com/api-docs/commerce/notification/overview.html \ No newline at end of file diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index aebd929c2500..a9736476f0ce 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -52,7 +52,7 @@ export default function Casestudies() { Check out how different companies use AsyncAPI and what problems they solve. - Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that + Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that writing an official case study might be time consuming and requires too much internal paper work. Let's make sure we can at least capture a use case that is already a great learning information for the community. diff --git a/scripts/adopters/index.js b/scripts/adopters/index.js index 6f5ae48fc19b..a1a6380f79be 100644 --- a/scripts/adopters/index.js +++ b/scripts/adopters/index.js @@ -1,21 +1,18 @@ -const { readdir, writeFile, readFile } = require('fs').promises; +const { promises: { readFile, writeFile } } = require('fs'); const { convertToJson } = require('../utils'); const { resolve } = require('path'); module.exports = async function buildAdoptersList() { - let AdoptersList = []; try { - const AdoptersContent = await readFile('config/adopters/adopters.yml', 'utf-8'); - const jsonContent = convertToJson(AdoptersContent); - - AdoptersList.push(jsonContent); - await writeFile( - resolve(__dirname, '../../config', 'adopters.json'), - JSON.stringify(AdoptersList) - ) - } - catch (err) { - console.log(err); - throw err + const AdoptersContent = await readFile('config/adopters/adopters.yml', 'utf-8'); + const jsonContent = convertToJson(AdoptersContent); + + await writeFile( + resolve(__dirname, '../../config', 'adopters.json'), + JSON.stringify([jsonContent]) + ); + } catch (err) { + console.error(err); + throw err; } -}; \ No newline at end of file +}; From 417984ca30faace90cb80167b01bd5c87a80f7b2 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Wed, 25 Oct 2023 22:15:17 +0530 Subject: [PATCH 05/12] code updates --- pages/casestudies/index.js | 2 +- scripts/adopters/index.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index a9736476f0ce..6b7ff1cb08ec 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -71,7 +71,7 @@ export default function Casestudies() { - {AdoptersList[0].map((entry, index) => ( + {AdoptersList.map((entry, index) => ( {entry.companyName} {entry.useCase} diff --git a/scripts/adopters/index.js b/scripts/adopters/index.js index a1a6380f79be..1debd00080a7 100644 --- a/scripts/adopters/index.js +++ b/scripts/adopters/index.js @@ -9,7 +9,7 @@ module.exports = async function buildAdoptersList() { await writeFile( resolve(__dirname, '../../config', 'adopters.json'), - JSON.stringify([jsonContent]) + JSON.stringify(jsonContent) ); } catch (err) { console.error(err); From 87dabc51aa55df9af11b5ebb9635a6978669bd4c Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Thu, 26 Oct 2023 22:10:54 +0530 Subject: [PATCH 06/12] path changes --- config/{adopters => }/adopters.yml | 0 scripts/adopters/index.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename config/{adopters => }/adopters.yml (100%) diff --git a/config/adopters/adopters.yml b/config/adopters.yml similarity index 100% rename from config/adopters/adopters.yml rename to config/adopters.yml diff --git a/scripts/adopters/index.js b/scripts/adopters/index.js index 1debd00080a7..0f5eeb427cf5 100644 --- a/scripts/adopters/index.js +++ b/scripts/adopters/index.js @@ -4,7 +4,7 @@ const { resolve } = require('path'); module.exports = async function buildAdoptersList() { try { - const AdoptersContent = await readFile('config/adopters/adopters.yml', 'utf-8'); + const AdoptersContent = await readFile('config/adopters.yml', 'utf-8'); const jsonContent = convertToJson(AdoptersContent); await writeFile( From 4232685d91b2f4ccc0a1fd6e31a27f9036b986f3 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Wed, 20 Dec 2023 13:06:19 +0530 Subject: [PATCH 07/12] design updates --- pages/casestudies/index.js | 93 ++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 45 deletions(-) diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index 6b7ff1cb08ec..1ecfd96247b1 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -43,55 +43,58 @@ export default function Casestudies() { />
-
-
- - Adopters - - - Check out how different companies use AsyncAPI and what problems they solve. - - - Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that - writing an official case study might be time consuming and requires too much internal paper work. - Let's make sure we can at least capture a use case that is already a great learning information for the - community. - +
+
+
+ + Adopters + + + Check out how different companies use AsyncAPI and what problems they solve. + + + Feel free to submit a pull request with information about how your company uses AsyncAPI. We know that + writing an official case study might be time consuming and requires too much internal paper work. + Let's make sure we can at least capture a use case that is already a great learning information for the + community. + +
-
-
- - - - - - - - - - {AdoptersList.map((entry, index) => ( - - - - +
+
+
Company nameUse CaseResources
{entry.companyName}{entry.useCase} - -
+ + + + + - ))} - -
Company nameUse CaseResources
- -
+ + + {AdoptersList.map((entry, index) => ( + + {entry.companyName} + {entry.useCase} + + + + + ))} + + +
+ + ); } From 0953060fd8228ccd3f9be065f8a041219e9499ba Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Wed, 20 Dec 2023 22:14:40 +0530 Subject: [PATCH 08/12] added tests --- cypress/test/components/CaseStudyCard.cy.js | 30 ++++++++++++++++++++- pages/casestudies/index.js | 2 +- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/cypress/test/components/CaseStudyCard.cy.js b/cypress/test/components/CaseStudyCard.cy.js index 2e14e4b176f0..8b987d817434 100644 --- a/cypress/test/components/CaseStudyCard.cy.js +++ b/cypress/test/components/CaseStudyCard.cy.js @@ -1,7 +1,10 @@ import React from 'react'; import { mount } from 'cypress/react'; import CaseStudyCard from '../../../components/CaseStudyCard'; -import CaseStudiesList from "../../../config/case-studies.json"; +import CaseStudiesList from '../../../config/case-studies.json'; +import AdoptersList from '../../../config/adopters.json'; +import Casestudies from '../../../pages/casestudies'; + describe('CaseStudyCard Component', () => { it('renders the CaseStudyCard component with study data', () => { @@ -20,4 +23,29 @@ describe('CaseStudyCard Component', () => { cy.get('.rounded-md').should('not.exist'); }); + + //tests for the Adopters section + it('renders the Adopters section with adopters data', () => { + mount(); + + cy.get('[data-testid="Adopters"]').should('exist'); + + AdoptersList.forEach((entry, index) => { + cy.get(`table tbody tr:eq(${index}) td:eq(0)`).should('have.text', entry.companyName); + cy.get(`table tbody tr:eq(${index}) td:eq(1)`).should('have.text', entry.useCase); + + entry.resources.forEach((resource, resourceIndex) => { + cy.get(`table tbody tr:eq(${index}) td:eq(2) ul li:eq(${resourceIndex}) a`) + .should('have.attr', 'href', resource.link) + .should('have.text', resource.title); + }); + }); + }); + + it('does not render anything when adopters array is empty', () => { + // Modify Casestudies component to pass an empty AdoptersList + mount(); + + cy.get('table tbody tr').should('not.exist'); + }); }); diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index 1ecfd96247b1..2230b06d7756 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -43,7 +43,7 @@ export default function Casestudies() { /> -
+
From 283bcc6069021fccaf8ee74b275d6c5d707de016 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Thu, 21 Dec 2023 17:40:39 +0530 Subject: [PATCH 09/12] test updaates --- cypress/test/components/CaseStudyCard.cy.js | 36 +++++++++------------ 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/cypress/test/components/CaseStudyCard.cy.js b/cypress/test/components/CaseStudyCard.cy.js index 8b987d817434..62618f31a97c 100644 --- a/cypress/test/components/CaseStudyCard.cy.js +++ b/cypress/test/components/CaseStudyCard.cy.js @@ -25,27 +25,21 @@ describe('CaseStudyCard Component', () => { }); //tests for the Adopters section - it('renders the Adopters section with adopters data', () => { - mount(); - - cy.get('[data-testid="Adopters"]').should('exist'); - - AdoptersList.forEach((entry, index) => { - cy.get(`table tbody tr:eq(${index}) td:eq(0)`).should('have.text', entry.companyName); - cy.get(`table tbody tr:eq(${index}) td:eq(1)`).should('have.text', entry.useCase); - - entry.resources.forEach((resource, resourceIndex) => { - cy.get(`table tbody tr:eq(${index}) td:eq(2) ul li:eq(${resourceIndex}) a`) - .should('have.attr', 'href', resource.link) - .should('have.text', resource.title); + it('displays a table with correct columns and AdoptersList data', () => { + cy.get('table') + .should('exist') + .within(() => { + // Check table headers + cy.get('th').eq(0).should('have.text', 'Company name'); + cy.get('th').eq(1).should('have.text', 'Use Case'); + cy.get('th').eq(2).should('have.text', 'Resources'); + + // Check table data + cy.get('tbody tr').should('have.length', AdoptersList.length); + AdoptersList.forEach((entry, index) => { + cy.get('tbody tr').eq(index).find('td').eq(0).should('have.text', entry.companyName); + cy.get('tbody tr').eq(index).find('td').eq(1).should('have.text', entry.useCase); + }); }); - }); - }); - - it('does not render anything when adopters array is empty', () => { - // Modify Casestudies component to pass an empty AdoptersList - mount(); - - cy.get('table tbody tr').should('not.exist'); }); }); From 5bf5f183e1e1eea6d9b252042dd1d685b2e80b21 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Thu, 21 Dec 2023 17:44:58 +0530 Subject: [PATCH 10/12] test updates 2 --- cypress/test/components/CaseStudyCard.cy.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cypress/test/components/CaseStudyCard.cy.js b/cypress/test/components/CaseStudyCard.cy.js index 62618f31a97c..870142c8aa80 100644 --- a/cypress/test/components/CaseStudyCard.cy.js +++ b/cypress/test/components/CaseStudyCard.cy.js @@ -26,6 +26,9 @@ describe('CaseStudyCard Component', () => { //tests for the Adopters section it('displays a table with correct columns and AdoptersList data', () => { + mount(); + cy.get('[data-testid="Adopters"]').should('have.length', AdoptersList.length); + cy.get('table') .should('exist') .within(() => { From dde0876cd5b20364b317ab7e864847578c783c04 Mon Sep 17 00:00:00 2001 From: Vishvamsinh Vaghela Date: Thu, 21 Dec 2023 17:46:07 +0530 Subject: [PATCH 11/12] test updates 3 --- cypress/test/components/CaseStudyCard.cy.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/test/components/CaseStudyCard.cy.js b/cypress/test/components/CaseStudyCard.cy.js index 870142c8aa80..6c226b0c2fe9 100644 --- a/cypress/test/components/CaseStudyCard.cy.js +++ b/cypress/test/components/CaseStudyCard.cy.js @@ -26,7 +26,7 @@ describe('CaseStudyCard Component', () => { //tests for the Adopters section it('displays a table with correct columns and AdoptersList data', () => { - mount(); + mount(); cy.get('[data-testid="Adopters"]').should('have.length', AdoptersList.length); cy.get('table') From 7f18339bb4fe44903a420067574d494210c3b42b Mon Sep 17 00:00:00 2001 From: akshatnema Date: Thu, 21 Dec 2023 19:36:23 +0530 Subject: [PATCH 12/12] correct pages/casestudies tests --- cypress/test/components/CaseStudyCard.cy.js | 22 -------------- cypress/test/pages/casestudies/index.cy.js | 33 +++++++++++++++++++-- pages/casestudies/index.js | 4 +-- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/cypress/test/components/CaseStudyCard.cy.js b/cypress/test/components/CaseStudyCard.cy.js index 6c226b0c2fe9..7fc273f8bc3a 100644 --- a/cypress/test/components/CaseStudyCard.cy.js +++ b/cypress/test/components/CaseStudyCard.cy.js @@ -23,26 +23,4 @@ describe('CaseStudyCard Component', () => { cy.get('.rounded-md').should('not.exist'); }); - - //tests for the Adopters section - it('displays a table with correct columns and AdoptersList data', () => { - mount(); - cy.get('[data-testid="Adopters"]').should('have.length', AdoptersList.length); - - cy.get('table') - .should('exist') - .within(() => { - // Check table headers - cy.get('th').eq(0).should('have.text', 'Company name'); - cy.get('th').eq(1).should('have.text', 'Use Case'); - cy.get('th').eq(2).should('have.text', 'Resources'); - - // Check table data - cy.get('tbody tr').should('have.length', AdoptersList.length); - AdoptersList.forEach((entry, index) => { - cy.get('tbody tr').eq(index).find('td').eq(0).should('have.text', entry.companyName); - cy.get('tbody tr').eq(index).find('td').eq(1).should('have.text', entry.useCase); - }); - }); - }); }); diff --git a/cypress/test/pages/casestudies/index.cy.js b/cypress/test/pages/casestudies/index.cy.js index e8907f6baad2..282ae639e059 100644 --- a/cypress/test/pages/casestudies/index.cy.js +++ b/cypress/test/pages/casestudies/index.cy.js @@ -1,6 +1,8 @@ import Casestudies from "../../../../pages/casestudies"; import MockApp from "../../../utils/MockApp"; -import {mount} from 'cypress/react'; +import { mount } from 'cypress/react'; +import AdoptersList from "../../../../config/adopters.json" + describe('Test for Case Study Pages', () => { it('renders correctly', () => { mount( @@ -8,7 +10,32 @@ describe('Test for Case Study Pages', () => { ); - cy.get('[data-testid="CaseStudy-main"]').should('exist'); - cy.get('[data-testid="CaseStudy-card"]').should('exist'); + cy.get('[data-testid="CaseStudy-main"]').should('exist'); + cy.get('[data-testid="CaseStudy-card"]').should('exist'); }); + + it('Adopters section renders correctly', () => { + mount( + + + + ); + cy.get('[data-testid="Adopters"]').should('have.length', AdoptersList.length); + + cy.get('table') + .should('exist') + .within(() => { + // Check table headers + cy.get('th').eq(0).should('have.text', 'Company name'); + cy.get('th').eq(1).should('have.text', 'Use Case'); + cy.get('th').eq(2).should('have.text', 'Resources'); + + // Check table data + cy.get('tbody tr').should('have.length', AdoptersList.length); + AdoptersList.forEach((entry, index) => { + cy.get('tbody tr').eq(index).find('td').eq(0).should('have.text', entry.companyName); + cy.get('tbody tr').eq(index).find('td').eq(1).should('have.text', entry.useCase); + }); + }); + }) }); \ No newline at end of file diff --git a/pages/casestudies/index.js b/pages/casestudies/index.js index 2230b06d7756..40fa02c1d699 100644 --- a/pages/casestudies/index.js +++ b/pages/casestudies/index.js @@ -43,7 +43,7 @@ export default function Casestudies() { />
-
+
@@ -74,7 +74,7 @@ export default function Casestudies() { {AdoptersList.map((entry, index) => ( - + {entry.companyName} {entry.useCase}