burdy
Version:
Open Source Headless Platform
125 lines (124 loc) • 6.23 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = __importDefault(require("express"));
const typeorm_1 = require("typeorm");
const site_settings_model_1 = __importDefault(require("../models/site-settings.model"));
const user_model_1 = __importDefault(require("../models/user.model"));
const async_middleware_1 = __importDefault(require("../middleware/async.middleware"));
const bad_request_error_1 = __importDefault(require("../errors/bad-request-error"));
const model_1 = require("../../shared/interfaces/model");
const group_model_1 = __importDefault(require("../models/group.model"));
const validators_1 = __importDefault(require("../../shared/validators"));
const orm_helpers_1 = require("../common/orm-helpers");
const jwt_1 = require("../common/jwt");
const user_session_model_1 = __importDefault(require("../models/user-session.model"));
const server_bl_1 = require("../business-logic/server.bl");
const auth_middleware_1 = __importDefault(require("../middleware/auth.middleware"));
const path_util_1 = __importDefault(require("../../scripts/util/path.util"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const access_token_1 = __importDefault(require("../models/access-token"));
const nanoid_1 = require("nanoid");
const app = (0, express_1.default)();
app.get('/health', (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
res.send({
status: 'ok'
});
})));
app.post('/init', (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _a;
const siteSettingsRepository = (0, typeorm_1.getRepository)(site_settings_model_1.default);
const userRepository = (0, orm_helpers_1.getEnhancedRepository)(user_model_1.default);
const groupRepository = (0, typeorm_1.getRepository)(group_model_1.default);
const userSessionRepository = (0, typeorm_1.getRepository)(user_session_model_1.default);
const [initiated, userCount] = yield Promise.all([
siteSettingsRepository.findOne({ where: { key: 'initiated' } }),
userRepository.count(),
]);
if (initiated || userCount > 0)
throw new bad_request_error_1.default('site_initiated');
yield req.validate({
email: validators_1.default.email(),
password: validators_1.default.password(),
firstName: validators_1.default.firstName(),
lastName: validators_1.default.lastName(),
});
const { email, password, firstName, lastName } = req.body;
const adminGroup = yield groupRepository.findOne({
where: { name: 'Admin' },
});
let user = yield userRepository.create({
email,
firstName,
lastName,
status: model_1.UserStatus.ACTIVE,
groups: [adminGroup],
});
yield user.setPassword(password);
let siteSettings = siteSettingsRepository.create([
{ key: 'initiated', value: true },
{ key: 'adminEmail', value: email },
]);
const accessTokenRepository = (0, orm_helpers_1.getEnhancedRepository)(access_token_1.default);
yield accessTokenRepository.save({
name: (_a = req === null || req === void 0 ? void 0 : req.body) === null || _a === void 0 ? void 0 : _a.name,
token: (0, nanoid_1.nanoid)()
});
let token;
yield (0, typeorm_1.getManager)().transaction((entityManager) => __awaiter(void 0, void 0, void 0, function* () {
user = yield entityManager.save(user);
siteSettings = yield entityManager.save(siteSettings);
const userSession = yield entityManager.save(userSessionRepository.create({
user,
expiresAt: (0, jwt_1.getExpires)(),
}));
token = (0, jwt_1.sign)({
sessionId: userSession.id,
userId: user.id,
});
res.cookie('token', token, {
maxAge: (0, jwt_1.getExpires)().getTime() * 1000,
httpOnly: true,
});
}));
res.send({ user, token });
})));
app.get('/export', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _b, _c;
const include = (_c = (_b = req.query) === null || _b === void 0 ? void 0 : _b.includes) !== null && _c !== void 0 ? _c : undefined;
let includeTokens;
if (include)
includeTokens = include.split(',');
const output = path_util_1.default.burdyRoot('temp-export.zip');
yield (0, server_bl_1.exportContent)({ output, force: true, include: includeTokens });
const readStream = fs_extra_1.default.createReadStream(output);
res.attachment(`export-${new Date().toISOString()}.zip`);
res.contentType('application/zip');
readStream.on('end', () => {
res.end();
fs_extra_1.default.remove(output);
});
readStream.pipe(res);
})));
app.post('/import', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _d, _e;
yield (0, server_bl_1.importContent)({
user: (_d = req === null || req === void 0 ? void 0 : req.data) === null || _d === void 0 ? void 0 : _d.user,
options: {
force: (_e = req === null || req === void 0 ? void 0 : req.query) === null || _e === void 0 ? void 0 : _e.force,
},
});
res.send('ok');
})));
exports.default = app;