UNPKG

jumbo-core

Version:

Modern lightweight fast enterprise level MVW framework for Node.js

160 lines 6.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ErrorResult_1 = require("../results/ErrorResult"); if (Jumbo.config.jumboDebugMode) { console.log("[DEBUG] REQUIRE: Controller"); } let $fs, $path, fileExtensionToMimeMap; let crossRequestDataStorage = {}; const XJUMBO_REQUEST_ACTION_MAP = { "text/html": function (ctrl, viewOrData, data = null) { return ctrl.partialView(viewOrData, data); }, "text/template": function (ctrl, view) { return ctrl.template(typeof view == "string" ? view : null); }, "application/json": function (ctrl, viewOrData, data = null) { return ctrl.json(data || viewOrData || {}); }, }; const X_JUMBO_VIEW_TYPE_HEADER_PROP_NAME = "x-required-content-type"; class Controller { constructor() { this.session = {}; this.scope = null; this.exited = false; this.crossRequestData = null; } get url() { return new Jumbo.Utils.Url(this.request); } get csrfToken() { return Application_1.Application.instance.generateCsrfTokenFor(Application_1.Application.instance.getCsrfSecret(this.session)); } _initController(request, response, session, scope) { this.session = session; this.request = request; this.response = response; this.scope = scope; this.crossRequestData = {}; } _clearOldCrossRequestData() { if (!crossRequestDataStorage.hasOwnProperty(this.request.sessionId)) { return; } delete crossRequestDataStorage[this.request.sessionId]; } static createBaseViewResult(viewOrData, data) { if (typeof viewOrData == "string") { return new ViewResult_1.ViewResult(viewOrData, data || {}); } return new ViewResult_1.ViewResult(null, viewOrData || {}); } async regenerateCsrfSecret() { await Application_1.Application.instance.generateCsrfSecret(this.session); } exit() { this.exited = true; if (!this.response.response.finished) { this.response.response.end(); } } addMessage(message, messageType) { if (!crossRequestDataStorage.hasOwnProperty(this.request.sessionId) || !crossRequestDataStorage[this.request.sessionId].hasOwnProperty(Controller.clientMessagesId)) { this.crossRequestData[Controller.clientMessagesId] = []; } crossRequestDataStorage[this.request.sessionId][Controller.clientMessagesId] .push({ message: message, type: messageType }); } renderView(viewOrData, data = null) { return Controller.createBaseViewResult(viewOrData, data); } partialView(partialViewOrData = null, data = null) { let res = Controller.createBaseViewResult(partialViewOrData, data); res.partialView = true; return res; } template(view = null) { let res = Controller.createBaseViewResult(view, undefined); res.rawTemplate = true; return res; } view(viewOrData, data = null) { let reqTypeHeader = this.request.request.headers[X_JUMBO_VIEW_TYPE_HEADER_PROP_NAME]; if (reqTypeHeader) { let action = XJUMBO_REQUEST_ACTION_MAP[reqTypeHeader]; if (action) { this.response.headers["Vary"] = X_JUMBO_VIEW_TYPE_HEADER_PROP_NAME; return action(this, viewOrData, data); } } return this.renderView(viewOrData, data); } snippetView(viewOrData, dataOrSnippetName = null, snippetName = "content") { let res; if (typeof viewOrData == "string") { res = new ViewResult_1.ViewResult(viewOrData, dataOrSnippetName.constructor == Object ? dataOrSnippetName : {}); } else { res = new ViewResult_1.ViewResult(null, viewOrData.constructor == Object ? viewOrData : {}); } res.snippet = snippetName; res.partialView = true; return res; } data(data, type = "text/plain") { if (type && type.trim().length != 0) { this.response.headers["Content-Type"] = type; } this.response.headers["Content-Length"] = Buffer.byteLength(data, "utf-8"); this.response.response.writeHead(200, this.response.headers); this.response.response.end(data); this.exit(); } json(jsonObj) { this.data(JSON.stringify(jsonObj), "application/json"); this.exit(); } error(message, statusCode = 500, error = undefined) { return new ErrorResult_1.ErrorResult(message, statusCode, error); } fileDownload(filePath, newName, contentType) { this.exited = true; if (!$fs) { $fs = require("fs"); } if (!$path) { $path = require("path"); } if (!contentType && !fileExtensionToMimeMap) { fileExtensionToMimeMap = require("jumbo-core/utils/file-extension-to-mime-map"); } $fs.lstat(filePath, (error, stats) => { if (error || !stats || !stats.isFile()) { return this.error(`File '${filePath}' given for download is not valid file.`, 404); } if (!newName) { newName = $path.parse(filePath).base; } let mime = contentType || fileExtensionToMimeMap[$path.extname(filePath).slice(1)]; this.response.headers["Content-Disposition"] = "attachment; filename=" + newName; this.response.headers["Content-Type"] = mime; this.response.headers["Content-Type"] = stats.size; this.response.response.writeHead(200, this.response.headers); $fs.createReadStream(filePath).pipe(this.response.response); }); } redirect(url) { this.response.redirectUrl(url.getUrl()); this.exit(); } } Controller.clientMessagesId = "_clientMessages"; exports.Controller = Controller; const ViewResult_1 = require("jumbo-core/results/ViewResult"); const Application_1 = require("../application/Application"); if (Jumbo.config.jumboDebugMode) { console.log("[DEBUG] REQUIRE: Controller END"); } //# sourceMappingURL=Controller.js.map