ckn.server
Version:
206 lines (195 loc) • 9.39 kB
JavaScript
import { ckn } from "ckn";
import { CKNFile } from "ckn.file";
import { CKNServer } from "./ckn.server.js";
import { CKNController } from "./ckn.server.controller.js";
import { CKNView } from './ckn.server.view.js';
import express from "express";
class CKNApplication {
constructor(name) {
ckn.log.info("Loading App: " + name);
this.pathPrefix = process.env.MODE == "packagedev" ? "./" : '../../';
this.name = name;
this.url = name === "main" ? "" : name;
this.physicalPath = CKNServer.directoryPath + "/"+this.pathPrefix+"apps/" + name;
this.logicalPath = this.pathPrefix + "apps/" + this.name;
this.models = [];
this.controllers = [];
this.views = [];
}
initial = async (server) => {
this.server = server;
ckn.log.info("Application(" + this.name + ") is loading..");
await this.#loadPublicFolder(server);
await this.#loadModels(server);
await this.#loadControllers(server);
await this.#loadViews(server);
ckn.log.info("Application(" + this.name + ") is loaded");
}
#loadPublicFolder = async (server) => {
ckn.log.info("Load public folder for " + this.name +".");
let publicFolder = this.physicalPath + "/public";
server.server.use("/" + this.url, express.static(publicFolder));
}
#loadModels = async (server) => {
ckn.log.info("Load models for " + this.name + ".");
let files = await CKNFile.getFiles(this.physicalPath + "/models");
for (const file of files) {
let model = await import(this.logicalPath + "/models/" + file.name);
let modelName = file.name.replace(".js", "");
ckn.log.info("Load " + this.name + " model.");
this.models[modelName] = model[modelName];
}
}
#executeMiddleWare = async (process, session) => {
let run = () => {
if (run.index == this.server.middlewares.length) {
process(session);
}
else {
run.index++;
this.server.middlewares[run.index - 1](session, run);
}
}
run.index = 0;
run();
}
#loadControllers = async (server) => {
ckn.log.info("Load controller for " + this.name);
let files = await CKNFile.getFiles(this.physicalPath + "/controllers");
for (const file of files) {
let controller = await import(this.logicalPath + "/controllers/" + file.name);
let controllerName = file.name.replace(".js", "");
controller = new controller[controllerName](controllerName);
controller.initial(server);
this.controllers[controllerName] = controller;
Object.keys(controller).forEach(key => {
if (typeof controller[key] == "object" && controller[key].process != null) {
let process = controller[key].process;
let cors = controller[key].cors;
let isPublic = controller[key].public;
let method = controller[key].method == null ? CKNController.Method.GET : controller[key].method;
let processURL = controller[key].url == null ? key : controller[key].url;
if (processURL === "default") processURL = "";
let url = (this.url === "" ? "" : "/" + this.url) + (controller.url === "" ? "" : "/" + controller.url) + (processURL === "" ? "" : "/" + processURL);
controller[key].fullURL = url;
controller[key].name = key;
ckn.log.info("Initial URL>" + method + ">" + url);
switch (method) {
case CKNController.Method.GET:
server.get(url, session => {
ckn.log.info("GET>" + url);
session.isPublic = isPublic == true;
this.#executeMiddleWare(process,session);
}, cors);
break;
case CKNController.Method.POST:
server.post(url, session => {
ckn.log.info("POST>" + url);
session.isPublic = isPublic == true;
this.#executeMiddleWare(process,session);
}, cors);
break;
case CKNController.Method.PATCH:
server.patch(url, session => {
ckn.log.info("PATCH>" + url);
session.isPublic = isPublic == true;
this.#executeMiddleWare(process,session);
}, cors);
break;
case CKNController.Method.PUT:
server.put(url, session => {
ckn.log.info("PUT>" + url);
session.isPublic = isPublic == true;
this.#executeMiddleWare(process,session);
}, cors);
break;
case CKNController.Method.DELETE:
server.delete(url, session => {
ckn.log.info("DELETE>" + url);
session.isPublic = isPublic == true;
this.#executeMiddleWare(process,session);
}, cors);
break;
}
}
});
}
}
#loadViews = async (server) => {
// For EJS View
ckn.log.info("Load views for " + this.name);
this.views.push(this.physicalPath + "/views");
// For ckn.view
let files = await CKNFile.getFiles(this.physicalPath + "/views");
files = files.where(file => file.name.toLowerCase().endsWith(".cknview"));
for (const file of files) {
console.log(file)
let fileName = file.name;
let tagName = fileName.replaceAll(".cknview", "");
tagName = tagName.replaceAll(".","");
let viewFile = new CKNFile(this.physicalPath + "/views/" + fileName);
let viewContent = await viewFile.readAllText();
let component = CKNView.register(tagName, viewContent)
CKNApplication.viewComponents[tagName] = component;
}
if (CKNFile.exist(this.physicalPath + "/components")) {
let files = await CKNFile.getFiles(this.physicalPath + "/components", true);
files = files.where(file => file.name.toLowerCase().endsWith(".cknview"));
for (const file of files) {
console.log(file)
let fileName = file.name;
let tagName = fileName.replaceAll(".cknview", "");
tagName = tagName.replaceAll(".","");
let viewFile = file;//new CKNFile(this.physicalPath + "/components/" + fileName);
let viewContent = await viewFile.readAllText();
let component = CKNView.register(tagName, viewContent)
CKNApplication.viewComponents[tagName] = component;
}
}
for (const file of files) {
console.log(file)
let fileName = file.name;
let tagName = fileName.replaceAll(".cknview", "");
tagName = tagName.replaceAll(".","");
let viewFile = file;//new CKNFile(this.physicalPath + "/views/" + fileName);
let viewContent = await viewFile.readAllText();
let component = CKNView.register(tagName, viewContent)
CKNApplication.viewComponents[tagName] = component;
}
for (const tagName of Object.keys(CKNApplication.viewComponents)) {
server.get("/ckn.server/components/"+tagName + ".js", session => {
ckn.log.info("GET> " + tagName + ".js");
session.response.type(".js").send(CKNApplication.viewComponents[tagName].script);
}, () => {
return {
origin: '*'
}
});
server.get("/ckn.server/components/"+tagName + ".html", session => {
ckn.log.info("GET> " + tagName + ".html");
session.response.type(".html").send(CKNApplication.viewComponents[tagName].template);
}, () => {
return {
origin: '*'
}
});
server.get("/ckn.server/components/"+tagName + ".css", session => {
ckn.log.info("GET> " + tagName + ".css");
session.response.type(".css").send(CKNApplication.viewComponents[tagName].style);
}, () => {
return {
origin: '*'
}
});
}
server.get("/ckn.server/components", session => {
let obj = [];
for (let key of Object.keys(CKNApplication.viewComponents)) {
obj.push(key);
}
session.send(obj);
});
}
}
CKNApplication.viewComponents = {};
export { CKNApplication }