UNPKG

@wbg-mde/repository

Version:

Managing all common method for file system CRUD operations.

187 lines (186 loc) 8.3 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const rest_client_1 = require("./rest.client"); const app_repo_constants_1 = require("../shared/app.repo.constants"); const app_repo_utility_1 = require("../shared/app.repo.utility"); const export_dubilncore_1 = require("../export-master/export.dubilncore"); const model_transformer_1 = require("./model.transformer"); const resource_path_1 = require("../resource-path/resource-path"); const project_configuration_1 = require("../configuration/project.configuration"); const trace_decorator_1 = require("../decorators/trace.decorator"); const path = require("path"); const fs = require("fs"); let NadaPublisher = class NadaPublisher { constructor(config) { this.transformer = new model_transformer_1.ModelTransformer(); this.restClient = new rest_client_1.RestClient(config); this.exportDblCore = new export_dubilncore_1.ExportDublinCore(); this.resourcePath = new resource_path_1.ResourcePath(); } publish(studyType, nadaConfig, project, extResources, callback) { const [survey, extRes, extFiles] = nadaConfig.selected; let mappingFile = path.join(project_configuration_1.configuaration.masterDataPath, app_repo_constants_1.App_Repository_Constants.modelMappingPath, `${studyType.toLowerCase()}_mapping.json`); let appConfig = app_repo_utility_1.App_Repository_Utility.getAppConfig(); const { idKey, endpoint } = appConfig.datatypes.find((x) => x.type === studyType); let study = this.transformer.transformMetadata(mappingFile, project.metadata); let IDNO = this.getIDNumber(study, idKey); this.publishStudy(IDNO, endpoint || studyType, study, nadaConfig.projectMetadata, survey, (resp) => { if (resp.status && resp.status === 'success') { if (extResources.length > 0) { this.publishExtResrc(IDNO, project, extResources, extRes, (extRsrcResp) => { if (extRsrcResp.status === 'success') { if (extFiles && nadaConfig.dataFiles && nadaConfig.dataFiles.length > 0) { let filePaths = extResources.filter((extResrc) => { return (extResrc.resDscr && extResrc.resDscr.resDscr && extResrc.resDscr.resDscr.resource && nadaConfig.dataFiles.indexOf(extResrc.resDscr.resId) !== -1); }).map((resource) => resource.resDscr.resDscr.resource); this.uploadExtFiles(IDNO, filePaths, 0, (uplFileResp) => { callback({ data: uplFileResp }); }); } else { callback({ data: extRsrcResp }); } } else { callback({ data: extRsrcResp }); } }); } else { callback({ data: resp }); } } else { callback({ data: resp }); } }); } publishStudy(IDNO, type, study, params, includeStudy, callback) { if (includeStudy) { params = this.reduceParams(params); study = Object.assign(study, params); let args = { endPoint: 'project', path: { IDNO, type }, options: { body: study, json: true } }; let self = this; this.restClient.getResponse(args, function (response) { callback(self.formatClientResponse(response)); }); } else { callback({ status: 'success' }); } } publishExtResrc(IDNO, project, extResources, includeExtRes, callback) { if (includeExtRes) { let tempExtFilePath = path.join(this.resourcePath.getTempDirectory(), app_repo_constants_1.App_Repository_Constants.tempFolder.publishStdy, `${project._id}.rdf`); this.exportDblCore.exportResourceDescription(tempExtFilePath, project, extResources, (resp) => { if (resp.result === 'ok') { let args = { endPoint: 'external_resources', path: { IDNO }, options: { formData: { file: fs.createReadStream(tempExtFilePath) } } }; let self = this; this.restClient.getResponse(args, function (response) { fs.unlinkSync(tempExtFilePath); callback(self.formatClientResponse(response)); }); } else { callback({ status: 'error', message: `error occured while publishing external resources` }); } }); } else { callback({ status: 'success' }); } } uploadExtFiles(IDNO, filepaths, index, callback) { let filepath = filepaths[index]; let self = this; if (fs.existsSync(filepath)) { let args = { endPoint: 'files', path: { IDNO }, options: { formData: { file: fs.createReadStream(filepath) } } }; self.restClient.getResponse(args, function (response) { index += 1; if (index < filepaths.length) { self.uploadExtFiles(IDNO, filepaths, index, callback); } else { callback(self.formatClientResponse(response)); } }); } else { callback({ status: 'error', message: `file not found ${filepath}` }); } } reduceParams(config) { return config.reduce((props, param) => { props[param.key] = param.value; return props; }, {}); } getIDNumber(metadata, idKey) { if (idKey) { return app_repo_utility_1.App_Repository_Utility.getNestedProperty(metadata, idKey); } else { return 'IDNO'; } } formatClientResponse(resp) { if (resp.body) { if (resp.body instanceof Object) { return resp.body; } else { try { resp.body = JSON.parse(resp.body); if (resp.body instanceof Object) { return resp.body; } else { return { status: 'error', message: resp.body }; } } catch (e) { return { status: 'error', message: resp.body }; } } } else { return { status: 'error', message: 'API error response' }; } } }; NadaPublisher = __decorate([ trace_decorator_1.Trace() ], NadaPublisher); exports.NadaPublisher = NadaPublisher;