diff --git a/README.md b/README.md index ddda82a..6170ea1 100644 --- a/README.md +++ b/README.md @@ -14,16 +14,55 @@ The purpose of this service is to provide a [Universal Registrar driver](https:/ - `/create` - `/update` +- `/deactivate` +- `/create-resource` - `/api-docs` ## 🧑‍💻🛠 Developer Guide ### Setup -To build and run in Docker, use the [Dockerfile](Dockerfile) provided. +#### Environment variable configuration + +Environment variables needed for the Registrar are + +1. `FEE_PAYER_TESTNET_MNEMONIC` : The cosmos payer mnemonic for the Cheqd Mainnet +2. `FEE_PAYER_MAINNET_MNEMONIC` : The cosmos payer mnemonic for the Cheqd Tesnet, By default it's the Testnet Faucet +3. `LOCAL_STORE_TTL` (default: `600`): The time in seconds for the registrar to store data in cache +4. `PORT` (default: `3000`): The port number + + +Clone the repository + +```bash +git clone git@github.com:cheqd/did-registrar.git +cd did-registrar +``` + +*** + +### Running a DID Registrar Using Docker + +Build Docker container image using Dockerfile: + +```bash +docker build --target cheqd-did-registrar . --tag did-registrar:local +``` + +Run the Docker container (modify according to your own build tags and other desired parameters): + +```bash +docker run -it did-registrar:local +``` + +*** + +### Running a DID Registrar Locally ```bash -docker build -t cheqd-did-registrar . +npm install +npm run build +npm start ``` ## 🐞 Bug reports & 🤔 feature requests diff --git a/src/app.ts b/src/app.ts index 3a14356..0ea2907 100644 --- a/src/app.ts +++ b/src/app.ts @@ -32,10 +32,10 @@ class App { app.get('/', (req, res) => res.redirect('api-docs')) // did-registrar - app.post(`${URL_PREFIX}/create`, DidController.didDocValidator, new DidController().create) - app.post(`${URL_PREFIX}/update`, DidController.updateValidator, DidController.didDocValidator, new DidController().update) - app.post(`${URL_PREFIX}/deactivate`, DidController.deactivateValidator, new DidController().deactivate) - app.post(`${URL_PREFIX}/:did/create-resource`, ResourceController.createValidator, new ResourceController().create) + app.post(`${URL_PREFIX}/create`, DidController.createValidator, DidController.commonValidator, new DidController().create) + app.post(`${URL_PREFIX}/update`, DidController.updateValidator, DidController.commonValidator, new DidController().update) + app.post(`${URL_PREFIX}/deactivate`, DidController.deactivateValidator, DidController.commonValidator, new DidController().deactivate) + app.post(`${URL_PREFIX}/:did/create-resource`, ResourceController.createValidator, DidController.commonValidator, new ResourceController().create) // cheqd-helpers app.get(`${URL_PREFIX}/key-pair`, new CheqdController().generateKeys) diff --git a/src/controllers/did.ts b/src/controllers/did.ts index 2ade458..ae03a19 100644 --- a/src/controllers/did.ts +++ b/src/controllers/did.ts @@ -15,14 +15,17 @@ import { LocalStore } from './store' export class DidController { - public static didDocValidator = [ + public static createValidator = [ check('didDocument').custom((value, {req})=>{ if(!req.body.jobId && value) { const {valid} = validateSpecCompliantPayload(value) return valid } return true - }).withMessage(Messages.InvalidDidDocument), + }).withMessage(Messages.InvalidDidDocument) + ] + + public static commonValidator = [ check('options.versionId').optional().isString().withMessage(Messages.InvalidOptions), check('secret.signingResponse').optional().isArray().withMessage(Messages.InvalidSecret), check('secret.signingResponse.*.signature').isString().withMessage(Messages.InvalidSecret), @@ -30,6 +33,10 @@ export class DidController { ] public static updateValidator = [ + check('didDocument').optional().isArray().custom((value, {req})=>{ + const {valid} = validateSpecCompliantPayload(value[0]) + return valid + }).withMessage(Messages.InvalidDidDocument), check('jobId').custom((value, {req})=>value || (req.body.did && req.body.didDocument)).withMessage(Messages.Invalid), check('did').optional().isString().withMessage(Messages.InvalidDid).contains('did:cheqd:').withMessage(Messages.InvalidDid), check('didDocumentOperation').optional().isArray().custom((value) => value[0] === DidDocumentOperation.Set && value.length == 1 ).withMessage('Only Set operation is supported') diff --git a/src/controllers/store.ts b/src/controllers/store.ts index 37c58eb..4b6653f 100644 --- a/src/controllers/store.ts +++ b/src/controllers/store.ts @@ -2,9 +2,16 @@ import { DIDDocument } from '@cheqd/sdk/build/types'; import { MsgCreateResourcePayload } from '@cheqd/ts-proto/cheqd/resource/v2'; import NodeCache from 'node-cache' +import * as dotenv from 'dotenv' import { IState } from '../types/types'; +dotenv.config() + +let { + LOCAL_STORE_TTL +} = process.env + export class LocalStore { private cache: NodeCache @@ -15,7 +22,7 @@ export class LocalStore { } setItem(key: string, data: IDidDocData) { - this.cache.set(key, data, 600) + this.cache.set(key, data, LOCAL_STORE_TTL || 600) } getItem(key: string) { @@ -23,7 +30,7 @@ export class LocalStore { } setResource(key: string, data: IResourceData) { - this.cache.set(key, data, 600) + this.cache.set(key, data, LOCAL_STORE_TTL || 600) } getResource(key: string) { diff --git a/src/types/environment.d.ts b/src/types/environment.d.ts index 71b419a..fd12bfb 100644 --- a/src/types/environment.d.ts +++ b/src/types/environment.d.ts @@ -3,6 +3,8 @@ declare global { interface ProcessEnv { FEE_PAYER_TESTNET_MNEMONIC: string FEE_PAYER_MAINNET_MNEMONIC: string + LOCAL_STORE_TTL: number + PORT: number } } } diff --git a/swagger.json b/swagger.json index 36a24c9..12d8cea 100644 --- a/swagger.json +++ b/swagger.json @@ -320,7 +320,7 @@ "$ref": "#/components/schemas/Options" }, "secret": { - "$ref": "#/components/schemas/SigningResponse" + "$ref": "#/components/schemas/Secret" }, "didDocument": { "$ref": "#/components/schemas/DidDocument"