From 02e5fb1c0e3a27b4ac1995c2eafb7eca177df2c5 Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Thu, 28 Jan 2021 07:41:51 -0300 Subject: [PATCH 1/4] add CODE_OF_CONDUCT and API Definition --- CODE_OF_CONDUCT.md | 52 ++++ README.md | 18 +- api/package-lock.json | 15 +- api/package.json | 1 + api/routes/explorer.js | 2 +- api/routes/explorerApiDocumentation.js | 255 ++++++++++++++++++ api/routes/index.js | 5 +- assets/swagger.png | Bin 0 -> 44685 bytes .../components/common/NodeButton/index.tsx | 15 +- 9 files changed, 343 insertions(+), 20 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 api/routes/explorerApiDocumentation.js create mode 100644 assets/swagger.png diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..186cbf2 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,52 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +### Facilitation, Not Strongarming + +We recognise that this software is merely a tool for users to create and maintain their blockchain of preference. We see that blockchains are naturally community platforms with users being the ultimate decision makers. We assert that good software will maximise user agency by facilitate user-expression on the network. As such: + +* This project will strive to give users as much choice as is both reasonable and possible over what protocol they adhere to; but +* use of the project's technical forums, commenting systems, pull requests and issue trackers as a means to express individual protocol preferences is forbidden. + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at . The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://contributor-covenant.org/version/1/4 + +[homepage]: https://contributor-covenant.org \ No newline at end of file diff --git a/README.md b/README.md index e045556..224aeca 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Mempool Explorer allow users to monitor pending transactions on [Polkadot](https ## Demo -[https://mempool.dot.protofire.io](https://mempool.dot.protofire.io) +[mempool.dot.protofire.io](https://mempool.dot.protofire.io) ## Custom Polkadot Node @@ -30,7 +30,7 @@ In the project directory, you can run: ### `npm start:dev` Runs the docker containers in the development mode.\ -Open [http://localhost:8084](http://localhost:8084) to view it in the browser. +Open [localhost:8084](http://localhost:8084) to view it in the browser. The page will reload if you make edits.\ You will also see any lint errors in the console. @@ -83,6 +83,18 @@ Displays log output from custom `polkadot-westend` service. Displays log output from custom `polkadot-main` service. +## Mempool Explorer API Definition + +

+ +You can read more about the API Definition [here](https://mempool.dot.protofire.io/api/v1/api-docs). + +## Contributing + +### Code of Conduct + +[Code of Conduct](CODE_OF_CONDUCT.md) + ## License -Mempool Explorer is [Apache 2.0 licensed](LICENSE). \ No newline at end of file +Mempool Explorer is [Apache 2.0 licensed](LICENSE). diff --git a/api/package-lock.json b/api/package-lock.json index bac6a81..d65113d 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.0.0", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -3918,6 +3918,19 @@ "has-flag": "^3.0.0" } }, + "swagger-ui-dist": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.40.0.tgz", + "integrity": "sha512-R0eaS61/cOE6wiFOY7AtmoTBV5lZqmyosuE14G9nAudp5MNsNfCTdI9MWJLs8iF28HXdtH8EACiFFtUbQomHog==" + }, + "swagger-ui-express": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.6.tgz", + "integrity": "sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==", + "requires": { + "swagger-ui-dist": "^3.18.1" + } + }, "table": { "version": "6.0.7", "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", diff --git a/api/package.json b/api/package.json index 83375fa..4a99fe3 100644 --- a/api/package.json +++ b/api/package.json @@ -25,6 +25,7 @@ "moment": "^2.29.1", "pino": "^6.8.0", "pino-http": "^5.3.0", + "swagger-ui-express": "^4.1.6", "uuid": "^8.3.2" }, "devDependencies": { diff --git a/api/routes/explorer.js b/api/routes/explorer.js index 4529566..e42abf2 100644 --- a/api/routes/explorer.js +++ b/api/routes/explorer.js @@ -32,7 +32,7 @@ router.get('/networks', (req, res) => { } }); -router.get('/networks/:networkId/reset', async (req, res) => { +router.post('/networks/:networkId/reset', async (req, res) => { try { await PolkadotService.resetWatchPendingExtrinsics(req.params.networkId || ''); diff --git a/api/routes/explorerApiDocumentation.js b/api/routes/explorerApiDocumentation.js new file mode 100644 index 0000000..6525993 --- /dev/null +++ b/api/routes/explorerApiDocumentation.js @@ -0,0 +1,255 @@ +/** + * Expose OpenAPI Definition + */ +module.exports = { + openapi: '3.0.1', + info: { + title: "Polkadot Mempool Explorer API", + version: '1.0.3', + description: 'This is the definition of the `Polkadot Mempool Explorer` API.', + contact: { + name: 'Protofire Team', + email: 'hello@protofire.io', + url: 'http://protofire.io/', + }, + license: { + name: 'Apache 2.0', + url: 'https://github.com/protofire/polkadot-mempool-explorer/blob/main/LICENSE' + } + }, + servers: [ + { + url: 'https://mempool.dot.protofire.io/api/v1/mempool-explorer', + description: 'Demo server' + }, + ], + tags: [ + { + name: 'Mempool' + } + ], + paths: { + '/networks': { + get: { + tags: ['Mempool'], + description: 'Get networks', + operationId: 'getNetworks', + responses: { + '200': { + description: 'Networks were obtained', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Networks' + }, + }, + }, + }, + '500': { + description: 'The server encountered an unexpected condition.', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Error' + }, + example: { + code: 500, + type: 'Internal Server', + message: 'The server encountered an unexpected condition.' + }, + }, + }, + }, + }, + }, + }, + '/networks/{networkId}/reset': { + post: { + tags: ['Mempool'], + description: 'Reset the listener for a network id.', + operationId: 'resetNetwork', + parameters: [ + { $ref: '#/components/schemas/NetworkId' }, + ], + responses: { + '204': { + description: '204 - No Content. The action has been enacted and no further\ninformation is to be supplied\n' + }, + '500': { + description: 'The server encountered an unexpected condition.', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Error' + }, + example: { + code: 500, + type: 'Internal Server', + message: 'The server encountered an unexpected condition.' + }, + }, + }, + }, + } + } + }, + '/transactions/{networkId}': { + get: { + tags: ['Mempool'], + description: 'Get transactions by network id.', + operationId: 'getTransactionsByNetworkId', + parameters: [ + { $ref: '#/components/schemas/NetworkId' }, + ], + responses: { + '200': { + description: 'Transactions were obtained', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Transactions' + }, + }, + }, + }, + '500': { + description: 'The server encountered an unexpected condition.', + content: { + 'application/json': { + schema: { + $ref: '#/components/schemas/Error' + }, + example: { + code: 500, + type: 'Internal Server', + message: 'The server encountered an unexpected condition.' + }, + }, + }, + }, + }, + } + }, + }, + components: { + schemas: { + NetworkId: { + name: 'networkId', + in: 'path', + description: 'ID of the network', + schema: { + type: 'string', + }, + required: true + }, + Network: { + type: 'object', + properties: { + id: { + type: 'string', + }, + name: { + type: 'string', + }, + url: { + type: 'string', + }, + }, + }, + Networks: { + type: 'object', + properties: { + test: { + type: 'array', + items: { + $ref: '#/components/schemas/Network' + }, + }, + live: { + type: 'array', + items: { + $ref: '#/components/schemas/Network' + }, + }, + local: { + type: 'array', + items: { + $ref: '#/components/schemas/Network' + }, + }, + }, + }, + Transaction: { + type: 'object', + properties: { + hash: { + type: 'string', + }, + update_at: { + type: 'string', + }, + create_at: { + type: 'string', + }, + block_number: { + type: 'string', + }, + type: { + type: 'string', + }, + nonce: { + type: 'number', + }, + tip: { + type: 'number', + }, + balance_transfer: { + type: 'string', + }, + isValid: { + type: 'boolean', + default: false, + }, + isFinalized: { + type: 'boolean', + default: false, + }, + from: { + type: 'string', + }, + to: { + type: 'string', + }, + }, + }, + Transactions: { + type: 'object', + properties: { + items: { + type: 'array', + items: { + $ref: '#/components/schemas/Transaction' + }, + }, + _total: { + type: 'number', + }, + }, + }, + Error: { + type: 'object', + properties: { + code: { + type: 'number' + }, + type: { + type: 'string' + }, + message: { + type: 'string' + }, + } + }, + }, + }, +}; diff --git a/api/routes/index.js b/api/routes/index.js index 63366cb..2348983 100644 --- a/api/routes/index.js +++ b/api/routes/index.js @@ -6,9 +6,11 @@ const bodyParser = require('body-parser'); const compression = require('compression'); const hpp = require('hpp'); const helmet = require('helmet'); +const swaggerUi = require('swagger-ui-express'); const ping = require('./ping'); const explorer = require('./explorer'); const { NotFoundErrorResponse } = require('../http-errors'); +const explorerApiDocumentation = require('./explorerApiDocumentation'); const router = express.Router(); const notFound = new NotFoundErrorResponse(); @@ -33,8 +35,9 @@ router.use([ * Mount routes */ router.use('/', ping); +router.use('/api-docs', swaggerUi.serve, swaggerUi.setup(explorerApiDocumentation)); router.use('/mempool-explorer', explorer); -router.use('/*', (req, res) => res.send(notFound.code, notFound)); +router.use('/*', (_, res) => res.send(notFound.code, notFound)); /** * Espose API Router diff --git a/assets/swagger.png b/assets/swagger.png new file mode 100644 index 0000000000000000000000000000000000000000..8a8a43a90afbb18be543ff5faa12f2e41e6014ea GIT binary patch literal 44685 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 { {item.name} {item.url} - {index !== 0 && ( - { - e.stopPropagation() - - if (confirm(`Remove ${item.name}?`)) { - deleteNetwork(item.id) - } - }} - > - - - )} ))} , From b508cbc4e0b90c7856a793889660dfede8a2cb04 Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Thu, 28 Jan 2021 07:47:04 -0300 Subject: [PATCH 2/4] Bump --- CHANGELOG.md | 8 ++++++-- api/package.json | 2 +- package.json | 2 +- web/package.json | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af29094..c40a7e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,16 @@ # Changelog +## 1.0.3 +Published by **[jarcodallo](https://github.com/jarcodallo)** on **2021/01/28** +- [#16](https://github.com/protofire/polkadot-mempool-explorer/pull/16) Fixes on UI, API Definition and CODE_OF_CONDUCT + ## 1.0.2 Published by **[jarcodallo](https://github.com/jarcodallo)** on **2021/01/26** -- [#13](https://github.com/protofire/polkadot-mempool-explorer/pull/15) UI Fixes +- [#15](https://github.com/protofire/polkadot-mempool-explorer/pull/15) UI Fixes ## 1.0.1 Published by **[jarcodallo](https://github.com/jarcodallo)** on **2021/01/26** -- [#13](https://github.com/protofire/polkadot-mempool-explorer/pull/14) Fix extrinsic URL and added empty data component. +- [#14](https://github.com/protofire/polkadot-mempool-explorer/pull/14) Fix extrinsic URL and added empty data component. ## 1.0.0 Published by **[jarcodallo](https://github.com/jarcodallo)** on **2021/01/19** diff --git a/api/package.json b/api/package.json index 4a99fe3..d804bba 100644 --- a/api/package.json +++ b/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.0.2", + "version": "1.0.3", "engines": { "node": ">= 14.0.0" }, diff --git a/package.json b/package.json index f646777..6c34e85 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "polkadot-mempool-explorer", - "version": "1.0.2", + "version": "1.0.3", "scripts": { "start:dev": "docker-compose up -d", "down": "docker-compose down -v --rmi=local --remove-orphans", diff --git a/web/package.json b/web/package.json index ed5696e..4f3ea53 100644 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "web", - "version": "1.0.2", + "version": "1.0.3", "engines": { "node": ">= 14.0.0" }, From 71a725658f9b248abc7c76a5222cb3029fc1de32 Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Thu, 28 Jan 2021 07:48:20 -0300 Subject: [PATCH 3/4] typo --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c40a7e4..811d339 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## 1.0.3 Published by **[jarcodallo](https://github.com/jarcodallo)** on **2021/01/28** -- [#16](https://github.com/protofire/polkadot-mempool-explorer/pull/16) Fixes on UI, API Definition and CODE_OF_CONDUCT +- [#16](https://github.com/protofire/polkadot-mempool-explorer/pull/16) UI Fixes, API Definition and CODE_OF_CONDUCT ## 1.0.2 Published by **[jarcodallo](https://github.com/jarcodallo)** on **2021/01/26** From 9ed6ba07ef39eaed0a6a64d42bd42d7f6b308cc4 Mon Sep 17 00:00:00 2001 From: Jose Ramirez Date: Thu, 28 Jan 2021 07:52:59 -0300 Subject: [PATCH 4/4] update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 224aeca..f9cf9cb 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,9 @@ In order to track extrinsics lifecycle. We added a new RPC method ([author_track This basically allows someone to subscribe and track status changes in the extrinsics lifecycle, for example movements getting in or out of queues, and everything that matters for us before including those extrinsics in blocks. - - Substrate change: https://github.com/jarcodallo/substrate/commits/master - - Polkadot dependencies update: https://github.com/jarcodallo/polkadot/commits/master - - Docker image of the polkadot binary: https://hub.docker.com/repository/docker/jarcodallo/polkadot + - Substrate change: [github.com/paritytech/substrate](https://github.com/jarcodallo/substrate/commits/master) + - Polkadot dependencies update: [github.com/paritytech/polkadot](https://github.com/jarcodallo/polkadot/commits/master) + - Docker image of the polkadot binary: [hub.docker.com/polkadot](https://hub.docker.com/repository/docker/jarcodallo/polkadot) ## Get Started