diff --git a/package.json b/package.json index 107fe58..84a65a8 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "dotenv": "^16.0.3", "express": "^4.18.2", "moment": "^2.30.1", + "multer": "^1.4.5-lts.1", "nodemon": "^3.1.7", "pg": "^8.10.0", "reflect-metadata": "^0.2.2", @@ -30,6 +31,7 @@ "devDependencies": { "@types/cors": "^2.8.14", "@types/express": "^4.17.17", + "@types/multer": "^1.4.12", "@types/node": "^22.7.3", "@types/swagger-ui-express": "^4.1.3", "@types/uuid": "^10.0.0", diff --git a/src/controller/credential_controller.ts b/src/controller/credential_controller.ts index 72fbe5e..2e611ed 100644 --- a/src/controller/credential_controller.ts +++ b/src/controller/credential_controller.ts @@ -17,6 +17,7 @@ import { Cred } from '../entity/Cred'; import { Schema } from '../entity/Schema'; import { dataSource } from '../dbconfig'; import { extractCredentialFields } from '../utils/CredentialUtils'; +import { MulterRequest } from '../types/type'; const { CHAIN_SPACE_ID, CHAIN_SPACE_AUTH } = process.env; export async function issueVC(req: express.Request, res: express.Response) { @@ -274,19 +275,24 @@ export async function revokeCred(req: express.Request, res: express.Response) { } } + + + export async function documentHashOnChain( - req: express.Request, + req: MulterRequest, res: express.Response ) { - try { - const data = req.body; - const api = Cord.ConfigService.get('api'); - // const content: any = fs.readFileSync('./package.json'); - const content = JSON.stringify(data); - const hashFn = crypto.createHash('sha256'); - hashFn.update(content); - let digest = `0x${hashFn.digest('hex')}`; + try { +// Ensure a file is uploaded +if (!req.file) { + return res.status(400).json({ err: "No file uploaded" }); +} +const api = Cord.ConfigService.get('api'); +// Compute SHA-256 hash of the file buffer +const hashFn = crypto.createHash("sha256"); +hashFn.update(req.file.buffer); +const digest = `0x${hashFn.digest("hex")}`; const docProof = await Vc.getCordProofForDigest( digest as `0x${string}`, @@ -312,8 +318,8 @@ export async function documentHashOnChain( console.log(`✅ Statement element registered - ${statement1}`); return res.status(200).json({ result: statement1 }); - } catch (error) { + } catch (error:any) { console.log('errr: ', error); - return res.status(400).json({ err: error }); + return res.status(400).json({ err: error.message ? error.message : error }); } } diff --git a/src/index.ts b/src/index.ts index 1070326..5108b05 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,12 +11,17 @@ import { } from './controller/credential_controller'; import { generateDid, resolveDid } from './controller/did_controller'; import app from './server'; +import multer from "multer"; const { PORT } = process.env; const credentialRouter = express.Router({ mergeParams: true }); const schemaRouter = express.Router({ mergeParams: true }); const didRouter = express.Router({ mergeParams: true }); +const upload = multer({ + storage: multer.memoryStorage(), + limits: { fileSize: 3 * 1024 * 1024 }, // 3MB limit +}); credentialRouter.post('/', async (req, res) => { return await issueVC(req, res); @@ -50,7 +55,7 @@ app.use('/api/v1/schema', schemaRouter); app.use('/api/v1/cred', credentialRouter); app.use('/api/v1/did', didRouter); -app.post('/api/v1/docHash', async (req, res) => { +app.post("/api/v1/docHash", upload.single("file"), async (req, res) => { return await documentHashOnChain(req, res); }); @@ -58,6 +63,15 @@ app.get('/:id/did.json', async (req, res) => { return await resolveDid(req, res); }); +app.use((err: any, req: express.Request, res: express.Response, next: express.NextFunction) => { + if (err instanceof multer.MulterError) { + if (err.code === "LIMIT_FILE_SIZE") { + return res.status(400).json({ err: "❌ File size exceeds 3MB limit!" }); + } + } + next(err); +}); + app.get('/*', async (req, res) => { return res.json({ message: 'check https://docs.dhiway.com/api for details of the APIs', diff --git a/src/types/type.d.ts b/src/types/type.d.ts new file mode 100644 index 0000000..862c0b9 --- /dev/null +++ b/src/types/type.d.ts @@ -0,0 +1,6 @@ +import { Request } from "express"; +import { File } from "multer"; + +export interface MulterRequest extends Request { + file?: File; +} \ No newline at end of file