0.0.1 • Published 4 years ago

@aragon/court-backend-server v0.0.1

Weekly downloads
1
License
(GPL-3.0-or-later...
Repository
-
Last release
4 years ago

Court Backend server

This server aims to provide different kind of services to complement the logic implemented at the smart contracts level.

Setup

First clone this repo and install dependencies:

git clone https://github.com/aragonone/court-backend/
cd court-backend
npm i
npx lerna bootstrap
cd packages/server

To run the server simply create your own .env file, feel free to follow the template provided in .env.sample. Once you have done that, spin up a docker container with:

docker-compose up -d

If you had run it before, make sure to remove it first:

docker-compose down

and simply run the following commands:

npx sequelize db:create
npx sequelize db:migrate
npx sequelize db:seed:all
npm start

Remember to append NODE_ENV=production if needed.

Endpoints

All the provided endpoints are Content-Type: application/json

1. Subscriptions

1.1. Create

  • URL: /subscriptions
  • Method: POST
  • Body:
    • email: Email address, string mandatory
    • address: Ethereum address, string not mandatory
  • Response:
    • Code: 200
    • Content example:
        {
          "id": 4,
          "email": "bla@gmail.com",
          "address": "0xd5931f0a36FE76845a5330f6D0cd7a378401e34d",
          "updatedAt":"2019-12-19T16:00:18.208Z",
          "createdAt":"2019-12-19T16:00:18.208Z"
        }

1.2. All

  • URL: /subscriptions
  • Method: GET
  • Query:
    • token: JSON web token
    • limit: Number of items to be fetched
    • page: Page number to be used for the items to be fetched based on the limit requested
  • Response:
    • Code: 200
    • Content example:
        {
          "subscriptions":[
            {
              "id": 9,
              "email": "juan@aragon.one",
              "address": "0xd5931f0a36FE76845a5330f6D0cd7a378401",
              "createdAt": "2019-12-25T14:58:58.705Z",
              "updatedAt":"2019-12-25T14:58:58.705Z"
            },
            {
              "id": 8,
              "email": "delfi@aragon.one",
              "address": "0xd5931f0a36FE76845a5330f6D0cd7a378401",
              "createdAt": "2019-12-25T14:58:52.433Z",
              "updatedAt": "2019-12-25T14:58:52.433Z"
            }
          ],
          "total": 9
        }

2. Reveals

2.1. Create

  • URL: /reveals
  • Method: POST
  • Body:
    • juror: Ethereum address of the juror requesting for the reveal
    • voteId: Vote ID to be revealed for the given juror
    • outcome: Outcome voted in favor of
    • salt: Salt used for the committed vote to be revealed
  • Response:
    • Code: 200
    • Content example:
        {
          "reveal": {
            "id": 1,
            "juror": "0xd5931f0a36FE76845a5330f6D0cd7a378401",
            "voteId": "0", 
            "disputeId": "0", 
            "roundNumber": "0",
            "createdAt": "2019-12-25T14:58:58.705Z",
            "updatedAt":"2019-12-25T14:58:58.705Z"
          }
        }

2.2. Show

  • URL: /reveal
  • Method: GET
  • Body:
    • juror: Ethereum address of the juror requesting for the reveal
    • voteId: Vote ID to be revealed for the given juror
  • Response:
    • Code: 200
    • Content example:
        {
          "reveal": {
            "id": 1,
            "juror": "0xd5931f0a36FE76845a5330f6D0cd7a378401",
            "voteId": "0", 
            "disputeId": "0", 
            "roundNumber": "0",
            "createdAt": "2019-12-25T14:58:58.705Z",
            "updatedAt":"2019-12-25T14:58:58.705Z"
          }
        }

2.3. All

  • URL: /reveals
  • Method: GET
  • Query:
    • token: JSON web token
    • limit: Number of items to be fetched
    • page: Page number to be used for the items to be fetched based on the limit requested
  • Response:
    • Code: 200
    • Content example:
        {
          "reveals":[
            {
              "id": 9,
              "juror": "0xd5931f0a36FE76845a5330f6D0cd7a378401",
              "voteId": "0", 
              "disputeId": "0", 
              "roundNumber": "0",
              "outcome": "4",
              "salt": "0x609a2445eb34bc29b4d87aea2cae24fba90a1583b14df2d765ae1f89d32b4beb",
              "revealed": false,
              "tries": 3,
              "errorId": 41,
              "createdAt": "2019-12-25T14:58:58.705Z",
              "updatedAt":"2019-12-25T14:58:58.705Z"
            }
          ],
          "total": 1
        }

3. Admins

3.1. Login

  • URL: /login
  • Method: POST
  • Body:
    • email: Admin email
    • password: Admin password
  • Response:
    • Code: 200
    • Content example:

        {
          "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ImZhY3VAYXJhZ29uLm9uZSIsImlhdCI6MTU3ODA4MTI5NCwiZXhwIjoxNTc4MDg0ODk0fQ.lmcJOE0eblD_maqXqyK0_H2swXnvG9lfEm1aJRGiAVw"
        }

3.2. Me

  • URL: /me
  • Method: GET
  • Query:
    • token: JSON web token
  • Response:
    • Code: 200
    • Content example:
        {
          "admin": {
            "id": 1,
            "email": "admin@aragon.one"
          }
        }

3.3. All

  • URL: /admins
  • Method: GET
  • Query:
    • token: JSON web token
    • limit: Number of items to be fetched
    • page: Page number to be used for the items to be fetched based on the limit requested
  • Response:
    • Code: 200
    • Content example:
        {
          "reveals":[
            {
              "id": 9,
              "juror": "0xd5931f0a36FE76845a5330f6D0cd7a378401",
              "voteId": "0", 
              "disputeId": "0", 
              "roundNumber": "0",
              "outcome": "4",
              "salt": "0x609a2445eb34bc29b4d87aea2cae24fba90a1583b14df2d765ae1f89d32b4beb",
              "revealed": false,
              "tries": 3,
              "createdAt": "2019-12-25T14:58:58.705Z",
              "updatedAt":"2019-12-25T14:58:58.705Z",
              "error": {
                "id": 41,
                "context": "Worker 'reveal' job #1 revealing vote ID 0 for juror 0xd5931f0a36fe76845a5330f6d0cd7a378401e34d",
                "message": "Transaction: 0x8752864b6fd59ec6365855fe17bbfc2382632e27e9d9e92e8d817e626582a757 exited with an error (status 0). Reason given: DM_INVALID_ADJUDICATION_STATE.\n     Please check that the transaction:\n     - satisfies all conditions set by Solidity `require` statements.\n     - does not trigger a Solidity `revert` statement.\n",
                "stack": "Error: Transaction: 0x8752864b6fd59ec6365855fe17bbfc2382632e27e9d9e92e8d817e626582a757 exited with an error (status 0). Reason given: DM_INVALID_ADJUDICATION_STATE.    at PromiEvent (~/court-backend/packages/shared/node_modules/@truffle/contract/lib/promievent.js:9:30)\n    at TruffleContract.reveal (~/court-backend/packages/shared/node_modules/@truffle/contract/lib/execute.js:169:26)\n    at module.exports.revealFor (~/court-backend/packages/shared/models/Court.js:261:19)\n    at process._tickCallback (internal/process/next_tick.js:68:7)",
                "createdAt": "2019-12-25T16:06:42.304Z",
                "updatedAt": "2019-12-25T16:06:42.304Z"
              }
            }
          ],
          "total": 1
        }

3.4. Create

  • URL: /admins
  • Method: POST
  • Body:
    • token: JSON web token
    • email: Admin email
    • password: Admin password
  • Response:
    • Code: 200
    • Content example:
        {
          "admin": {
            "id": 2,
            "email": "admin@aragon.one"
          }
        }

3.5. Delete

  • URL: /admins/:id
  • Method: DELETE
  • Query:
    • token: JSON web token
  • Response:
    • Code: 200
    • Content example: empty

4. Errors

4.1. Show

  • URL: /error/:id
  • Method: GET
  • Query:
    • token: JSON web token
  • Response:
    • Code: 200
    • Content example:
        {
          "error": {
            "id": 45,
            "context": "Worker 'settlements' job #2 settling dispute #0",
            "message": "fetch is not defined", 
            "stack": "ReferenceError: fetch is not defined\n    at TruffleEnvironment.query (~/court-backend/packages/shared/models/evironments/Environment.js:19:22)\n    at module.exports.getJurors (~/court-backend/packages/shared/models/Court.js:95:43)\n    at module.exports.settle (~/court-backend/packages/shared/models/Court.js:346:33)\n    at process._tickCallback (internal/process/next_tick.js:68:7)",
            "createdAt": "2019-12-27T13:09:04.204Z",
            "updatedAt": "2019-12-27T13:09:04.204Z"
          }
        }

4.2. All

  • URL: /errors
  • Method: GET
  • Query:
    • token: JSON web token
    • limit: Number of items to be fetched
    • page: Page number to be used for the items to be fetched based on the limit requested
  • Response:
    • Code: 200
    • Content example:
        {
          "errors": [
            {
              "id": 45,
              "context": "Worker 'settlements' job #2 settling dispute #0",
              "message": "fetch is not defined", 
              "stack": "ReferenceError: fetch is not defined\n    at TruffleEnvironment.query (~/court-backend/packages/shared/models/evironments/Environment.js:19:22)\n    at module.exports.getJurors (~/court-backend/packages/shared/models/Court.js:95:43)\n    at module.exports.settle (~/court-backend/packages/shared/models/Court.js:346:33)\n    at process._tickCallback (internal/process/next_tick.js:68:7)",
              "createdAt": "2019-12-27T13:09:04.204Z",
              "updatedAt": "2019-12-27T13:09:04.204Z"
            },
            {
              "id": 44,
              "context": "Worker 'settlements' job #1 settling dispute #0",
              "message": "Cannot read property 'rounds' of undefined",
              "stack": "TypeError: Cannot read property 'rounds' of undefined\n    at module.exports.getJurors (~/court-backend/packages/shared/models/Court.js:100:27)\n    at module.exports.settle (~/court-backend/packages/shared/models/Court.js:346:33)\n    at process._tickCallback (internal/process/next_tick.js:68:7)",
              "createdAt": "2019-12-27T13:00:34.091Z",
              "updatedAt": "2019-12-27T13:00:34.091Z"
            }
          ],
          "total": 45
        }