add route and service to download the document

This commit is contained in:
Loïs Mansot 2023-09-22 17:57:16 +02:00
parent 554819b0f8
commit fa5cd62bd0
No known key found for this signature in database
GPG Key ID: 8CF1F4150DDA726D
2 changed files with 76 additions and 1 deletions

View File

@ -17,6 +17,52 @@ export default class OfficeFoldersController extends ApiController {
super(); super();
} }
/**
* @description Download a folder anchoring proof document
*/
@Get("/api/v1/notary/anchors/download/:uid", [authHandler, ruleHandler, folderHandler])
protected async download(req: Request, response: Response) {
try {
const uid = req.params["uid"];
if (!uid) {
this.httpBadRequest(response, "No uid provided");
return;
}
const query = {
documents: {
include: {
files: true,
},
},
};
const officeFolderFound = await this.officeFoldersService.getByUid(uid, query);
if (!officeFolderFound) {
this.httpNotFoundRequest(response, "Office folder not found");
return;
}
const officeFolder = OfficeFolder.hydrate<OfficeFolder>(officeFolderFound, { strategy: "excludeAll" });
const folderHashes = getFolderHashes(officeFolder);
if (folderHashes.length === 0) {
this.httpNotFoundRequest(response, "No file hash to anchor");
return;
}
const sortedHashes = [...folderHashes].sort();
const buffer = await this.secureService.download(sortedHashes);
this.httpSuccess(response, buffer);
} catch (error) {
this.httpInternalError(response, error);
return;
}
}
/** /**
* @description Create a new folder anchor * @description Create a new folder anchor
*/ */

View File

@ -1,10 +1,12 @@
import BaseService from "@Services/BaseService"; import BaseService from "@Services/BaseService";
import { Service } from "typedi"; import { Service } from "typedi";
import { BackendVariables } from "@Common/config/variables/Variables"; import { BackendVariables } from "@Common/config/variables/Variables";
import AnchoringProofService from "@Services/common/AnchoringProofService/AnchoringProofService";
import EAnchoringStatus from "le-coffre-resources/dist/Notary/EAnchoringStatus";
@Service() @Service()
export default class SecureService extends BaseService { export default class SecureService extends BaseService {
constructor(protected variables: BackendVariables) { constructor(protected variables: BackendVariables, protected anchoringProofService: AnchoringProofService) {
super(); super();
} }
@ -56,4 +58,31 @@ export default class SecureService extends BaseService {
return await response.json(); return await response.json();
} }
/**
* @description : Download the anchoring proof document
* @throws {Error} If transaction is not verified on chain
*/
public async download(hash_sources: string[]) {
const anchor = await this.verify(hash_sources);
if (anchor.transactions.length === 0) {
throw new Error("No anchor found");
}
const transaction = anchor.transactions[0];
if (transaction.status !== EAnchoringStatus.VERIFIED_ON_CHAIN) {
throw new Error(`Transaction not verified on chain: ${transaction.status}`);
}
return this.anchoringProofService.generate({
rootHash: anchor.root_hash,
txLink: transaction.tx_link,
anchoringTime: new Date(transaction.anchoring_timestamp).toLocaleString("fr-FR", {
timeZone: "Europe/Paris",
timeZoneName: "short",
}),
});
}
} }