Merge branch 'master' of ssh.dev.azure.com:v3/HackKu/HackKu%202020/backend

This commit is contained in:
garrettmills 2020-02-09 01:58:46 -06:00
commit 8714ab79f1
8 changed files with 185 additions and 181 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -11,7 +11,7 @@ const path = require('path');
*/ */
class Export extends Controller { class Export extends Controller {
static get services() { static get services() {
return [...super.services, 'models'] return [...super.services, 'models', 'app']
} }
/* /*
* Serve the main page. * Serve the main page.
@ -40,11 +40,12 @@ class Export extends Controller {
const temp_dir = path.resolve(os.tmpdir(), uuid()) const temp_dir = path.resolve(os.tmpdir(), uuid())
await fs.mkdir(temp_dir) await fs.mkdir(temp_dir)
this._markdown_recurse(page0, temp_dir) await this._markdown_recurse(page0, temp_dir)
/* Archive directory */ /* Archive directory */
const exec = require('child_process').exec; const exec = require('child_process').exec;
exec('zip -r ' + path.resolve(temp_dir, 'archive.zip') + ' ' + path.resolve(temp_dir), (error) => { console.log('zip -9jpr ' + path.resolve(temp_dir, '../archive.zip') + ' ' + path.resolve(temp_dir) + '/')
exec('cd ' + path.resolve(temp_dir) + '; zip -r archive.zip *', (error) => {
if (error) { if (error) {
console.error(`exec error: ${error}`); console.error(`exec error: ${error}`);
return res.error(500); return res.error(500);
@ -56,16 +57,17 @@ class Export extends Controller {
} }
async _markdown_recurse(root, temp_dir) { //recursive function for creating directory and generating markdown pages async _markdown_recurse(root, temp_dir) { //recursive function for creating directory and generating markdown pages
console.log('root', root) const fs = require('fs').promises
const Page = this.models.get('api:Page') const Page = this.models.get('api:Page')
const child = await Page.find({ UUID: { $in: root.ChildPageIds } }) const child = await Page.find({ UUID: { $in: root.ChildPageIds } })
for (const page of child) { for (const page of child) {
const markdown = this._generate_markdown(page) const markdown = await this._generate_markdown(page)
await fs.writeFile(path.resolve(temp_dir, page.Name.replace(/\s/g, '_')) + '.md', markdown)
if (page.ChildPageIds && page.ChildPageIds.length) { if (page.ChildPageIds && page.ChildPageIds.length) {
const sub_temp_dir = path.resolve(temp_dir, page.Name.replace(/\s/g, '_')) const sub_temp_dir = path.resolve(temp_dir, page.Name.replace(/\s/g, '_'))
// console.log(sub_temp_dir)
await fs.mkdir(sub_temp_dir) await fs.mkdir(sub_temp_dir)
this._markdown_recurse(page, sub_temp_dir) await this._markdown_recurse(page, sub_temp_dir)
} }
} }
} }
@ -91,16 +93,19 @@ class Export extends Controller {
const html_name = page.Name.replace(/\s/g, '_') + '.html' const html_name = page.Name.replace(/\s/g, '_') + '.html'
mapping[page.UUID] = html_name mapping[page.UUID] = html_name
} }
const sidebar_html = this._generate_sidebar(page0) //generates the sidebar contents console.log(page0)
const sidebar_html = await this._generate_sidebar(mapping, page0) //generates the sidebar contents
const temp_dir = path.resolve(os.tmpdir(), uuid()) //make temporary directory const temp_dir = path.resolve(os.tmpdir(), uuid()) //make temporary directory
await fs.mkdir(temp_dir) await fs.mkdir(temp_dir)
/* Generates html files from template */ /* Generates html files from template */
for(const page of pages) { for (const page of pages) {
const fs = require('fs').promises const fs = require('fs').promises
const contents = await fs.readFile('../assets/export-template.html') const contents = (await fs.readFile(path.resolve(this.app.directories.assets, 'export-template.html'))).toString('utf8')
const content_html = this._generate_html(page) console.log(page)
//console.log({contents})
const content_html = await this._generate_html(page)
//console.log({content_html, sidebar_html})
const page_html = contents.replace('%%SIDEBAR%%', sidebar_html).replace('%%CONTENTS%%', content_html) const page_html = contents.replace('%%SIDEBAR%%', sidebar_html).replace('%%CONTENTS%%', content_html)
await fs.writeFile(path.resolve(temp_dir, mapping[page.UUID]), page_html) await fs.writeFile(path.resolve(temp_dir, mapping[page.UUID]), page_html)
} }
@ -112,18 +117,21 @@ class Export extends Controller {
return res.error(500); return res.error(500);
return; return;
} }
return res.sendFile(`${path.resolve(temp_dir, 'archive.zip')}`) return res.sendFile(`${path.resolve(temp_dir, 'archive.zip')}`)
}) })
} }
async _generate_sidebar(root) { //generate sidebar from mapping array and root async _generate_sidebar(mapping, upper_node) { //generate sidebar from mapping array and upper_node
if (root.ChildPageIds < 1) { const Page = this.models.get('api:Page')
return '<a class="nav-link" href="' + mapping[root.UUID] + '">' + root.Name + '</a>' console.log(upper_node)
console.log(upper_node.ChildPageIds == 'undefined')
if (upper_node.ChildPageIds == 'undefined') {
return '<a class="nav-link" href="' + mapping[upper_node.UUID] + '">' + upper_node.Name + '</a>'
} else { } else {
let base = '<nav class="nav nav-pills flex-column">' let base = '<nav class="nav nav-pills flex-column">'
for (const childrenId of root.ChildPageIds) { for (const childrenId of upper_node.ChildPageIds) {
base += this._generate_sidebar(await Page.findOne({ UUID: childrenId })) base += (await this._generate_sidebar(await Page.findOne({ UUID: childrenId })))
} }
console.log({ base })
return base return base
} }
} }

View File

@ -1,4 +1,4 @@
const Controller = require('libflitter/controller/Controller') const Controller = require('libflitter/controller/Controller');
/* /*
* Home Controller * Home Controller
@ -7,26 +7,28 @@ const Controller = require('libflitter/controller/Controller')
* are used as handlers for routes specified in the route files. * are used as handlers for routes specified in the route files.
*/ */
class Home extends Controller { class Home extends Controller {
static get services(){ static get services() {
return [...super.services, 'configs'] return [...super.services, 'configs'];
} }
/*
* Serve the main welcome page.
*/
welcome(req, res) {
/* /*
* Serve the main welcome page. * Return the welcome view.
* The page() method is added by Flitter and passes some
* helpful contextual data to the view as well.
*/ */
welcome(req, res){ return res.page('welcome', { user: req.user });
}
/* async get_login(req, res) {
* Return the welcome view. const AppName = this.configs.get('app.name');
* The page() method is added by Flitter and passes some return res.page('login', { AppName });
* helpful contextual data to the view as well. }
*/ toApp(req, res) {
return res.page('welcome', {user: req.user}) return res.redirect('/i');
} }
async get_login(req, res){
const AppName = this.configs.get('app.name')
return res.page('login', {AppName})
}
} }
module.exports = Home module.exports = Home;

View File

@ -15,99 +15,96 @@
* /auth/register * /auth/register
*/ */
const index = { const index = {
prefix: '/auth',
prefix: '/auth', middleware: [],
middleware: [
get: {
'/:provider/register': [
'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly',
'middleware::auth:ProviderRegistrationEnabled',
'controller::auth:Forms.registration_provider_get'
],
'/register': [
'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly',
'middleware::auth:ProviderRegistrationEnabled',
'controller::auth:Forms.registration_provider_get'
], ],
get: { '/:provider/login': [
'/:provider/register': [ 'middleware::auth:ProviderRoute',
'middleware::auth:ProviderRoute', 'middleware::auth:GuestOnly',
'middleware::auth:GuestOnly', 'controller::auth:Forms.login_provider_get'
'middleware::auth:ProviderRegistrationEnabled', ],
'controller::auth:Forms.registration_provider_get', '/login': [
], 'middleware::auth:ProviderRoute',
'/register': [ 'middleware::auth:GuestOnly',
'middleware::auth:ProviderRoute', 'controller::auth:Forms.login_provider_get'
'middleware::auth:GuestOnly', ],
'middleware::auth:ProviderRegistrationEnabled',
'controller::auth:Forms.registration_provider_get',
],
'/:provider/login': [ '/:provider/logout': [
'middleware::auth:ProviderRoute', 'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly', 'middleware::auth:UserOnly',
'controller::auth:Forms.login_provider_get', 'controller::auth:Forms.logout_provider_clean_session',
],
'/login': [
'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly',
'controller::auth:Forms.login_provider_get',
],
'/:provider/logout': [ // Note, this separation is between when the auth action has happened properly
'middleware::auth:ProviderRoute', // and before the user is allowed to continue. You can use it to add your own
'middleware::auth:UserOnly', // custom middleware for auth flow handling.
'controller::auth:Forms.logout_provider_clean_session',
// Note, this separation is between when the auth action has happened properly 'controller::auth:Forms.logout_provider_present_success'
// and before the user is allowed to continue. You can use it to add your own ],
// custom middleware for auth flow handling. '/logout': [
'middleware::auth:ProviderRoute',
'middleware::auth:UserOnly',
'controller::auth:Forms.logout_provider_clean_session',
'controller::auth:Forms.logout_provider_present_success'
]
},
'controller::auth:Forms.logout_provider_present_success', post: {
], '/:provider/register': [
'/logout': [ 'middleware::auth:ProviderRoute',
'middleware::auth:ProviderRoute', 'middleware::auth:GuestOnly',
'middleware::auth:UserOnly', 'middleware::auth:ProviderRegistrationEnabled',
'controller::auth:Forms.logout_provider_clean_session', 'controller::auth:Forms.registration_provider_create_user',
'controller::auth:Forms.logout_provider_present_success', 'controller::auth:Forms.registration_provider_present_user_created'
], ],
}, '/register': [
'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly',
'middleware::auth:ProviderRegistrationEnabled',
'controller::auth:Forms.registration_provider_create_user',
'controller::auth:Forms.registration_provider_present_user_created'
],
post: { '/:provider/login': [
'/:provider/register': [ 'middleware::auth:ProviderRoute',
'middleware::auth:ProviderRoute', 'middleware::auth:GuestOnly',
'middleware::auth:GuestOnly', 'controller::auth:Forms.login_provider_authenticate_user',
'middleware::auth:ProviderRegistrationEnabled', 'controller::auth:Forms.login_provider_present_success'
'controller::auth:Forms.registration_provider_create_user', ],
'controller::auth:Forms.registration_provider_present_user_created', '/login': [
], 'middleware::auth:ProviderRoute',
'/register': [ 'middleware::auth:GuestOnly',
'middleware::auth:ProviderRoute', 'controller::auth:Forms.login_provider_authenticate_user',
'middleware::auth:GuestOnly', 'controller::auth:Forms.login_provider_present_success'
'middleware::auth:ProviderRegistrationEnabled', ],
'controller::auth:Forms.registration_provider_create_user',
'controller::auth:Forms.registration_provider_present_user_created',
],
'/:provider/login': [ '/:provider/logout': [
'middleware::auth:ProviderRoute', 'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly', 'middleware::auth:UserOnly',
'controller::auth:Forms.login_provider_authenticate_user', 'controller::auth:Forms.logout_provider_clean_session',
'controller::auth:Forms.login_provider_present_success', 'controller::auth:Forms.logout_provider_present_success'
], ],
'/login': [ '/logout': [
'middleware::auth:ProviderRoute', 'middleware::auth:ProviderRoute',
'middleware::auth:GuestOnly', 'middleware::auth:UserOnly',
'controller::auth:Forms.login_provider_authenticate_user', 'controller::auth:Forms.logout_provider_clean_session',
'controller::auth:Forms.login_provider_present_success', 'controller::auth:Forms.logout_provider_present_success'
], ]
}
};
'/:provider/logout': [ module.exports = exports = index;
'middleware::auth:ProviderRoute',
'middleware::auth:UserOnly',
'controller::auth:Forms.logout_provider_clean_session',
'controller::auth:Forms.logout_provider_present_success',
],
'/logout': [
'middleware::auth:ProviderRoute',
'middleware::auth:UserOnly',
'controller::auth:Forms.logout_provider_clean_session',
'controller::auth:Forms.logout_provider_present_success',
],
},
}
module.exports = exports = index

View File

@ -5,62 +5,59 @@
* defined here, but no logic should occur. * defined here, but no logic should occur.
*/ */
const index = { const index = {
/*
* Define the prefix applied to each of these routes.
* For example, if prefix is '/auth':
* '/' becomes '/auth'
* '/login' becomes '/auth/login'
*/
prefix: '/',
/* /*
* Define the prefix applied to each of these routes. * Define middleware that should be applied to all
* For example, if prefix is '/auth': * routes defined in this file. Middleware should be
* '/' becomes '/auth' * included using its non-prefixed canonical name.
* '/login' becomes '/auth/login' *
*/ * You can pass arguments along to a middleware by
prefix: '/', * specifying it as an array where the first element
* is the canonical name of the middleware and the
* second element is the argument passed to the
* handler's exec() method.
*/
middleware: [
// 'MiddlewareName', // Or without arguments
],
/* /*
* Define middleware that should be applied to all * Define GET routes.
* routes defined in this file. Middleware should be * These routes are registered as GET methods.
* included using its non-prefixed canonical name. * Handlers for these routes should be specified as
* * an array of canonical references to controller methods
* You can pass arguments along to a middleware by * or middleware that are applied in order.
* specifying it as an array where the first element */
* is the canonical name of the middleware and the get: {
* second element is the argument passed to the // handlers should be a list of either controller:: or middleware:: references
* handler's exec() method. // e.g. middleware::HomeLogger
*/ // e.g. controller::Home.welcome
middleware: [ '/': ['controller::Home.welcome'],
// 'MiddlewareName', // Or without arguments
],
/* // Placeholder for auth dashboard. You'd replace this with
* Define GET routes. // your own route protected by 'middleware::auth:UserOnly'
* These routes are registered as GET methods. '/dash': ['controller::Home.toApp'],
* Handlers for these routes should be specified as '/login': ['middleware::auth:GuestOnly', 'controller::Home.get_login'],
* an array of canonical references to controller methods '/test-json': ['controller::Export.json_export'],
* or middleware that are applied in order. '/test-markdown': ['controller::Export.markdown_export'],
*/ '/test-html': ['controller::Export.html_export']
get: { },
// handlers should be a list of either controller:: or middleware:: references
// e.g. middleware::HomeLogger
// e.g. controller::Home.welcome
'/': [ 'controller::Home.welcome' ],
// Placeholder for auth dashboard. You'd replace this with /*
// your own route protected by 'middleware::auth:UserOnly' * Define POST routes.
'/dash': [ 'controller::Home.welcome' ], * These routes are registered as POST methods.
'/login': [ 'middleware::auth:GuestOnly', 'controller::Home.get_login' ], * Handlers for these routes should be specified as
'/test-json' : [ 'controller::Export.json_export' ], * an array of canonical references to controller methods
'/test-markdown' : [ 'controller::Export.markdown_export' ], * or middleware that are applied in order.
'/test-html' : [ 'controller::Export.html_export' ] */
}, post: {}
};
/* module.exports = exports = index;
* Define POST routes.
* These routes are registered as POST methods.
* Handlers for these routes should be specified as
* an array of canonical references to controller methods
* or middleware that are applied in order.
*/
post: {
},
}
module.exports = exports = index

View File

@ -37,10 +37,10 @@ html
body body
.flitter-container .flitter-container
img.flitter-image(src="/assets/logo/3x/logo3x.png") img.flitter-image(src="/assets/logo/3x/logo3x.png")
a.flitter-name(href="https://hack20.glmdev.tech/i" target="_blank") powered by #{_app.name} a.flitter-name(href="/login" target="_blank") powered by #{_app.name}
if user if user
.flitter-container .flitter-container
p.flitter-text Welcome, #{user.uid}! <a href="/auth/logout">Log out.</a> p.flitter-text Welcome, #{user.uid}! <a href="/auth/logout">Log out.</a>
else else
.flitter-container .flitter-container
p.flitter-text New to #{_app.name}? <a href="https://hack20.glmdev.tech/login" target="_blank">Start here.</a> p.flitter-text New to #{_app.name}? <a href=/login" target="_blank">Start here.</a>