Merge branch 'master' of ssh.dev.azure.com:v3/HackKu/HackKu%202020/backend
This commit is contained in:
commit
8714ab79f1
BIN
app/assets/favicon-16x16.png
Normal file
BIN
app/assets/favicon-16x16.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 639 B |
BIN
app/assets/favicon-32x32.png
Normal file
BIN
app/assets/favicon-32x32.png
Normal file
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 |
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
|
||||||
|
@ -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
|
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user