From 804e47d2ddf8929504fc630813d6e1209a30cde8 Mon Sep 17 00:00:00 2001 From: Xavier Fernandez Date: Wed, 24 Jan 2024 12:08:19 -0600 Subject: [PATCH] docs(intro): Added a tech stack page --- docs/{api => backend}/_category_.json | 2 +- docs/{api => backend}/engage/_category_.json | 2 +- docs/{api => backend}/engage/addKycWallet.md | 0 .../engage/circulatingSupply.md | 0 docs/{api => backend}/engage/getKyc.md | 0 .../engage/getProposalDetails.md | 0 .../{api => backend}/engage/insertUserVote.md | 0 docs/{api => backend}/engage/listProposals.md | 0 docs/{api => backend}/engage/listVotes.md | 0 docs/{api => backend}/engage/startKyc.md | 0 .../erc20CollateralToken/_category_.json | 0 .../erc20CollateralToken/default.md | 0 docs/{api => backend}/pools/_category_.json | 0 docs/{api => backend}/pools/initiateUpload.md | 0 docs/{api => backend}/pools/insertPool.md | 0 docs/{api => backend}/pools/listPools.md | 0 docs/backend/software-development-kit.md | 4 + .../{components.md => react-components.md} | 0 docs/introduction/tech-stack.md | 52 ++++++++ docusaurus.config.js | 4 +- static/img/defactor-services.drawio | 121 ++++++++++++++++++ static/img/defactor-services.webp | Bin 0 -> 10810 bytes 22 files changed, 181 insertions(+), 4 deletions(-) rename docs/{api => backend}/_category_.json (92%) rename docs/{api => backend}/engage/_category_.json (90%) rename docs/{api => backend}/engage/addKycWallet.md (100%) rename docs/{api => backend}/engage/circulatingSupply.md (100%) rename docs/{api => backend}/engage/getKyc.md (100%) rename docs/{api => backend}/engage/getProposalDetails.md (100%) rename docs/{api => backend}/engage/insertUserVote.md (100%) rename docs/{api => backend}/engage/listProposals.md (100%) rename docs/{api => backend}/engage/listVotes.md (100%) rename docs/{api => backend}/engage/startKyc.md (100%) rename docs/{api => backend}/erc20CollateralToken/_category_.json (100%) rename docs/{api => backend}/erc20CollateralToken/default.md (100%) rename docs/{api => backend}/pools/_category_.json (100%) rename docs/{api => backend}/pools/initiateUpload.md (100%) rename docs/{api => backend}/pools/insertPool.md (100%) rename docs/{api => backend}/pools/listPools.md (100%) create mode 100644 docs/backend/software-development-kit.md rename docs/front-end-ui/{components.md => react-components.md} (100%) create mode 100644 docs/introduction/tech-stack.md create mode 100644 static/img/defactor-services.drawio create mode 100644 static/img/defactor-services.webp diff --git a/docs/api/_category_.json b/docs/backend/_category_.json similarity index 92% rename from docs/api/_category_.json rename to docs/backend/_category_.json index 4f8d7690..c38f0bff 100644 --- a/docs/api/_category_.json +++ b/docs/backend/_category_.json @@ -1,5 +1,5 @@ { - "label": "Back End API", + "label": "Back End Services", "position": 4, "link": { "type": "generated-index", diff --git a/docs/api/engage/_category_.json b/docs/backend/engage/_category_.json similarity index 90% rename from docs/api/engage/_category_.json rename to docs/backend/engage/_category_.json index 08544a43..a489e6fc 100644 --- a/docs/api/engage/_category_.json +++ b/docs/backend/engage/_category_.json @@ -1,6 +1,6 @@ { "label": "Engage", - "position": 1, + "position": 4, "link": { "type": "generated-index", "description": "Endpoints required to consume the services for the engage application." diff --git a/docs/api/engage/addKycWallet.md b/docs/backend/engage/addKycWallet.md similarity index 100% rename from docs/api/engage/addKycWallet.md rename to docs/backend/engage/addKycWallet.md diff --git a/docs/api/engage/circulatingSupply.md b/docs/backend/engage/circulatingSupply.md similarity index 100% rename from docs/api/engage/circulatingSupply.md rename to docs/backend/engage/circulatingSupply.md diff --git a/docs/api/engage/getKyc.md b/docs/backend/engage/getKyc.md similarity index 100% rename from docs/api/engage/getKyc.md rename to docs/backend/engage/getKyc.md diff --git a/docs/api/engage/getProposalDetails.md b/docs/backend/engage/getProposalDetails.md similarity index 100% rename from docs/api/engage/getProposalDetails.md rename to docs/backend/engage/getProposalDetails.md diff --git a/docs/api/engage/insertUserVote.md b/docs/backend/engage/insertUserVote.md similarity index 100% rename from docs/api/engage/insertUserVote.md rename to docs/backend/engage/insertUserVote.md diff --git a/docs/api/engage/listProposals.md b/docs/backend/engage/listProposals.md similarity index 100% rename from docs/api/engage/listProposals.md rename to docs/backend/engage/listProposals.md diff --git a/docs/api/engage/listVotes.md b/docs/backend/engage/listVotes.md similarity index 100% rename from docs/api/engage/listVotes.md rename to docs/backend/engage/listVotes.md diff --git a/docs/api/engage/startKyc.md b/docs/backend/engage/startKyc.md similarity index 100% rename from docs/api/engage/startKyc.md rename to docs/backend/engage/startKyc.md diff --git a/docs/api/erc20CollateralToken/_category_.json b/docs/backend/erc20CollateralToken/_category_.json similarity index 100% rename from docs/api/erc20CollateralToken/_category_.json rename to docs/backend/erc20CollateralToken/_category_.json diff --git a/docs/api/erc20CollateralToken/default.md b/docs/backend/erc20CollateralToken/default.md similarity index 100% rename from docs/api/erc20CollateralToken/default.md rename to docs/backend/erc20CollateralToken/default.md diff --git a/docs/api/pools/_category_.json b/docs/backend/pools/_category_.json similarity index 100% rename from docs/api/pools/_category_.json rename to docs/backend/pools/_category_.json diff --git a/docs/api/pools/initiateUpload.md b/docs/backend/pools/initiateUpload.md similarity index 100% rename from docs/api/pools/initiateUpload.md rename to docs/backend/pools/initiateUpload.md diff --git a/docs/api/pools/insertPool.md b/docs/backend/pools/insertPool.md similarity index 100% rename from docs/api/pools/insertPool.md rename to docs/backend/pools/insertPool.md diff --git a/docs/api/pools/listPools.md b/docs/backend/pools/listPools.md similarity index 100% rename from docs/api/pools/listPools.md rename to docs/backend/pools/listPools.md diff --git a/docs/backend/software-development-kit.md b/docs/backend/software-development-kit.md new file mode 100644 index 00000000..d469a81c --- /dev/null +++ b/docs/backend/software-development-kit.md @@ -0,0 +1,4 @@ +--- +title: Defactor SDK +sidebar_position: 1 +--- \ No newline at end of file diff --git a/docs/front-end-ui/components.md b/docs/front-end-ui/react-components.md similarity index 100% rename from docs/front-end-ui/components.md rename to docs/front-end-ui/react-components.md diff --git a/docs/introduction/tech-stack.md b/docs/introduction/tech-stack.md new file mode 100644 index 00000000..4790d849 --- /dev/null +++ b/docs/introduction/tech-stack.md @@ -0,0 +1,52 @@ +--- +title: Tech Stack +sidebar_position: 4 +--- + +At Defactor, we employ a sophisticated technology stack to ensure our solutions are both powerful and resilient. + +## Core Technologies + +- **EVM Blockchain Integration**: We integrate with EVM-compatible blockchains, like Polygon, to provide secure and scalable decentralized applications. +- **React**: Leveraging this library, we build dynamic user interfaces for our web applications. +- **Hasura**: Offering a real-time GraphQL API over PostgreSQL, Hasura facilitates efficient data management with built-in authorization. +- **Hapi**: This framework enables us to construct versatile applications and services with a focus on reusability. +- **Node.js**: We utilize Node.js for its efficiency in building scalable network applications. +- **Docker**: Docker's containerization technology allows us to deliver software reliably. +- **Kubernetes**: We orchestrate our containerized applications with Kubernetes, enhancing deployment and scalability. + +## Infrastructure Overview + +
+ ![Defactor Technology Stack](/img/defactor-services.webp) +
+ +## Web Application + +Our web applications are crafted using [React.js](https://reactjs.org), [Apollo Client](https://www.apollographql.com/docs/react/), [GraphQL](https://graphql.org/), and [Material UI](https://material-ui.com/) to ensure they are both robust and user-friendly. + +### UI Kit + +Our UI Kit is an open-source collection of React components designed for easy integration into Defactor front-ends. It ensures visual consistency across our tools and accelerates the development process. Access the UI Kit on our [GitHub repository](https://github.com/defactor-com/ui-kit). + +## Backend Architecture + +### Defactor SDK + +The Defactor SDK is an open-source Node.js module that standardizes backend development, promoting best practices as defined by our core team. It streamlines the creation of backend services. Visit the SDK [GitHub repository](https://github.com/defactor-com/sdk) for more details. + +### Hasura GraphQL Server + +Hasura enhances our PostgreSQL database operations with a robust GraphQL API, simplifying CRUD actions and supporting custom REST extensions for intricate business logic. + +### Hapi REST Server + +For custom RESTful needs, we rely on [hapi.dev](https://hapi.dev/) for its simplicity and efficiency in developing scalable server-side solutions. + +## EVM Blockchain Integration + +We harness the power of EVM-compatible blockchains such as [Polygon](https://polygon.technology/) to benefit from rapid transactions and minimal fees, providing a formidable foundation for our decentralized applications. + +## Kubernetes Cluster + +Our Kubernetes infrastructure guarantees service availability and resilience by isolating modules, minimizing the risk of systemic failures and optimizing for our unique operational needs. diff --git a/docusaurus.config.js b/docusaurus.config.js index a85d5e13..38f31930 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -94,12 +94,12 @@ const config = { }, { href: '/docs/category/back-end-api/', - label: 'API', + label: 'Back End', position: 'left', }, { href: '/docs/front-end-ui', - label: 'Front-End', + label: 'Front End', position: 'left', }, { diff --git a/static/img/defactor-services.drawio b/static/img/defactor-services.drawio new file mode 100644 index 00000000..9a55cbd1 --- /dev/null +++ b/static/img/defactor-services.drawio @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/img/defactor-services.webp b/static/img/defactor-services.webp new file mode 100644 index 0000000000000000000000000000000000000000..da15090a5106fc0f51d403e9805dbe264a39e6dc GIT binary patch literal 10810 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 F_&*FbN@oB7 literal 0 HcmV?d00001