From 6b04fe87289389e12193ee8afb6f058046269ee5 Mon Sep 17 00:00:00 2001 From: Cory LaViska Date: Thu, 20 Apr 2017 11:19:02 -0400 Subject: [PATCH] Initial commit --- .editorconfig | 9 + .env.example | 18 + .eslintrc | 23 + .github/CONTRIBUTING.md | 63 + .github/ISSUE_TEMPLATE.md | 20 + .github/PULL_REQUEST_TEMPLATE.md | 19 + .gitignore | 15 + .gitmodules | 0 LICENSE.md | 19 + README.md | 83 +- app.js | 109 ++ gulpfile.js | 245 +++ nodemon.json | 10 + package.json | 90 ++ .../controllers/admin/dashboard_controller.js | 16 + .../controllers/admin/edit_post_controller.js | 118 ++ .../controllers/admin/edit_tag_controller.js | 46 + .../controllers/admin/edit_user_controller.js | 52 + .../controllers/admin/install_controller.js | 30 + source/controllers/admin/login_controller.js | 22 + source/controllers/admin/logout_controller.js | 22 + .../admin/navigation_controller.js | 35 + source/controllers/admin/posts_controller.js | 93 ++ .../admin/quick_post_controller.js | 38 + .../admin/recover_password_controller.js | 22 + .../admin/reset_password_controller.js | 22 + .../controllers/admin/settings_controller.js | 73 + source/controllers/admin/tags_controller.js | 41 + source/controllers/admin/users_controller.js | 41 + source/controllers/api/auth_controller.js | 219 +++ source/controllers/api/backup_controller.js | 323 ++++ source/controllers/api/install_controller.js | 133 ++ .../controllers/api/navigation_controller.js | 64 + source/controllers/api/oembed_controller.js | 26 + source/controllers/api/posts_controller.js | 675 ++++++++ .../controllers/api/revisions_controller.js | 257 ++++ source/controllers/api/search_controller.js | 180 +++ source/controllers/api/settings_controller.js | 102 ++ source/controllers/api/tags_controller.js | 264 ++++ source/controllers/api/uploads_controller.js | 380 +++++ source/controllers/api/users_controller.js | 394 +++++ source/controllers/error_controller.js | 79 + source/controllers/theme/author_controller.js | 125 ++ source/controllers/theme/blog_controller.js | 103 ++ source/controllers/theme/feed_controller.js | 84 + source/controllers/theme/post_controller.js | 155 ++ source/controllers/theme/search_controller.js | 99 ++ source/controllers/theme/tag_controller.js | 133 ++ source/emails/invitation.txt | 16 + source/emails/password_reset.txt | 11 + source/images/app_icon.png | Bin 0 -> 3905 bytes source/images/favicon.png | Bin 0 -> 13181 bytes source/images/postleaf_logo.svg | 1 + source/images/postleaf_wordmark.svg | 1 + source/images/sample_cover.jpg | Bin 0 -> 486277 bytes source/images/sample_post_image.jpg | Bin 0 -> 203263 bytes source/images/zen_toggle.svg | 28 + source/languages/en_us.json | 263 ++++ source/middleware/auth_middleware.js | 84 + source/middleware/install_middleware.js | 46 + source/middleware/upload_middleware.js | 71 + source/middleware/view_middleware.js | 61 + source/models/navigation_model.js | 47 + source/models/post_model.js | 370 +++++ source/models/revision_model.js | 42 + source/models/setting_model.js | 52 + source/models/tag_model.js | 140 ++ source/models/upload_model.js | 92 ++ source/models/user_model.js | 281 ++++ source/modules/admin_menu.js | 82 + source/modules/auto_embed.js | 113 ++ source/modules/autocomplete_suggestions.js | 127 ++ source/modules/database.js | 123 ++ source/modules/dynamic_images.js | 328 ++++ source/modules/editor.js | 978 ++++++++++++ source/modules/email.js | 69 + source/modules/file_manager.js | 522 +++++++ source/modules/helpers/html_helpers.js | 115 ++ source/modules/helpers/theme_helpers.js | 829 ++++++++++ source/modules/helpers/utility_helpers.js | 364 +++++ source/modules/i18n.js | 178 +++ source/modules/includes/admin_menu.js | 56 + .../modules/includes/ajax_submit_defaults.js | 9 + source/modules/includes/alertable_defaults.js | 42 + .../modules/includes/dropdown_animations.js | 14 + source/modules/includes/html_classes.js | 16 + source/modules/includes/image_control.js | 151 ++ source/modules/includes/locater.js | 197 +++ source/modules/includes/panel.js | 142 ++ source/modules/includes/shortcuts.js | 74 + source/modules/includes/stretch.js | 15 + source/modules/includes/toggle_password.js | 19 + source/modules/includes/xhr_progress.js | 25 + source/modules/make_url.js | 286 ++++ source/modules/markdown.js | 54 + source/modules/paginate.js | 38 + source/modules/signed_url.js | 89 ++ source/modules/slug.js | 26 + source/modules/themes.js | 122 ++ source/routers/admin_router.js | 237 +++ source/routers/api_router.js | 359 +++++ source/routers/theme_router.js | 107 ++ source/scripts/edit_post.js | 1367 +++++++++++++++++ source/scripts/edit_tag.js | 110 ++ source/scripts/edit_user.js | 95 ++ source/scripts/install.js | 37 + source/scripts/lib.js | 37 + source/scripts/login.js | 18 + source/scripts/navigation.js | 317 ++++ source/scripts/posts.js | 284 ++++ source/scripts/quick_post.js | 67 + source/scripts/recover_password.js | 39 + source/scripts/reset_password.js | 27 + source/scripts/settings.js | 146 ++ source/scripts/tags.js | 138 ++ source/scripts/tinymce.js | 17 + source/scripts/users.js | 135 ++ source/styles/edit_post.scss | 113 ++ source/styles/edit_tag.scss | 33 + source/styles/edit_user.scss | 32 + source/styles/editor.scss | 84 + source/styles/install.scss | 13 + source/styles/lib.scss | 69 + source/styles/login.scss | 29 + source/styles/navigation.scss | 104 ++ source/styles/partials/_admin_menu.scss | 283 ++++ source/styles/partials/_admin_toolbar.scss | 121 ++ source/styles/partials/_alertable.scss | 59 + source/styles/partials/_announce.scss | 45 + source/styles/partials/_box.scss | 37 + source/styles/partials/_card_cover.scss | 77 + source/styles/partials/_empty_state.scss | 47 + source/styles/partials/_file_manager.scss | 207 +++ source/styles/partials/_image_control.scss | 126 ++ source/styles/partials/_locater.scss | 133 ++ source/styles/partials/_main_container.scss | 39 + source/styles/partials/_nprogress.scss | 57 + source/styles/partials/_overrides.scss | 343 +++++ source/styles/partials/_panel.scss | 126 ++ source/styles/partials/_revisions_table.scss | 36 + .../partials/_search_engine_preview.scss | 39 + source/styles/partials/_selectize.scss | 148 ++ source/styles/partials/_shortcuts.scss | 79 + source/styles/partials/_stretch.scss | 11 + source/styles/partials/_typeahead.scss | 42 + source/styles/partials/_variables.scss | 130 ++ source/styles/posts.scss | 168 ++ source/styles/quick_post.scss | 61 + source/styles/recover_password.scss | 7 + source/styles/reset_password.scss | 7 + source/styles/settings.scss | 64 + source/styles/tags.scss | 14 + source/styles/theme_toolbar.scss | 48 + source/styles/users.scss | 14 + source/styles/zen_mode.scss | 166 ++ source/views/application_error.dust | 60 + source/views/edit_post.dust | 227 +++ source/views/edit_tag.dust | 158 ++ source/views/edit_user.dust | 263 ++++ source/views/feed.dust | 26 + source/views/install.dust | 73 + source/views/layout.dust | 57 + source/views/login.dust | 54 + source/views/navigation.dust | 68 + source/views/not_allowed.dust | 1 + source/views/not_found.dust | 1 + source/views/partials/admin_menu.dust | 109 ++ source/views/partials/embed_panel.dust | 35 + source/views/partials/file_manager.dust | 80 + source/views/partials/file_manager_items.dust | 38 + source/views/partials/image_panel.dust | 93 ++ source/views/partials/link_panel.dust | 68 + source/views/partials/locater.dust | 12 + source/views/partials/locater_results.dust | 23 + source/views/partials/nav_item.dust | 16 + source/views/partials/post_items.dust | 78 + source/views/partials/revisions_table.dust | 72 + source/views/partials/settings_panel.dust | 239 +++ source/views/partials/shortcuts.dust | 101 ++ source/views/partials/tag_cards.dust | 28 + source/views/partials/theme_toolbar.dust | 35 + source/views/partials/user_cards.dust | 45 + source/views/posts.dust | 175 +++ source/views/quick_post.dust | 89 ++ source/views/recover_password.dust | 42 + source/views/reset_password.dust | 51 + source/views/settings.dust | 481 ++++++ source/views/tags.dust | 78 + source/views/users.dust | 78 + source/views/zen_mode.dust | 21 + 190 files changed, 21811 insertions(+), 10 deletions(-) create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .eslintrc create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 LICENSE.md create mode 100644 app.js create mode 100644 gulpfile.js create mode 100644 nodemon.json create mode 100644 package.json create mode 100644 source/controllers/admin/dashboard_controller.js create mode 100644 source/controllers/admin/edit_post_controller.js create mode 100644 source/controllers/admin/edit_tag_controller.js create mode 100644 source/controllers/admin/edit_user_controller.js create mode 100644 source/controllers/admin/install_controller.js create mode 100644 source/controllers/admin/login_controller.js create mode 100644 source/controllers/admin/logout_controller.js create mode 100644 source/controllers/admin/navigation_controller.js create mode 100644 source/controllers/admin/posts_controller.js create mode 100644 source/controllers/admin/quick_post_controller.js create mode 100644 source/controllers/admin/recover_password_controller.js create mode 100644 source/controllers/admin/reset_password_controller.js create mode 100644 source/controllers/admin/settings_controller.js create mode 100644 source/controllers/admin/tags_controller.js create mode 100644 source/controllers/admin/users_controller.js create mode 100644 source/controllers/api/auth_controller.js create mode 100644 source/controllers/api/backup_controller.js create mode 100644 source/controllers/api/install_controller.js create mode 100644 source/controllers/api/navigation_controller.js create mode 100644 source/controllers/api/oembed_controller.js create mode 100644 source/controllers/api/posts_controller.js create mode 100644 source/controllers/api/revisions_controller.js create mode 100644 source/controllers/api/search_controller.js create mode 100644 source/controllers/api/settings_controller.js create mode 100644 source/controllers/api/tags_controller.js create mode 100644 source/controllers/api/uploads_controller.js create mode 100644 source/controllers/api/users_controller.js create mode 100644 source/controllers/error_controller.js create mode 100644 source/controllers/theme/author_controller.js create mode 100644 source/controllers/theme/blog_controller.js create mode 100644 source/controllers/theme/feed_controller.js create mode 100644 source/controllers/theme/post_controller.js create mode 100644 source/controllers/theme/search_controller.js create mode 100644 source/controllers/theme/tag_controller.js create mode 100644 source/emails/invitation.txt create mode 100644 source/emails/password_reset.txt create mode 100644 source/images/app_icon.png create mode 100644 source/images/favicon.png create mode 100644 source/images/postleaf_logo.svg create mode 100644 source/images/postleaf_wordmark.svg create mode 100644 source/images/sample_cover.jpg create mode 100644 source/images/sample_post_image.jpg create mode 100644 source/images/zen_toggle.svg create mode 100644 source/languages/en_us.json create mode 100644 source/middleware/auth_middleware.js create mode 100644 source/middleware/install_middleware.js create mode 100644 source/middleware/upload_middleware.js create mode 100644 source/middleware/view_middleware.js create mode 100644 source/models/navigation_model.js create mode 100644 source/models/post_model.js create mode 100644 source/models/revision_model.js create mode 100644 source/models/setting_model.js create mode 100644 source/models/tag_model.js create mode 100644 source/models/upload_model.js create mode 100644 source/models/user_model.js create mode 100644 source/modules/admin_menu.js create mode 100644 source/modules/auto_embed.js create mode 100644 source/modules/autocomplete_suggestions.js create mode 100644 source/modules/database.js create mode 100644 source/modules/dynamic_images.js create mode 100644 source/modules/editor.js create mode 100644 source/modules/email.js create mode 100644 source/modules/file_manager.js create mode 100644 source/modules/helpers/html_helpers.js create mode 100644 source/modules/helpers/theme_helpers.js create mode 100644 source/modules/helpers/utility_helpers.js create mode 100644 source/modules/i18n.js create mode 100644 source/modules/includes/admin_menu.js create mode 100644 source/modules/includes/ajax_submit_defaults.js create mode 100644 source/modules/includes/alertable_defaults.js create mode 100644 source/modules/includes/dropdown_animations.js create mode 100644 source/modules/includes/html_classes.js create mode 100644 source/modules/includes/image_control.js create mode 100644 source/modules/includes/locater.js create mode 100644 source/modules/includes/panel.js create mode 100644 source/modules/includes/shortcuts.js create mode 100644 source/modules/includes/stretch.js create mode 100644 source/modules/includes/toggle_password.js create mode 100644 source/modules/includes/xhr_progress.js create mode 100644 source/modules/make_url.js create mode 100644 source/modules/markdown.js create mode 100644 source/modules/paginate.js create mode 100644 source/modules/signed_url.js create mode 100644 source/modules/slug.js create mode 100644 source/modules/themes.js create mode 100644 source/routers/admin_router.js create mode 100644 source/routers/api_router.js create mode 100644 source/routers/theme_router.js create mode 100644 source/scripts/edit_post.js create mode 100644 source/scripts/edit_tag.js create mode 100644 source/scripts/edit_user.js create mode 100644 source/scripts/install.js create mode 100644 source/scripts/lib.js create mode 100644 source/scripts/login.js create mode 100644 source/scripts/navigation.js create mode 100644 source/scripts/posts.js create mode 100644 source/scripts/quick_post.js create mode 100644 source/scripts/recover_password.js create mode 100644 source/scripts/reset_password.js create mode 100644 source/scripts/settings.js create mode 100644 source/scripts/tags.js create mode 100644 source/scripts/tinymce.js create mode 100644 source/scripts/users.js create mode 100644 source/styles/edit_post.scss create mode 100644 source/styles/edit_tag.scss create mode 100644 source/styles/edit_user.scss create mode 100644 source/styles/editor.scss create mode 100644 source/styles/install.scss create mode 100644 source/styles/lib.scss create mode 100644 source/styles/login.scss create mode 100644 source/styles/navigation.scss create mode 100644 source/styles/partials/_admin_menu.scss create mode 100644 source/styles/partials/_admin_toolbar.scss create mode 100644 source/styles/partials/_alertable.scss create mode 100644 source/styles/partials/_announce.scss create mode 100644 source/styles/partials/_box.scss create mode 100644 source/styles/partials/_card_cover.scss create mode 100644 source/styles/partials/_empty_state.scss create mode 100644 source/styles/partials/_file_manager.scss create mode 100644 source/styles/partials/_image_control.scss create mode 100644 source/styles/partials/_locater.scss create mode 100644 source/styles/partials/_main_container.scss create mode 100644 source/styles/partials/_nprogress.scss create mode 100644 source/styles/partials/_overrides.scss create mode 100644 source/styles/partials/_panel.scss create mode 100644 source/styles/partials/_revisions_table.scss create mode 100644 source/styles/partials/_search_engine_preview.scss create mode 100644 source/styles/partials/_selectize.scss create mode 100644 source/styles/partials/_shortcuts.scss create mode 100644 source/styles/partials/_stretch.scss create mode 100644 source/styles/partials/_typeahead.scss create mode 100644 source/styles/partials/_variables.scss create mode 100644 source/styles/posts.scss create mode 100644 source/styles/quick_post.scss create mode 100644 source/styles/recover_password.scss create mode 100644 source/styles/reset_password.scss create mode 100644 source/styles/settings.scss create mode 100644 source/styles/tags.scss create mode 100644 source/styles/theme_toolbar.scss create mode 100644 source/styles/users.scss create mode 100644 source/styles/zen_mode.scss create mode 100644 source/views/application_error.dust create mode 100644 source/views/edit_post.dust create mode 100644 source/views/edit_tag.dust create mode 100644 source/views/edit_user.dust create mode 100644 source/views/feed.dust create mode 100644 source/views/install.dust create mode 100644 source/views/layout.dust create mode 100644 source/views/login.dust create mode 100644 source/views/navigation.dust create mode 100644 source/views/not_allowed.dust create mode 100644 source/views/not_found.dust create mode 100644 source/views/partials/admin_menu.dust create mode 100644 source/views/partials/embed_panel.dust create mode 100644 source/views/partials/file_manager.dust create mode 100644 source/views/partials/file_manager_items.dust create mode 100644 source/views/partials/image_panel.dust create mode 100644 source/views/partials/link_panel.dust create mode 100644 source/views/partials/locater.dust create mode 100644 source/views/partials/locater_results.dust create mode 100644 source/views/partials/nav_item.dust create mode 100644 source/views/partials/post_items.dust create mode 100644 source/views/partials/revisions_table.dust create mode 100644 source/views/partials/settings_panel.dust create mode 100644 source/views/partials/shortcuts.dust create mode 100644 source/views/partials/tag_cards.dust create mode 100644 source/views/partials/theme_toolbar.dust create mode 100644 source/views/partials/user_cards.dust create mode 100644 source/views/posts.dust create mode 100644 source/views/quick_post.dust create mode 100644 source/views/recover_password.dust create mode 100644 source/views/reset_password.dust create mode 100644 source/views/settings.dust create mode 100644 source/views/tags.dust create mode 100644 source/views/users.dust create mode 100644 source/views/zen_mode.dust diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..c6c8b36 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..e566477 --- /dev/null +++ b/.env.example @@ -0,0 +1,18 @@ +# App +APP_ENVIRONMENT=production +APP_URL=http://example.com/ +APP_PORT=3000 + +# Security +AUTH_LIFETIME=1h +AUTH_SECRET=**** +AUTH_PASSWORD_MIN_LENGTH=8 + +# SMTP +SMTP_HOST=smtp.example.com +SMTP_USERNAME=smtp_user +SMTP_PASSWORD=**** +SMTP_PORT=587 +SMTP_SECURE=true +SMTP_FROM_NAME=Example User +SMTP_FROM_EMAIL=you@example.com diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..9b5319b --- /dev/null +++ b/.eslintrc @@ -0,0 +1,23 @@ +{ + "rules": { + "comma-dangle": ["warn"], + "eqeqeq": ["warn"], + "no-console": ["off"], + "indent": ["error", 2], + "quotes": ["error", "single"], + "linebreak-style": ["error", "unix"], + "no-unused-vars": ["warn", { "vars": "all", "args": "after-used" }], + "prefer-arrow-callback": ["warn"], + "semi": ["error", "always"] + }, + "env": { + "node": true, + "es6": true + }, + "extends": "eslint:recommended", + "globals": { + "__basedir": true, + "__version": true, + "Postleaf": true + } +} diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..a9cae50 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,63 @@ +# Contributing to Postleaf + +Postleaf is a simple, beautiful, decentralized publishing platform that anyone can use. It's free, open source, and built for the modern publisher. + +I'm building Postleaf for the greater good. I want everyone to have a chance to participate in its development no matter their skill level, and nobody should feel out of place for asking a question, submitting their code, etc. + +That said, I have a few simple rules I'm asking everyone to follow: + +- Don't be mean. +- Don't be a troll. +- Don't be a keyboard warrior. + +People from all over the world participate here, and everyone is welcome. Please bear in mind that not all people share the same languages, skills, and beliefs as you. Many are here to learn, so please facilitate that. + +## Support + +Please **do not** use the issue tracker for personal support requests. [The Postleaf community forum](https://community.postleaf.org/) is the preferred place to ask for help. + +Remember, Postleaf is open source. We have a great community of users volunteering their time at no cost to you. Attitude and demeanor go a long way in getting help. 😁 + +## Bug Reports + +Bugs should be submitted to the issue tracker. Before creating a new issue, please search open and closed issues to make sure it hasn't already been addressed. + +For bug reports, please provide: + +- Step-by-step instructions to reproduce the bug. +- A minimal test case to demonstrate the bug (if applicable). +- Postleaf version, Node version, etc. + +A good bug report will show us how to reproduce the problem quickly. A not-so-good bug report is likely to sit around waiting for additional feedback before anything can get fixed. + +## Feature Requests + +Feature requests may be submitted to the issue tracker as well. Before creating a new issue, please search open and close issues to make sure it hasn't already been requested. + +To vote for a specific feature, use GitHub reactions to 👍 or 👎. Remember that you can watch an issue to receive notifications anytime somebody comments. + +## Pull Requests + +I welcome design and code contributions, but bear in mind that I'm very opinionated. I've spent a lot of time and effort working on Postleaf, and I've developed a very clear vision for this project. + +Before embarking on a large, complex, or controversial feature, please open an issue so we can discuss it. Someone may be working on it already, it might not align with Postleaf's roadmap, or we might be able to improve on your idea before you spend time working on it. + +If your PR doesn't get accepted, don't let it get you down. Many don't. It doesn't mean I don't value your idea or contribution, it just means that it doesn't align with my vision for the project. As the maintainer, I'll do my best to explain why every PR doesn't get accepted. + +### Code Quality + +Postleaf uses an `.editorconfig` file to enforce things like indentation, trailing whitespace, etc. Please make sure your editor supports [EditorConfig]((http://editorconfig.org/)) before submitting a PR. + +I'm quite picky about code quality. That doesn't mean I don't like your code, it means I prefer the code to stay consistent. If you follow the same conventions as the rest of the project's code, you'll be good to go. + +### Linting + +I recommend using [Atom](https://atom.io/) because it has [a great linter plugin](https://atom.io/packages/atom-lint). If you use this along with [linter-eslint](https://atom.io/packages/linter-eslint) you'll save yourself a lot of time during development. While you're at it, don't forget to grab the [.editorconfig](https://atom.io/packages/editorconfig) plugin. + +This is by no means mandatory, but it will save you a lot of time. If your preferred IDE doesn't support linting, you can also see ESLint errors while running `gulp watch`. + +## License and Code Contributions + +By submitting bug fixes, code, documentation, or anything else to this project, you agree to allow the developer and his company, A Beautiful Site, LLC, to license or relicense your work under their license of choice and you agree to forfeit all copyrights, intellectual property rights, and royalties pertaining to your contribution. + +I want Postleaf to remain free for everyone to use, forever, so please do not submit any design, code, or content that is licensed or copyrighted without first getting written consent from the author. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..edf62a9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,20 @@ +### Summary + +Please summarize your issue here. + +### Steps to Reproduce + +1. Step one +2. Step two +3. ... + +### Additional info + +- Postleaf version: +- Node version: +- Affected browsers: +- Operating system: + +--- + +Note: This issue tracker is ONLY for bug reports and feature requests. If this is a personal support issue, please ask on the forum instead: community.postleaf.org diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..b366653 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,19 @@ +### Pull Request Summary + +Please describe what your PR does here. + +--- + +### Contributor License Agreement + +Before your pull request can be accepted, I ask that you agree to the following terms to ensure there are no conflicts with Postleaf's license now or in the future. + +I want Postleaf to remain free for everyone to use, forever, so please do not submit any design, code, or content that is licensed or copyrighted without first getting written consent from the author. + +[ ] I certify that the code I am contributing to this project is completely original or free of any known license or copyright. + +[ ] I agree to allow the developer of Postleaf, A Beautiful Site, LLC, to license or relicense my work at their discretion. By submitting this pull request, I agree to forfeit all copyrights, intellectual property rights, and royalties pertaining to my contribution. + +[ ] By entering my name in the space provided below, I agree to all of the terms mentioned above. + +Signed: FULL_LEGAL_NAME diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8a6c6f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +# Files +.DS_Store +.env + +# Directories +assets/ +cache/ +data/ +design/ +node_modules/ +uploads/ + +# Ignore everything except the default theme +themes/* +#!themes/default diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..e69de29 diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..74d9299 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,19 @@ +Copyright (c) 2017 A Beautiful Site, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index d2842f4..967bfbb 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,84 @@ -# Postleaf +# Postleaf -Simple, beautiful publishing. +**Simple, beautiful publishing.** ---- +![Postleaf on a laptop, tablet, and phone](http://postleaf.s3.amazonaws.com/website/images/devices.png) + +Postleaf is a simple, beautiful, decentralized publishing platform that anyone can use. It's free, open source, and built for the modern publisher. + +Created by [Cory LaViska](https://twitter.com/claviska) + +- Website: [postleaf.org](https://www.postleaf.org/) +- Twitter: [@postleafapp](https://twitter.com/postleafapp) + +This software is dedicated to my daughter, Sophia, and my son, Calvin. Chase your dreams, lil’ ones. 💙💚 + +## Requirements + +- Node 7 +- SQLite 3 +- GraphicsMagick + +## Download + +**This is the development repo!** You'll need to build Postleaf using the instructions below before running it. + +## Contributing + +Postleaf uses NPM to manage dependencies and Gulp as its task runner. To contribute to this project, you'll need to clone the repository and install the required development tools listed below. + +- [Node](https://nodejs.org/en/) +- [Gulp](http://gulpjs.com/) (Install using `npm install -g gulp-cli`) + +Please read through our [contributing guidelines](https://github.com/claviska/postleaf/blob/master/.github/CONTRIBUTING.md). + +## Building + +Once you have the necessary development tools installed: + +1. Open a terminal +2. Navigate to the root directory of your cloned repo +3. Run the following command: + +``` +npm install +gulp build +``` + +This will generate all the assets you need to run Postleaf. + +## Using Gulp + +- Use `gulp build` to build all assets. +- Use `gulp clean` to remove all assets. +- Use `gulp help` to see all available tasks. + +## Testing + +You can run Postleaf using the following command: + +``` +node app.js +``` + +Then open http://localhost:3000 in your browser. + +## Versioning + +Postleaf is maintained under the [Semantic Versioning guidelines](http://semver.org/) and we adhere to them as closely as possible. -To my awesome users: +## License -I've been taking some time to reimagine what Postleaf should have been. Yes, the betas were pretty awesome, but they weren't what I wanted them to be in terms of design, code, and function. I can do better, and you deserve nothing less than my very best. +©2016 A Beautiful Site, LLC -The last few months were difficult for me as I struggled to find my place in the world of content management. I thought about giving it up and getting out of software altogether. My vision was cloudy, my passion had faded. Recently, I looked at Postleaf from a completely different perspective and everything started to make sense again. +This software is copyrighted. You may use it under the terms of the MIT license. See LICENSE.md for details. -*I have a vision to bring simple, beautiful publishing to the world. And I'm not going to stop until I get it right.* +All code is copyrighted by A Beautiful Site, LLC except where noted. Third-party libraries are copyrighted and licensed by their respective owners. -Thanks for giving me the time I needed to find myself. +## Support -Postleaf will be back very soon. And it will be better than you ever imagined. +Please visit [the community forum](https://community.postleaf.org/) for support. --- -If you're looking for a fork of the original concept, please visit [Leafpub](https://leafpub.org). Marc is doing an excellent job maintaining the project, already piloting it to the [first stable version](https://github.com/Leafpub/leafpub/releases/tag/1.0.0). +*“The starting point of all achievement is desire.” — Napoleon Hill* diff --git a/app.js b/app.js new file mode 100644 index 0000000..de0a8bc --- /dev/null +++ b/app.js @@ -0,0 +1,109 @@ +'use strict'; + +// Environment +require('dotenv').config(); +process.env.TZ = 'UTC'; + +// Globals +global.__basedir = __dirname; +global.__version = require('./package.json').version; + +// Node modules +const Adaro = require('adaro'); +const BodyParser = require('body-parser'); +const Chalk = require('chalk'); +const CookieParser = require('cookie-parser'); +const Compression = require('compression'); +const Express = require('express'); +const Path = require('path'); +const Slashes = require('connect-slashes'); + +// Express app +const app = Express(); +const AdminRouter = require(Path.join(__basedir, 'source/routers/admin_router.js')); +const ApiRouter = require(Path.join(__basedir, 'source/routers/api_router.js')); +const ThemeRouter = require(Path.join(__basedir, 'source/routers/theme_router.js')); +const AuthMiddleware = require(Path.join(__basedir, 'source/middleware/auth_middleware')); +const ViewMiddleware = require(Path.join(__basedir, 'source/middleware/view_middleware.js')); +const ErrorController = require(Path.join(__basedir, 'source/controllers/error_controller.js')); +const DynamicImages = require(Path.join(__basedir, 'source/modules/dynamic_images.js')); + +// Database +const Database = require(Path.join(__basedir, 'source/modules/database.js')); +app.locals.Database = Database; + +// Sync the database +Database.init() + .then(() => { + let models = Database.sequelize.models; + + // Generate search indexes on startup + models.post.buildSearchIndex(); + models.user.buildSearchIndex(); + models.tag.buildSearchIndex(); + }) + // Load settings into app.locals.Settings + .then(() => Database.loadSettings()) + .then((settings) => app.locals.Settings = settings) + // Load navigation into app.locals.Navigation + .then(() => Database.sequelize.models.navigation.getArray()) + .then((navigation) => app.locals.Navigation = navigation) + // Load i18n into app.locals.I18n + .then(() => { + app.locals.I18n = require(Path.join(__basedir, 'source/modules/i18n.js')); + return app.locals.I18n.load(app.locals.Settings.language); + }) + // Start the app + .then(() => { + // App config + app.enable('strict routing'); + app.disable('x-powered-by'); + + // App-level middleware + app + .use(Slashes(false)) + .use(CookieParser()) + .use(Compression()) + .use(DynamicImages.processImages) + .use('/assets', Express.static(Path.join(__basedir, 'assets'))) + .use('/themes', Express.static(Path.join(__basedir, 'themes'))) + .use('/uploads', Express.static(Path.join(__basedir, 'uploads'))) + .use(BodyParser.urlencoded({ extended: true, limit: '10mb' })) + .use(AuthMiddleware.attachUser) + .use(ViewMiddleware.attachViewData) + .use(ViewMiddleware.enableDynamicViews); + + // View engine + app.engine('dust', Adaro.dust({ + cache: process.env.APP_ENVIRONMENT === 'production', + helpers: [ + 'dustjs-helpers', + 'source/modules/helpers/html_helpers.js', + 'source/modules/helpers/utility_helpers.js', + 'source/modules/helpers/theme_helpers.js' + ], + whitespace: process.env.APP_ENVIRONMENT !== 'production' + })); + app.set('views', Path.join(__basedir, 'source/views')); + app.set('view engine', 'dust'); + + // App routers + ApiRouter(app); + AdminRouter(app); + ThemeRouter(app); + + // Error pages + app.use(ErrorController.notFound); + app.use(ErrorController.applicationError); + + // Start sailing! ⚓️ + app.listen(process.env.APP_PORT, () => { + console.info('Postleaf publishing on port %d! 🌱', process.env.APP_PORT); + }); + }) + .catch((err) => { + console.error( + Chalk.red('Error: ') + 'Postleaf failed to start! 🐛\n\n' + + Chalk.red(err) + ); + }); diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..3ab5dbc --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,245 @@ +/* eslint-env es6, node */ +'use strict'; + +const Gulp = require('gulp-help')(require('gulp')); +const Autoprefixer = require('gulp-autoprefixer'); +const Babel = require('gulp-babel'); +const Browserify = require('gulp-browserify'); +const Chalk = require('chalk'); +const CleanCSS = require('gulp-clean-css'); +const Del = require('del'); +const ESLint = require('gulp-eslint'); +const Imagemin = require('gulp-imagemin'); +const Path = require('path'); +const Rename = require('gulp-rename'); +const Sass = require('gulp-sass'); +const Uglify = require('gulp-uglify'); +const Watch = require('gulp-watch'); + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Config +//////////////////////////////////////////////////////////////////////////////////////////////////// + +let fonts = { + base: Path.join(__dirname, 'node_modules/font-awesome/fonts'), + source: Path.join(__dirname, 'node_modules/font-awesome/fonts/**/*.+(eot|svg|ttf|woff|woff2|otf)'), + target: Path.join(__dirname, 'assets/fonts') +}; + +let images = { + source: Path.join(__dirname, 'source/images/**/*.+(gif|jpg|jpeg|png|svg)'), + target: Path.join(__dirname, 'assets/images') +}; + +let scripts = { + source: Path.join(__dirname, 'source/scripts/**/*.js'), + target: Path.join(__dirname, 'assets/js') +}; + +let styles = { + source: Path.join(__dirname, 'source/styles/**/*.scss'), + target: Path.join(__dirname, 'assets/css') +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Build functions +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Copies font files to target +function buildFonts(source, target, base) { + console.log(Chalk.yellow('Building fonts...')); + return Gulp.src(source, { base: base }) + .pipe(Gulp.dest(target)) + .on('end', () => { + console.log(Chalk.green('✔︎ Fonts at ' + new Date())); + }); +} + +// Optimizes images in source and outputs them in target +function buildImages(source, target) { + console.log(Chalk.yellow('Building images...')); + return Gulp.src(source) + .pipe(Imagemin()) + .pipe(Gulp.dest(target)) + .on('end', () => { + console.log(Chalk.green('✔︎ Images at ' + new Date())); + }); +} + +// Minifies scripts in source and outputs them in target +function buildScripts(source, target) { + console.log(Chalk.yellow('Building scripts...')); + return Gulp.src(source) + .pipe(ESLint()) + .pipe(ESLint.format()) + .pipe(ESLint.failAfterError()) + .on('error', (err) => { + console.error(Chalk.red(err.message)); + }) + .pipe(Browserify()) + .on('error', (err) => { + console.error(Chalk.red(err.message)); + }) + .pipe(Babel({ + presets: ['es2015'] + })) + .on('error', (err) => { + console.error(Chalk.red(err.message)); + }) + .on('error', (err) => { + console.error(Chalk.red(err.message)); + }) + .pipe(Uglify({ + preserveComments: 'license' + })) + .on('error', (err) => { + console.error(Chalk.red(err.message)); + }) + .pipe(Rename({ suffix: '.bundle' })) + .pipe(Gulp.dest(target)) + .on('end', () => { + console.log(Chalk.green('✔︎ Scripts at ' + new Date())); + }); +} + +// Compiles styles in source and outputs them in target +function buildStyles(source, target) { + console.log(Chalk.yellow('Building styles...')); + return Gulp.src(source) + .pipe(Sass({ + includePaths: [ + 'node_modules' + ], + precision: 8, + outputStyle: 'compressed' + })) + .on('error', (err) => { + console.error(Chalk.red(err.message)); + }) + .pipe(Autoprefixer({ + browsers: ['last 2 versions'] + })) + .pipe(CleanCSS({ + format: 'keep-breaks', + specialComments: 'all' + })) + .pipe(Gulp.dest(target)) + .on('end', () => { + console.log(Chalk.green('✔︎ Styles at ' + new Date())); + }); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Build tasks +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Build fonts +Gulp.task('build:fonts', 'Build font assets.', ['clean:fonts'], () => { + buildFonts(fonts.source, fonts.target, fonts.base); +}); + +// Build images +Gulp.task('build:images', 'Optimize images.', ['clean:images'], () => { + buildImages(images.source, images.target); +}); + +// Build scripts +Gulp.task('build:scripts', 'Build scripts.', ['clean:scripts'], () => { + buildScripts(scripts.source, scripts.target); +}); + +// Build styles +Gulp.task('build:styles', 'Build styles.', ['clean:styles'], () => { + buildStyles(styles.source, styles.target); +}); + +// Build all +Gulp.task('build', 'Run all build tasks.', [ + 'build:fonts', + 'build:images', + 'build:scripts', + 'build:styles' +]); + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Clean tasks +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Clean fonts +Gulp.task('clean:fonts', 'Delete generated fonts.', () => { + return Del(fonts.target); +}); + +// Clean images +Gulp.task('clean:images', 'Delete generated images.', () => { + return Del(images.target); +}); + +// Clean scripts +Gulp.task('clean:scripts', 'Delete generated scripts.', () => { + return Del(scripts.target); +}); + +// Clean styles +Gulp.task('clean:styles', 'Delete generated styles.', () => { + return Del(styles.target); +}); + +// Clean all +Gulp.task('clean', 'Delete all generated files.', [ + 'clean:fonts', + 'clean:images', + 'clean:scripts', + 'clean:styles' +]); + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// Other tasks +//////////////////////////////////////////////////////////////////////////////////////////////////// + +// Watch for changes +Gulp.task('watch', 'Watch files and automatically build assets on change.', () => { + // Watch fonts + Gulp.src(fonts.source) + .pipe(Watch(fonts.source)) + .on('add', (file) => { + buildFonts(file, fonts.target); + }) + .on('change', (file) => { + buildFonts(file, fonts.target); + }); + + // Watch images + Gulp.src(images.source) + .pipe(Watch(images.source)) + .on('add', (file) => { + buildImages(file, images.target); + }) + .on('change', (file) => { + buildImages(file, images.target); + }); + + // Watch scripts + Gulp.src(scripts.source) + .pipe(Watch(scripts.source)) + .on('add', (file) => { + buildScripts(file, scripts.target); + }) + .on('change', (file) => { + buildScripts(file, scripts.target); + }); + + // Watch styles + Gulp.src(styles.source) + .pipe(Watch(styles.source)) + // Recompile all styles since changes to _partials.scss won't compile on their own + .on('add', () => { + buildStyles(styles.source, styles.target); + }) + .on('change', () => { + buildStyles(styles.source, styles.target); + }); +}); + +// Default +Gulp.task('default', 'Run the default task.', ['help']); diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..024e486 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,10 @@ +{ + "ignore": [ + "assets/*", + "cache/*", + "source/scripts/*", + "source/styles/*", + "themes/*", + "uploads/*" + ] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7525757 --- /dev/null +++ b/package.json @@ -0,0 +1,90 @@ +{ + "name": "postleaf", + "version": "1.0.0-alpha.1", + "license": "MIT", + "repository": { + "type": "git", + "url": "git@github.com:Postleaf/postleaf.git" + }, + "devDependencies": { + "babel-preset-es2015": "^6.22.0", + "chalk": "^1.1.3", + "del": "^2.2.1", + "eslint": "^3.10.1", + "gulp": "^3.9.1", + "gulp-autoprefixer": "^3.1.0", + "gulp-babel": "^6.1.2", + "gulp-browserify": "^0.5.1", + "gulp-clean-css": "^3.0.3", + "gulp-eslint": "^3.0.1", + "gulp-help": "^1.6.1", + "gulp-imagemin": "^3.0.2", + "gulp-preprocess": "^2.0.0", + "gulp-rename": "^1.2.2", + "gulp-sass": "^2.3.2", + "gulp-uglify": "^1.5.4", + "gulp-watch": "^4.3.9", + "path": "^0.12.7" + }, + "dependencies": { + "@claviska/jquery-ajax-submit": "^2.0.4", + "@claviska/jquery-alertable": "^1.0.2", + "@claviska/jquery-animate-css": "^1.0.0", + "@claviska/jquery-announce": "^1.0.0", + "@claviska/jquery-offscreen": "^1.0.1", + "@claviska/jquery-selectable": "^1.0.6", + "adaro": "^1.0.4", + "animate.css": "^3.5.2", + "autolinker": "^1.4.2", + "bcrypt": "^0.8.7", + "body-parser": "^1.15.2", + "bootstrap": "^4.0.0-alpha.6", + "chalk": "^1.1.3", + "cheerio": "^0.22.0", + "clipboard": "^1.6.1", + "compression": "^1.6.2", + "connect-slashes": "^1.3.1", + "cookie-parser": "^1.4.3", + "crypto": "0.0.3", + "dotenv": "^4.0.0", + "express": "^4.14.0", + "extend": "^3.0.0", + "font-awesome": "^4.7.0", + "format-number": "^2.0.1", + "fs": "0.0.1-security", + "gm": "^1.23.0", + "he": "^1.1.1", + "http-codes": "^1.0.0", + "jquery": "^3.1.1", + "js-cookie": "^2.1.3", + "jsonwebtoken": "^7.1.9", + "jszip": "^3.1.3", + "lunr": "^1.0.0", + "marked": "^0.3.6", + "mime": "^1.3.4", + "mkdirp": "^0.5.1", + "moment": "^2.17.1", + "moment-timezone": "^0.5.11", + "multer": "^1.2.0", + "nodemailer": "^2.7.0", + "nprogress": "^0.2.0", + "oembed": "^0.1.2", + "recursive-readdir": "^2.1.1", + "sanitize-filename": "^1.6.1", + "screenfull": "^3.0.2", + "selectize": "^0.12.4", + "sequelize": "^3.29.0", + "slugify": "^1.1.0", + "sortablejs": "^1.5.0", + "sqlite3": "^3.1.8", + "striptags": "^2.2.1", + "tether": "^1.3.2", + "tinymce": "^4.5.4", + "tmp": "0.0.31", + "trim": "0.0.1", + "truncate-html": "^0.1.2", + "typeahead.js": "^0.11.1", + "undo-manager": "^1.0.5", + "url": "^0.11.0" + } +} diff --git a/source/controllers/admin/dashboard_controller.js b/source/controllers/admin/dashboard_controller.js new file mode 100644 index 0000000..8f8353c --- /dev/null +++ b/source/controllers/admin/dashboard_controller.js @@ -0,0 +1,16 @@ +'use strict'; + +const Path = require('path'); + +module.exports = { + + // + // Reserved for future use. Currently redirects to posts. + // + view: (req, res) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + + res.redirect(MakeUrl.admin('posts')); + } + +}; diff --git a/source/controllers/admin/edit_post_controller.js b/source/controllers/admin/edit_post_controller.js new file mode 100644 index 0000000..c3b62ce --- /dev/null +++ b/source/controllers/admin/edit_post_controller.js @@ -0,0 +1,118 @@ +'use strict'; + +const Path = require('path'); +const HttpCodes = require('http-codes'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); +const AutocompleteSuggestions = require(Path.join(__basedir, 'source/modules/autocomplete_suggestions.js')); +const Themes = require(Path.join(__basedir, 'source/modules/themes.js')); + +module.exports = { + + // + // Renders the post editor. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const User = req.User; + const Settings = req.app.locals.Settings; + const models = req.app.locals.Database.sequelize.models; + let create = typeof req.params.id === 'undefined'; + let statuses = []; + let authors; + let linkSuggestions; + let tags; + let templates; + + Promise.resolve() + // Get theme templates + .then(() => Themes.getPostTemplates(Settings.theme)) + .then((result) => templates = result) + // Get link suggestions + .then(() => AutocompleteSuggestions.getLinks(req, ['users', 'tags', 'posts'])) + .then((links) => linkSuggestions = links) + // Fetch authors + .then(() => models.user.findAll({ + attributes: ['id', 'name', 'username'], + order: [ + ['name', 'ASC'] + ] + })) + .then((result) => authors = result) + // Fetch tags + .then(() => models.tag.findAll({ + attributes: ['id', 'slug', 'name'], + order: [ + ['name', 'ASC'] + ] + })) + .then((result) => tags = result) + // Fetch the post + .then(() => models.post.findOne({ + where: { + id: req.params.id + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ] + })) + .then((post) => { + // Owners/admins/editors can publish. Contributors can only publish if the post they're + // editing is already published. + let canPublish = + ['owner', 'admin', 'editor'].includes(User.role) || + (!create && post.status === 'published'); + + // Owners/admins/editors can reject. Contributors can only reject if the post they're + // editing is already rejected. + let canReject = + ['owner', 'admin', 'editor'].includes(User.role) || + (!create && post.status === 'rejected'); + + // Generate available statuses + if(canPublish) statuses.push({ status: 'published', term: 'published' }); + statuses.push({ status: 'draft', term: 'draft' }); + statuses.push({ status: 'pending', term: 'pending_review' }); + if(canReject) statuses.push({ status: 'rejected', term: 'rejected' }); + + if(!create && !post) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // All posts for owners/admins/editors, only yours for contributors + if(!create && !['owner', 'admin', 'editor'].includes(User.role) && !User.id === post.userId) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Render the template + res.useSystemViews().render('edit_post', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'edit-post', + title: I18n.term(create ? 'new_post' : 'edit_post') + }, + post: post, + authors: authors, + tags: tags, + templates: templates, + statuses: statuses, + linkSuggestions: linkSuggestions, + scripts: ['/assets/js/edit_post.bundle.js'], + styles: ['/assets/css/edit_post.css'] + }); + }) + .catch((err) => next(err)); + + } + +}; diff --git a/source/controllers/admin/edit_tag_controller.js b/source/controllers/admin/edit_tag_controller.js new file mode 100644 index 0000000..9bda0c7 --- /dev/null +++ b/source/controllers/admin/edit_tag_controller.js @@ -0,0 +1,46 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); + +module.exports = { + + // + // Renders the edit tag page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + + let create = typeof req.params.id === 'undefined'; + + // Fetch the tag + models.tag + .findOne({ + where: { + id: req.params.id + } + }) + .then((tag) => { + if(!create && !tag) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // Render the template + res.useSystemViews().render('edit_tag', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'edit-tag', + title: I18n.term(create ? 'new_tag' : 'edit_tag') + }, + tag: tag, + scripts: ['/assets/js/edit_tag.bundle.js'], + styles: ['/assets/css/edit_tag.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/edit_user_controller.js b/source/controllers/admin/edit_user_controller.js new file mode 100644 index 0000000..c164765 --- /dev/null +++ b/source/controllers/admin/edit_user_controller.js @@ -0,0 +1,52 @@ +'use strict'; + +const Path = require('path'); +const HttpCodes = require('http-codes'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); + +module.exports = { + + // + // Renders the edit user page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + let create = typeof req.params.id === 'undefined'; + + // Fetch the user + models.user + .findOne({ + where: { + id: req.params.id + } + }) + .then((user) => { + if(!create && !user) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // Only the owner can edit the owner profile + if(!create && user.role === 'owner' && User.role !== 'owner') { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Render the template + res.useSystemViews().render('edit_user', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'edit-user', + title: I18n.term(create ? 'new_user' : 'edit_user') + }, + user: user, + scripts: ['/assets/js/edit_user.bundle.js'], + styles: ['/assets/css/edit_user.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/install_controller.js b/source/controllers/admin/install_controller.js new file mode 100644 index 0000000..09e4253 --- /dev/null +++ b/source/controllers/admin/install_controller.js @@ -0,0 +1,30 @@ +'use strict'; + +const HttpCodes = require('http-codes'); + +module.exports = { + + // + // Renders the installation page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + + // If the app is installed, pretend the page doesn't exist + if(req.app.locals.isInstalled) { + res.status(HttpCodes.NOT_FOUND); + return next('Not Found'); + } + + // Render the template + res.useSystemViews().render('install', { + meta: { + bodyClass: 'install no-menu', + title: I18n.term('welcome_to_postleaf') + }, + scripts: ['/assets/js/install.bundle.js'], + styles: ['/assets/css/install.css'] + }); + } + +}; diff --git a/source/controllers/admin/login_controller.js b/source/controllers/admin/login_controller.js new file mode 100644 index 0000000..c30c02b --- /dev/null +++ b/source/controllers/admin/login_controller.js @@ -0,0 +1,22 @@ +'use strict'; + +module.exports = { + + // + // Renders the login page. + // + view: (req, res) => { + const I18n = req.app.locals.I18n; + + // Render the template + res.useSystemViews().render('login', { + meta: { + bodyClass: 'login no-menu', + title: I18n.term('login') + }, + scripts: ['/assets/js/login.bundle.js'], + styles: ['/assets/css/login.css'] + }); + } + +}; diff --git a/source/controllers/admin/logout_controller.js b/source/controllers/admin/logout_controller.js new file mode 100644 index 0000000..d3f501e --- /dev/null +++ b/source/controllers/admin/logout_controller.js @@ -0,0 +1,22 @@ +'use strict'; + +const Path = require('path'); + +module.exports = { + + // + // Logs the user out and redirects them to the login page. + // + view: (req, res) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + + // Remove the auth cookie for supportive clients + res.cookie('authToken', '', { expires: new Date() }); + + // Redirect to the login page + res.redirect( + MakeUrl.admin('login') + ); + } + +}; diff --git a/source/controllers/admin/navigation_controller.js b/source/controllers/admin/navigation_controller.js new file mode 100644 index 0000000..a5bbf14 --- /dev/null +++ b/source/controllers/admin/navigation_controller.js @@ -0,0 +1,35 @@ +'use strict'; + +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); +const AutocompleteSuggestions = require(Path.join(__basedir, 'source/modules/autocomplete_suggestions.js')); + +module.exports = { + + // + // Renders the navigation page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + + Promise.resolve() + // Get autocomplete suggestions + .then(() => AutocompleteSuggestions.getLinks(req, ['users', 'tags', 'posts'])) + .then((links) => { + // Render the template + res.useSystemViews().render('navigation', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'navigation', + title: I18n.term('navigation') + }, + linkSuggestions: links, + navigation: req.app.locals.Navigation, + scripts: ['/assets/js/navigation.bundle.js'], + styles: ['/assets/css/navigation.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/posts_controller.js b/source/controllers/admin/posts_controller.js new file mode 100644 index 0000000..f219041 --- /dev/null +++ b/source/controllers/admin/posts_controller.js @@ -0,0 +1,93 @@ +'use strict'; + +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); + +module.exports = { + + // + // Renders the posts page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + let itemsPerPage = 50; + let where = {}; + let status = []; + let flag = []; + let postFilters = (req.cookies.postFilters || '').split(','); + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role)) { + where.userId = User.id; + } + + // Restore status from cookie + ['draft', 'pending', 'rejected', 'published'].forEach((key) => { + if(postFilters.includes(key)) status.push(key); + }); + + // Restore flags from cookie + ['isPage', 'isFeatured', 'isSticky'].forEach((key) => { + if(postFilters.includes(key)) flag.push(key); + }); + + // Filter by status + if(status && status.length) where.status = { $in: status }; + + // Filter by flag + if(flag && flag.length) { + if(flag.includes('isPage')) where.isPage = 1; + if(flag.includes('isFeatured')) where.isFeatured = 1; + if(flag.includes('isSticky')) where.isSticky = 1; + } + + Promise.resolve() + // Fetch posts + .then(() => { + return models.post + .findAll({ + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] }, + where: req.query.author ? { + username: { + $in: req.query.author.split(',') + } + } : null + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + limit: itemsPerPage, + offset: 0, + order: [ + ['publishedAt', 'DESC'] + ] + }); + }) + // Render the template + .then((posts) => { + res.useSystemViews().render('posts', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'posts', + title: I18n.term('posts') + }, + posts: posts, + itemsPerPage: itemsPerPage, + scripts: ['/assets/js/posts.bundle.js'], + styles: ['/assets/css/posts.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/quick_post_controller.js b/source/controllers/admin/quick_post_controller.js new file mode 100644 index 0000000..df65bbb --- /dev/null +++ b/source/controllers/admin/quick_post_controller.js @@ -0,0 +1,38 @@ +'use strict'; + +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); +const Themes = require(Path.join(__basedir, 'source/modules/themes.js')); + +module.exports = { + + // + // Renders the posts page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const Settings = req.app.locals.Settings; + + let templates; + + Promise.resolve() + // Fetch post templates + .then(() => Themes.getPostTemplates(Settings.theme)) + .then((result) => templates = result) + // Render the template + .then(() => { + res.useSystemViews().render('quick_post', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'quick-post', + title: I18n.term('quick_post') + }, + templates: templates, + scripts: ['/assets/js/quick_post.bundle.js'], + styles: ['/assets/css/quick_post.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/recover_password_controller.js b/source/controllers/admin/recover_password_controller.js new file mode 100644 index 0000000..cf082eb --- /dev/null +++ b/source/controllers/admin/recover_password_controller.js @@ -0,0 +1,22 @@ +'use strict'; + +module.exports = { + + // + // Renders the password recovery page. + // + view: (req, res) => { + const I18n = req.app.locals.I18n; + + // Render the template + res.useSystemViews().render('recover_password', { + meta: { + bodyClass: 'recover-password no-menu', + title: I18n.term('recover_password') + }, + scripts: ['/assets/js/recover_password.bundle.js'], + styles: ['/assets/css/recover_password.css'] + }); + } + +}; diff --git a/source/controllers/admin/reset_password_controller.js b/source/controllers/admin/reset_password_controller.js new file mode 100644 index 0000000..3b40e61 --- /dev/null +++ b/source/controllers/admin/reset_password_controller.js @@ -0,0 +1,22 @@ +'use strict'; + +module.exports = { + + // + // Renders the password reset page. + // + view: (req, res) => { + const I18n = req.app.locals.I18n; + + // Render the template + res.useSystemViews().render('reset_password', { + meta: { + bodyClass: 'reset-password no-menu', + title: I18n.term('reset_your_password') + }, + scripts: ['/assets/js/reset_password.bundle.js'], + styles: ['/assets/css/reset_password.css'] + }); + } + +}; diff --git a/source/controllers/admin/settings_controller.js b/source/controllers/admin/settings_controller.js new file mode 100644 index 0000000..901e450 --- /dev/null +++ b/source/controllers/admin/settings_controller.js @@ -0,0 +1,73 @@ +'use strict'; + +const Moment = require('moment'); +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); +const Themes = require(Path.join(__basedir, 'source/modules/themes.js')); + +module.exports = { + + // + // Renders the settings page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + + let queue = []; + let timeZones = []; + + // Get a list of all possible time zones + Moment.tz.names().map((zone) => { + timeZones.push({ id: zone, name: zone.replace(/_/g, ' ')}); + }); + + // Get themes + queue.push(Themes.getThemes()); + + // Get language packs + queue.push(I18n.getLanguagePacks()); + + // Get all posts that are eligible to use as a custom homepage + queue.push( + models.post.findAll({ + attributes: ['id', 'slug', 'title'], + where: { + isPage: 1, + status: 'published', + publishedAt: { $lt: Moment().utc().toDate() } + }, + order: [ + ['title', 'ASC'] + ] + }) + ); + + // Wait for all queue to resolve + Promise.all(queue) + .then((result) => { + let themes = result[0]; + let languages = result[1]; + let homepagePosts = result[2]; + + // Render the template + res.useSystemViews().render('settings', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'settings', + title: I18n.term('settings') + }, + homepagePosts: homepagePosts, + languages: languages, + themes: themes, + timeZones: timeZones, + scripts: ['/assets/js/settings.bundle.js'], + styles: ['/assets/css/settings.css'], + uploadAction: MakeUrl.api('uploads') + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/tags_controller.js b/source/controllers/admin/tags_controller.js new file mode 100644 index 0000000..d29f029 --- /dev/null +++ b/source/controllers/admin/tags_controller.js @@ -0,0 +1,41 @@ +'use strict'; + +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); + +module.exports = { + + // + // Renders the tags page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + + Promise.resolve() + // Fetch tags + .then(() => { + return models.tag + .findAll({ + order: [ + ['name', 'ASC'] + ] + }); + }) + .then((tags) => { + // Render the template + res.useSystemViews().render('tags', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'tags', + title: I18n.term('tags') + }, + tags: tags, + scripts: ['/assets/js/tags.bundle.js'], + styles: ['/assets/css/tags.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/admin/users_controller.js b/source/controllers/admin/users_controller.js new file mode 100644 index 0000000..6c3975b --- /dev/null +++ b/source/controllers/admin/users_controller.js @@ -0,0 +1,41 @@ +'use strict'; + +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); + +module.exports = { + + // + // Renders the users page. + // + view: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + + // Fetch users + Promise.resolve() + .then(() => { + return models.user + .findAll({ + order: [ + ['name', 'ASC'] + ] + }); + }) + .then((users) => { + // Render the template + res.useSystemViews().render('users', { + adminMenu: AdminMenu.getItems(req), + meta: { + bodyClass: 'users', + title: I18n.term('users') + }, + users: users, + scripts: ['/assets/js/users.bundle.js'], + styles: ['/assets/css/users.css'] + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/api/auth_controller.js b/source/controllers/api/auth_controller.js new file mode 100644 index 0000000..55dec42 --- /dev/null +++ b/source/controllers/api/auth_controller.js @@ -0,0 +1,219 @@ +'use strict'; + +const Crypto = require('crypto'); +const Fs = require('fs'); +const HttpCodes = require('http-codes'); +const Path = require('path'); +const Email = require(Path.join(__basedir, 'source/modules/email.js')); + +module.exports = { + + // + // Handles authentication requests by generating an authentication token for the user. + // + // username* (string) - The username of the user to authenticate. + // password* (string) - The user's password. + // + // Returns a JSON response: + // + // { authToken: '' } + // { message: '', invalid: [] } + // + authenticate: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + const sequelize = req.app.locals.Database.sequelize; + + // Fetch the user + models.user + .findOne({ + where: { + $or: [ + // Allow case-insensitive usernames + sequelize.where( + sequelize.fn('lower', sequelize.col('username')), + sequelize.fn('lower', req.body.username) + ), + // Allow case-insensitive emails + sequelize.where( + sequelize.fn('lower', sequelize.col('email')), + sequelize.fn('lower', req.body.username) + ) + ] + } + }) + .then((user) => { + // User not found + if(!user) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('invalid_username_or_email_address'), + invalid: ['username'] + }); + } + + // Verify password + if(!user.verifyPassword(req.body.password)) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('your_password_is_incorrect'), + invalid: ['password'] + }); + } + + // Generate an auth token + let authToken = user.generateAuthToken(); + + // Set a cookie for supportive clients + res.cookie('authToken', authToken.token, { + path: '/', + expires: authToken.expires + }); + + // Send the response + res.json({ + authToken: authToken + }); + }) + .catch((err) => next(err)); + }, + + // + // Generates a reset token and sends a password recovery email. + // + // username* (string) - A valid username. + // + // Returns a JSON response: + // + // { message: '' } + // + recoverPassword: (req, res, next) => { + const I18n = req.app.locals.I18n; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + const sequelize = req.app.locals.Database.sequelize; + + // Fetch the user + models.user + .findOne({ + where: { + $or: [ + // Allow case-insensitive usernames + sequelize.where( + sequelize.fn('lower', sequelize.col('username')), + sequelize.fn('lower', req.body.username) + ), + // Allow case-insensitive emails + sequelize.where( + sequelize.fn('lower', sequelize.col('email')), + sequelize.fn('lower', req.body.username) + ) + ] + } + }) + .then((user) => { + // User not found + if(!user) { + return res.status(HttpCodes.BAD_REQUEST).json({ + invalid: ['username'] + }); + } + + // Generate reset token and URL + let message = Fs.readFileSync(Path.join(__basedir, 'source/emails/password_reset.txt'), { encoding: 'utf8' }); + let resetToken = Crypto.randomBytes(32).toString('hex'); + let resetUrl = MakeUrl.admin('login/reset', { + absolute: true, + query: { + id: user.id, + token: resetToken + } + }); + + // Set the user's reset token + user.resetToken = resetToken; + user.save(); + + // Send email + Email.send({ + to: { + name: user.name, + email: user.email + }, + subject: I18n.term('postleaf_account_recovery_message'), + message: { text: message }, + placeholders: { + name: user.name, + forgotYourPassword: I18n.term('forgot_your_password_it_happens_sometimes'), + followThisLink: I18n.term('just_follow_this_link_and_youll_be_publishing_again'), + resetUrl: resetUrl, + websiteUrl: MakeUrl.raw('', { absolute: true }), + websiteTitle: req.app.locals.Settings.title + } + }) + .then(() => { + // Send the response + res.json({ + message: I18n.term('please_check_your_email_for_further_instructions') + }); + }) + .catch(() => { + res.status(HttpCodes.INTERNAL_SERVER_ERROR).json({ + message: I18n.term('sorry_but_i_cant_seem_to_send_an_email_at_the_moment') + }); + }); + }) + .catch((err) => next(err)); + }, + + // + // Resets a user's password. + // + // resetToken* (string) - A valid reset token. + // password* (string) - The new password. + // + // Returns a JSON response: + // + // { message: '' } + // { message: '', invalid: [] } + // + resetPassword: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + let password = req.body.password || ''; + + // Fetch the user + models.user + .findOne({ + where: { + id: req.body.id, + resetToken: req.body.token + } + }) + .then((user) => { + // User not found or invalid reset token + if(!user) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('the_link_you_followed_is_no_longer_valid') + }); + } + + // Check password length + if(password.length < process.env.AUTH_PASSWORD_MIN_LENGTH) { + return res.status(HttpCodes.BAD_REQUEST).json({ + invalid: ['password'], + message: I18n.term('passwords_need_to_be_at_least_eight_characters_long') + }); + } + + // Reset the password + user.setPassword(password); + user.resetToken = null; + user.save(); + + return res.json({ + message: I18n.term('your_password_has_been_reset') + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/api/backup_controller.js b/source/controllers/api/backup_controller.js new file mode 100644 index 0000000..567b7ce --- /dev/null +++ b/source/controllers/api/backup_controller.js @@ -0,0 +1,323 @@ +'use strict'; + +const Del = require('del'); +const Fs = require('fs'); +const HttpCodes = require('http-codes'); +const JSZip = require('jszip'); +const Mkdirp = require('mkdirp'); +const Moment = require('moment'); +const RecursiveReaddir = require('recursive-readdir'); +const Path = require('path'); +const Tmp = require('tmp'); +const UploadMiddleware = require(Path.join(__basedir, 'source/middleware/upload_middleware.js')); + +// +// Adds an entire folder to a zip file. +// +// folder* (string) - The full path of the folder to add. +// zip* (object) - A zip object. +// +// Returns a promise. +// +function addFolderToZip(folder, zip) { + return new Promise((resolve, reject) => { + RecursiveReaddir(folder, (err, files) => { + if(err) { + return reject('Unable to read folder: ' + folder); + } + + // Add each file to the zip + files.forEach((file) => { + let folder = Path.dirname(Path.relative(__basedir, file)); + let filename = Path.basename(file); + zip + .folder(folder) + .file(filename, Fs.readFileSync(file)); + }); + + resolve(); + }); + }); +} + +// +// Restores data from a backup if a restore file is found in the zip. +// +// model* (object) - The model to restore. +// zip* (object) - A zip object containing the data file. +// +// Returns a promise that resolve with a zip object. +// +function restoreData(model, zip) { + return new Promise((resolve, reject) => { + let filename = 'data/' + model.name + '.json'; + let queue = []; + + // No restore file, skip it + if(!zip.files[filename]) { + return resolve(zip); + } + + // Read the restore file + zip.files[filename].async('string') + .then((data) => { + // Parse the restore file + try { + data = JSON.parse(data); + } catch(err) { + return reject('Unable to parse JSON file: ' + filename); + } + + if(data && data.length) { + // Empty the table + model.destroy({ truncate: true }) + .then(() => { + // Restore all rows + data.forEach((row) => queue.push(model.create(row))); + + // Wait for all rows to populate before proceeding + Promise.all(queue) + .then(() => resolve(zip)) + .catch((err) => reject(err)); + }) + .catch((err) => reject(err)); + } else { + return resolve(zip); + } + }) + .catch((err) => reject(err)); + }); +} + +// +// Restores data from a backup if a restore file is found in the zip. +// +// sourceFolder* (string) - The path to the folder in the zip file. +// destinationFolder* (string) - The path to restore the folder to. +// zip* (object) - A zip object containing the data file. +// +// Returns a promise that resolve with a zip object. +// +function restoreFolderFromZip(sourceFolder, targetFolder, zip) { + return new Promise((resolve, reject) => { + // Folder name must end in a trailing slash + sourceFolder = sourceFolder.replace(/\/$/, '') + '/'; + + // No restore files, skip it + if(!zip.files[sourceFolder]) { + return resolve(zip); + } + + // Delete target + Del(targetFolder) + .then(() => { + let queue = []; + let files = Object.keys(zip.files); + + // Move files from zip to target + if(files && files.length) { + files.forEach((file) => { + // Skip folders and files that aren't in the source folder + if(zip.files[file].dir || file.indexOf(sourceFolder) !== 0) return; + + let pathname = Path.join(targetFolder, Path.relative(sourceFolder, file)); + let dirname = Path.dirname(pathname); + + // Queue restoration + queue.push( + // Read the file's content + zip.files[file].async('nodebuffer') + .then((buffer) => { + // Create the directory if it doesn't exist + Mkdirp(Path.dirname(pathname), (err) => { + if(err) { + return reject('Unable to create directory: ' + dirname); + } + + // Create the file + Fs.writeFile(pathname, buffer, (err) => { + if(err) { + return reject('Unable to create file: ' + pathname); + } + }); + }); + }) + .catch((err) => reject(err)) + ); + }); + + // Wait for all files to be written before proceeding + Promise.all(queue) + .then(() => resolve(zip)) + .catch((err) => reject(err)); + + } else { + // No files, continue restoring + resolve(zip); + } + }) + .catch((err) => reject(err)); + }); +} + +// +// Checks the backup file for postleaf.json to see if it's a valid zip file. We current do this by +// checking for postleaf.json, but this could become a more elaborate check in the future. +// +// zip* (object) - A zip object containing the data file. +// +// Returns a promise that resolve with a zip object. +// +function verifyBackup(zip) { + return new Promise((resolve, reject) => { + if(zip.files['postleaf.json']) { + resolve(zip); + } else { + reject('Invalid backup file.'); + } + }); +} + +module.exports = { + + // + // Creates a backup. + // + // data (string) - Whether or not to export data (default 'true'). + // themes (string) - Whether or not to export themes. + // uploads (string) - Whether or not to export uploads. + // + // Returns a zip file response. + // + create: (req, res, next) => { + const models = req.app.locals.Database.sequelize.models; + + let zip = new JSZip(); + let queue = []; + + // Add a meta file + zip.file('postleaf.json', JSON.stringify({ + createdAt: Moment().tz('utc').format('YYYY-MM-DD HH:mm:ss') + }, null, 2)); + + // Export data + if(typeof req.query.data === 'undefined' || req.query.data === 'true') { + // Convert all database models to JSON strings + for(let model in models) { + // Export each model + queue.push( + models[model].findAll() + .then((rows) => { + let data = []; + + if(rows.length) { + rows.forEach((row) => data.push(row.toJSON())); + } + + // Write data to zip file + zip.folder('data').file(model + '.json', JSON.stringify(data, null, 2)); + }) + .catch((err) => next(err)) + ); + } + } + + // Export themes + if(req.query.themes === 'true') { + queue.push(addFolderToZip(Path.join(__basedir, 'themes'), zip)); + } + + // Export uploads + if(req.query.uploads === 'true') { + queue.push(addFolderToZip(Path.join(__basedir, 'uploads'), zip)); + } + + // Wait for all queue to resolve + Promise.all(queue) + .then(() => zip.generateAsync({ type: 'nodebuffer' })) + .then((buffer) => { + let filename = 'Postleaf Backup (' + Moment.tz('utc').format('YYYY-MM-DD') + ').zip'; + + // Send zip as a download + res.setHeader('Content-Type', 'application/octet-stream'); + res.setHeader('Content-disposition', 'attachment; filename="' + filename + '"'); + res.end(buffer); + }) + .catch((err) => next(err)); + }, + + // + // Restores from a backup. + // + // file* (file) - A zipped backup file. + // + // Returns a JSON response. + // + restore: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + + let tempDir = Tmp.dirSync(); + + // Create a multer instance to receive the zip file + const upload = UploadMiddleware.getMulter({ + allowedTypes: ['application/zip'], + destination: tempDir.name + }).single('file'); + + // Call the upload middleware + upload(req, res, (err) => { + if(err) { + res.status(HttpCodes.BAD_REQUEST); + return next(err); + } + + // Was a file uploaded? + if(!req.file) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('nothing_was_uploaded') + }); + } + + // Extract zip contents + Fs.readFile(req.file.path, (err, data) => { + if(err) { + res.status(HttpCodes.BAD_REQUEST).json({ + message: 'Unable to read from the temp file.' + }); + } + + JSZip.loadAsync(data) + .then((zip) => verifyBackup(zip)) + // Restore uploads + .then((zip) => restoreFolderFromZip('uploads', Path.join(__basedir, 'uploads'), zip)) + // // Restore Themes + .then((zip) => restoreFolderFromZip('themes', Path.join(__basedir, 'themes'), zip)) + // Restore data in a specific order to prevent foreign key constraint errors + .then((zip) => restoreData(models.user, zip)) + .then((zip) => restoreData(models.post, zip)) + .then((zip) => restoreData(models.tag, zip)) + .then((zip) => restoreData(models.postTags, zip)) + .then((zip) => restoreData(models.navigation, zip)) + .then((zip) => restoreData(models.revision, zip)) + .then((zip) => restoreData(models.setting, zip)) + .then((zip) => restoreData(models.upload, zip)) + // Reload settings + .then(() => models.setting.getObject().then((settings) => req.app.locals.Settings = settings)) + // Reload navigation + .then(() => models.navigation.getArray().then((navigation) => req.app.locals.Navigation = navigation)) + .then(() => { + res.json({ + message: I18n.term('your_backup_has_been_restored') + }); + }) + .catch(() => { + res.status(HttpCodes.INTERNAL_SERVER_ERROR); + return next(I18n.term('your_backup_could_not_be_restored_from_this_file')); + }); + }); + }); + + } + +}; diff --git a/source/controllers/api/install_controller.js b/source/controllers/api/install_controller.js new file mode 100644 index 0000000..30822c6 --- /dev/null +++ b/source/controllers/api/install_controller.js @@ -0,0 +1,133 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Path = require('path'); + +module.exports = { + + // + // Creates the owner account, sample posts, and other installation data. + // + // name* (string) - The owner's name. + // email (string) - The owner's email address. + // username* (string) - The owner's username. + // password* (string) - The owner's password. + // + // Returns a JSON response: + // + // { authToken: '' } + // { message: '', invalid: [] } + // + install: (req, res, next) => { + const I18n = req.app.locals.I18n; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + let authToken; + let owner; + let tag; + + // If the app is installed, pretend the endpoint doesn't exist + if(req.app.locals.isInstalled) { + res.status(HttpCodes.NOT_FOUND); + return next('Not Found'); + } + + // Verify password length + if(req.body.password.length < 8) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('passwords_need_to_be_at_least_eight_characters_long'), + invalid: ['password'] + }); + } + + models.user + // Create the owner account + .create({ + name: req.body.name, + email: req.body.email, + username: req.body.username, + password: models.user.hashPassword(req.body.password), + role: 'owner', + bio: 'Just another proud owner of a Postleaf website!', + website: MakeUrl.raw({ absolute: true }) + }) + .then((user) => { + owner = user; + + // Update the installation flag + req.app.locals.isInstalled = true; + + // Generate an auth token (auto-login) + authToken = user.generateAuthToken(); + + // Set a cookie for supportive clients + res.cookie('authToken', authToken.token, { + path: '/', + expires: authToken.expires + }); + }) + // Create a sample nav item + .then(() => models.navigation.create({ label: 'Home', link: '/' })) + // Create a sample tag + .then(() => { + return models.tag + .create({ + slug: 'getting-started', + name: 'Getting Started' + }); + }) + .then((result) => tag = result) + // Create the first sample post + .then(() => { + return models.post + .create({ + slug: 'welcome-to-postleaf', + userId: owner.id, + publishedAt: '2017-04-01 00:00:00', + title: 'Welcome to Postleaf', + content: ` +

Incredible! You just installed the world's most amazing publishing platform. You can use Postleaf to start a new blog or a website. Either way, great choice!

+

By the way, this is just a sample post to help you get started. You can delete it anytime.

+

The Admin Panel

+

You can login to the admin panel by adding /admin to your website's URL. This is where you'll manage your posts, tags, users, and settings. For example: example.com/admin

+

To logout, click the Postleaf logo and select Logout.

+

The Editor

+

Postleaf's editor shows you exactly what your post will look like as you write it. This is known as inline editing, but most people just call it "incredible." If you prefer a distraction-free environment, that's fine too. In that case, check out Zen Mode.

+

Pretty much everything you need can be found in the toolbar, but there are a couple hidden features. Try dragging an image over the editor, for example. Or pasting a link to a YouTube video. Or using Markdown shortcuts as you type.

+

Everything Else

+

There's so much more to this software than just posts, but I'll get out of the way and let you do some exploring.

+

If you enjoy Postleaf, please tell someone about it. Post a status. Send a tweet. Star the repo on GitHub. Help me spread the word about Postleaf and, if you can, please make a donation to the project so I can continue developing it.

+

For more info and other helpful links, head over to Settings > About in the admin panel.

+

Happy publishing!

+

— Cory LaViska, Creator of Postleaf

+ `, + image: '/assets/images/sample_post_image.jpg', + status: 'published', + isPage: false, + isFeatured: false, + isSticky: false + }); + }) + .then((post) => models.postTags.upsert({ postId: post.id, tagId: tag.id })) + // Send a response + .then(() => { + res.json({ + authToken: authToken + }); + }) + .catch((err) => { + // Validation error + if(err.name === 'SequelizeValidationError') { + // Only report one validation error at a time + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term(err.errors[0].message), + invalid: [err.errors[0].path] + }); + } + + return next(err); + }); + + } + +}; diff --git a/source/controllers/api/navigation_controller.js b/source/controllers/api/navigation_controller.js new file mode 100644 index 0000000..06764be --- /dev/null +++ b/source/controllers/api/navigation_controller.js @@ -0,0 +1,64 @@ +'use strict'; + +const HttpCodes = require('http-codes'); + +module.exports = { + + // + // Gets all navigation menu items. + // + // Returns a JSON response: + // + // { navigation: [] } + // + index: (req, res) => { + res.json({ + navigation: req.app.locals.Navigation + }); + }, + + // + // Updates the navigation menu. + // + // navigation* (array) - An arry of { label: link } objects. + // + // Returns a JSON response: + // + // { navigation: {} } + // + update: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + let navigation = req.body.navigation || []; + + // Remove existing items + models.navigation.destroy({ truncate: true }) + .then(() => { + // Insert new items + let queue = []; + for(let i = 0; i < navigation.length; i++) { + queue.push(models.navigation.create({ + label: navigation[i].label, + link: navigation[i].link + })); + } + + // Wait for all rows to update + Promise.all(queue) + .then(() => { + // Update locals + req.app.locals.Navigation = navigation; + + res.json({ + navigation: navigation + }); + }) + .catch(() => { + res.status(HttpCodes.INTERNAL_SERVER_ERROR); + return next(I18n.term('your_changes_could_not_be_saved_at_this_time')); + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/api/oembed_controller.js b/source/controllers/api/oembed_controller.js new file mode 100644 index 0000000..e81fb0a --- /dev/null +++ b/source/controllers/api/oembed_controller.js @@ -0,0 +1,26 @@ +'use strict'; + +const Oembed = require('oembed'); + +module.exports = { + + // + // Submits a URL to an oEmbed provider and returns the resulting oEmbed properties. If no provider + // is found or the URL can't be processed, null is returned. + // + // Returns a JSON response: + // + // { embed: {} } + // { embed: null } + // + getFromProvider: (req, res) => { + Oembed.fetch(req.query.url, { for: req.hostname }, (err, result) => { + if(err) { + return res.json({ embed: null }); + } + + return res.json({ embed: result }); + }); + } + +}; diff --git a/source/controllers/api/posts_controller.js b/source/controllers/api/posts_controller.js new file mode 100644 index 0000000..9bcce65 --- /dev/null +++ b/source/controllers/api/posts_controller.js @@ -0,0 +1,675 @@ +'use strict'; + +const Extend = require('extend'); +const Fs = require('fs'); +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); +const Striptags = require('striptags'); +const AutoEmbed = require(Path.join(__basedir, 'source/modules/auto_embed.js')); +const DynamicImages = require(Path.join(__basedir, 'source/modules/dynamic_images.js')); +const Markdown = require(Path.join(__basedir, 'source/modules/markdown.js')); + +// +// Handles the validation error response for create and update +// +function handleErrorResponse(req, res, err) { + const I18n = req.app.locals.I18n; + + // Foreign key constraint error + if(err.name === 'SequelizeForeignKeyConstraintError') { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('invalid_user'), + invalid: ['user-id'] + }); + } + + // Unique constraint error + if(err.name === 'SequelizeUniqueConstraintError') { + let message = I18n.term('this_field_is_invalid'); + + // Custom message based on field + if(err.fields.includes('slug')) { + message = I18n.term('this_slug_is_already_in_use'); + } + + return res.status(HttpCodes.BAD_REQUEST).json({ + message: message, + invalid: err.fields + }); + } + + // Validation error + if(err.name === 'SequelizeValidationError') { + // Only report one validation error at a time + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term(err.errors[0].message), + invalid: [err.errors[0].path] + }); + } + + // Other + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('your_changes_could_not_be_saved_at_this_time'), + invalid: [] + }); +} + +module.exports = { + + // + // Gets a list of posts. + // + // search (string) - Filter posts by search (default null). + // status (string) - Optional CSV of statuses to filter by (default null). Ex: 'draft,published' + // flag (string) - Optional CSV of flags to filter by (default null). Ex: 'isFeatured,isSticky' + // count (int) - The number of posts to return (default 100). + // offset (int) - The offset to return posts from (default 0). + // render (string) - Set to 'postItems' to return the rendered HTML from `partials/post_items.dust`. + // + // Returns a JSON response: + // + // { totalItems: 100, posts: [] } + // { totalItems: 100, posts: [], html: '' } + // + index: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + let count = parseInt(req.query.count) || 100; + let offset = parseInt(req.query.offset) || 0; + let where = {}; + let status = typeof req.query.status === 'string' ? req.query.status.split(',') : null; + let flag = typeof req.query.flag === 'string' ? req.query.flag.split(',') : null; + let fetch; + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role)) { + where.userId = User.id; + } + + // Filter by status + if(status && status.length) where.status = { $in: status }; + + // Filter by flag + if(flag && flag.length) { + if(flag.includes('isPage')) where.isPage = 1; + if(flag.includes('isFeatured')) where.isFeatured = 1; + if(flag.includes('isSticky')) where.isSticky = 1; + } + + if(req.query.search) { + // Search + fetch = models.post.search(req.query.search, { + distinct: true, + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + limit: count, + offset: offset + }); + } else { + // No search + fetch = models.post + .findAndCountAll({ + distinct: true, + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + limit: count, + offset: offset, + order: [ + ['publishedAt', 'DESC'] + ] + }); + } + + // Fetch posts + fetch + .then((result) => { + return new Promise((resolve) => { + // Render the post items and return the posts + if(req.query.render === 'postItems') { + // Render the partial + res.useSystemViews().app.render('partials/post_items.dust', { + posts: result.rows + }, (err, html) => { + if(err) throw new Error(err); + + resolve({ + totalItems: result.count, + posts: result.rows, + html: html + }); + }); + + return; + } + + // Just return the posts + resolve({ + totalItems: result.count, + posts: result.rows + }); + }); + }) + .then((json) => res.json(json)) + .catch((err) => next(err)); + }, + + // + // Creates a post. + // + // slug* (string) - The post's slug. + // user-id* (string) - The post author's id + // published-at* (string) - The publish date in YYYY-MM-DD HH:mm:ss format + // title* (string) - The post's title. + // content* (string) - The post's content as HTML. + // content-format (string) - The format of the content being submitted. Either 'html' or + // 'markdown' (default 'html'). For markdown, URLs will be converted into embedded objects when + // a suitable oEmbed provider is found. + // image (string) - The post's image URL. + // meta-title (string) - The post's meta title. + // meta-description (string) - The post's meta description. + // template (string) - The name of the template the post should use (default null). + // status* (string) - The post status. Either 'draft', 'published', 'pending', or 'rejected'. + // is-page (int) - Set to true if the post is a page, false if not (default false). + // is-featured (int) - Set to true if the post is featured, false if not (default false). + // is-sticky (int) - Set to true if the post is sticky, false if not (default false). + // tags (array) - One or more tags to assign to the post. + // + // Returns a JSON response: + // + // { post: {} } + // { message: '', invalid: [] } + // + create: function(req, res, next) { + const User = req.User; + const Settings = req.app.locals.Settings; + const models = req.app.locals.Database.sequelize.models; + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && req.body['user-id'] !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + return next('Unauthorized'); + } + + // Contributors can't publish or reject posts + if( + !['owner', 'admin', 'editor'].includes(User.role) && + ['published', 'rejected'].includes(req.body.status) + ) { + res.status(HttpCodes.UNAUTHORIZED); + return next('Unauthorized'); + } + + Promise.resolve() + // Process content + .then(() => { + // Convert markdown to HTML and auto-embed text URLs + if(req.body['content-format'] === 'markdown') { + return AutoEmbed.parse(req.body.content, { hostname: req.hostname }).then((content) => { + req.body.content = Markdown.toHtml(content); + }); + } + }) + .then(() => { + // Create the post + return models.post.create({ + slug: req.body.slug, + userId: req.body['user-id'], + publishedAt: new Moment.tz(req.body['published-at'], Settings.timeZone).tz('UTC'), + title: req.body.title, + content: req.body.content, + image: req.body.image, + metaTitle: req.body['meta-title'], + metaDescription: req.body['meta-description'], + template: req.body.template, + status: req.body.status || 'published', + isPage: req.body['is-page'] === 'true', + isFeatured: req.body['is-featured'] === 'true', + isSticky: req.body['is-sticky'] === 'true' + }); + }) + // Create an initial revision + .then((post) => { + return models.revision + .create({ + postId: post.id, + userId: req.User.id, + revisionDate: Moment().format('YYYY-MM-DD HH:mm:ss'), + title: post.title, + content: post.content + }) + .then(() => post); + }) + // Assign tags to the post + .then((post) => { + if(Array.isArray(req.body.tags)) { + req.body.tags.forEach((tagId) => { + models.postTags.upsert({ postId: post.id, tagId: tagId }); + }); + } + + return post; + }) + // Send a response + .then((post) => { + res.json({ + post: post + }); + }) + .catch((err) => handleErrorResponse(req, res, err)); + }, + + // + // Gets a post. + // + // Returns a JSON response: + // + // { post: {} } + // + read: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + models.post + .findOne({ + where: { + id: req.params.id + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ] + }) + .then((post) => { + // Not found + if(!post) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Post Not Found'); + } + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && post.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + res.json({ + post: post + }); + }) + .catch((err) => next(err)); + }, + + // + // Updates a post. + // + // slug (string) - The post's slug. + // user-id (string) - The post author's id + // published-at (string) - The publish date in YYYY-MM-DD HH:mm:ss format + // title (string) - The post's title. + // content (string) - The post's content as HTML. + // image (string) - The post's image as URL. + // meta-title (string) - The post's meta title. + // meta-description (string) - The post's meta description. + // template (string) - The name of the template the post should use. + // status (string) - The post status. Either 'draft', 'published', 'pending', or 'rejected'. + // is-page (int) - Set to true if the post is a page, false if not. + // is-featured (int) - Set to true if the post is featured, false if not. + // is-sticky (int) - Set to true if the post is sticky, false if not. + // tags (array) - One or more tags to assign to the post. + // + // Returns a JSON response: + // + // { post: {} } + // { message: '', invalid: [] } + // + update: function(req, res, next) { + const User = req.User; + const Settings = req.app.locals.Settings; + const models = req.app.locals.Database.sequelize.models; + + // Fetch the post + models.post + .findOne({ + where: { + id: req.params.id + } + }) + .then((post) => { + // Not found + if(!post) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Post Not Found'); + } + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && post.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Contributors can't publish or reject posts unless the post is already published/rejected + if( + // Not an owner/admin/editor + !['owner', 'admin', 'editor'].includes(User.role) && + // A status is set + typeof req.body.status !== 'undefined' && + // The new status is rejected or published and doesn't match the old status + (['rejected', 'published'].includes(req.body.status) && req.body.status !== post.status) + ) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Set fields + if(typeof req.body.slug !== 'undefined') post.slug = req.body.slug; + if(typeof req.body['user-id'] !== 'undefined') post.userId = req.body['user-id']; + if(typeof req.body['published-at'] !== 'undefined') { + post.publishedAt = new Moment.tz(req.body['published-at'], Settings.timeZone).tz('UTC'); + } + if(typeof req.body.title !== 'undefined') post.title = req.body.title; + if(typeof req.body.content !== 'undefined') post.content = req.body.content; + if(typeof req.body.image !== 'undefined') post.image = req.body.image; + if(typeof req.body['meta-title'] !== 'undefined') post.metaTitle = req.body['meta-title']; + if(typeof req.body['meta-description'] !== 'undefined') post.metaDescription = req.body['meta-description']; + if(typeof req.body.template !== 'undefined') post.template = req.body.template; + if(typeof req.body.status !== 'undefined') post.status = req.body.status; + if(typeof req.body['is-page'] !== 'undefined') post.isPage = req.body['is-page'] === 'true'; + if(typeof req.body['is-featured'] !== 'undefined') post.isFeatured = req.body['is-featured'] === 'true'; + if(typeof req.body['is-sticky'] !== 'undefined') post.isSticky = req.body['is-sticky'] === 'true'; + + // Update the post + post.save() + // Create a revision + .then(() => models.revision.create({ + postId: post.id, + userId: req.User.id, + revisionDate: Moment().format('YYYY-MM-DD HH:mm:ss'), + title: post.title, + content: post.content + })) + // Send a response + .then(() => { + res.json({ + post: post + }); + }) + .catch((err) => handleErrorResponse(req, res, err)); + + // Update tags + if(Array.isArray(req.body.tags)) { + models.postTags + // Remove old tags + .destroy({ + where: { postId: post.id } + }) + // Set new tags + .then(() => { + req.body.tags.forEach((tagId) => { + models.postTags + .upsert({ postId: post.id, tagId: tagId }) + .catch((err) => next(err)); + }); + }) + .catch((err) => next(err)); + } + }) + .catch((err) => next(err)); + }, + + // + // Deletes a post + // + // Returns a JSON response: + // + // { deleted: true } + // + delete: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + // Fetch the post + models.post + .findOne({ + where: { + id: req.params.id + } + }) + .then((post) => { + // Not found + if(!post) { + if(!post) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Post Not Found'); + } + } + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && post.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Delete the post + return post.destroy(); + }) + .then(() => res.json({ deleted: true })) + .catch((err) => next(err.message)); + }, + + // + // Renders a post preview. Previews are rendered without any session context so users can see the + // post as normal visitors would. + // + // Query params: + // + // isEditor (string) - Set to 'true' when the post is being rendered in the editor. + // isZenMode (string) - Set to 'true' to render the post in a distraction-free template. + // + // Body params (POST request only) + // + // post (string) - A JSON string of post data that can be used to override existing properties. + // + // Notes: + // - The :id request param can be a post ID or the string ':blank'. + // - JSON-LD, OpenGraph, and Twitter Card data is not generated for previews. + // + // Returns the rendered post. + // + preview: function(req, res, next) { + const User = req.User; + const Settings = req.app.locals.Settings; + const models = req.app.locals.Database.sequelize.models; + + // Parse custom post data + let customPostData; + try { + customPostData = JSON.parse(req.body.post || '{}'); + } catch(err) { + res.status(HttpCodes.BAD_REQUEST); + return next('Invalid JSON string for post parameter.'); + } + + // Fetch the post, the post's author, and all related tags + models.post + .findOne({ + where: { + id: req.params.id + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ] + }) + // Inject srcset attribute for dynamic images + .then((post) => { + if(post) { + return DynamicImages + .injectSrcset(post.content, models.upload) + .then((content) => Extend(post, { content: content })) + .catch((err) => next(err)); + } + + return post; + }) + .then((post) => { + let queue = []; + + if(!post) { + // No post found, should we render a blank one? + if(req.params.id === ':blank') { + // Create a blank post object + post = { + slug: '', + userId: User.id, + author: User, + publishedAt: '', + title: '', + content: '', + metaTitle: '', + metaDescription: '', + template: '', + status: 'published', + isPage: false, + isFeatured: false, + isSticky: false + }; + } else if(!post) { + // Not found + res.status(HttpCodes.NOT_FOUND); + return next('Not Found'); + } + } + + // All posts for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && post.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + return next('Unauthorized'); + } + + // Merge custom post data + if(customPostData) { + if(typeof customPostData.slug !== 'undefined') post.slug = customPostData.slug; + if(typeof customPostData['user-id'] !== 'undefined') post.userId = customPostData['user-id']; + if(typeof customPostData['published-at'] !== 'undefined') { + post.publishedAt = new Moment.tz(customPostData['published-at'], Settings.timeZone).tz('utc'); + } + if(typeof customPostData.title !== 'undefined') post.title = customPostData.title; + if(typeof customPostData.content !== 'undefined') post.content = customPostData.content; + if(typeof customPostData.image !== 'undefined') post.image = customPostData.image; + if(typeof customPostData['meta-title'] !== 'undefined') post.metaTitle = customPostData['meta-title']; + if(typeof customPostData['meta-description'] !== 'undefined') post.metaDescription = customPostData['meta-description']; + if(typeof customPostData.template !== 'undefined') post.template = customPostData.template; + if(typeof customPostData.status !== 'undefined') post.status = customPostData.status; + if(typeof customPostData['is-page'] !== 'undefined') post.isPage = customPostData['is-page'] === true; + if(typeof customPostData['is-featured'] !== 'undefined') post.isFeatured = customPostData['is-featured'] === true; + if(typeof customPostData['is-sticky'] !== 'undefined') post.isSticky = customPostData['is-sticky'] === true; + + // Override author + if(typeof customPostData['user-id'] !== 'undefined') { + queue.push( + models.user + .findOne({ + where: { id: customPostData['user-id'] } + }) + .then((user) => post.author = user) + ); + } + + // Override tags + if(typeof customPostData['tags'] !== 'undefined') { + post.tags = []; + + // Fetch all tags and append them to post.tags + if(Array.isArray(customPostData['tags'])) { + customPostData['tags'].forEach((id) => { + queue.push( + models.tag.findOne({ where: { id: id } }).then((tag) => post.tags.push(tag)) + ); + }); + } + } + } + + // Wait for all queue to resolve + Promise.all(queue) + .then(() => { + // Assemble view data + let metaTitle = post.metaTitle || post.title; + let metaDescription = Striptags(post.metaDescription || post.content).split(' ', 50).join(' '); + let viewData = { + post: post, + meta: { + title: metaTitle, + description: metaDescription + } + }; + + // Determine which template the post should use + let themeName = req.app.locals.Settings.theme; + let template = req.query.template || post.template || 'post'; + let templatePath = Path.join(__basedir, 'themes', themeName, 'templates', template); + if(template !== 'post' && !Fs.existsSync(templatePath)) template = 'post'; + + // Prevent browsers from identifying XSS attacks when post previews are rendered. + // See http://stackoverflow.com/questions/1547884/refused-to-execute-a-javascript-script-source-code-of-script-found-within-reque + res.set('X-XSS-Protection', '0'); + + // Create a copy of the response object so we can safely modify it for the preview. Remove + // user session data and append the isEditor flag if it's desired. + let previewRes = Extend({}, res); + previewRes.locals.User = null; + previewRes.locals.isEditor = req.query.isEditor === 'true'; + + // Render the post + if(req.query.isZenMode === 'true') { + // Use zen mode template + previewRes.useSystemViews().render('zen_mode', viewData); + } else { + // Use post template + previewRes.useThemeViews().render(template, viewData); + } + }) + .catch((err) => next(err)); + }); + } + +}; diff --git a/source/controllers/api/revisions_controller.js b/source/controllers/api/revisions_controller.js new file mode 100644 index 0000000..22b9a23 --- /dev/null +++ b/source/controllers/api/revisions_controller.js @@ -0,0 +1,257 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Path = require('path'); + +module.exports = { + + // + // Gets a list of revisions. + // + // postId (string) - Filter revisions by post id. + // userId (string) - Filter revisions by user id. + // count (int) - The number of posts to return (default 100). + // offset (int) - The offset to return posts from (default 0). + // render (string) - Set to 'revisionsTable' to return the rendered HTML from + // `partials/revisions_table.dust`. + // + // Returns a JSON response: + // + // { totalItems: 100, revisions: [] } + // { totalItems: 100, revisions: [], html: '' } + // + index: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + let count = parseInt(req.query.count) || 100; + let offset = parseInt(req.query.offset) || 0; + let where = {}; + + // Filter by post id + if(req.query.postId) where.postId = req.query.postId; + + // Filter by user id + if(req.query.userId) where.userId = req.query.userId; + + // Fetch revisions + models.revision + .findAndCountAll({ + distinct: true, + where: where, + include: [ + { + model: models.post, + // All revisions for owners/admins/editors, only revisions to your posts for + // contributors + where: ['owner', 'admin', 'editor'] + .includes(User.role) ? undefined : { userId: User.id } + }, + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + } + ], + limit: count, + offset: offset, + order: [ + ['createdAt', 'DESC'] + ] + }) + .then((result) => { + return new Promise((resolve) => { + // Render the revision table and return the revisions + if(req.query.render === 'revisionsTable') { + // Render the partial + res.useSystemViews().app.render('partials/revisions_table.dust', { + revisions: result.rows + }, (err, html) => { + if(err) throw new Error(err); + + resolve({ + totalItems: result.count, + revisions: result.rows, + html: html + }); + }); + + return; + } + + // Just return the revisions + resolve({ + totalItems: result.count, + revisions: result.rows + }); + }); + }) + .then((json) => res.json(json)) + .catch((err) => next(err)); + }, + + // + // Creates a revision. + // + // NOTE: There is no method to create a revision. It happens internally when posts are saved. + // + // Always returns a Method Not Allowed response. + // + create: function(req, res) { + return res.status(HttpCodes.METHOD_NOT_ALLOWED); + }, + + // + // Gets a revision. + // + // Returns a JSON response: + // + // { revision: {} } + // + read: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + models.revision + .findOne({ + where: { + id: req.params.id + }, + include: [ + { + model: models.post + }, + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + } + ] + }) + .then((revision) => { + // Not found + if(!revision) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Revision Not Found'); + } + + // All revisions for owners/admins/editors, only revisions to your posts for contributors + if( + !['owner', 'admin', 'editor'].includes(User.role) && + revision.post.userId !== User.id + ) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + res.json({ + revision: revision + }); + }) + .catch((err) => next(err)); + }, + + // + // Updates a revision. + // + // NOTE: There is no method to update a revision. Revisions are created internally at this time. + // + // Always returns a Method Not Allowed response. + // + update: function(req, res) { + return res.status(HttpCodes.METHOD_NOT_ALLOWED); + }, + + // + // Deletes a revision + // + // Returns a JSON response: + // + // { deleted: true } + // + delete: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + // Fetch the revision + models.revision + .findOne({ + where: { + id: req.params.id + }, + include: [{ + model: models.post + }] + }) + .then((revision) => { + // Not found + if(!revision) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Revision Not Found'); + } + + // All revisions for owners/admins/editors, only revisions to your posts for contributors + if( + !['owner', 'admin', 'editor'].includes(User.role) && + revision.post.userId !== User.id + ) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Delete it + return revision.destroy(); + }) + .then(() => res.json({ deleted: true })) + .catch((err) => next(err.message)); + }, + + // + // Renders a revision preview. Previews are rendered without any session context. + // + // Notes: + // - JSON-LD, OpenGraph, and Twitter Card data is not generated for previews. + // + // Returns the rendered post. + // + preview: function(req, res, next) { + const PostsController = require(Path.join(__basedir, 'source/controllers/api/posts_controller.js')); + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + models.revision + // Fetch the revision + .findOne({ + where: { + id: req.params.id + }, + include: [{ + model: models.post + }] + }) + // Render the preview + .then((revision) => { + // All revisions for owners/admins/editors, only revisions to your posts for contributors + if( + !['owner', 'admin', 'editor'].includes(User.role) && + revision.post.userId !== User.id + ) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Hand the request off to the post preview controller + req.params = { id: revision.postId }; + req.body.post = JSON.stringify({ + title: revision.title, + content: revision.content + }); + + PostsController.preview(req, res, next); + }) + .catch((err) => { + res.status(HttpCodes.NOT_FOUND); + return next(err); + }); + } + +}; diff --git a/source/controllers/api/search_controller.js b/source/controllers/api/search_controller.js new file mode 100644 index 0000000..f543139 --- /dev/null +++ b/source/controllers/api/search_controller.js @@ -0,0 +1,180 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Path = require('path'); +const AdminMenu = require(Path.join(__basedir, 'source/modules/admin_menu.js')); + +module.exports = { + + // + // Gets search results. + // + // search* (string) - The term to search for. + // render (string) - Set to 'locaterResults' to return the rendered HTML from + // `partials/locater_results.dust`. + // + // Returns a JSON response: + // + // { results: [] } + // { results: [], html: '' } + // { invalid: [] } + // + index: function(req, res, next) { + const Settings = req.app.locals.Settings; + const User = req.User; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + let queue = []; + let maxResults = 20; + + // Search is required + if(!req.query.search) { + return res.status(HttpCodes.BAD_REQUEST).json({ + invalid: ['search'] + }); + } + + // Special items + let websiteResults = []; + // Homepage link + if( + // Search can match any of these terms + (Settings.title + ' ' + Settings.tagline + ' blog homepage website') + .toLowerCase() + .indexOf(req.query.search.toLowerCase()) + > -1 + ) { + websiteResults.push({ + title: Settings.title, + description: Settings.tagline, + image: Settings.favicon || null, + icon: 'fa fa-globe', + link: MakeUrl.raw() + }); + } + + // Search menu items + let adminMenu = AdminMenu.getItems(req); + let adminMenuResults = []; + // Loop through groups + adminMenu.forEach((group) => { + group.forEach((item) => { + if(!item.noSearch && item.label.toLowerCase().indexOf(req.query.search.toLowerCase()) > -1) { + adminMenuResults.push({ + title: item.label, + description: null, + icon: item.icon, + link: item.link + }); + } + }); + }); + + // Search users + if(['owner', 'admin'].includes(User.role)) { + queue.push( + models.user.search(req.query.search, { limit: maxResults }) + .then((users) => { + let results = []; + if(users.rows) { + users.rows.forEach((user) => { + results.push({ + title: user.name, + description: user.username, + icon: 'fa fa-user', + image: user.avatar || null, + link: MakeUrl.admin('users/edit/' + encodeURIComponent(user.id)) + }); + }); + } + return results; + }) + ); + } + + // Search tags + if(['owner', 'admin', 'editor'].includes(User.role)) { + queue.push( + models.tag.search(req.query.search, { limit: maxResults }) + .then((tags) => { + let results = []; + if(tags.rows) { + tags.rows.forEach((tag) => { + results.push({ + title: tag.name, + description: tag.slug, + image: tag.image ? tag.image : null, + icon: 'fa fa-tag', + link: MakeUrl.admin('tags/edit/' + encodeURIComponent(tag.id)) + }); + }); + } + return results; + }) + ); + } + + // Search posts + queue.push( + models.post.search(req.query.search, { + where: { + // Show all posts for owners/admins/editors, only yours for contributors + userId: ['owner', 'admin', 'editor'].includes(User.role) ? undefined : User.id + }, + limit: maxResults + }) + .then((posts) => { + let results = []; + if(posts.rows) { + posts.rows.forEach((post) => { + results.push({ + title: post.title, + image: post.image ? post.image : null, + icon: 'fa fa-file-text', + description: post.slug, + link: MakeUrl.admin('/posts/edit/' + encodeURIComponent(post.id)) + }); + }); + } + return results; + }) + ); + + // Wait for the queue to resolve + Promise.all(queue) + .then((results) => { + return new Promise((resolve) => { + // Remove empty results and merge everything into a single array + results = [].concat( + websiteResults, + adminMenuResults, + ...results.filter((items) => items.length) + ); + + // Render locater results list and return it with results + if(req.query.render === 'locaterResults') { + // Render the partial + res.useSystemViews().app.render('partials/locater_results.dust', { + results: results + }, (err, html) => { + if(err) throw new Error(err); + resolve({ + results: results, + html: html + }); + }); + + return; + } + + // Just return the results + resolve({ + results: results + }); + }); + }) + .then((json) => res.json(json)) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/api/settings_controller.js b/source/controllers/api/settings_controller.js new file mode 100644 index 0000000..f8a2196 --- /dev/null +++ b/source/controllers/api/settings_controller.js @@ -0,0 +1,102 @@ +'use strict'; + +const Extend = require('extend'); +const HttpCodes = require('http-codes'); + +module.exports = { + + // + // Gets all settings. + // + // Returns a JSON response: + // + // { settings: {} } + // + index: (req, res) => { + res.json({ + settings: req.app.locals.Settings + }); + }, + + // + // Updates one or more settings. + // + // title (string) - The website's title. + // tagline (string) - The website's tagline. + // custom-homepage (string) - A post slug to use as the custom homepage. + // posts-per-page (int) - The number of posts to display per page. + // cover (string) - A relative or absolute URL for the website's cover photo. + // logo (string) - A relative or absolute URL for the website's logo. + // favicon (string) - A relative or absolute URL for the website's favicon. + // theme (string) - A valid theme ID. + // language (string) - A valid language code. + // time-zone (string) - A valid time zone identifier per moment.js. + // default-post-title (string) - The default title to use for posts. + // default-post-content (string) - The default content to use for posts. + // head-code (string) - Code to inject into {@head/}. + // foot-code (string) - Code to inject into {@foot/}. + // + // Returns a JSON response: + // + // { settings: {} } + // + update: (req, res, next) => { + const I18n = req.app.locals.I18n; + const models = req.app.locals.Database.sequelize.models; + let settings = Extend(true, {}, req.app.locals.Settings); + + // Website + if(typeof req.body.title !== 'undefined') settings.title = req.body.title; + if(typeof req.body.tagline !== 'undefined') settings.tagline = req.body.tagline; + if(typeof req.body['custom-homepage'] !== 'undefined') { + settings.customHomepage = req.body['custom-homepage'] || null; + } + if(typeof req.body['posts-per-page'] !== 'undefined') { + settings.postsPerPage = parseInt(req.body['posts-per-page']) || 10; + } + if(typeof req.body.cover !== 'undefined') settings.cover = req.body.cover; + if(typeof req.body.logo !== 'undefined') settings.logo = req.body.logo; + if(typeof req.body.favicon !== 'undefined') settings.favicon = req.body.favicon; + + // Theme + if(typeof req.body.theme !== 'undefined') settings.theme = req.body.theme; + + // Preferences + if(typeof req.body.language !== 'undefined') settings.language = req.body.language; + if(typeof req.body['time-zone'] !== 'undefined') settings.timeZone = req.body['time-zone']; + + // Advanced + if(typeof req.body['default-post-title'] !== 'undefined') { + settings.defaultPostTitle = req.body['default-post-title']; + } + if(typeof req.body['default-post-content'] !== 'undefined') { + settings.defaultPostContent = req.body['default-post-content']; + } + if(typeof req.body['head-code'] !== 'undefined') settings.headCode = req.body['head-code']; + if(typeof req.body['foot-code'] !== 'undefined') settings.footCode = req.body['foot-code']; + + // Update the database + let queue = []; + for(let key in settings) { + queue.push(models.setting.upsert({ key: key, value: settings[key] })); + } + + // Wait for all rows to update + Promise.all(queue) + // Update locals + .then(() => req.app.locals.Settings = settings) + // Reload i18n + .then(() => I18n.load(settings.language)) + // Send the response + .then(() => { + res.json({ + settings: settings + }); + }) + .catch(() => { + res.status(HttpCodes.INTERNAL_SERVER_ERROR); + return next(I18n.term('your_changes_could_not_be_saved_at_this_time')); + }); + } + +}; diff --git a/source/controllers/api/tags_controller.js b/source/controllers/api/tags_controller.js new file mode 100644 index 0000000..1cafed2 --- /dev/null +++ b/source/controllers/api/tags_controller.js @@ -0,0 +1,264 @@ +'use strict'; + +const HttpCodes = require('http-codes'); + +// +// Handles the validation error response for create and update +// +function handleErrorResponse(req, res, err) { + const I18n = req.app.locals.I18n; + + // Unique constraint error + if(err.name === 'SequelizeUniqueConstraintError') { + let message = I18n.term('this_field_is_invalid'); + + // Custom message based on field + if(err.fields.includes('slug')) { + message = I18n.term('this_slug_is_already_in_use'); + } + + return res.status(HttpCodes.BAD_REQUEST).json({ + message: message, + invalid: err.fields + }); + } + + // Validation error + if(err.name === 'SequelizeValidationError') { + // Only report one validation error at a time + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term(err.errors[0].message), + invalid: [err.errors[0].path] + }); + } + + // Other + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('your_changes_could_not_be_saved_at_this_time'), + invalid: [] + }); +} + +module.exports = { + + // + // Gets a list of tags. + // + // search (string) - Filter tags by search (default null). + // count (int) - The number of tags to return (default 100). + // offset (int) - The offset to return tags from (default 0). + // render (string) - Set to 'tagCards' to return the rendered HTML from `partials/tag_cards.dust`. + // + // Returns a JSON response: + // + // { totalItems: 100, tags: [] } + // { totalItems: 100, tags: [], html: '' } + // + index: function(req, res, next) { + const models = req.app.locals.Database.sequelize.models; + let count = parseInt(req.query.count) || 100; + let offset = parseInt(req.query.offset) || 0; + let fetch; + + if(req.query.search) { + // Search + fetch = models.tag.search(req.query.search, { + limit: count, + offset: offset + }); + } else { + // No search + fetch = models.tag + .findAndCountAll({ + limit: count, + offset: offset, + order: [ + ['name', 'ASC'] + ] + }); + } + + // Fetch tags + fetch + .then((result) => { + return new Promise((resolve) => { + // Render the tag cards and return the tags + if(req.query.render === 'tagCards') { + // Render the partial + res.useSystemViews().app.render('partials/tag_cards.dust', { + tags: result.rows + }, (err, html) => { + if(err) throw new Error(err); + + resolve({ + totalItems: result.count, + tags: result.rows, + html: html + }); + }); + + return; + } + + // Just return the tags + resolve({ + totalItems: result.count, + tags: result.rows + }); + }); + }) + .then((json) => res.json(json)) + .catch((err) => next(err)); + }, + + // + // Creates a tag. + // + // name* (string) - The tag's name. + // slug* (string) - The tag's slug. + // description (string) - The tag's description. + // image (string) - The tag's cover image URL. + // meta-title (string) - The tag's meta title. + // meta-description (string) - The tag's meta description. + // + // Returns a JSON response: + // + // { tag: {} } + // { message: '', invalid: [] } + // + create: function(req, res) { + const models = req.app.locals.Database.sequelize.models; + + // Create the tag + models.tag + .create({ + name: req.body.name, + slug: req.body.slug, + description: req.body.description, + image: req.body.image, + metaTitle: req.body['meta-title'], + metaDescription: req.body['meta-description'] + }) + .then((tag) => { + res.json({ + tag: tag + }); + }) + .catch((err) => handleErrorResponse(req, res, err)); + }, + + // + // Gets a tag. + // + // Returns a JSON response: + // + // { tag: {} } + // + read: function(req, res, next) { + const models = req.app.locals.Database.sequelize.models; + + models.tag + .findOne({ + where: { + id: req.params.id + } + }) + .then((tag) => { + // Not found + if(!tag) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Tag Not Found'); + } + + res.json({ + tag: tag + }); + }) + .catch((err) => next(err)); + }, + + // + // Updates a tag. + // + // name (string) - The tag's name. + // slug (string) - The tag's slug. + // description (string) - The tag's description. + // image (string) - The tag's cover image URL. + // meta-title (string) - The tag's meta title. + // meta-description (string) - The tag's meta description. + // + // Returns a JSON response: + // + // { tag: {} } + // { message: '', invalid: [] } + // + update: function(req, res) { + const models = req.app.locals.Database.sequelize.models; + + // Fetch the tag + models.tag + .findOne({ + where: { + id: req.params.id + } + }) + .then((tag) => { + // Not found + if(!tag) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Tag Not Found'); + } + + // Set fields + if(typeof req.body.name !== 'undefined') tag.name = req.body.name; + if(typeof req.body.slug !== 'undefined') tag.slug = req.body.slug; + if(typeof req.body.description !== 'undefined') tag.description = req.body.description; + if(typeof req.body.image !== 'undefined') tag.image = req.body.image; + if(typeof req.body['meta-title'] !== 'undefined') tag.metaTitle = req.body['meta-title']; + if(typeof req.body['meta-description'] !== 'undefined') tag.metaDescription = req.body['meta-description']; + + // Update the database + return tag.save(); + }) + .then((tag) => { + res.json({ + tag: tag + }); + }) + .catch((err) => handleErrorResponse(req, res, err)); + }, + + // + // Deletes a tag + // + // Returns a JSON response: + // + // { deleted: true } + // + delete: function(req, res, next) { + const models = req.app.locals.Database.sequelize.models; + + // Fetch the tag + models.tag + .findOne({ + where: { + id: req.params.id + } + }) + .then((tag) => { + // Not found + if(!tag) { + if(!tag) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Tag Not Found'); + } + } + + // Delete the tag + return tag.destroy(); + }) + .then(() => res.json({ deleted: true })) + .catch((err) => next(err.message)); + } + +}; diff --git a/source/controllers/api/uploads_controller.js b/source/controllers/api/uploads_controller.js new file mode 100644 index 0000000..9de73d3 --- /dev/null +++ b/source/controllers/api/uploads_controller.js @@ -0,0 +1,380 @@ +'use strict'; + +const Crypto = require('crypto'); +const Del = require('del'); +const Fs = require('fs'); +const Gm = require('gm'); +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); + +const UploadMiddleware = require(Path.join(__basedir, 'source/middleware/upload_middleware.js')); + +const self = { + + // + // Gets a list of uploads. + // + // search (string) - Filter uploads by search (default null). + // mimeType (string) - One or more mime types to filter by separated by a comma (default null). + // count (int) - The number of uploads to return (default 100). + // offset (int) - The offset to return uploads from (default 0). + // render (string) - Set to 'fileManagerItems' to return the rendered HTML from + // `partials/file_manager_items.dust`. + // + // Returns a JSON response: + // + // { totalItems: 100, uploads: [] } + // { totalItems: 100, uploads: [], html: '' } + // + index: (req, res, next) => { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + let mimeType = req.query.mimeType; + let count = parseInt(req.query.count) || 100; + let offset = parseInt(req.query.offset) || 0; + let where = {}; + let fetch; + + // All uploads for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role)) { + where.userId = User.id; + } + + // Filter by mime type + if(mimeType) { + where.mimeType = { $in: mimeType.split(',') }; + } + + if(req.query.search) { + // Search + fetch = models.upload.search(req.query.search, { + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + } + ], + limit: count, + offset: offset + }); + } else { + // No search + fetch = models.upload + .findAndCountAll({ + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + } + ], + limit: count, + offset: offset, + order: [ + ['createdAt', 'DESC'] + ] + }); + } + + // Fetch uploads + fetch + .then((result) => { + return new Promise((resolve) => { + // Render the file manager items and return the uploads + if(req.query.render === 'fileManagerItems') { + // Render the partial + res.useSystemViews().app.render('partials/file_manager_items.dust', { + uploads: result.rows + }, (err, html) => { + if(err) throw new Error(err); + + resolve({ + totalItems: result.count, + uploads: result.rows, + html: html + }); + }); + + return; + } + + // Just return the tags + resolve({ + totalItems: result.count, + uploads: result.rows + }); + }); + }) + .then((json) => res.json(json)) + .catch((err) => next(err)); + }, + + // + // Creates an upload. + // + // file* - A file to be uploaded as multipart/form-data. + // + // Returns a JSON response: + // + // { upload: {} } + // { message: '' } + // + create: (req, res, next) => { + const I18n = req.app.locals.I18n; + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + const upload = UploadMiddleware.getMulter({ + allowedTypes: [ + // Archives + 'application/zip', + + // Documents + 'application/msword', + 'application/pdf', + 'application/vnd.ms-excel', + 'application/vnd.ms-powerpoint', + 'text/csv', + 'text/markdown', + 'text/plain', + + // Images + 'image/gif', + 'image/jpeg', + 'image/png', + 'image/svg+xml' + ], + destination: function() { + let month = Moment().format('MM'); + let year = Moment().format('YYYY'); + return Path.join(__basedir, 'uploads', year, month); + }, + overwrite: false + }).single('file'); + + // Call the upload middleware + upload(req, res, (err) => { + if(err) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: err.message + }); + } + + // Were any files uploaded? + if(!req.file) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('nothing_was_uploaded') + }); + } + + let file = { + userId: User.id, + filename: req.file.filename, + // Extension should be lowercase and without a dot + extension: Path.extname(req.file.filename).toLowerCase().replace(/^\./, ''), + // Path should be relative to the base dir. Example: /uploads/2017/01/image.png + path: req.file.path.substring(__basedir.length), + mimeType: req.file.mimetype, + size: req.file.size, + width: null, + height: null + }; + + // Process images (all but SVG) + if(['image/gif', 'image/jpeg', 'image/png'].includes(req.file.mimetype)) { + // Load the image + Gm(req.file.path) + // Adjust orientation + .autoOrient() + // Strip exif data + .noProfile() + // Save to file + .write(req.file.path, (err) => { + if(err) { + res.status(HttpCodes.BAD_REQUEST); + return next(I18n.term('sorry_but_i_cant_seem_to_process_this_image')); + } + + // Get the image's dimensions + Gm(req.file.path).size((err, info) => { + if(err) { + res.status(HttpCodes.BAD_REQUEST); + return next(I18n.term('sorry_but_i_cant_seem_to_process_this_image')); + } + + // Set dimensions + file.width = info.width; + file.height = info.height; + + // Get updated file size since stripping exif data likely changed it + file.size = Fs.statSync(req.file.path).size; + + // Add it to the database and send a response + models.upload + .create(file) + .then((upload) => res.json({ upload: upload })) + .catch(() => { + res.status(HttpCodes.BAD_REQUEST); + return next(I18n.term('sorry_but_i_cant_seem_to_process_this_image')); + }); + }); + }); + } else { + // Nope, add it to the database and send a response + models.upload + .create(file) + .then((upload) => res.json({ upload: upload })) + .catch(() => { + res.status(HttpCodes.BAD_REQUEST); + next(I18n.term('sorry_but_i_cant_seem_to_process_this_image')); + }); + } + }); + }, + + // + // Gets an upload and instructs the client to download the file. + // + // Returns a file. + // + download: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + let where = { id: req.params.id }; + + models.upload + .findOne({ + where: where + }) + .then((upload) => { + // Not found + if(!upload) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Upload Not Found'); + } + + // All uploads for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && upload.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Set download headers + res.setHeader('Content-disposition', 'attachment; filename=' + upload.filename); + res.setHeader('Content-type', upload.mimeType); + + // Stream the download + let stream = Fs.createReadStream(Path.join(__basedir, upload.path)); + stream.pipe(res); + }) + .catch((err) => next(err)); + }, + + // + // Gets an upload. + // + // Returns a JSON response: + // + // { upload: {} } + // + read: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + models.upload + .findOne({ + where: { + id: req.params.id + } + }) + .then((upload) => { + // Not found + if(!upload) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Upload Not Found'); + } + + // All uploads for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && upload.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + res.json({ + upload: upload + }); + }) + .catch((err) => next(err)); + }, + + // + // Updates an upload. + // + // NOTE: There is no functional update method for uploads. All properties are generated from the + // original file (filename, extension, path, mimeType, size, width, and height), which makes them + // effectively read-only. If you need to "replace" an upload, use delete + create. + // + // Always returns a Method Not Allowed response. + // + update: function(req, res) { + return res.status(HttpCodes.METHOD_NOT_ALLOWED); + }, + + // + // Deletes an upload. + // + // id* (string) - An upload id. + // + // Returns a JSON response: + // + // { deleted: true } + // + delete: function(req, res, next) { + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + // Fetch the upload + models.upload + .findOne({ + where: { + id: req.params.id + } + }) + .then((upload) => { + // Not found + if(!upload) { + if(!upload) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Upload Not Found'); + } + } + + // All uploads for owners/admins/editors, only yours for contributors + if(!['owner', 'admin', 'editor'].includes(User.role) && upload.userId !== User.id) { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Delete related cache files which are prefixed by SHA256(path) + let pathHash = Crypto.createHash('sha256').update(upload.path).digest('hex').substring(0, 10); + Del(Path.join(__basedir, 'cache/images/' + pathHash + '.*')); + + // Delete the file + Fs.unlink(Path.join(__basedir, upload.path), () => { + // Remove it from the database + upload.destroy().then(() => { + res.json({ + deleted: true + }); + }); + }); + }) + .catch((err) => next(err.message)); + } + +}; + +module.exports = self; diff --git a/source/controllers/api/users_controller.js b/source/controllers/api/users_controller.js new file mode 100644 index 0000000..851e3d6 --- /dev/null +++ b/source/controllers/api/users_controller.js @@ -0,0 +1,394 @@ +'use strict'; + +const Crypto = require('crypto'); +const Fs = require('fs'); +const HttpCodes = require('http-codes'); +const Path = require('path'); +const Email = require(Path.join(__basedir, 'source/modules/email.js')); + +// +// Handles the validation error response for create and update +// +function handleErrorResponse(req, res, err) { + const I18n = req.app.locals.I18n; + + // Unique constraint error + if(err.name === 'SequelizeUniqueConstraintError') { + let message = I18n.term('this_field_is_invalid'); + + // Custom message based on field + if(err.fields.includes('username')) { + message = I18n.term('this_username_is_already_in_use'); + } else if(err.fields.includes('email')) { + message = I18n.term('this_email_address_is_already_in_use'); + } + + return res.status(HttpCodes.BAD_REQUEST).json({ + message: message, + invalid: err.fields + }); + } + + // Validation error + if(err.name === 'SequelizeValidationError') { + // Only report one validation error at a time + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term(err.errors[0].message), + invalid: [err.errors[0].path] + }); + } + + // Other + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('your_changes_could_not_be_saved_at_this_time'), + invalid: [] + }); +} + +module.exports = { + + // + // Gets a list of users. + // + // search (string) - Filter users by search (default null). + // count (int) - The number of users to return (default 100). + // offset (int) - The offset to return users from (default 0). + // render (string) - Set to 'userCards' to return the rendered HTML from `partials/user_cards.dust`. + // + // Returns a JSON response: + // + // { totalItems: 100, users: [] } + // { totalItems: 100, users: [], html: '' } + // + index: function(req, res, next) { + const models = req.app.locals.Database.sequelize.models; + let count = parseInt(req.query.count) || 100; + let offset = parseInt(req.query.offset) || 0; + let fetch; + + if(req.query.search) { + // Search + fetch = models.user.search(req.query.search, { + limit: count, + offset: offset + }); + } else { + // No search + fetch = models.user + .findAndCountAll({ + limit: count, + offset: offset, + order: [ + ['name', 'ASC'] + ] + }); + } + + // Fetch users + fetch + .then((result) => { + return new Promise((resolve) => { + // Render the user cards and return the users + if(req.query.render === 'userCards') { + // Render the partial + res.useSystemViews().app.render('partials/user_cards.dust', { + users: result.rows + }, (err, html) => { + if(err) throw new Error(err); + + resolve({ + totalItems: result.count, + users: result.rows, + html: html + }); + }); + + return; + } + + // Just return the users + resolve({ + totalItems: result.count, + users: result.rows + }); + }); + }) + .then((json) => res.json(json)) + .catch((err) => next(err)); + }, + + // + // Creates a user. + // + // name* (string) - The user's name. + // email* (string) - The user's email. + // username* (string) - The user's username. + // password (string) - The user's password. If omitted, a random password will be generated. + // role (string) - The user's role. Either 'admin', 'editor', or 'contributor'. + // website (string) - The user's website. + // location (string) - The user's location. + // bio (string) - The user's bio. + // avatar (string) - The user's avatar URL. + // image (string) - The user's cover image URL. + // + // Note: don't set a password for this method. When a new user is created, a random password is + // set and an invitation email will be sent to the user with a secure link to login. + // + // Returns a JSON response: + // + // { user: {} } + // { message: '', invalid: [] } + // + create: function(req, res, next) { + const I18n = req.app.locals.I18n; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + + // The owner role can't be duplicated or reassigned + if(req.body.role === 'owner') { + res.status(HttpCodes.UNAUTHORIZED); + return next('Unauthorized'); + } + + // Generate a password if one wasn't set + if(typeof req.body.password === 'undefined') { + req.body.password = Crypto.randomBytes(8).toString('hex'); + } + + // Verify password length + if(req.body.password.length < 8) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('passwords_need_to_be_at_least_eight_characters_long'), + invalid: ['password'] + }); + } + + // Create the user + models.user + .create({ + name: req.body.name, + email: req.body.email, + username: req.body.username, + password: models.user.hashPassword(req.body.password), + role: req.body.role, + website: req.body.website, + location: req.body.location, + bio: req.body.bio, + avatar: req.body.avatar, + image: req.body.image + }) + // Send an invitation email + .then((user) => { + let message = Fs.readFileSync(Path.join(__basedir, 'source/emails/invitation.txt'), { encoding: 'utf8' }); + let adminUrl = MakeUrl.admin('users/edit/' + user.id, { absolute: true }); + + return Email + .send({ + to: { + name: user.name, + email: user.email + }, + subject: I18n.term('welcome_to_postleaf'), + message: { text: message }, + placeholders: { + name: user.name, + welcomeToPostleaf: I18n.term('welcome_to_postleaf'), + yourUsernameIs: I18n.term('your_username_is_[username]', { placeholders: { username: user.username } }), + yourPasswordIs: I18n.term('your_temporary_password_is_[password]', { placeholders: { password: req.body.password }}), + followTheLinkBelow: I18n.term('follow_the_link_below_to_login_to_your_account'), + adminUrl: adminUrl, + changeYourPassword: I18n.term('dont_forget_to_change_your_password_the_first_time_you_login'), + websiteTitle: req.app.locals.Settings.title, + websiteUrl: MakeUrl.raw('', { absolute: true }) + } + }) + // Send the response + .then(() => { + res.json({ + user: user + }); + }) + .catch(() => { + res.status(HttpCodes.INTERNAL_SERVER_ERROR); + return next(I18n.term('sorry_but_i_cant_seem_to_send_an_email_at_the_moment')); + }); + }) + .catch((err) => handleErrorResponse(req, res, err)); + }, + + // + // Gets a user. + // + // Returns a JSON response: + // + // { user: {} } + // + read: function(req, res, next) { + const models = req.app.locals.Database.sequelize.models; + + models.user + .findOne({ + where: { + id: req.params.id + } + }) + .then((user) => { + // Not found + if(!user) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('User Not Found'); + } + + res.json({ + user: user + }); + }) + .catch((err) => next(err)); + }, + + // + // Updates a user. + // + // name (string) - The user's name. + // email (string) - The user's email. + // username (string) - The user's username. + // password (string) - The user's new password. + // website (string) - The user's website. + // location (string) - The user's location. + // bio (string) - The user's bio. + // avatar (string) - The user's avatar URL. + // image (string) - The user's cover image URL. + // + // Returns a JSON response: + // + // { user: {} } + // { message: '', invalid: [] } + // + // If the current user is updating their own password, the X-Auth-Token header will contain a new + // auth token since the old one will no longer work. In supportive clients, the authToken cookie + // will be set. + // + update: function(req, res) { + const I18n = req.app.locals.I18n; + const User = req.User; + const models = req.app.locals.Database.sequelize.models; + + models.user + // Fetch the user + .findOne({ + where: { + id: req.params.id + } + }) + // Update the user + .then((user) => { + // Not found + if(!user) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('User Not Found'); + } + + // The owner role can't be duplicated or reassigned + if(req.body.role === 'owner' && User.role !== 'owner') { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Is the target user the owner? + if(user.role === 'owner') { + // The owner role can't be revoked + if(typeof req.body.role !== 'undefined' && req.body.role !== 'owner') { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + } + + // Set fields + if(typeof req.body.name !== 'undefined') user.name = req.body.name; + if(typeof req.body.email !== 'undefined') user.email = req.body.email; + if(typeof req.body.username !== 'undefined') user.username = req.body.username; + if(typeof req.body.password !== 'undefined' && req.body.password !== '') { + if(req.body.password.length < 8) { + return res.status(HttpCodes.BAD_REQUEST).json({ + message: I18n.term('passwords_need_to_be_at_least_eight_characters_long'), + invalid: ['password'] + }); + } + + // Change the password + user.setPassword(req.body.password); + + // Update auth token since the hash will change + if(User.id === req.params.id) { + let authToken = user.generateAuthToken(); + + // Set a header with the new auth token + res.set('X-Auth-Token', authToken); + + // Set a cookie for supportive clients + res.cookie('authToken', authToken.token, { + path: '/', + expires: authToken.expires + }); + } + } + if(typeof req.body.role !== 'undefined') user.role = req.body.role; + if(typeof req.body.website !== 'undefined') user.website = req.body.website; + if(typeof req.body.location !== 'undefined') user.location = req.body.location; + if(typeof req.body.bio !== 'undefined') user.bio = req.body.bio; + if(typeof req.body.avatar !== 'undefined') user.avatar = req.body.avatar; + if(typeof req.body.image !== 'undefined') user.image = req.body.image; + + return user.save(); + }) + // Send the response + .then((user) => { + res.json({ + user: user + }); + }) + .catch((err) => handleErrorResponse(req, res, err)); + }, + + // + // Deletes a user + // + // id* (srting) - A user id. + // + // Returns a JSON response: + // + // { deleted: true } + // + delete: function(req, res, next) { + const models = req.app.locals.Database.sequelize.models; + + // Fetch the user + models.user + .findOne({ + where: { + id: req.params.id + } + }) + .then((user) => { + // Not found + if(!user) { + if(!user) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('User Not Found'); + } + } + + // The owner can't be deleted + if(user.role === 'owner') { + res.status(HttpCodes.UNAUTHORIZED); + throw new Error('Unauthorized'); + } + + // Delete the user + return user.destroy(); + }) + .then(() => res.json({ deleted: true })) + .catch((err) => next(err.message)); + } + +}; diff --git a/source/controllers/error_controller.js b/source/controllers/error_controller.js new file mode 100644 index 0000000..225dfdd --- /dev/null +++ b/source/controllers/error_controller.js @@ -0,0 +1,79 @@ +'use strict'; + +const HttpCodes = require('http-codes'); + +module.exports = { + + // + // Renders the Application Error page + // + applicationError: (err, req, res, next) => { // eslint-disable-line + const I18n = req.app.locals.I18n; + let template, viewData; + + switch(res.statusCode) { + // Not found + case HttpCodes.NOT_FOUND: + template = 'not_found'; + viewData = { + title: I18n.term('not_found'), + message: req.xhr ? + I18n.term('the_requested_resource_could_not_be_found') : + I18n.term('the_requested_page_could_not_be_found') + }; + break; + + // Forbidden + case HttpCodes.UNAUTHORIZED: + template = 'application_error'; + viewData = { + title: I18n.term('unauthorized'), + message: I18n.term('you_are_not_authorized_to_make_this_request') + }; + break; + + // Application error + default: + template = 'application_error'; + viewData = { + title: I18n.term('application_error'), + message: process.env.APP_ENVIRONMENT !== 'production' ? + err : + I18n.term('sorry_but_something_isnt_working_right_at_the_moment') + }; + // Log dev error messages + if(process.env.APP_ENVIRONMENT !== 'production') { + console.error(err); + } + break; + } + + if(req.xhr) { + // Response to XHR requests + res.send({ message: viewData.message }); + } else { + // Render the appropriate error template + res + .useThemeViews() + .render(template, viewData, (err, html) => { + if(!err) { + res.send(html); + } else { + // Fallback to the system error + res + .useSystemViews() + .render(template, viewData); + } + }); + } + }, + + // + // Renders the Not Found page + // + notFound: (req, res, next) => { + res.status(HttpCodes.NOT_FOUND); + return next('Page Not Found'); + } + +}; diff --git a/source/controllers/theme/author_controller.js b/source/controllers/theme/author_controller.js new file mode 100644 index 0000000..dbe9a98 --- /dev/null +++ b/source/controllers/theme/author_controller.js @@ -0,0 +1,125 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); +const Markdown = require(Path.join(__basedir, 'source/modules/markdown.js')); +const Paginate = require(Path.join(__basedir, 'source/modules/paginate.js')); + +module.exports = { + + // + // Renders an author page. + // + view: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + const Settings = req.app.locals.Settings; + let page = req.params.page || 1; + let limit = Settings.postsPerPage; + let offset = limit * (page - 1); + let author; + + models.user + // Get the author + .findOne({ + where: { + username: req.params.username + } + }) + .then((result) => { + author = result; + + if(!author) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + }) + // Get posts by this author + .then(() => models.post.findAndCountAll({ + distinct: true, + where: { + userId: author.id, + status: 'published', + isPage: 0, + publishedAt: { $lt: Moment().utc().toDate() } + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + limit: limit, + offset: offset, + order: [ + ['isSticky', 'DESC'], + ['publishedAt', 'DESC'] + ] + })) + // Render the view + .then((posts) => { + if(page > 1 && !posts.rows.length) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // Assemble view data + let pagination = Paginate.get(posts.count, limit, page, (page) => { + return MakeUrl.author(author.username, { page: page }); + }); + let authorUrl = MakeUrl.author(author.username); + let authorAvatar = author.avatar ? MakeUrl.raw(author.avatar) : null; + let metaTitle = author.name; + let metaDescription = Markdown.toText(author.bio); + + // Render the template + res.useThemeViews().render('author', { + author: author, + posts: posts.rows, + pagination: pagination, + meta: { + title: metaTitle, + description: metaDescription, + // JSON linked data + jsonLD: { + '@context': 'https://schema.org', + '@type': 'Person', + 'name': author.name, + 'description': Markdown.toText(author.bio), + 'url': authorUrl, + 'image': authorAvatar, + 'sameAs': author.website + }, + // Open Graph + openGraph: { + 'og:type': 'profile', + 'og:site_name': Settings.title, + 'og:title': metaTitle, + 'og:description': metaDescription, + 'og:url': authorUrl, + 'og:image': authorAvatar + }, + // Twitter Card + twitterCard: { + 'twitter:card': author.avatar ? 'summary_large_image' : 'summary', + 'twitter:site': Settings.twitter ? '@' + Settings.twitter : null, + 'twitter:title': metaTitle, + 'twitter:description': metaDescription, + 'twitter:creator': author.twitter ? '@' + author.twitter : null, + 'twitter:url': authorUrl, + 'twitter:image': authorAvatar + } + } + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/theme/blog_controller.js b/source/controllers/theme/blog_controller.js new file mode 100644 index 0000000..dbdaea4 --- /dev/null +++ b/source/controllers/theme/blog_controller.js @@ -0,0 +1,103 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); +const Paginate = require(Path.join(__basedir, 'source/modules/paginate.js')); + +module.exports = { + + // + // Renders the blog index. + // + view: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + const Settings = req.app.locals.Settings; + let page = req.params.page || 1; + let limit = Settings.postsPerPage; + let offset = limit * (page - 1); + + models.post + // Fetch blog posts. + .findAndCountAll({ + distinct: true, + where: { + status: 'published', + isPage: 0, + publishedAt: { $lt: Moment().utc().toDate() } + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + limit: limit, + offset: offset, + order: [ + ['isSticky', 'DESC'], + ['publishedAt', 'DESC'] + ] + }) + // Render the view + .then((posts) => { + if(page > 1 && !posts.rows.length) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // Assemble view data + let pagination = Paginate.get(posts.count, limit, page, (page) => { + return MakeUrl.blog({ page: page }); + }); + let websiteImage = Settings.cover ? MakeUrl.raw(Settings.cover) : null; + let websiteUrl = MakeUrl.raw(); + + // Render the template + res.useThemeViews().render('blog', { + posts: posts.rows, + pagination: pagination, + meta: { + title: Settings.title, + description: Settings.tagline, + // JSON linked data + jsonLD: { + '@context': 'https://schema.org', + '@type': 'Website', + 'publisher': Settings.title, + 'url': websiteUrl, + 'image': websiteImage, + 'description': Settings.tagline + }, + // Open Graph + openGraph: { + 'og:type': 'website', + 'og:site_name': Settings.title, + 'og:title': Settings.title, + 'og:description': Settings.tagline, + 'og:url': websiteUrl, + 'og:image': websiteImage + }, + // Twitter Card + twitterCard: { + 'twitter:card': Settings.cover ? 'summary_large_image' : 'summary', + 'twitter:site': Settings.twitter ? '@' + Settings.twitter : null, + 'twitter:title': Settings.title, + 'twitter:description': Settings.tagline, + 'twitter:url': websiteUrl, + 'twitter:image': websiteImage + } + } + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/theme/feed_controller.js b/source/controllers/theme/feed_controller.js new file mode 100644 index 0000000..cce3225 --- /dev/null +++ b/source/controllers/theme/feed_controller.js @@ -0,0 +1,84 @@ +'use strict'; + +const Cheerio = require('cheerio'); +const Moment = require('moment'); +const Path = require('path'); + +module.exports = { + + // + // Renders the RSS feed. + // + view: (req, res, next) => { + const models = req.app.locals.Database.sequelize.models; + const Settings = req.app.locals.Settings; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(Settings); + + // Fetch posts and associated data for feeds + models.post + .findAll({ + where: { + status: 'published', + publishedAt: { $lt: Moment().utc().toDate() } + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] }, + where: req.query.author ? { + username: { + $in: req.query.author.split(',') + } + } : null + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + order: [ + ['publishedAt', 'DESC'] + ], + limit: Settings.postsPerPage + }) + .then((posts) => { + let viewData = { posts: posts }; + + // Convert relative URLs to absolute URLs since most aggregators prefer them + for(let i = 0; i < posts.length; i++) { + let $ = Cheerio.load(posts[i].content); + + // Links + $('a').each(function() { + $(this).attr('href', MakeUrl.absolute($(this).attr('href'))); + }); + + // Images + $('img').each(function() { + $(this).attr('src', MakeUrl.absolute($(this).attr('src'))); + }); + + posts[i].content = $.html(); + } + + // Try the custom feed template + res + .useThemeViews() + .append('Content-Type', 'application/xml') + .render('feed', viewData, (err, html) => { + if(!err) { + res.send(html); + } else { + // Fallback to system feed template + res + .useSystemViews() + .render('feed', viewData); + } + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/theme/post_controller.js b/source/controllers/theme/post_controller.js new file mode 100644 index 0000000..d3f6b39 --- /dev/null +++ b/source/controllers/theme/post_controller.js @@ -0,0 +1,155 @@ +'use strict'; + +const Extend = require('extend'); +const Fs = require('fs'); +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); +const Striptags = require('striptags'); +const DynamicImages = require(Path.join(__basedir, 'source/modules/dynamic_images.js')); +const Markdown = require(Path.join(__basedir, 'source/modules/markdown.js')); + +const self = module.exports = { + + // + // Renders a custom homepage. + // + customHomepage: (req, res, next) => { + // Set custom homepage + req.params.slug = req.app.locals.Settings.homepage; + + // Render it + return self.view(req, res, next); + }, + + // + // Renders a post. + // + // slug* (string) - A post slug. + // + view: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + const Settings = req.app.locals.Settings; + let where = {}; + + where.slug = req.params.slug; + where.status = 'published'; + where.publishedAt = { $lt: Moment().utc().toDate() }; + + // Fetch the post, the post's author, and all related tags + models.post + .findOne({ + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ] + }) + // Inject srcset attribute for dynamic images + .then((post) => { + if(post) { + return DynamicImages + .injectSrcset(post.content, models.upload) + .then((content) => Extend(post, { content: content })); + } + + return post; + }) + .then((post) => { + // Not found + if(!post) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // Assemble view data + let logo = Settings.logo ? MakeUrl.raw(Settings.logo) : null; + let postUrl = MakeUrl.post(post.slug); + let postImage = post.image ? MakeUrl.raw(post.image) : null; + let postDate = Moment(post.publishedAt).format('YYYY-MM-DD[T]HH:mm:ss[Z]'); + let metaTitle = post.metaTitle || post.title; + let metaDescription = Striptags(post.metaDescription || post.content).split(' ', 50).join(' '); + let tags = (post.tags || []).map((val) => { return val.name; }).join(', '); + let authorBio = Markdown.toText(post.author.bio); + let authorImage = post.author.avatar ? MakeUrl.raw(post.author.avatar) : null; + let viewData = { + post: post, + meta: { + title: metaTitle, + description: metaDescription, + // JSON linked data + jsonLD: { + '@context': 'https://schema.org', + '@type': 'Article', + 'publisher': { + '@type': 'Organization', + 'name': Settings.title, + 'logo': logo + }, + 'author': { + '@type': 'Person', + 'name': post.author.name, + 'description': authorBio, + 'image': authorImage, + 'sameAs': post.author.website + }, + 'url': MakeUrl.post(post.slug), + 'headline': metaTitle, + 'description': metaDescription, + 'image': postImage, + 'datePublished': postDate, + 'dateModified': postDate + }, + // OpenGraph + openGraph: { + 'og:type': 'article', + 'og:site_name': Settings.title, + 'og:title': metaTitle, + 'og:description': metaDescription, + 'og:url': postUrl, + 'og:image': postImage, + 'article:published_time': postDate, + 'article:modified_time': postDate, + 'article:tag': tags + }, + // Twitter card + twitterCard: { + 'twitter:card': postImage ? 'summary_large_image' : 'summary', + 'twitter:site': Settings.twitter ? '@' + Settings.twitter : null, + 'twitter:title': metaTitle, + 'twitter:description': metaDescription, + 'twitter:creator': post.author.twitter ? '@' + post.author.twitter : null, + 'twitter:url': postUrl, + 'twitter:image': postImage, + 'twitter:label1': post.isPage ? 'Written by' : null, + 'twitter:data1': post.isPage ? post.author.name : null, + 'twitter:label2': tags.length ? 'Tagged with' : null, + 'twitter:data2': tags.length ? tags : null + } + } + }; + + // Determine which template the post should use. By default, this will be `post.dust`. If a + // custom template is specified (`post.*.dust`), make sure it exists. Otherwise, fall back + // to the default. + let themeName = req.app.locals.Settings.theme; + let template = post.template || 'post'; + let templatePath = Path.join(__basedir, 'themes', themeName, 'templates', template); + if(template !== 'post' && !Fs.existsSync(templatePath)) template = 'post'; + + // Render the template + res.useThemeViews().render(template, viewData); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/theme/search_controller.js b/source/controllers/theme/search_controller.js new file mode 100644 index 0000000..f79b7f4 --- /dev/null +++ b/source/controllers/theme/search_controller.js @@ -0,0 +1,99 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); +const Paginate = require(Path.join(__basedir, 'source/modules/paginate.js')); + +const self = module.exports = { + + // + // Renders a custom homepage. + // + customHomepage: (req, res, next) => { + // Set custom homepage + req.params.slug = req.app.locals.Settings.homepage; + + // Render it + return self.view(req, res, next); + }, + + // + // Renders the search page. + // + view: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const sequelize = req.app.locals.Database.sequelize; + const models = sequelize.models; + const Settings = req.app.locals.Settings; + let page = req.params.page || 1; + let limit = Settings.postsPerPage; + let offset = limit * (page - 1); + + models.post + // Fetch search results + .search(req.query.s, { + where: { + status: 'published', + isPage: 0, + publishedAt: { $lt: Moment().utc().toDate() } + }, + limit: limit, + offset: offset + }) + // Render the view + .then((posts) => { + if(page > 1 && !posts.rows.length) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + + // Assemble view data + let pagination = Paginate.get(posts.count, limit, page, (page) => { + return MakeUrl.search(req.query.s, { page: page }); + }); + let websiteImage = Settings.cover ? MakeUrl.raw(Settings.cover) : null; + let websiteUrl = MakeUrl.raw(); + + // Render the template + res.useThemeViews().render('search', { + query: req.query.s, + posts: posts.rows, + pagination: pagination, + meta: { + title: Settings.title, + description: Settings.tagline, + // JSON linked data + jsonLD: { + '@context': 'https://schema.org', + '@type': 'Website', + 'publisher': Settings.title, + 'url': websiteUrl, + 'image': websiteImage, + 'description': Settings.tagline + }, + // Open Graph + openGraph: { + 'og:type': 'website', + 'og:site_name': Settings.title, + 'og:title': Settings.title, + 'og:description': Settings.tagline, + 'og:url': websiteUrl, + 'og:image': websiteImage + }, + // Twitter Card + twitterCard: { + 'twitter:card': Settings.cover ? 'summary_large_image' : 'summary', + 'twitter:site': Settings.twitter ? '@' + Settings.twitter : null, + 'twitter:title': Settings.title, + 'twitter:description': Settings.tagline, + 'twitter:url': websiteUrl, + 'twitter:image': websiteImage + } + } + }); + }) + .catch((err) => next(err)); + } + +}; diff --git a/source/controllers/theme/tag_controller.js b/source/controllers/theme/tag_controller.js new file mode 100644 index 0000000..911c7d3 --- /dev/null +++ b/source/controllers/theme/tag_controller.js @@ -0,0 +1,133 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Moment = require('moment'); +const Path = require('path'); +const Markdown = require(Path.join(__basedir, 'source/modules/markdown.js')); +const Paginate = require(Path.join(__basedir, 'source/modules/paginate.js')); + +module.exports = { + + // + // Renders a tag page. + // + view: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const sequelize = req.app.locals.Database.sequelize; + const models = sequelize.models; + const Settings = req.app.locals.Settings; + let page = req.params.page || 1; + let limit = Settings.postsPerPage; + let offset = limit * (page - 1); + let tag; + + models.tag + // Fetch the tag + .findOne({ + where: { + slug: req.params.slug + } + }) + .then((result) => { + tag = result; + + if(!tag) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Page Not Found'); + } + }) + // Fetch posts with this tag + .then(() => models.postTags.findAndCountAll({ + distinct: true, + where: { + tagId: tag.id + }, + include: [ + { + model: models.post, + where: { + status: 'published', + isPage: 0, + publishedAt: { $lt: Moment().utc().toDate() } + }, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ] + } + ], + limit: limit, + offset: offset, + order: [ + sequelize.literal('`post.isSticky` DESC'), + sequelize.literal('`post.publishedAt` DESC') + ] + })) + // Render the view + .then((posts) => { + if(page > 1 && !posts.rows.length) { + res.status(HttpCodes.NOT_FOUND); + return next('Page Not Found'); + } + + // Assemble view data + let pagination = Paginate.get(posts.count, limit, page, (page) => { + return MakeUrl.tag(tag.slug, { page: page }); + }); + let tagUrl = MakeUrl.tag(tag.slug); + let tagImage = tag.image ? MakeUrl.raw(tag.image) : null; + let metaTitle = tag.metaTitle || tag.name; + let metaDescription = tag.metaDescription || Markdown.toText(tag.description); + + // Render the template + res.useThemeViews().render('tag', { + tag: tag, + posts: posts.rows.map((val) => val.post), + pagination: pagination, + meta: { + title: metaTitle, + description: metaDescription, + // JSON linked data + jsonLD: { + '@context': 'https://schema.org', + '@type': 'Series', + 'publisher': Settings.title, + 'url': tagUrl, + 'image': tagImage, + 'name': metaTitle, + 'description': metaDescription + }, + // Open Graph + openGraph: { + 'og:type': 'website', + 'og:site_name': Settings.title, + 'og:title': metaTitle, + 'og:description': metaDescription, + 'og:url': tagUrl, + 'og:image': tagImage + }, + // Twitter Card + twitterCard: { + 'twitter:card': tag.image ? 'summary_large_image' : 'summary', + 'twitter:site': Settings.twitter ? '@' + Settings.twitter : null, + 'twitter:title': metaTitle, + 'twitter:description': metaDescription, + 'twitter:url': tagUrl, + 'twitter:image': tagImage + } + } + }); + }) + .catch((err) => next(err)); + + } + +}; diff --git a/source/emails/invitation.txt b/source/emails/invitation.txt new file mode 100644 index 0000000..5f95b93 --- /dev/null +++ b/source/emails/invitation.txt @@ -0,0 +1,16 @@ +{name}, + +{welcomeToPostleaf} + +{yourUsernameIs} +{yourPasswordIs} + +{followTheLinkBelow} + +{adminUrl} + +{changeYourPassword} + +----- + +{websiteTitle} <{websiteUrl}> diff --git a/source/emails/password_reset.txt b/source/emails/password_reset.txt new file mode 100644 index 0000000..b836d72 --- /dev/null +++ b/source/emails/password_reset.txt @@ -0,0 +1,11 @@ +{name}, + +{forgotYourPassword} + +{followThisLink} + +{resetUrl} + +----- + +{websiteTitle} <{websiteUrl}> diff --git a/source/images/app_icon.png b/source/images/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..46083d3d05a80c11a8d8ec587730aed75652f195 GIT binary patch literal 3905 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 literal 0 HcmV?d00001 diff --git a/source/images/favicon.png b/source/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..df7e25c9237236a4a44087edecda1df8d8826a28 GIT binary patch literal 13181 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 literal 0 HcmV?d00001 diff --git a/source/images/postleaf_logo.svg b/source/images/postleaf_logo.svg new file mode 100644 index 0000000..45b4ba4 --- /dev/null +++ b/source/images/postleaf_logo.svg @@ -0,0 +1 @@ +Logo (color) \ No newline at end of file diff --git a/source/images/postleaf_wordmark.svg b/source/images/postleaf_wordmark.svg new file mode 100644 index 0000000..08408ff --- /dev/null +++ b/source/images/postleaf_wordmark.svg @@ -0,0 +1 @@ +slice \ No newline at end of file diff --git a/source/images/sample_cover.jpg b/source/images/sample_cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bae1c935b00d839d5c0356fa9d069c4d74a4994 GIT binary patch literal 486277 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

    SAjb+nIkH>7=E9cV4|gIXqy6 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%0DmNGZj6T&%Q;z3ROql+A1-sSXJ+6&qn7NZZRLkA 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 M#G}5JD%{Wi+2sA;cmMzZ literal 0 HcmV?d00001 diff --git a/source/images/sample_post_image.jpg b/source/images/sample_post_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc67988d13b84ff89fa99c3175f038b4d472bea2 GIT binary patch literal 203263 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%0D~znNCujP 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�)Cq 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 UIj=c+%V!%C7WXfF6K8k-*&S4Y<^TWy literal 0 HcmV?d00001 diff --git a/source/images/zen_toggle.svg b/source/images/zen_toggle.svg new file mode 100644 index 0000000..80491f0 --- /dev/null +++ b/source/images/zen_toggle.svg @@ -0,0 +1,28 @@ + + + + zen_toggle + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/source/languages/en_us.json b/source/languages/en_us.json new file mode 100644 index 0000000..8237430 --- /dev/null +++ b/source/languages/en_us.json @@ -0,0 +1,263 @@ +{ + "code": "en-us", + "name": "English (US)", + "momentjs_locale": "en", + "symbols": { + "decimal": ".", + "money": "$", + "thousands": "," + }, + "terms": { + "[count]_posts_selected": "[count] posts selected", + "[count]_words": "[count] words", + "[name]_has_been_created": "[name] has been created.", + "1_word": "1 word", + "about": "About", + "administrator": "Administrator", + "advanced": "Advanced", + "align_center": "Align Center", + "align_left": "Align Left", + "align_right": "Align Right", + "alignment": "Alignment", + "application_error": "Application Error", + "are_you_sure_you_want_to_delete_the_selected_files": "Are you sure you want to delete the selected files?", + "are_you_sure_you_want_to_delete_the_selected_posts": "Are you sure you want to delete the selected posts?", + "are_you_sure_you_want_to_delete_the_selected_revisions": "Are you sure you want to delete the selected revisions?", + "are_you_sure_you_want_to_delete_the_selected_tags": "Are you sure you want to delete the selected tags?", + "are_you_sure_you_want_to_delete_the_selected_users": "Are you sure you want to delete the selected users, their posts, and all their revisions?", + "author": "Author", + "avatar": "Avatar", + "avatars_are_public_and_often_displayed_on_your_website": "Avatars are public and often displayed on your website. Your avatar will be trimmed to a square automatically.", + "backups": "Backups", + "bio": "Bio", + "block": "Block", + "bold": "Bold", + "browse": "Browse", + "bulleted_list": "Bulleted List", + "cancel": "Cancel", + "caption": "Caption", + "change_password": "Change Password", + "clear_formatting": "Clear Formatting", + "code": "Code", + "contributor": "Contributor", + "copied_to_clipboard": "Copied to Clipboard", + "copy": "Copy", + "cover_images_are_used_by_themes_to_provide_a_unique_visual_experience": "Cover images are used by themes to provide a unique visual experience for your website.", + "cover_photo": "Cover Photo", + "create_my_account": "Create My Account", + "create": "Create", + "current_password": "Current Password", + "custom_code": "Custom Code", + "custom_homepage": "Custom Homepage", + "dashboard": "Dashboard", + "data": "Data", + "date": "Date", + "decrease_indent": "Decrease Indent", + "default_post_content": "Default Post Content", + "default_post_title": "Default Post Title", + "default": "Default", + "delete": "Delete", + "description": "Description", + "dont_forget_to_change_your_password_the_first_time_you_login": "Don’t forget to change your password the first time you login.", + "download_backup": "Download Backup", + "download": "Download", + "draft": "Draft", + "drop_files_to_upload": "Drop Files to Upload", + "edit_post": "Edit Post", + "edit_profile": "Edit Profile", + "edit_tag": "Edit Tag", + "edit_user": "Edit User", + "edit": "Edit", + "editor_shortcuts": "Editor Shortcuts", + "editor": "Editor", + "email": "Email", + "embed": "Embed", + "enter_a_caption": "Enter a caption", + "enter_a_description_for_users_who_cant_see_images": "Enter a description for users who can’t see images.", + "enter_a_new_password": "Enter a New Password", + "enter_a_url_if_you_want_the_image_to_link_somewhere": "Enter a URL if you want the image to link somewhere.", + "featured_posts_are_given_special_attention_by_your_theme": "Featured posts are given special attention by your theme. Use this to make a post stand out from all the rest.", + "featured": "Featured", + "follow_the_link_below_to_login_to_your_account": "Follow the link below to login to your account.", + "foot_code": "Foot Code", + "forgot_your_password_it_happens_sometimes": "Forgot your password? It happens sometimes.", + "format": "Format", + "fullscreen": "Fullscreen", + "global_shortcuts": "Global Shortcuts", + "head_code": "Head Code", + "heading": "Heading", + "height": "Height", + "help_and_support": "Help and Support", + "homepage": "Homepage", + "html": "HTML", + "image": "Image", + "increase_indent": "Increase Indent", + "insert_into_post": "Insert Into Post", + "insert": "Insert", + "invalid_file_format": "Invalid file format.", + "invalid_user": "Invalid user.", + "invalid_username_or_email_address": "Invalid username or email address.", + "italic": "Italic", + "just_follow_this_link_and_youll_be_publishing_again": "Just follow this link and you’ll be publishing again in no time!", + "keyboard_shortcuts": "Keyboard Shortcuts", + "label": "Label", + "language": "Language", + "lets_create_your_account": "Let’s create your account", + "link": "Link", + "list": "List", + "live": "Live", + "locale": "Locale", + "location": "Location", + "login": "Login", + "logo": "Logo", + "logos_are_often_displayed_on_your_website": "Logos are often displayed on your website. Supported formats include GIF, JPEG, PNG, and SVG.", + "logout": "Logout", + "maintain_aspect_ratio": "Maintain aspect ratio", + "manage_uploads": "Manage Uploads", + "markdown": "Markdown", + "meta_description": "Meta Description", + "meta_title": "Meta Title", + "metadata_is_used_by_search_engines_and_other_apps": "Metadata is used by search engines and other apps that link to your content.", + "metadata": "Metadata", + "name": "Name", + "navigation": "Navigation", + "new_menu_item": "New Menu Item", + "new_password": "New Password", + "new_post": "New Post", + "new_section": "New Section", + "new_tag": "New Tag", + "new_user": "New User", + "no_files": "No Files", + "no_menu_items": "No Menu Items", + "no_posts_selected": "No Posts Selected", + "no_posts": "No Posts", + "no_revisions": "No Revisions", + "no_tags": "No Tags", + "no_users": "No Users", + "no_words": "No words", + "none": "None", + "not_found": "Not Found", + "nothing_was_uploaded": "Nothing was uploaded.", + "numbered_list": "Numbered List", + "open_in_a_new_window": "Open in a new window", + "open": "Open", + "owner": "Owner", + "page": "Page", + "pages_dont_show_up_in_the_blog_index": "Pages don’t show up in the blog index, but you can link to them from your navigation menu and other posts.", + "paragraph": "Paragraph", + "password": "Password", + "passwords_need_to_be_at_least_eight_characters_long": "Passwords need to be at least eight characters long.", + "paste_embed_code_or_a_url_here": "Paste embed code or a URL here.", + "pending_review": "Pending Review", + "pending": "Pending", + "please_check_your_email_for_further_instructions": "Please check your email for further instructions.", + "please_login_again_to_complete_your_request": "Please login again to complete your request.", + "post_settings": "Post Settings", + "post_things_faster_by_adding_this_page_to_your_device": "Post things faster by adding this page to your device’s home screen.", + "post": "Post", + "postleaf_account_recovery_message": "Postleaf: Account Recovery Message", + "postleaf_can_backup_your_data_to_a_single_file": "Postleaf can backup your data, uploads, and themes to a single file. You should do this frequently, and keep a copy of the backup in a safe place.", + "postleaf_on_twitter": "Postleaf on Twitter", + "posts_per_page": "Posts Per Page", + "posts": "Posts", + "preferences": "Preferences", + "preformatted_text": "Preformatted Text", + "preview": "Preview", + "profile": "Profile", + "publish_now": "Publish Now", + "published": "Published", + "quick_post": "Quick Post", + "quote": "Quote", + "recent_posts": "Recent Posts", + "recover_password": "Recover Password", + "recover_your_password": "Recover Your Password", + "redo": "Redo", + "rejected": "Rejected", + "remove_link": "Remove Link", + "remove": "Remove", + "reset_password": "Reset Password", + "reset_your_password": "Reset Your Password", + "restore_from_backup": "Restore From Backup", + "revert": "Revert", + "revisions": "Revisions", + "role": "Role", + "roles_determine_what_features_a_user_has_access_to": "Roles determine what features a user has access to.", + "save_for_later": "Save For Later", + "save": "Save", + "scheduled": "Scheduled", + "search_posts": "Search Posts", + "search_tags": "Search Tags", + "search_users": "Search Users", + "search": "Search", + "select": "Select", + "set_post_image": "Set Post Image", + "settings": "Settings", + "share_a_few_sentences_about_yourself": "Share a few sentences about yourself.", + "slug": "Slug", + "slugs_must_start_with_a_letter_and_can_only_contain": "Slugs must start with a letter and can only contain letters, numbers, and dashes.", + "sorry_but_i_cant_seem_to_process_this_image": "Sorry, but I can’t seem to process this image.", + "sorry_but_i_cant_seem_to_send_an_email_at_the_moment": "Sorry, but I can’t seem to send an email at the moment.", + "sorry_but_something_isnt_working_right_at_the_moment": "Sorry, but something isn’t working right at the moment. Please try again later.", + "status": "Status", + "sticky_posts_show_up_first_in_your_blog_index": "Sticky posts show up first in your blog index so visitors will be sure to see them.", + "sticky": "Sticky", + "strikethrough": "Strikethrough", + "subscript": "Subscript", + "superscript": "Superscript", + "tag_not_found": "Tag Not Found", + "tag": "Tag", + "tagline": "Tagline", + "tags": "Tags", + "template": "Template", + "the_link_you_followed_is_no_longer_valid": "The link you followed is no longer valid.", + "the_requested_page_could_not_be_found": "The requested page could not be found.", + "the_requested_resource_could_not_be_found": "The requested resource could not be found.", + "the_title_provides_additional_information_about_a_link": "The title provides additional information about a link, often in the form of a tooltip.", + "theme": "Theme", + "themes": "Themes", + "this_code_will_be_injected_into_every_page_by_the_[helper]_helper": "This code will be injected into every page by the [helper] helper.", + "this_email_address_is_already_in_use": "This email address is already in use.", + "this_field_cannot_be_empty": "This field cannot be empty.", + "this_field_is_invalid": "This field is invalid.", + "this_is_how_search_engines_might_display_your_content": "This is how search engines might display your content.", + "this_is_not_a_valid_email_address": "This is not a valid email address.", + "this_slug_is_already_in_use": "This slug is already in use.", + "this_username_is_already_in_use": "This username is already in use.", + "time_zone": "Time Zone", + "time": "Time", + "title": "Title", + "toggle_night_mode": "Toggle Night Mode", + "unauthorized": "Unauthorized", + "undo": "Undo", + "upload_a_backup_file_to_restore_your_website": "Upload a backup file to restore your website to a previous version. Postleaf will restore everything it can from the file you provide.", + "upload_and_restore": "Upload and Restore", + "upload": "Upload", + "uploads": "Uploads", + "url": "URL", + "user": "User", + "username_or_email": "Username or Email", + "username": "Username", + "usernames_must_be_lowercase_and_can_only_contain": "Usernames must be lowercase and can only contain letters, numbers, and dashes.", + "users": "Users", + "view": "View", + "website_icon": "Website Icon", + "website_icons_are_displayed_in_browser_tabs_and_bookmarks": "Website icons are displayed in browser tabs and bookmarks. Square PNG images with transparent backgrounds work well.", + "website": "Website", + "welcome_to_postleaf": "Welcome to Postleaf!", + "width": "Width", + "word_count": "Word Count", + "you_are_not_authorized_to_make_this_request": "You are not authorized to make this request.", + "your_backup_could_not_be_restored_from_this_file": "Your backup could not be restored from this file.", + "your_backup_has_been_restored": "Your backup has been restored.", + "your_changes_could_not_be_saved_at_this_time": "Your changes could not be saved at this time.", + "your_changes_have_been_saved": "Your changes have been saved.", + "your_changes_havent_been_saved_yet": "Your changes haven’t been saved yet!", + "your_password_has_been_reset": "Your password has been reset.", + "your_password_is_incorrect": "Your password is incorrect.", + "your_profile_tells_visitors_a_little_bit_about_who_you_are": "Your profile tells visitors a little bit about who you are.", + "your_template_is_missing_a_required_helper": "Your template is missing a required helper.", + "your_temporary_password_is_[password]": "Your temporary password is: [password]", + "your_username_is_[username]": "Your username is: [username]", + "zen_mode": "Zen Mode" + } +} diff --git a/source/middleware/auth_middleware.js b/source/middleware/auth_middleware.js new file mode 100644 index 0000000..a5a3580 --- /dev/null +++ b/source/middleware/auth_middleware.js @@ -0,0 +1,84 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Path = require('path'); + +module.exports = { + + // + // Looks for an auth header or cookie and sets req.User and res.locals.User if the token is valid. + // + attachUser: (req, res, next) => { + const models = req.app.locals.Database.sequelize.models; + + // Check for an auth token in headers or cookies and set req.user if the token is valid + let authToken = req.get('X-Auth-Token') || req.cookies.authToken; + + // Decode the token + models.user + .decodeAuthToken(authToken) + .then((user) => { + // Attach the user to req and res.locals + req.User = user; + res.locals.User = user; + + next(); + }) + // Missing or invalid token, don't attach anything + .catch(() => next()); + }, + + // + // Forwards authenticated users to the dashboard. + // + forwardAuth: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + + if(req.User) { + return res.redirect(MakeUrl.admin()); + } + + next(); + }, + + // + // Requires an authorized user before allowing the request to complete. + // + requireAuth: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + + if(req.User) return next(); + + // XHR requests + if(req.xhr) { + res.status(HttpCodes.UNAUTHORIZED); + return next('Unauthorized'); + } + + // Redirect non-XHR requests to the login page + res.redirect( + MakeUrl.admin('login', { + query: { redirect: req.originalUrl } + }) + ); + }, + + // + // Requires the authorized user to have a certain role before allowing the request to complete. + // + // role* (string|array) - The role(s) to require. + // + requireRole: (role) => { + return (req, res, next) => { + if(!Array.isArray(role)) role = [role]; + + if(!role.includes(req.User.role)) { + res.status(HttpCodes.UNAUTHORIZED); + return next('Unauthorized'); + } + + return next(); + }; + } + +}; diff --git a/source/middleware/install_middleware.js b/source/middleware/install_middleware.js new file mode 100644 index 0000000..f13118d --- /dev/null +++ b/source/middleware/install_middleware.js @@ -0,0 +1,46 @@ +'use strict'; + +const Path = require('path'); + +module.exports = { + + // + // Checks for an owner account. + // + checkInstallation: (req, res, next) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + let installUrl = MakeUrl.admin('install'); + let apiUrl = MakeUrl.api('install'); + + // If the app is already installed, there's nothing to do + if(req.app.locals.isInstalled) { + return next(); + } + + // Make the installation view and API endpoint accessible + if(req.originalUrl === installUrl || req.originalUrl === apiUrl) { + return next(); + } + + // Check for an owner account + models.user + .findOne({ + where: { + role: 'owner' + } + }) + .then((owner) => { + // If an owner exists, assume the app is installed + if(owner) { + req.app.locals.isInstalled = true; + return next(); + } + + // If not, send them to the installation page + res.redirect(installUrl); + }); + + } + +}; diff --git a/source/middleware/upload_middleware.js b/source/middleware/upload_middleware.js new file mode 100644 index 0000000..80484fa --- /dev/null +++ b/source/middleware/upload_middleware.js @@ -0,0 +1,71 @@ +'use strict'; + +const Fs = require('fs'); +const Mkdirp = require('mkdirp'); +const Multer = require('multer'); +const Path = require('path'); +const SanitizeFilename = require('sanitize-filename'); + +module.exports = { + + // + // Middleware that returns a Multer instance with custom fileFilter and storage options. + // + // options* (object) + // - destination* (function|string) - The folder where files should be uploaded to. + // - allowedTypes (array|null) - Array of acceptable mime types or null to allow all files + // (default null). + // - overwrite (boolean) - Whether or not to overwrite files of the same name (default false). + // If false, conflicting images will be renamed with an incremental suffix: image_1.png + // + getMulter: (options) => { + return Multer({ + // Filter out files of the wrong type + fileFilter: (req, file, cb) => { + const I18n = req.app.locals.I18n; + + // Check file extension against allowed types + if(options.allowedTypes && !options.allowedTypes.includes(file.mimetype)) { + return cb(new Error(I18n.term('invalid_file_format'))); + } + + cb(null, true); + }, + + // Store uploads to disk + storage: Multer.diskStorage({ + destination: (req, file, cb) => { + let destination = typeof options.destination === 'function' ? options.destination() : options.destination; + + // Set the target filename to the original filename and sanitize it + file.targetName = SanitizeFilename(file.originalname); + + // Create the destination folder if it doesn't exist + if(Fs.existsSync(destination)) { + let parsed = Path.parse(file.targetName); + let i = 0; + + // If a file with this name already exists, append a counter to the target filename + if(!options.overwrite) { + while(Fs.existsSync(Path.join(destination, file.targetName))) { + file.targetName = parsed.name + '_' + (++i) + parsed.ext; + } + } + + cb(null, destination); + } else { + Mkdirp.sync(destination); + cb(null, destination); + } + }, + + // Generate filename + filename: function(req, file, cb) { + cb(null, file.targetName); + } + }) + + }); + } + +}; diff --git a/source/middleware/view_middleware.js b/source/middleware/view_middleware.js new file mode 100644 index 0000000..e411e29 --- /dev/null +++ b/source/middleware/view_middleware.js @@ -0,0 +1,61 @@ +'use strict'; + +const HttpCodes = require('http-codes'); +const Path = require('path'); + +module.exports = { + + // + // Attaches view data to res.locals so it becomes available to views and helpers. + // + attachViewData: (req, res, next) => { + // Request data + res.locals.Request = { + body: req.body, + cookies: req.cookies, + host: req.get('Host'), + hostname: req.hostname, + isHomepage: req.path === '/', + path: req.path, + query: req.query, + secure: req.secure, + url: req.originalUrl + }; + + next(); + }, + + // + // Serves a Not Found error for routes ending in /page/1 since it would create duplicate content. + // + checkPageNumbers: (req, res, next) => { + if(req.params.page && parseInt(req.params.page) <= 1) { + res.status(HttpCodes.NOT_FOUND); + throw new Error('Not Found'); + } + + next(); + }, + + // + // Extends the response object with useThemeViews() and useSystemViews() so you can adjust the + // view path before rending a template. + // + enableDynamicViews: (req, res, next) => { + // Use the current theme's templates + res.useThemeViews = () => { + let theme = req.app.locals.Settings.theme; + req.app.set('views', Path.join(__basedir, 'themes', theme, 'templates')); + return res; + }; + + // Use the systems templates in source/views + res.useSystemViews = () => { + req.app.set('views', Path.join(__basedir, 'source/views')); + return res; + }; + + next(); + } + +}; diff --git a/source/models/navigation_model.js b/source/models/navigation_model.js new file mode 100644 index 0000000..67ea570 --- /dev/null +++ b/source/models/navigation_model.js @@ -0,0 +1,47 @@ +'use strict'; + +module.exports = (sequelize, DataTypes) => { + + const navigation = sequelize.define('navigation', { + label: { + type: DataTypes.STRING, + allowNull: false + }, + link: { + type: DataTypes.STRING, + allowNull: false + } + }, { + primaryKey: false, + tableName: 'navigation', + + // Class methods + classMethods: { + + // + // Loads all navigation data into an array. + // + // Returns a promise that resolves with an array of navigation objects. + // + getArray: function() { + return sequelize.models.navigation + .findAll() + .then((navigation) => { + let result = []; + navigation.forEach((item) => result.push(item.get({ plain: true }))); + return result; + }); + } + + }, + + // Instance methods + instanceMethods: { }, + + // Hooks + hooks: { } + }); + + return navigation; + +}; diff --git a/source/models/post_model.js b/source/models/post_model.js new file mode 100644 index 0000000..58f35a6 --- /dev/null +++ b/source/models/post_model.js @@ -0,0 +1,370 @@ +'use strict'; + +const Extend = require('extend'); +const Moment = require('moment'); +const Lunr = require('lunr'); +const Striptags = require('striptags'); + +// +// Converts a model object to a Lunr search index object. +// +// Returns an object. +// +function getSearchIndexObject(postObject) { + return { + id: postObject.id, + heavy: postObject.title, + light: [ + Striptags(postObject.content), + postObject.metaTitle, + postObject.metaDescription + ].join(' ') + }; +} + +module.exports = (sequelize, DataTypes) => { + + const post = sequelize.define('post', { + // Schema + id: { + type: DataTypes.UUID, + primaryKey: true, + defaultValue: DataTypes.UUIDV4 + }, + slug: { + type: DataTypes.STRING, + unique: true, + allowNull: false, + validate: { + is: { + args: /^[a-z](?:-?[a-z0-9]+)*$/, + msg: 'slugs_must_start_with_a_letter_and_can_only_contain' // i18n + } + } + }, + userId: { + type: DataTypes.UUID, + allowNull: false, + references: { + model: sequelize.models.user, + key: 'id' + } + }, + publishedAt: { + type: DataTypes.DATE, + allowNull: false, + validate: { + isDate: { + args: true, + msg: 'this_field_is_invalid' // i18n + } + } + }, + title: { + type: DataTypes.TEXT, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: 'this_field_cannot_be_empty' // i18n + } + } + }, + content: DataTypes.TEXT, + image: DataTypes.TEXT, + metaTitle: DataTypes.TEXT, + metaDescription: DataTypes.TEXT, + template: DataTypes.STRING, + status: DataTypes.ENUM('draft', 'pending', 'rejected', 'published'), + isPage: { + type: DataTypes.BOOLEAN, + allowNull: false + }, + isFeatured: { + type: DataTypes.BOOLEAN, + allowNull: false + }, + isSticky: { + type: DataTypes.BOOLEAN, + allowNull: false + } + }, { + // Class methods + classMethods: { + // + // Builds the full text search index and stores it in post.searchIndex. + // + // Returns a promise with the search index as its first argument. + // + buildSearchIndex: () => { + // Create an instance of Lunr + post.searchIndex = Lunr(function() { + this.ref('id'); + this.field('heavy', { boost: 10 }); + this.field('light'); + }); + + // Build an index of posts using searchable fields + return post + .findAll({ + attributes: ['id', 'title', 'content', 'metaTitle', 'metaDescription'] + }) + .then((posts) => { + // Index each post + for(let i in posts) { + post.searchIndex.add(getSearchIndexObject(posts[i])); + } + + return post.searchIndex; + }); + }, + + // + // Returns the number of posts based on the specified options. + // + // author (string) - A username. + // tag (string) - A tag slug. + // + // Returns a promise that resolve with an integer post count. + // + getCount: (options) => { + let author = options.author; + let tag = options.tag; + let status = options.status; + let isFeatured = options.isFeatured; + let isPage = options.isPage; + let isSticky = options.isSticky; + let isPublic = options.isPublic; + let include = []; + let where = {}; + + // Count by author + if(author) { + include.push({ + model: sequelize.models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] }, + where: { username: author } + }); + } + + // Count by tag + if(tag) { + include.push({ + model: sequelize.models.tag, + where: { slug: tag } + }); + } + + // Filter by status + if(typeof status !== 'undefined') where.status = status; + + // Filter by flags + if(typeof isFeatured !== 'undefined') where.isFeatured = isFeatured ? 1 : 0; + if(typeof isPage !== 'undefined') where.isPage = isPage ? 1 : 0; + if(typeof isSticky !== 'undefined') where.isSticky = isSticky ? 1 : 0; + + // Filter by public posts + if(typeof isPublic !== 'undefined') { + if(isPublic === 'true') { + where.status = 'published'; + where.publishedAt = { $lt: Moment().utc().toDate() }; + } else { + where.status !== 'published'; + } + } + + // Get the count + return post.count({ + where: where, + include: include + }); + }, + + // + // Performs a full text search. + // + // query* (string) - The term(s) to search for. + // options (object) + // - where (object) - An object to pass to post.findAll to limit results (default null). + // - limit (int) - Max number of posts to return (default null). + // - offset (int) - Return posts from this offset (default 0). + // + // Returns a promise. + // + search: (query, options) => { + options = Extend(true, { + where: null, + limit: null, + offset: 0 + }, options); + + // Perform the search + let matches = post.searchIndex.search(query); + let ids = matches.map((val) => val.ref); + let order = ids.map((val) => { + return '`post`.`id` = ' + sequelize.escape(val) + ' DESC'; + }); + order = order.join(', '); + + // Return matching posts ordered by score + return post.findAndCountAll({ + distinct: true, + where: Extend(true, options.where, { id: { $in: ids } }), + include: [ + { + model: sequelize.models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: sequelize.models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + limit: options.limit, + offset: options.offset, + order: sequelize.literal(order) + }); + } + }, + + // Instance methods + instanceMethods: { + // + // Returns the next public post. + // + // options (object) + // - previous (boolean) - Set to true to return the previous post. + // + // Returns a promise with a post as its first argument. + // + getNext: function(options) { + options = options || {}; + let previous = options.previous; + let order = previous ? 'DESC' : 'ASC'; + + return post.findOne({ + where: { + id: { $ne: this.id }, + status: 'published', + isPage: 0, + publishedAt: Extend( + // Post must not be in the future + { $lt: Moment().utc().toDate() }, + // Previous post must be <= the target post's publish date. Next post must be > the + // target post's published date. We use > instead of >= for next postp to avoid + // duplicates when two posts have the same exact publish date. + previous ? { $lte: this.publishedAt } : { $gt: this.publishedAt } + ) + }, + include: [ + { + model: sequelize.models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: sequelize.models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + order: [ + ['publishedAt', order] + ] + }); + }, + + // + // Gets suggested posts based on the current post. + // + // Returns a promise with the suggested posts as the first argument. + // + getRelated: function(options) { + options = options || {}; + let count = options.count || 10; + let offset = options.offset || 0; + let tags = this.tags || []; + + // Get ids of posts that share the same tags as this post + return sequelize.models.tag.findAll({ + where: { + id: { $in: tags.map((tag) => tag.id) } + }, + include: [{ + model: post, + where: { + status: 'published', + isPage: 0, + publishedAt: { $lt: Moment().utc().toDate() } + } + }] + }) + .then((result) => { + // Assemble post ids in an array + let ids = []; + result.forEach((tag) => { + tag.posts.forEach((post) => { + ids.push(post.id); + }); + }); + + // Fetch matching posts and associations + return post.findAll({ + where: { + id: { $in: ids } + }, + include: [ + { + model: sequelize.models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: sequelize.models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + order: [ + ['publishedAt', 'DESC'] + ], + limit: count, + offset: offset + }); + }); + }, + + // + // Determines whether or not a post is publicly visible. + // + // Returns a boolean. + // + isPublic: function() { + if(this.status !== 'published') return false; + + // Make sure the publish date isn't in the future + let now = new Moment.utc(); + let publishedAt = new Moment(this.publishedAt); + if(publishedAt.isAfter(now)) return false; + + return true; + } + }, + + // Hooks + hooks: { + // + // Update the search index when posts are added, deleted, and updated + // + afterCreate: (item) => post.searchIndex.add(getSearchIndexObject(item)), + afterDelete: (item) => post.searchIndex.remove({ id: item.id }), + afterUpdate: (item) => post.searchIndex.update(getSearchIndexObject(item)) + } + }); + + return post; + +}; diff --git a/source/models/revision_model.js b/source/models/revision_model.js new file mode 100644 index 0000000..3e4e6db --- /dev/null +++ b/source/models/revision_model.js @@ -0,0 +1,42 @@ +'use strict'; + +module.exports = (sequelize, DataTypes) => { + + const revision = sequelize.define('revision', { + // Schema + id: { + type: DataTypes.UUID, + primaryKey: true, + defaultValue: DataTypes.UUIDV4 + }, + postId: { + type: DataTypes.UUID, + allowNull: false, + references: { + model: sequelize.models.post, + key: 'id' + } + }, + userId: { + type: DataTypes.UUID, + allowNull: false, + references: { + model: sequelize.models.user, + key: 'id' + } + }, + title: DataTypes.TEXT, + content: DataTypes.TEXT + }, { + + // Class methods + classMethods: { }, + + // Instance methods + instanceMethods: { } + + }); + + return revision; + +}; diff --git a/source/models/setting_model.js b/source/models/setting_model.js new file mode 100644 index 0000000..1a47dc5 --- /dev/null +++ b/source/models/setting_model.js @@ -0,0 +1,52 @@ +'use strict'; + +module.exports = (sequelize, DataTypes) => { + + const setting = sequelize.define('setting', { + key: { + type: DataTypes.STRING, + unique: true, + allowNull: false, + validate: { + is: { + args: /^[a-zA-Z_-]+$/, + msg: 'Invalid key!' + } + } + }, + value: DataTypes.TEXT + }, { + + // Class methods + classMethods: { + + // + // Loads all settings data into a key/value object. + // + // Returns a promise that resolves with an object. + // + getObject: function() { + return sequelize.models.setting + .findAll() + .then((settings) => { + let result = {}; + + settings.map((setting) => result[setting.key] = setting.value); + + return result; + }); + } + + }, + + // Instance methods + instanceMethods: { }, + + // Hooks + hooks: { } + + }); + + return setting; + +}; diff --git a/source/models/tag_model.js b/source/models/tag_model.js new file mode 100644 index 0000000..268bf7c --- /dev/null +++ b/source/models/tag_model.js @@ -0,0 +1,140 @@ +'use strict'; + +const Extend = require('extend'); +const Lunr = require('lunr'); + +// +// Converts a model object to a Lunr search index object. +// +// Returns an object. +// +function getSearchIndexObject(tagObject) { + return { + id: tagObject.id, + heavy: tagObject.name, + light: [ + tagObject.description, + tagObject.metaTitle, + tagObject.metaDescription + ].join(' ') + }; +} + +module.exports = (sequelize, DataTypes) => { + + const tag = sequelize.define('tag', { + // Schema + id: { + type: DataTypes.UUID, + primaryKey: true, + defaultValue: DataTypes.UUIDV4 + }, + slug: { + type: DataTypes.STRING, + unique: true, + allowNull: false, + validate: { + is: { + args: /^[a-z](?:-?[a-z0-9]+)*$/, + msg: 'slugs_must_start_with_a_letter_and_can_only_contain' // i18n + } + } + }, + name: { + type: DataTypes.TEXT, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: 'this_field_cannot_be_empty' // i18n + } + } + }, + description: DataTypes.TEXT, + image: DataTypes.STRING, + metaTitle: DataTypes.TEXT, + metaDescription: DataTypes.TEXT + }, { + // Class methods + classMethods: { + // + // Builds the full text search index and stores it in tag.searchIndex. + // + // Returns a promise with the search index as its first argument. + // + buildSearchIndex: () => { + // Create an instance of Lunr + tag.searchIndex = Lunr(function() { + this.ref('id'); + this.field('heavy', { boost: 10 }); + this.field('light'); + }); + + // Build an index of tags using searchable fields + return tag + .findAll({ + attributes: ['id', 'name', 'description', 'metaTitle', 'metaDescription'] + }) + .then((tags) => { + // Index each tag + for(let i in tags) { + tag.searchIndex.add(getSearchIndexObject(tags[i])); + } + + return tag.searchIndex; + }); + }, + + // + // Performs a full text search. + // + // query* (string) - The term(s) to search for. + // options (object) + // - where (object) - An object to pass to tag.findAll to limit results (default null). + // - limit (int) - Max number of tags to return (default null). + // - offset (int) - Return tags from this offset (default 0). + // + // Returns a promise. + // + search: (query, options) => { + options = Extend(true, { + where: null, + limit: null, + offset: 0 + }, options); + + // Perform the search + let matches = tag.searchIndex.search(query); + let ids = matches.map((val) => val.ref); + let order = ids.map((val) => { + return '`tag`.`id` = ' + sequelize.escape(val) + ' DESC'; + }); + order = order.join(', '); + + // Return matching tags ordered by score + return tag.findAndCountAll({ + where: Extend(true, options.where, { id: { $in: ids } }), + limit: options.limit, + offset: options.offset, + order: sequelize.literal(order) + }); + } + }, + + // Instance methods + instanceMethods: { }, + + // Hooks + hooks: { + // + // Update the search index when tags are added, deleted, and updated + // + afterCreate: (item) => tag.searchIndex.add(getSearchIndexObject(item)), + afterDelete: (item) => tag.searchIndex.remove({ id: item.id }), + afterUpdate: (item) => tag.searchIndex.update(getSearchIndexObject(item)) + } + }); + + return tag; + +}; diff --git a/source/models/upload_model.js b/source/models/upload_model.js new file mode 100644 index 0000000..2cd959e --- /dev/null +++ b/source/models/upload_model.js @@ -0,0 +1,92 @@ +'use strict'; + +const Extend = require('extend'); + +module.exports = (sequelize, DataTypes) => { + + const upload = sequelize.define('upload', { + // Schema + id: { + type: DataTypes.UUID, + primaryKey: true, + defaultValue: DataTypes.UUIDV4 + }, + userId: { + type: DataTypes.UUID, + allowNull: false, + references: { + model: sequelize.models.user, + key: 'id' + } + }, + filename: { + type: DataTypes.STRING, + allowNull: false + }, + extension: { + type: DataTypes.STRING, + allowNull: false + }, + path: { + type: DataTypes.STRING, + allowNull: false + }, + mimeType: { + type: DataTypes.STRING, + allowNull: false + }, + size: { + type: DataTypes.INTEGER, + allowNull: false + }, + width: { + type: DataTypes.INTEGER + }, + height: { + type: DataTypes.INTEGER + } + }, { + // Class methods + classMethods: { + // + // Performs a search. + // + // query* (string) - The term(s) to search for. + // options (object) + // - where (object) - An object to pass to post.findAll to limit results (default null). + // - limit (int) - Max number of posts to return (default null). + // - offset (int) - Return posts from this offset (default 0). + // + // Returns a promise. + // + search: (query, options) => { + options = Extend(true, { + where: null, + limit: null, + offset: 0 + }, options); + + // Perform the search + return upload.findAndCountAll({ + where: Extend(true, options.where, { + filename: { $like: '%' + query.replace(/(%)/g, '\\$1') + '%' } + }), + limit: options.limit, + offset: options.offset, + order: [ + ['createdAt', 'DESC'] + ] + }); + } + }, + + // Instance methods + instanceMethods: { }, + + // Hooks + hooks: { } + }); + + return upload; + +}; diff --git a/source/models/user_model.js b/source/models/user_model.js new file mode 100644 index 0000000..bd336a3 --- /dev/null +++ b/source/models/user_model.js @@ -0,0 +1,281 @@ +'use strict'; + +const Bcrypt = require('bcrypt'); +const Crypto = require('crypto'); +const Extend = require('extend'); +const Jwt = require('jsonwebtoken'); +const Lunr = require('lunr'); + +// +// Converts a model object to a Lunr search index object. +// +// Returns an object. +// +function getSearchIndexObject(userObject) { + return { + id: userObject.id, + heavy: userObject.name, + light: [ + userObject.email, + userObject.username, + userObject.bio, + userObject.location + ].join(' ') + }; +} + +module.exports = (sequelize, DataTypes) => { + + const user = sequelize.define('user', { + // Schema + id: { + type: DataTypes.UUID, + primaryKey: true, + defaultValue: DataTypes.UUIDV4 + }, + name: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: 'this_field_cannot_be_empty' // i18n + } + } + }, + email: { + type: DataTypes.STRING, + unique: { + args: true, + msg: 'this_email_address_is_already_in_use' // i18n + }, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: 'this_field_cannot_be_empty' // i18n + }, + isEmail: { + args: true, + msg: 'this_is_not_a_valid_email_address' // i18n + } + } + }, + username: { + type: DataTypes.STRING, + unique: { + args: true, + msg: 'this_username_is_already_in_use' // i18n + }, + allowNull: false, + validate: { + is: { + args: /^[a-z](?:-?[a-z0-9]+)*$/, + msg: 'usernames_must_be_lowercase_and_can_only_contain' // i18n + } + } + }, + password: { + type: DataTypes.STRING, + allowNull: false, + validate: { + notEmpty: { + args: true, + msg: 'this_field_cannot_be_empty' // i18n + } + } + }, + resetToken: DataTypes.STRING, + role: DataTypes.ENUM('owner', 'admin', 'editor', 'contributor'), + avatar: DataTypes.STRING, + image: DataTypes.STRING, + location: DataTypes.STRING, + bio: DataTypes.TEXT, + website: DataTypes.STRING + }, { + // Class methods + classMethods: { + // + // Builds the full text search index and stores it in user.searchIndex. + // + // Returns a promise with the search index as its first argument. + // + buildSearchIndex: () => { + // Create an instance of Lunr + user.searchIndex = Lunr(function() { + this.ref('id'); + this.field('heavy', { boost: 10 }); + this.field('light'); + }); + + // Build an index of users using searchable fields + return user + .findAll({ + attributes: ['id', 'name', 'email', 'username', 'bio', 'location'] + }) + .then((users) => { + // Index each user + for(let i in users) { + user.searchIndex.add(getSearchIndexObject(users[i])); + } + + return user.searchIndex; + }); + }, + + // + // Attempts to decode an auth token. + // + // token* (string) - The auth token to decode. + // + // Returns a promise resolving with the respective user object. + // + decodeAuthToken(token) { + return new Promise((resolve, reject) => { + try { + // Decode it + let decoded = Jwt.verify(token, process.env.AUTH_SECRET); + + // Fetch the user + user + .findOne({ + where: { + id: decoded.data.id + } + }) + .then((user) => { + if(!user) { + return reject('User not found.'); + } + + // Verify token hash + let hash = Crypto + .createHash('sha256') + .update(process.env.AUTH_SECRET + user.password) + .digest('hex') + .substring(0, 10); + + if(hash !== decoded.data.hash) { + reject('Invalid auth token.'); + } + + return resolve(user); + }) + .catch(() => reject('Error fetching user from the database.')); + } catch(err) { + return reject('Invalid auth token.'); + } + }); + }, + + // + // Generates a password hash. + // + // Returns a string. + // + hashPassword(password) { + return Bcrypt.hashSync(password, 10); + }, + + // + // Performs a full text search. + // + // query* (string) - The term(s) to search for. + // options (object) + // - where (object) - An object to pass to user.findAll to limit results (default null). + // - limit (int) - Max number of users to return (default null). + // - offset (int) - Return users from this offset (default 0). + // + // Returns a promise. + // + search: (query, options) => { + options = Extend(true, { + where: null, + limit: null, + offset: 0 + }, options); + + // Perform the search + let matches = user.searchIndex.search(query); + let ids = matches.map((val) => val.ref); + let order = ids.map((val) => { + return '`user`.`id` = ' + sequelize.escape(val) + ' DESC'; + }); + order = order.join(', '); + + // Return matching users ordered by score + return user.findAndCountAll({ + where: Extend(true, options.where, { id: { $in: ids } }), + limit: options.limit, + offset: options.offset, + order: sequelize.literal(order) + }); + } + }, + + // Instance methods + instanceMethods: { + // + // Generates an auth token for the user. + // + // Returns an object: { token, expires } + // + generateAuthToken: function() { + let days = process.env.AUTH_LIFETIME; + let seconds = days * 24 * 60 * 60; + let expires = new Date(Date.now() + seconds * 1000); // milliseconds + + // Create a hash of the auth secret + password so changing passwords will revoke auth tokens + let hash = Crypto + .createHash('sha256') + .update(process.env.AUTH_SECRET + this.password) + .digest('hex') + .substring(0, 10); + + let token = Jwt.sign({ + data: { + id: this.id, + hash: hash + } + }, process.env.AUTH_SECRET, { expiresIn: seconds }); + + return { + token: token, + expires: expires + }; + }, + + // + // Hashes and sets the user's password. + // + // Returns the user instance. + // + setPassword: function(password) { + this.password = user.hashPassword(password); + return this; + }, + + // + // Verifies the user's password. + // + // Returns true if the password matches, false otherwise. + // + verifyPassword: function(password) { + return Bcrypt.compareSync(password, this.password); + } + }, + + // Hooks + hooks: { + // + // Update the search index when users are added, deleted, and updated + // + afterCreate: (item) => user.searchIndex.add(getSearchIndexObject(item)), + afterDelete: (item) => user.searchIndex.remove({ id: item.id }), + afterUpdate: (item) => user.searchIndex.update(getSearchIndexObject(item)) + } + }); + + return user; + +}; diff --git a/source/modules/admin_menu.js b/source/modules/admin_menu.js new file mode 100644 index 0000000..a07cea0 --- /dev/null +++ b/source/modules/admin_menu.js @@ -0,0 +1,82 @@ +'use strict'; + +const Path = require('path'); + +const self = { + + // + // Gets all admin menu items. + // + // Returns an array of menu item objects. + // + getItems: (req) => { + const I18n = req.app.locals.I18n; + const User = req.User; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + let primary = []; + let secondary = []; + + // Posts + primary.push({ + label: I18n.term('posts'), + link: MakeUrl.admin('posts'), + icon: 'fa fa-file-text' + }); + + // Tags + if(['owner', 'admin', 'editor'].includes(User.role)) { + primary.push({ + label: I18n.term('tags'), + link: MakeUrl.admin('tags'), + icon: 'fa fa-tag' + }); + } + + // Navigation + if(['owner', 'admin'].includes(User.role)) { + primary.push({ + label: I18n.term('navigation'), + link: MakeUrl.admin('navigation'), + icon: 'fa fa-map' + }); + } + + // Users + if(['owner', 'admin'].includes(User.role)) { + primary.push({ + label: I18n.term('users'), + link: MakeUrl.admin('users'), + icon: 'fa fa-user' + }); + } + + // Settings + if(['owner', 'admin'].includes(User.role)) { + primary.push({ + label: I18n.term('settings'), + link: MakeUrl.admin('settings'), + icon: 'fa fa-gear' + }); + } + + // New + secondary.push({ + label: I18n.term('new_post'), + link: MakeUrl.admin('posts/new'), + icon: 'fa fa-plus' + }); + + // Search + secondary.push({ + label: I18n.term('search'), + link: '#locater', + icon: 'fa fa-search', + noSearch: true + }); + + return [secondary, primary]; + } + +}; + +module.exports = self; diff --git a/source/modules/auto_embed.js b/source/modules/auto_embed.js new file mode 100644 index 0000000..5790a4f --- /dev/null +++ b/source/modules/auto_embed.js @@ -0,0 +1,113 @@ +'use strict'; + +const Autolinker = require('autolinker'); +const Cheerio = require('cheerio'); +const He = require('he'); +const Oembed = require('oembed'); +const Path = require('path'); +const Url = require('url'); + +const self = { + + // + // Parses text or HTML and turns links into embedded objects. + // + // + // html* (string) - The HTML to parse. + // options (object) + // - hostname (string) - The current hostname. Used for converting URLs and requesting oEmbeds. + // + // Returns a promise that resolves with an HTML string. + // + parse: (html, options) => { + options = options || {}; + + return new Promise((resolve, reject) => { + // Parse HTML to find URLs + html = Autolinker.link(html, { + newWindow: false, + email: false, + phone: false, + truncate: { + length: 32, + location: 'middle' + }, + replaceFn: function(match) { + // Parse the URL + let url = match.getUrl(); + let parsed = Url.parse(url); + let extension = Path.extname(parsed.pathname); + + // Is it a local URL? If so, make it root relative + if(parsed.hostname === options.hostname) { + url = parsed.pathname + (parsed.search || '') + (parsed.hash || ''); + } + + switch(match.getType()) { + case 'url': + if(extension.match(/^\.(gif|jpeg|jpg|png|svg)$/i)) { + // Embed an image + return '\n' + + '
    ' + + '' + + '
    ' + + '\n'; + } else { + // Embed other URLs. Since this method doesn't support promises, we'll create a + // placeholder element that we can easily parse afterwards. + return '\n' + + '' + + '\n'; + } + default: + return false; + } + } + }); + + // Convert oEmbed URLs + let $ = Cheerio.load(html); + let queue = []; + + // Get a list of oembed URLs + $('[data-auto-embed]').each(function() { + let url = $(this).attr('data-auto-embed'); + + queue.push( + new Promise((resolve) => { + Oembed.fetch(url, { for: options.hostname }, (err, result) => { + resolve(err ? null : result); + }); + }) + ); + }); + + // Fetch embed code for all oembed links + Promise.all(queue) + .then((result) => { + $('[data-auto-embed]').each(function(index) { + if(result[index]) { + // Insert the embed code + $(this).replaceWith( + '
    ' + + result[index].html + + '
    ' + ); + } else { + // No oembed provider found, revert to to the original URL + $(this).replaceWith($(this).attr('data-auto-embed')); + } + }); + + // Return the updated HTML + resolve($.html()); + }) + .catch((err) => reject(err)); + }); + } + +}; + +module.exports = self; diff --git a/source/modules/autocomplete_suggestions.js b/source/modules/autocomplete_suggestions.js new file mode 100644 index 0000000..090cc13 --- /dev/null +++ b/source/modules/autocomplete_suggestions.js @@ -0,0 +1,127 @@ +'use strict'; + +const Moment = require('moment'); +const Path = require('path'); + +const self = { + + // + // Returns an array of link suggestions for use with autocomplete fields. + // + // req* (object) - The request object. + // types (string|array) - The type of links to return: ['posts', 'users', 'tags'] (defaults to + // all) + // + // Returns a promise that resolves with an array of typeahead suggestions: + // + // { + // type: '', + // label: '', + // searchText: '', + // url: '' + // } + // + getLinks: function(req, type) { + return new Promise((resolve, reject) => { + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(req.app.locals.Settings); + const models = req.app.locals.Database.sequelize.models; + + let queue = []; + + // Type defaults to all types + if(typeof type === 'undefined') type = ['posts', 'tags', 'users']; + + // Convert string type to array + if(typeof type === 'string') type = [type]; + + // Get users + if(type.includes('users')) { + queue.push( + models.user + .findAll({ + attributes: ['name', 'username'], + order: [ + ['name', 'ASC'] + ] + }) + .then((users) => { + return users.map((user) => { + return { + type: 'user', + label: user.name, + searchText: user.name + ' ' + user.username, + url: MakeUrl.author(user.username) + }; + }); + }) + ); + } + + // Get tags + if(type.includes('tags')) { + queue.push( + models.tag + .findAll({ + attributes: ['name', 'slug'], + order: [ + ['name', 'ASC'] + ] + }) + .then((tags) => { + return tags.map((tag) => { + return { + type: 'tag', + label: tag.name, + searchText: tag.name + ' ' + tag.slug, + url: MakeUrl.tag(tag.slug) + }; + }); + }) + ); + } + + // Get posts + if(type.includes('posts')) { + queue.push( + models.post + .findAll({ + attributes: ['title', 'slug'], + where: { + status: 'published', + publishedAt: { $lt: Moment().utc().toDate() } + }, + order: [ + ['title', 'ASC'] + ] + }) + .then((posts) => { + return posts.map((post) => { + return { + type: 'post', + label: post.title, + searchText: post.title + ' ' + post.slug, + url: MakeUrl.post(post.slug) + }; + }); + }) + ); + } + + // Wait for all queue to resolve + Promise.all(queue) + .then((results) => { + // Merge link suggestions into a single array + let all = []; + for(let i in results) { + all = all.concat(results[i]); + } + + resolve(all); + }) + .catch((err) => reject(err)); + }); + } + +}; + +module.exports = self; diff --git a/source/modules/database.js b/source/modules/database.js new file mode 100644 index 0000000..38f712f --- /dev/null +++ b/source/modules/database.js @@ -0,0 +1,123 @@ +'use strict'; + +const Path = require('path'); +const Sequelize = require('sequelize'); +let databasePath = Path.join(__basedir, 'data/database.sq3'); + +const sequelize = new Sequelize(null, null, null, { + dialect: 'sqlite', + benchmark: false, + logging: false, // console.log + storage: databasePath +}); + +// Models +const navigation = sequelize.import(Path.join(__basedir, 'source/models/navigation_model.js')); +const post = sequelize.import(Path.join(__basedir, 'source/models/post_model.js')); +const tag = sequelize.import(Path.join(__basedir, 'source/models/tag_model.js')); +const user = sequelize.import(Path.join(__basedir, 'source/models/user_model.js')); +const revision = sequelize.import(Path.join(__basedir, 'source/models/revision_model.js')); +const setting = sequelize.import(Path.join(__basedir, 'source/models/setting_model.js')); +const upload = sequelize.import(Path.join(__basedir, 'source/models/upload_model.js')); + +// +// Creates missing database tables. +// +// Returns a promise. +// +function init() { + return sequelize.sync(); +} + +// +// Loads settings from the settings table. If no settings exist, default settings will be created. +// +// Returns a promise that resolves with a settings object. +// +function loadSettings() { + // Load settings + return setting.getObject().then((settings) => { + // If settings exist, assume the app has already been initialized + if(Object.keys(settings).length) { + return settings; + } + + // Otherwise, write default settings and return them + return Promise + .all([ + setting.create({ key: 'cover', value: '/assets/images/sample_cover.jpg' }), + setting.create({ key: 'defaultPostContent', value: 'Start writing here…' }), + setting.create({ key: 'defaultPostTitle', value: 'Untitled Post' }), + setting.create({ key: 'favicon', value: '/assets/images/postleaf_logo.svg' }), + setting.create({ key: 'footCode', value: '' }), + setting.create({ key: 'headCode', value: '' }), + setting.create({ key: 'homepage', value: '' }), + setting.create({ key: 'language', value: 'en-us' }), + setting.create({ key: 'logo', value: '/assets/images/postleaf_wordmark.svg' }), + setting.create({ key: 'postsPerPage', value: 5 }), + setting.create({ key: 'tagline', value: 'Go forth and create!' }), + setting.create({ key: 'theme', value: 'empower-theme' }), + setting.create({ key: 'timeZone', value: 'UTC' }), + setting.create({ key: 'title', value: 'A Postleaf Website' }), + setting.create({ key: 'customHomepage', value: '' }), + setting.create({ key: 'pathForAdmin', value: 'admin' }), + setting.create({ key: 'pathForAuthor', value: 'author' }), + setting.create({ key: 'pathForAPI', value: 'api' }), + setting.create({ key: 'pathForBlog', value: 'blog' }), + setting.create({ key: 'pathForFeed', value: 'feed' }), + setting.create({ key: 'pathForPage', value: 'page' }), + setting.create({ key: 'pathForSearch', value: 'search' }), + setting.create({ key: 'pathForTag', value: 'tag' }) + ]) + .then(() => setting.getObject()) + .then((settings) => settings); + }); +} + +// Associate posts with users +user.hasMany(post); +post.belongsTo(user, { + foreignKey: 'userId', + targetKey: 'id', + as: 'author' +}); + +// Associate uploads with users +user.hasMany(upload); +upload.belongsTo(user, { + foreignKey: 'userId', + targetKey: 'id', + as: 'author' +}); + +// Associate revisions with posts +post.hasMany(revision); +revision.belongsTo(post, { + foreignKey: 'postId', + targetKey: 'id' +}); +user.hasMany(revision); +revision.belongsTo(user, { + foreignKey: 'userId', + targetKey: 'id', + as: 'author' +}); + +// Associate tags with posts +post.belongsToMany(tag, { through: 'postTags' }); +tag.belongsToMany(post, { through: 'postTags' }); + +// Link postTags back to post/tag +sequelize.models.postTags.belongsTo(post); +sequelize.models.postTags.belongsTo(tag); + +// Remove primary keys from navigation and setting +navigation.removeAttribute('id'); +setting.removeAttribute('id'); + +// Exports +module.exports = { + init, + loadSettings, + sequelize +}; diff --git a/source/modules/dynamic_images.js b/source/modules/dynamic_images.js new file mode 100644 index 0000000..1783e99 --- /dev/null +++ b/source/modules/dynamic_images.js @@ -0,0 +1,328 @@ +'use strict'; + +const Cheerio = require('cheerio'); +const Crypto = require('crypto'); +const Fs = require('fs'); +const Gm = require('gm'); +const HttpCodes = require('http-codes'); +const Mkdirp = require('mkdirp'); +const Mime = require('mime'); +const Path = require('path'); +const Url = require('url'); +const SignedUrl = require(Path.join(__basedir, 'source/modules/signed_url.js')); + +const self = { + + // + // Parses an HTML string and injects srcset attributes with dynamic images every 200px. + // + // html* (string) - An HTML string of content. + // uploadModel* (object) - A reference to the upload model. + // + // Returns a promise that resolves an HTML string. + // + injectSrcset(html, uploadModel) { + return new Promise((resolve, reject) => { + let $ = Cheerio.load(html); + let queue = []; + + // Find each image in the content + $('img').each((index, el) => { + let src = $(el).attr('src'); + let path = Url.parse(src).pathname; + let srcset = []; + + // Skip images that aren't in the uploads folder + if(!path || !path.match(/^\/uploads\//)) return; + + queue.push( + // Find the original image + uploadModel + .findOne({ + where: { path: src } + }) + .then((upload) => { + // Do nothing if no image exists or if it's less than 200px wide + if(!upload || upload.width < 200) return; + + // Create dynamic images at 200px intervals up to the original width + for(let width = 200; width < upload.width; width += 200) { + let url = SignedUrl.sign(src + '?width=' + width, process.env.AUTH_SECRET); + srcset.push(url + ' ' + width + 'w'); + } + + // Inject srcset + $(el).attr('srcset', srcset.join(', ')); + }) + ); + }); + + // Wait for the queue to finish + Promise.all(queue) + // Send back the updated HTML + .then(() => resolve($.html())) + .catch((err) => reject(err)); + }); + }, + + // + // Middleware that intercepts static image requests, dynamically processes them based on query + // params, and caches them for optimal performance. + // + // Query params: + // + // width (int) - Resize proportionally to fit inside this this width. + // height (int) - Resize proportionally to fit inside this height. + // crop (string) - The crop coordinates after resizing occurs. Use: '{x1},{y1},{x2},{y2}' + // thumbnail (int|string) - Creates a thumbnail of the exact size. Use: '{width}' or + // '{width},{height}' + // rotate (int) - The angle of rotation, from 0 to 360. + // flip (string) - Flip the image horizontally or vertically. Use: 'h', 'v', or 'both' + // grayscale (bool) - Set to true to desaturate the image. + // colorize (string) - Colorize the image. Use: `{red},{green},{blue}` where values are 0–100%. + // blur (int) - Apply a blur to the image using this argument as the blur radius. + // colors (int) - Reduce the image to this many of colors. Uses a dithering effect. + // quality (int) - The quality of the resulting image. The higher the quality, the larger the + // file size. The lower the quality, the smaller the file size. Quality has no affect on + // lossless image formats such as PNG and GIF. Default is 75. + // + processImages: (req, res, next) => { + // Ignore requests outside of the uploads folder + if(!req.path.match(/^\/uploads\//)) return next(); + + // Ignore requests where no query params exist + if(typeof req.query !== 'object' || Object.keys(req.query).length === 0) return next(); + + // Decode the path and get the mime type + let targetFile = Path.join(__basedir, decodeURI(req.path)); + let mimeType = Mime.lookup(targetFile); + + // Ignore all files that aren't supported raster images + if(!['image/gif', 'image/jpeg', 'image/png'].includes(mimeType)) return next(); + + // Is the URL signed? + if(!SignedUrl.verify(req.originalUrl, process.env.AUTH_SECRET)) { + return res.status(HttpCodes.FORBIDDEN).end(); + } + + // Determine cache filename. We use a shortened hash of the path (relative to the app root) so + // we can cleanup cache files when the original gets deleted. + // + // Cache filenames are formatted like this: + // + // pathHash.key.extension + // + // - Where pathHash is the first 10 chars of SHA256(path), and path is relative to the website + // root (e.g. '/uploads/2017/03/image.jpg'). + // - Where key is a key from a signed URL. + // - Where extension is the lowercase file extension + // + let key = req.query.key || ''; + let extension = Path.extname(targetFile).toLowerCase(); + let pathHash = Crypto.createHash('sha256').update(decodeURI(req.path)).digest('hex').substring(0, 10); + let cacheFile = Path.join(__basedir, 'cache/images', pathHash + '.' + key + extension); + + // Check for an existing cache file + Fs.stat(cacheFile, (err) => { + if(!err) { + // We have a hit! Send the file from cache. + res.header('Content-Type', mimeType).sendFile(cacheFile); + return; + } + + // Nothing in cache. Does the target file exist? + Fs.stat(targetFile, (err) => { + if(err) return next(); + + // Process the image + Promise.resolve(Gm(targetFile)) + // Resize + .then((image) => { + return new Promise((resolve, reject) => { + if(req.query.width || req.query.height) { + let width = req.query.width ? parseInt(req.query.width) : null; + let height = req.query.height ? parseInt(req.query.height) : null; + + // Determine the image's current size + image.size((err, size) => { + if(err) return reject(err); + + // Only resize if requested dimensions are smaller than the original + if(width < size.width && height < size.height) { + image.resize(width, height); + } + + resolve(image); + }); + } else { + resolve(image); + } + }); + }) + // Crop + .then((image) => { + if(req.query.crop) { + let crop = req.query.crop.split(','); + let x1 = parseInt(crop[0]); + let y1 = parseInt(crop[1]); + let x2 = parseInt(crop[2]); + let y2 = parseInt(crop[3]); + let cropWidth = Math.abs(x2 - x1); + let cropHeight = Math.abs(y2 - y1); + let x = Math.min(x1, x2); + let y = Math.min(y1, y2); + + if(cropWidth > 0 && cropHeight > 0) { + image.crop(cropWidth, cropHeight, x, y); + } + } + + return image; + }) + // Thumbnail + .then((image) => { + return new Promise((resolve, reject) => { + if(req.query.thumbnail) { + let args = req.query.thumbnail.split(','); + let width = args[0] ? parseInt(args[0]) : null; + let height = args[1] ? parseInt(args[1]) : width; + + if(!width && !height) return resolve(image); + + // Determine the image's current size + image.size((err, size) => { + if(err) return reject(err); + + if(size.width < size.height) { + // Resize to width and crop to the desired height + image + .resize(width, null) + .gravity('Center') + .crop(width, height); + } else { + // Resize to height and crop to desired width + image + .resize(null, height) + .gravity('Center') + .crop(width, height); + } + + resolve(image); + }); + } else { + resolve(image); + } + }); + }) + // Rotate + .then((image) => { + if(req.query.rotate) { + let angle = parseInt(req.query.rotate); + + if(angle > 0 && angle < 360) { + image.rotate('transparent', angle); + } + } + + return image; + }) + // Flip + .then((image) => { + switch(req.query.flip) { + case 'h': + image.flop(); + break; + case 'v': + image.flip(); + break; + case 'both': + image.flip().flop(); + break; + } + + return image; + }) + // Grayscale + .then((image) => { + if(req.query.grayscale) { + image.type('Grayscale'); + } + + return image; + }) + // Colorize + .then((image) => { + if(req.query.colorize) { + let rgb = req.query.colorize.split(','); + let red = 100 - (parseInt(rgb[0]) || 0); + let green = 100 - (parseInt(rgb[1]) || 0); + let blue = 100 - (parseInt(rgb[2]) || 0); + + if( + red >= 0 && red <= 100 && + green >= 0 && green <= 100 && + blue >= 0 && blue <= 100 + ) { + image.colorize(red, green, blue); + } + } + + return image; + }) + // Blur + .then((image) => { + if(req.query.blur) { + let radius = parseInt(req.query.blur); + + if(radius > 0) { + image.blur(0, radius); + } + } + + return image; + }) + // Colors + .then((image) => { + if(req.query.colors) { + let colors = parseInt(req.query.colors); + + if(colors > 0) { + image.colors(colors); + } + } + + return image; + }) + // Quality + .then((image) => { + if(req.query.quality) { + let quality = parseInt(req.query.quality); + + if(quality >= 1 && quality <= 100) { + image.quality(quality); + } + } + + return image; + }) + // Write and serve the image to cache + .then((image) => { + // Create the cache directory if it doesn't exist + Mkdirp.sync(Path.dirname(cacheFile)); + + // Write the cache file + image.write(cacheFile, (err) => { + if(err) throw new Error(err); + res.header('Content-Type', mimeType).sendFile(cacheFile); + return; + }); + }) + // Something went wrong, fallback and serve the static image + .catch(() => next()); + }); + }); + } + +}; + +module.exports = self; diff --git a/source/modules/editor.js b/source/modules/editor.js new file mode 100644 index 0000000..45d0f28 --- /dev/null +++ b/source/modules/editor.js @@ -0,0 +1,978 @@ +/* eslint-env browser */ +'use strict'; + +// +// Initializes TinyMCE. +// +// instance* (object) - An Editor instance. +// +// Returns a promise that resolve with the a TinyMCE instance. +// +function initializeTinymce(instance) { + return new Promise((resolve) => { + + let settings = { + browser_spellcheck: true, + // Document base URL must end with slash per the TinyMCE docs + document_base_url: instance.baseUrl.replace(/\/$/, '') + '/', + element_format: 'html', + entity_encoding: 'raw', + extended_valid_elements: 'i[class],iframe[*],script[*]', + formats: { + // Align left + alignleft: [ + { selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-left' }, + { selector: 'figure', classes: 'align-left', ceFalseOverride: true } + ], + // Align center + aligncenter: [ + { selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-center' }, + { selector: 'figure', classes: 'align-center', ceFalseOverride: true } + ], + // Align right + alignright: [ + { selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', classes: 'align-right' }, + { selector: 'figure', classes: 'align-right', ceFalseOverride: true } + ], + // Justify + alignjustify: [ + { selector: 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table', classes: 'align-justify' } + ], + // Remove certain formatters so shortcut keys and the API won't apply them. + div: {}, underline: {}, + // Enable semantic formatters + strikethrough: { inline: 'del' }, + insert: { inline: 'ins' }, + highlight: { inline: 'mark' } + }, + hidden_input: false, + inline: true, + menubar: false, + object_resizing: false, + paste_preprocess: (editor, event) => { + // Paste as plain text + if(instance.textOnly) { + let div = document.createElement('div'); + div.innerHTML = event.content; + event.content = div.innerText; + } + + // Run onPaste callback + instance.onPaste.call(instance, event); + }, + plugins: 'lists,paste,textpattern,wordcount', + relative_urls: false, + skin: false, + target: instance.element, + textpattern_patterns: (instance.textOnly || !instance.convertMarkdown) ? [] : [ + {start: '*', end: '*', format: 'italic'}, + {start: '_', end: '_', format: 'italic'}, + {start: '**', end: '**', format: 'bold'}, + {start: '__', end: '__', format: 'bold'}, + {start: '~~', end: '~~', format: 'strikethrough'}, + {start: '`', end: '`', format: 'code'}, + {start: '#', format: 'h1'}, + {start: '##', format: 'h2'}, + {start: '###', format: 'h3'}, + {start: '> ', format: 'blockquote'}, + {start: '* ', cmd: 'InsertUnorderedList'}, + {start: '- ', cmd: 'InsertUnorderedList'}, + {start: '1. ', cmd: 'InsertOrderedList'} + ], + toolbar: false, + setup: function(editor) { + // PreInit + editor.on('PreInit', () => { + // Disable TinyMCE's window manager. We do this because certain plugins such + // as media/paste/table may trigger a popup in rare cases even though we're + // not using those features. + editor.windowManager = { + alert: function() {}, + close: function() {}, + confirm: function() {}, + getParams: function() {}, + open: function() {}, + setParams: function() {} + }; + }); + + // Handle special elements before content is placed into the editor + editor.on('BeforeSetContent', (event) => { + let parser = new DOMParser(); + let doc = parser.parseFromString(event.content, 'text/html'); + let matches; + + // Prepare embed elements when content is set. We store the original embed code + // to make sure it's unaltered by the DOM or scripts. + // + // This: + // + //
    {html}
    + // + // Will become this: + // + //
    {html}
    + // + matches = doc.body.querySelectorAll('[data-embed]'); + for(let i = 0; i < matches.length; i++ ) { + // Remove data-mce-* from pasted embed blocks + matches[i].setAttribute('data-embed', removeDataMceAttributes(matches[i].innerHTML)); + matches[i].setAttribute('contenteditable', false); + } + + // Add contenteditable attributes and caption placeholders + matches = doc.body.querySelectorAll('figure, figcaption'); + for(let i = 0; i < matches.length; i++) { + if(matches[i].tagName === 'FIGURE') matches[i].setAttribute('contenteditable', false); + if(matches[i].tagName === 'FIGCAPTION') { + matches[i].setAttribute('contenteditable', true); + if(trim(matches[i].innerText) === '') { + matches[i].innerHTML = instance.captionPlaceholder; + } + } + } + + // Send back the updated content + event.content = doc.body.innerHTML; + }); + + // Handle special elements when content is fetched from the editor + editor.on('GetContent', (event) => { + let parser = new DOMParser(); + let doc = parser.parseFromString(event.content, 'text/html'); + let matches; + + // This: + // + //
    {{html}}
    + // + // Will go back to this: + // + //
    {html}
    + // + matches = doc.body.querySelectorAll('[data-embed]'); + for(let i = 0; i < matches.length; i++) { + matches[i].removeAttribute('contenteditable'); + matches[i].innerHTML = matches[i].getAttribute('data-embed'); + matches[i].setAttribute('data-embed', true); + } + + // Remove contenteditable attributes and caption placeholders + matches = doc.body.querySelectorAll('figure, figcaption'); + for(let i = 0; i < matches.length; i++) { + matches[i].removeAttribute('contenteditable'); + if(matches[i].tagName === 'FIGCAPTION') { + if(trim(matches[i].innerText) === instance.captionPlaceholder) { + matches[i].innerText = ''; + } + } + } + + // Send back the updated content + event.content = doc.body.innerHTML; + }); + + // Allow new lines? + if(instance.allowNewlines === false) { + editor.on('keydown', (event) => { + if(event.keyCode === 13) event.preventDefault(); + }); + } + + // Simulate a placeholder (highlight on focus, restore on blur) + if(instance.placeholder) { + // Remove on focus + editor.on('focus', () => { + if(instance.getContent() === trim(instance.placeholder)) { + instance.selectAll(); + } + }); + + // Restore on blur (when empty) + editor.on('blur', () => { + if(!trim(editor.getContent()).length) { + instance.setContent(instance.placeholder); + } + }); + } + + // Convert triple backticks to code blocks + if(instance.convertMarkdown) { + editor.on('keydown', (event) => { + if(event.keyCode === 13) { + let block = editor.selection.getNode(); + let match = block.innerText.match(/^```([a-z]+)?$/i); + + if(match) { + event.preventDefault(); + editor.undoManager.transact(() => { + block.innerHTML = ''; + if(match[1]) block.setAttribute('data-code', match[1]); + editor.formatter.apply('pre'); + }); + } + } + }); + } + }, + init_instance_callback: (editor) => { + // Initial placeholder state + if(instance.placeholder && editor.getContent() === '') { + editor.setContent(instance.placeholder); + editor.undoManager.clear(); + } + + // Caption placeholders + if(instance.captionPlaceholder) { + // Focus on caption + instance.document.addEventListener('focus', (event) => { + if(event.target.tagName === 'FIGCAPTION') { + if(event.target.innerText === instance.captionPlaceholder) { + event.target.innerHTML = '
    '; + } + } + }, true); + + // Blur on caption + instance.document.addEventListener('blur', (event) => { + if(event.target.tagName === 'FIGCAPTION') { + if(trim(event.target.innerText) === '') { + event.target.innerHTML = instance.captionPlaceholder; + } + } + }, true); + } + + // Event callbacks + editor.on('NodeChange', () => instance.onSelectionChange.call(instance)); + editor.on('focus', () => instance.onFocus.call(instance)); + editor.on('blur', () => instance.onBlur.call(instance)); + editor.on('change', () => instance.onChange.call(instance)); + editor.on('click', (event) => instance.onClick.call(instance, event)); + editor.on('dblclick', (event) => instance.onDoubleClick.call(instance, event)); + editor.on('keydown', (event) => instance.onKeyDown.call(instance, event), false); + editor.on('keyup', (event) => instance.onKeyUp.call(instance, event), false); + + resolve(editor); + } + }; + + // Adjust settings for text-only editors + if(instance.textOnly) { + settings.forced_root_block = false; + settings.formats = { + // Remove these formatters so shortcut keys and the API won't apply them + h1: {}, h2: {}, h3: {}, h4: {}, h5: {}, h6: {}, pre: {}, div: {}, p: {}, blockquote: {}, + bold: {}, italic: {}, underline: {}, code: {}, strikethrough: {}, subscript: {}, superscript: {}, + alignleft: {}, alignright: {}, aligncenter: {}, alignjustify: {} + }; + settings.valid_elements = 'br'; // can't be blank + } + + // Check for required TinyMCE plugins + settings.plugins.split(',').forEach((plugin) => { + if(!instance.tinymce.PluginManager.lookup[plugin]) { + throw new Error('Required TinyMCE plugin missing: ' + plugin); + } + }); + + // Initialize TinyMCE + instance.tinymce.init(settings); + }); +} + +// +// Removes data-mce-* attributes from every element in an HTML string. +// +// html* (string) - The HTML to parse. +// +// Returns a string. +// +function removeDataMceAttributes(html) { + let parser = new DOMParser(); + let doc = parser.parseFromString(html, 'text/html'); + let matches = doc.body.querySelectorAll('*'); + let attribs; + let i; + let j; + + // Loop through each element + for(i = 0; i < matches.length; i++) { + // Get a list of attributes and remove ones that start with data-mce- + attribs = matches[i].attributes; + for(j = 0; j < attribs.length; j++) { + if(attribs[j].name.match(/^data-mce-/)) { + matches[i].removeAttribute(attribs[j].name); + } + } + } + + return doc.body.innerHTML; +} + +// +// Trims whitespace off both ends of a string. +// +// string* (string) - The string to trim. +// +// Returns a string. +// +function trim(string) { + return string.replace(/^\s+|\s+$/g, ''); +} + +// +// Creates a new editor instance. +// +// options* (object) +// - element* (element) - The HTML element to make editable. +// - allowNewlines (boolean) - Whether or not to allow new lines in the editor (default true). +// - baseUrl (string) - The base URL of the content for generating URLs (default '/'). +// - captionPlaceholder (string) - Placeholder text to use for image captions. +// - convertMarkdown (boolean) - Whether or not to convert certain markdown syntaxes to HTML +// (default false). +// - onBlur (function) - Fired when the editor gets blurs. +// - onChange (function) - Fired when the editor's content changes. +// - onClick (function) - Fired when the editor receives a click. +// - onDoubleClick (function) - Fired when the editor receives a double click. +// - onFocus (function) - Fired when the editor receives focus. +// - onKeyDown (function) - Fired when the editor receives a keydown event. +// - onKeyUp (function) - Fired when the editor receives a keyup event. +// - onPaste (function) - Fired when content is pasted into the editor. +// - onSelectionChange (function) - Fired when the editor's selection changes. +// - placeholder (string) - Placeholder text for the content region. +// - textOnly (boolean) - Whether or not the editor should only allow plain text. +// +// Returns a new Editor instance. +// +function Editor(options) { + options = options || {}; + + // Check for a valid element + this.element = options.element; + if(!this.element.ownerDocument) throw new Error('Parameter `element` must be a valid HTML element.'); + + // Identify the element's document and TinyMCE object + this.document = options.element.ownerDocument; + this.tinymce = this.document.defaultView.tinymce; + if(!this.tinymce) throw new Error('TinyMCE is required but not loaded.'); + + // Set additional properties + this.allowNewlines = options.allowNewlines === false ? false : true; + this.baseUrl = options.baseUrl || '/'; + this.cleanState = null; + this.captionPlaceholder = options.captionPlaceholder || ''; + this.convertMarkdown = !!options.convertMarkdown; + this.editor = null; + this.isReady = false; + this.onBlur = options.onBlur || function() {}; + this.onChange = options.onChange || function() {}; + this.onClick = options.onClick || function() {}; + this.onDoubleClick = options.onDoubleClick || function() {}; + this.onFocus = options.onFocus || function() {}; + this.onKeyDown = options.onKeyDown || function() {}; + this.onKeyUp = options.onKeyUp || function() {}; + this.onPaste = options.onPaste || function() {}; + this.onSelectionChange = options.onSelectionChange || function() {}; + this.placeholder = options.placeholder || ''; + this.onReady = options.onReady || function() {}; + this.textOnly = !!options.textOnly; + + // Initialize TinyMCE + initializeTinymce(this) + .then((editor) => { + // Store the editor instance + this.editor = editor; + + // Set initial clean state + this.cleanState = this.getContent(); + + // Fire the ready callback + this.isReady = true; + this.onReady(); + }) + .catch(() => { + throw new Error('Failed to initialize the editor'); + }); +} + +// +// Toggles center alignment for the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.alignCenter = function() { + this.editor.execCommand('JustifyCenter'); + return this; +}; + +// +// Toggles justify alignment for the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.alignJustify = function() { + this.editor.execCommand('JustifyFull'); + return this; +}; + +// +// Toggles left alignment for the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.alignLeft = function() { + this.editor.execCommand('JustifyLeft'); + return this; +}; + +// +// Toggles right alignment for the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.alignRight = function() { + this.editor.execCommand('JustifyRight'); + return this; +}; + +// +// Applies a format to the current selection. Supported formats include: +// +// blockquote, bold, code, h1, h2, h3, italic, p, pre, strikethrough, subscript, superscript +// +// Returns an Editor instance. +// +Editor.prototype.applyFormat = function(name) { + this.editor.formatter.apply(name); + this.editor.nodeChanged(); + return this; +}; + +// +// Collapses the selection and moves the caret to the start or end of the selected range. +// +// position* (string) - The desired cursor location 'start' or 'end' (default 'end'). +// +// Returns an Editor instance. +// +Editor.prototype.collapseSelection = function(position) { + this.editor.selection.collapse(position === 'start' ? 'start' : 'end'); + return this; +}; + +// +// Gets the editor's content. +// +// Returns a string. +// +Editor.prototype.getContent = function() { + return this.textOnly ? this.editor.getBody().textContent : this.editor.getContent(); +}; + +// +// Gets the location of the current selection. This can be used to restore a selection after DOM or +// other content changes have occurred. +// +// Returns a TinyMCE bookmark object. +// +// NOTE: The output of this method may change in future versions and may not be considered a +// breaking change. It should only be passed directly to setLocation() to restore a selection. +// +Editor.prototype.getLocation = function() { + return this.editor.selection.getBookmark(2); +}; + +// +// Gets the selected element. If the cursor is collapsed, the closest parent will be returned. If +// the selection spans multiple elements, the closest parent of those elements will be returned. +// +// Returns an element. +// +Editor.prototype.getSelectedElement = function() { + return this.editor.selection.getNode(); +}; + +// +// Gets the current word count. +// +// Returns an integer. +// +Editor.prototype.getWordCount = function() { + return this.editor.plugins.wordcount.getCount(); +}; + +// +// Sets focus on the editor. +// +// Returns an Editor instance. +// +Editor.prototype.focus = function() { + this.editor.focus(); + return this; +}; + +// +// Tests the current selection to see if the specified format is applied. +// +// Returns a boolean. +// +Editor.prototype.hasFormat = function(name) { + return this.editor.formatter.match(name); +}; + +// +// Detects if the editor has an available undo state. +// +// Returns a boolean. +// +Editor.prototype.hasUndo = function() { + return this.editor.undoManager.hasUndo(); +}; + +// +// Detects if the editor has an available redo state. +// +// Returns a boolean. +// +Editor.prototype.hasRedo = function() { + return this.editor.undoManager.hasRedo(); +}; + +// +// Increases the current selection's indentation. +// +// Returns an Editor instance. +// +Editor.prototype.indent = function() { + this.editor.execCommand('indent'); + return this; +}; + +// +// Inserts content at the last known caret position. +// +// content* (string) - The content to insert. +// +// Returns an Editor instance. +// +Editor.prototype.insertContent = function(content) { + this.editor.execCommand('mceInsertContent', false, content); + return this; +}; + +// +// Inserts an embeddable object at the current selection. +// +// code* (string) - The HTML code of the embed. +// options (object) +// - provider (string) - The oEmbed provider name, which will be stored in data-embed-provider. +// +// Returns an Editor instance. +// +Editor.prototype.insertEmbed = function(code, options) { + options = options || {}; + let embed = this.editor.dom.getParent(this.editor.selection.getNode(), '[data-embed]'); + + this.editor.undoManager.transact(() => { + if(!embed) { + // Insert a new embed + let div = document.createElement('div'); + div.setAttribute('data-embed', code); + div.setAttribute('data-embed-provider', options.provider); + div.setAttribute('contenteditable', false); + div.innerHTML = code; + this.editor.insertContent(div.outerHTML); + } else { + // Update an existing embed + embed.setAttribute('data-embed', code); + embed.setAttribute('data-embed-provider', options.provider); + embed.setAttribute('contenteditable', false); + embed.innerHTML = code; + } + }); + + return this; +}; + +// +// Inserts an image at the current selection. +// +// src* (string) - The images's src attribute. +// options (object) +// - srcset (string) - The image's srcset attribute. +// - sizes (string) - The image's sizes attribute. +// - alt (string) - The image's alt attribute. +// - align (string) - The image's alignment ('left', 'center', 'right', 'none'). +// - caption (boolean) - Whether or not to include a caption for this image. +// +// Returns an Editor instance. +// +Editor.prototype.insertImage = function(src, options) { + options = options || {}; + let figure = this.editor.dom.getParent(this.editor.selection.getNode(), 'figure'); + let image = figure ? this.editor.dom.select('img', figure) : null; + let caption = figure ? this.editor.dom.select('figcaption', figure): null; + + this.editor.undoManager.transact(() => { + if(!figure) { + // Insert a new image + figure = this.editor.dom.create('figure', { class: 'image' }); + image = this.editor.dom.create('img', { + src: src || '', + srcset: options.srcset || '', + sizes: options.sizes || '', + alt: options.alt || '' + }); + figure.appendChild(image); + + // Create a caption + if(options.caption) { + caption = this.editor.dom.create('figcaption', null, this.captionPlaceholder); + figure.appendChild(caption); + } + + // Insert it into the editor + this.editor.insertContent(figure.outerHTML); + } else { + // Update an existing image + this.editor.dom.setAttribs(image, { + src: src || '', + srcset: options.srcset || '', + sizes: options.sizes || '', + alt: options.alt || '' + }); + + // Update caption + if(typeof options.caption !== 'undefined') { + if(!caption.length && options.caption) { + // Create a new caption + caption = this.editor.dom.create('figcaption', null, this.captionPlaceholder); + figure.appendChild(caption); + } else if(caption.length && !options.caption) { + // Remove existing caption + this.editor.dom.remove(caption); + } + } + } + + // Set alignment + if(typeof options.align !== 'undefined') { + this.editor.formatter.remove('alignleft'); + this.editor.formatter.remove('aligncenter'); + this.editor.formatter.remove('alignright'); + this.editor.formatter.remove('alignjustify'); + if(options.align === 'left') this.editor.formatter.apply('alignleft'); + if(options.align === 'center') this.editor.formatter.apply('aligncenter'); + if(options.align === 'right') this.editor.formatter.apply('alignright'); + } + }); +}; + +// +// Applies a link to the current selection. +// +// href* (string) - The link's href attribute. +// options (object) +// - target (string) - The link's target attribute. +// - title (string) - The link's title attribute. +// +// Returns an Editor instance. +// +Editor.prototype.insertLink = function(href, options) { + options = options || {}; + + this.editor.execCommand('mceInsertLink', false, { + href: href || '', + target: options.target || '', + title: options.title || '', + rel: options.target ? 'noopener' : '' + }); + + return this; +}; + +// +// Detects if the current selection is aligned center. +// +// Returns a boolean. +// +Editor.prototype.isAlignCenter = function() { + return this.editor.formatter.match('aligncenter'); +}; + + +// +// Detects if the current selection is aligned center. +// +// Returns a boolean. +// +Editor.prototype.isAlignJustify = function() { + return this.editor.formatter.match('alignjustify'); +}; + +// +// Detects if the current selection is aligned left. +// +// Returns a boolean. +// +Editor.prototype.isAlignLeft = function() { + return this.editor.formatter.match('alignleft'); +}; + +// +// Detects if the current selection is aligned right. +// +// Returns a boolean. +// +Editor.prototype.isAlignRight = function() { + return this.editor.formatter.match('alignright'); +}; + +// +// Detects if the editor has unsaved changes. +// +// Returns a boolean. +// +Editor.prototype.isDirty = function() { + return this.cleanState !== null && this.cleanState !== this.getContent(); +}; + +// +// Detects if the current selection is an embed. +// +// Returns a boolean. +// +Editor.prototype.isEmbed = function() { + return !!this.editor.dom.getParent(this.editor.selection.getNode(), '[data-embed]'); +}; + +// +// Detects if the current selection is an image. +// +// Returns a boolean. +// +Editor.prototype.isImage = function() { + return !!this.editor.dom.getParent(this.editor.selection.getNode(), 'img, figure.image'); +}; + +// +// Detects if the current selection is a link. +// +// Returns a boolean. +// +Editor.prototype.isLink = function() { + return !!this.editor.dom.getParent(this.editor.selection.getNode(), 'a'); +}; + +// +// Detects if the current selection is an ordered list. +// +// Returns a boolean. +// +Editor.prototype.isOrderedList = function() { + return !!this.editor.dom.getParent(this.editor.selection.getNode(), 'ol'); +}; + +// +// Detects if the current selection is an unordered list. +// +// Returns a boolean. +// +Editor.prototype.isUnorderedList = function() { + return !!this.editor.dom.getParent(this.editor.selection.getNode(), 'ul'); +}; + +// +// Resets the editor's dirty state. +// +// Returns an Editor instance. +// +Editor.prototype.makeClean = function() { + this.cleanState = this.getContent(); + return this; +}; + +// +// Decreases the current selection's indentation. +// +// Returns an Editor instance. +// +Editor.prototype.outdent = function() { + this.editor.execCommand('outdent'); + return this; +}; + +// +// Toggles the editor's state between read-only and read/write. +// +// readonly* (boolean) - True for read-only, false for read/write., +// +// Returns an Editor instance. +// +Editor.prototype.readonly = function(readOnly) { + this.editor.setMode(readOnly === true ? 'readonly' : 'design'); + return this; +}; + +// +// Reverts to the next undo state. +// +Editor.prototype.redo = function(cmd) { + if(cmd === 'test') { + return this.editor.undoManager.hasRedo(); + } else { + this.editor.execCommand('Redo'); + } +}; + +// +// Removes an element element. +// +// element* (element) - The element to remove. +// +// Returns an Editor instance. +// +Editor.prototype.removeElement = function(element) { + this.editor.dom.remove(element); + return this; +}; + +// +// Removes a format from the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.removeFormat = function(name) { + this.editor.formatter.remove(name); + this.editor.nodeChanged(); + return this; +}; + +// +// Removes a link from the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.removeLink = function() { + this.editor.execCommand('unlink'); + return this; +}; + +// +// Removes text formatting from the current selection. +// +// Returns an editor object. +// +Editor.prototype.removeTextFormatting = function() { + this.editor.execCommand('RemoveFormat'); + return this.editor; +}; + +// +// Removes the selected element. +// +Editor.prototype.removeSelectedElement = function() { + this.editor.dom.remove(this.getSelectedElement()); + return this; +}; + +// +// Resets the editor's undo state. +// +// Returns an Editor instance. +// +Editor.prototype.resetUndo = function() { + this.editor.undoManager.clear(); + return this; +}; + +// +// Selects all content in the editor. +// +// Returns an Editor instance. +// +Editor.prototype.selectAll = function() { + this.editor.selection.select(this.editor.getBody(), true); + return this; +}; + +// +// Sets the editor's content. +// +// content* (string) - The content to set. +// +// Returns an Editor instance. +// +Editor.prototype.setContent = function(content) { + this.editor.setContent(content); + return this; +}; + +// +// Restores the selection to the specified location. +// +// location* (object) - A location object as returned from getLocation(). +// +// Returns an Editor instance. +// +Editor.prototype.setLocation = function(location) { + this.editor.selection.moveToBookmark(location); + return this; +}; + +// +// Sets the selection to the specified element. +// +// element* (element) - The HTML element to select. +// +// Returns an Editor instance. +// +Editor.prototype.setSelectedElement = function(element) { + this.editor.selection.setNode(element); + return this; +}; + +// +// Toggles a format on/off of the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.toggleFormat = function(name) { + this.editor.formatter.toggle(name); + this.editor.undoManager.add(); + this.editor.nodeChanged(); + return this; +}; + +// +// Toggles an ordered list for the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.toggleOrderedList = function() { + this.editor.execCommand('InsertOrderedList'); + return this; +}; + +// +// Toggles an unordered list for the current selection. +// +// Returns an Editor instance. +// +Editor.prototype.toggleUnorderedList = function() { + this.editor.execCommand('InsertUnorderedList'); + return this; +}; + +// +// Reverts to the previous undo state. +// +// Returns an Editor instance. +// +Editor.prototype.undo = function() { + this.editor.execCommand('Undo'); + return this; +}; + +module.exports = Editor; diff --git a/source/modules/email.js b/source/modules/email.js new file mode 100644 index 0000000..ce5c29b --- /dev/null +++ b/source/modules/email.js @@ -0,0 +1,69 @@ +'use strict'; + +const Nodemailer = require('nodemailer'); + +const self = { + + // + // Sends an email using the SMTP connection. + // + // options* (object) + // - to* (object) + // - email* (string) - The recipient's email address. + // - name (string) - The recipient's name. + // - subject* (string) - The subject of the message. + // - message* (object) + // - html* (string) - The HTML version of the message. + // - text* (string) - The text version of the message. + // - placeholders (object) - Key/value pairs of placeholders to substitute in the message. + // + // Returns a promise. + // + send: (options) => { + return new Promise((resolve, reject) => { + // Create the transporter + const transporter = Nodemailer.createTransport({ + host: process.env.SMTP_HOST, + port: process.env.SMTP_PORT, + auth: { + user: process.env.SMTP_USERNAME, + pass: process.env.SMTP_PASSWORD + }, + secure: process.env.SMTP_SECURE.toLowerCase() === 'true' + }); + + // Set placeholders + if(options.placeholders) { + for(let key in options.placeholders) { + if(options.message.text) { + options.message.text = options.message.text.replace('{' + key + '}', options.placeholders[key]); + } + + if(options.message.html) { + options.message.html = options.message.html.replace('{' + key + '}', options.placeholders[key]); + } + } + } + + // Send the email + transporter.sendMail({ + to: { + name: options.to.name, + address: options.to.email + }, + from: { + name: process.env.SMTP_FROM_NAME, + address: process.env.SMTP_FROM_EMAIL + }, + subject: options.subject, + html: options.message.html, + text: options.message.text + }, (err) => { + err ? reject(err) : resolve(); + }); + }); + } + +}; + +module.exports = self; diff --git a/source/modules/file_manager.js b/source/modules/file_manager.js new file mode 100644 index 0000000..2abd229 --- /dev/null +++ b/source/modules/file_manager.js @@ -0,0 +1,522 @@ +/* eslint-env browser, jquery */ +'use strict'; + +const Clipboard = require('clipboard'); +const NProgress = require('nprogress'); + +let loadAction = $('#file-manager').attr('data-load-action'); +let uploadAction = $('#file-manager').attr('data-upload-action'); +let isAvailable = $('#file-manager').length > 0; +let enableSelect = false; +let moreFiles = true; +let multiSelect = true; +let currentPage; +let dropzoneTimeout; +let mimeTypes; +let onSelect; +let searchTimeout; +let lastSearch; +let loadRequest; + +// +// Fetches uploaded files from the API. +// +// page* (int) - The page number to fetch. +// +// Returns a promise that resolves with a response object. +// +function getFiles(page) { + return new Promise((resolve, reject) => { + let query = $('#file-manager-search').val(); + let count = 50; + let offset = (page - 1) * count; + + // Fetch results + if(loadRequest) loadRequest.abort(); + loadRequest = $.ajax({ + url: loadAction, + type: 'GET', + data: { + search: query, + mimeType: mimeTypes, + count: count, + offset: offset, + render: 'fileManagerItems' + } + }) + .done((res) => { + loadRequest = null; + currentPage = page; + moreFiles = res.totalItems > count * page; + + // Update the file list + if(res.html) { + // Reset the list + if(page === 1) $('#file-manager-items').html(''); + + // Append files + $('#file-manager-items').append(res.html); + } + + resolve(res); + }) + .fail((jqXHR) => { + if(jqXHR.responseJSON) { + reject(jqXHR.responseJSON); + } + }) + .always(() => $('#file-manager').removeClass('loading')); + }); +} + +// Hides the file manager +function hide() { + if(!isAvailable) return false; + + // Don't dismiss if a confirmation modal is showing + if($('.alertable:visible').length) return false; + + // Remove bindings + $(document).off('.file-manager'); + + // Hide it + $('html').removeClass('has-modal'); + $('#file-manager-overlay').prop('hidden', true); + $('#file-manager').animateCSS('slideOutDown', 300, function() { + $(this).prop('hidden', true); + reset(); + }); +} + +// +// Hides the drop zone. +// +// No return value. +// +function hideDropzone() { + // Hide the dropzone after a short delay to prevent flickering in some browsers when dragging + // over a child element of the dropzone. + dropzoneTimeout = setTimeout(() => $('#file-manager-dropzone').prop('hidden', true)); +} + +// Resets the control to its original state +function reset() { + $('[data-file-manager-download]').prop('disabled', true); + $('[data-file-manager-copy]').prop('disabled', true); + $('[data-file-manager-delete]').prop('disabled', true); + $('[data-file-manager-select]').prop('disabled', true); + $('#file-manager-items').prop('hidden', false).html(''); + $('#file-manager-empty').prop('hidden', true); + $('#file-manager-search').val(''); + clearTimeout(searchTimeout); + lastSearch = ''; +} + +// +// Iterates all items passed and returns an array of their parsed data-json attributes. +// +// items* (element|array) - An element or an array of elements. +// +// Returns an array of uploaded file objects. +// +function parseItemJson(items) { + let result = []; + if(!Array.isArray(items)) items = [items]; + + // Loop through all selected items + if(items.length) { + items.forEach((item) => { + let json = $(item).attr('data-json'); + + try { + result.push(JSON.parse(json)); + } catch(err) { /* skip */ } + }); + } + + return result; +} + +// +// Runs the onSelect callback and hides the control. +// +// items* (object|array) - An uploaded file object or an array of file objects. +// +// No return value. +// +function select(items) { + if(!enableSelect) return; + + hide(); + + // Cast to array + if(!Array.isArray(items)) items = [items]; + + // If multi-select is disabled, only return one item + if(!multiSelect) items = items[0]; + + if(typeof onSelect === 'function') { + onSelect(items); + } +} + +// Shows the file manager +function show() { + if(!isAvailable) return false; + + // Don't show if there's another modal showing + if($('html').hasClass('has-modal')) return false; + + // Reset the control + reset(); + + // Toggle select + $('[data-file-manager-select]').prop('hidden', !enableSelect); + + // Show it + $('html').addClass('has-modal'); + $('#file-manager').addClass('loading'); + $('#file-manager-overlay').prop('hidden', false); + $('#file-manager') + .prop('hidden', false) + .animateCSS('slideInUp', 300, () => { + $('#file-manager-search').focus(); + + // Load initial items after the animation so images loading won't affect performance + getFiles(1).then(() => $('#file-manager-items').selectable('change')); + }); + + // Watch for key presses + $(document).on('keydown.file-manager', (event) => { + // Escape closes it + if(event.keyCode === 27) { + event.preventDefault(); + hide(); + } + }); +} + +// +// Shows the drop zone. +// +// No return value. +// +function showDropzone() { + clearTimeout(dropzoneTimeout); + $('#file-manager-dropzone').prop('hidden', false); +} + +// +// Uploads one or more files. +// +// files* (array) - An array of files to upload. +// +// Returns a promise that resolves with an array of upload objects. +// +function upload(files) { + return new Promise((resolve, reject) => { + let uploadQueue = []; + let newUploads = []; + + if(!files || !files.length) return; + event.preventDefault(); + + // Reset the UI and add a loading state while the uploads process + hideDropzone(); + reset(); + $('#file-manager').addClass('loading'); + + // Build an upload queue + for(let i = 0; i < files.length; i++) { + uploadQueue.push( + new Promise((resolve, reject) => { + let formData = new FormData(); + + // Append image file + formData.append('file', files[i]); + + // Upload the image + $.ajax({ + url: uploadAction, + type: 'POST', + data: formData, + dataType: 'json', + contentType: false, + processData: false, + cache: false + }) + .done((res) => resolve(res)) + .fail((jqXHR) => reject(jqXHR.responseJSON)); + }) + ); + } + + Promise + // Wait for all uploads to complete + .all(uploadQueue) + // Get a list of the new uploads + .then((responses) => { + responses.forEach((response) => { + newUploads.push(response.upload.id); + }); + }) + // Refresh items to show the newest ones + .then(() => { + return getFiles(1).then(() => $('#file-manager-items').selectable('change')); + }) + // Set selection on the new uploads + .then(() => { + $('#file-manager-items').selectable('value', newUploads); + + resolve(newUploads); + }) + .catch((err) => reject(err)); + }); +} + +// Listeners +$(() => { + // Close when the overlay is clicked + $('#file-manager-overlay').on('click.locater', () => hide()); + + // Enable selections + $('#file-manager-items') + .selectable({ + items: '.file-manager-item', + multiple: true, + change: function(values) { + let elements = $('#file-manager-items').selectable('getElements'); + let selectedElements = $('#file-manager-items').selectable('getElements', true); + let copyText = values.length === 1 ? $(selectedElements[0]).attr('data-copy-action') : ''; + + // Toggle toolbar buttons when selection changes + $('[data-file-manager-download]').prop('disabled', values.length !== 1); + $('[data-file-manager-copy]').prop('disabled', values.length !== 1); + $('[data-file-manager-delete]').prop('disabled', values.length === 0); + $('[data-file-manager-select]') + .prop('disabled', multiSelect ? values.length === 0 : values.length !== 1); + + // Toggle uploads/empty state + $('#file-manager-items').prop('hidden', elements.length === 0); + $('#file-manager-empty').prop('hidden', elements.length !== 0); + + // Set copy text + $('[data-file-manager-copy]').attr('data-clipboard-text', copyText); + }, + doubleClick: (value, el) => select(parseItemJson(el)) + }); + + // Remove selection when clicking outside of an item + $('#file-manager-items').on('click', (event) => { + if(!$(event.target).parents().addBack().is('.file-manager-item')) { + $('#file-manager-items').selectable('selectNone'); + } + }); + + // Watch for drag and drop if uploads are enabled + $('#file-manager') + .on('dragover', (event) => { + event.preventDefault(); + showDropzone(); + }) + .on('dragleave', (event) => { + event.preventDefault(); + hideDropzone(); + }) + .on('drop', (event) => { + upload(event.originalEvent.dataTransfer.files) + .catch((err) => { + // Reload files + getFiles(1); + + if(err.message) { + $.announce.warning(err.message); + } + }); + }); + + // Prevent drops on the overlay from redirecting the browser to the file + $('#file-manager-overlay').on('dragover drop', (event) => event.preventDefault()); + + // Watch the search field for changes + $('#file-manager-search').on('keyup', function() { + let search = $(this).val(); + let selection = $('#file-manager-items').selectable('value'); + + // Debounce requests + clearTimeout(searchTimeout); + if(search === lastSearch) return; + searchTimeout = setTimeout(() => { + getFiles(1) + .then(() => { + // Remember the previous search + lastSearch = search; + + // Restore selection when possible + $('#file-manager-items').selectable('value', selection); + }); + }, 300); + }); + + // Infinite scrolling + $('#file-manager-items').on('scroll', function() { + let div = this; + let scrollPos = $(div).scrollTop() + $(div).height(); + let scrollHeight = div.scrollHeight; + let threshold = $(window).height() / 2; + + // Load the next page of files + if(moreFiles && !loadRequest && scrollPos >= scrollHeight - threshold) { + NProgress.start(); + getFiles(currentPage + 1) + .then(() => NProgress.done()) + .catch(() => NProgress.done()); + } + }); + + // Upload + $('[data-file-manager-upload]').on('change', ':file', function(event) { + let input = $(this); + + upload(event.target.files) + .then(() => { + // Reset the input + $(input).val(''); + }) + .catch((err) => { + if(err.message) { + $.announce.warning(err.message); + } + }); + }); + + // Download + $('[data-file-manager-download]').on('click', () => { + let selectedItems = $('#file-manager-items').selectable('getElements', true); + let url = $(selectedItems[0]).attr('data-download-action'); + location.href = url; + }); + + // Copy + if(Clipboard.isSupported()) { + let button = $('[data-file-manager-copy]'); + let copied = $(button).attr('data-copied'); + let clipboard = new Clipboard('[data-file-manager-copy]'); + + // Show a brief message when a link is copied + clipboard.on('success', () => $.announce.info(copied)); + } else { + $('[data-file-manager-copy]').remove(); + } + + // Delete + $('[data-file-manager-delete]').on('click', function() { + let selectedItems = $('#file-manager-items').selectable('getElements', true); + let confirm = $(this).attr('data-confirm'); + let numItems = selectedItems.length; + let numDeleted = 0; + + // Quick confirmation + $.alertable.confirm(confirm).then(() => { + + // Start progress + NProgress.start(); + + // Delete each tag + $.each(selectedItems, (index, el) => { + let id = $(el).attr('data-value'); + let url = $(el).attr('data-delete-action'); + + $.ajax({ + url: url, + type: 'DELETE' + }) + .done(() => { + let item = $('#file-manager-items').selectable('getElements', id); + + // Remove the item from the list + $(item) + .animateCSS('fadeOut', 300, function() { + $(this).remove(); + + // Update the selectable control + $('#file-manager-items').selectable('change'); + }); + }) + .always(() => NProgress.set(++numDeleted / numItems)); + }); + }); + }); + + // Select + $('[data-file-manager-select]').on('click', () => { + let selectedItems = $('#file-manager-items').selectable('getElements', true); + select(parseItemJson(selectedItems)); + }); + + // Global shortcuts + $(document) + // Toggle with CMD|CTRL + SHIFT + U + .on('keydown', (event) => { + if((event.metaKey || event.ctrlKey) && event.shiftKey && event.keyCode === 85) { + event.preventDefault(); + self.show(); + } + }) + // Show when clicking [href="#file-manager"] + .on('click', '[href="#file-manager"]', (event) => { + event.preventDefault(); + self.show(); + }); +}); + +// Public API +const self = { + // + // Shows the file manager. + // + // No return value. + // + show: () => { + enableSelect = false; + multiSelect = true; + mimeTypes = null; + onSelect = null; + + show(); + }, + + // + // Hides the file manager. + // + // No return value. + // + hide: () => hide(), + + // + // Opens the file manager in selection mode. + // + // options (object) + // - mimeTypes (array) - The mime types to show (default all). + // - multiSelect (boolean) - Whether or not to allow multiple file selections (default true). + // - onSelect (function) - A callback function to run when a file is selected. + // + // No return value. + // + select: (options) => { + options = options || ''; + enableSelect = true; + multiSelect = options.multiSelect; + mimeTypes = options.mimeTypes; + onSelect = options.onSelect; + + // Convert mime types array to a CSV string + if(mimeTypes && mimeTypes.length) { + mimeTypes = mimeTypes.join(','); + } + + show(); + } +}; + +module.exports = self; diff --git a/source/modules/helpers/html_helpers.js b/source/modules/helpers/html_helpers.js new file mode 100644 index 0000000..cd379b6 --- /dev/null +++ b/source/modules/helpers/html_helpers.js @@ -0,0 +1,115 @@ +'use strict'; + +const Extend = require('extend'); +const He = require('he'); + +module.exports = (dust) => { + + // + // Outputs a custom checkbox element. + // + // Examples: + // {@htmlCheckbox name="option-name" value="on"}...{/htmlCheckbox} + // {@htmlCheckbox class="my-class" id="my-id" name="option-name" value="option-val" checked="true"}...{/htmlCheckbox} + // {@htmlCheckbox name="option-name" value="on" radio="true"}...{/htmlCheckbox} + // + dust.helpers.htmlCheckbox = (chunk, context, bodies, params) => { + let id = context.resolve(params.id) || ''; + let className = context.resolve(params.class) || ''; + let name = context.resolve(params.name) || ''; + let value = context.resolve(params.value) || ''; + let checked = (context.resolve(params.checked) + '') === 'true'; + let radio = (context.resolve(params.radio) + '') === 'true'; + + let labelClass = 'custom-control custom-' + (radio ? 'radio' : 'checkbox') + ' ' + className; + let labelType = (radio ? 'radio' : 'checkbox'); + let checkedProp = checked ? ' checked' : ''; + let start = ` + + `; + + chunk.write(start); + chunk.render(bodies.block, context); + chunk.write(end); + + return chunk; + }; + + // + // Outputs a custom radio element. Alias of htmlCheckbox with radio="true". + // + dust.helpers.htmlRadio = (chunk, context, bodies, params) => { + return dust.helpers.htmlCheckbox(chunk, context, bodies, Extend(params, { radio: 'true' })); + }; + + // + // Outputs a post badge. + // + // Examples: + // {@htmlPostBadge type="draft"/} + // {@htmlPostBadge type="published"/} + // + dust.helpers.htmlPostBadge = (chunk, context, bodies, params) => { + const I18n = context.options.locals.I18n; + let type = context.resolve(params.type); + let className = 'badge badge-info'; + let html = ''; + let icon; + + switch(type) { + case 'draft': + className = 'badge badge-draft'; + icon = 'fa fa-pencil'; + break; + case 'pending': + className = 'badge badge-pending'; + icon = 'fa fa-hourglass'; + break; + case 'rejected': + className = 'badge badge-rejected'; + icon = 'fa fa-ban'; + break; + case 'published': + case 'live': + case 'scheduled': + className = 'badge badge-published'; + icon = 'fa fa-rss'; + break; + case 'page': + className = 'badge badge-page'; + icon = 'fa fa-file'; + break; + case 'featured': + className = 'badge badge-featured'; + icon = 'fa fa-star'; + break; + case 'sticky': + className = 'badge badge-sticky'; + icon = 'fa fa-thumb-tack'; + break; + } + + // Generate the badge + html += ''; + if(icon) html += ' '; + html += I18n.term(type); + html += ''; + + return chunk.write(html); + }; + +}; diff --git a/source/modules/helpers/theme_helpers.js b/source/modules/helpers/theme_helpers.js new file mode 100644 index 0000000..d90b123 --- /dev/null +++ b/source/modules/helpers/theme_helpers.js @@ -0,0 +1,829 @@ +'use strict'; + +const Cheerio = require('cheerio'); +const He = require('he'); +const Moment = require('moment'); +const Path = require('path'); +const Striptags = require('striptags'); +const Trim = require('trim'); +const TruncateHtml = require('truncate-html'); +const SignedUrl = require(Path.join(__basedir, 'source/modules/signed_url.js')); +const Slug = require(Path.join(__basedir, 'source/modules/slug.js')); + +module.exports = (dust) => { + + // + // Outputs one or more classes that should be applied to the element. + // + // Examples: + // + // {@bodyClass/} + // + dust.helpers.bodyClass = (chunk, context) => { + const locals = context.options.locals; + let template = context.options.view.name; + let bodyClass = ''; + + // Remove .dust and convert the template name a slug + template = Slug(template.replace(/\.dust$/, '')); + + // Template class + bodyClass += 'template-' + template; + + // Homepage class + if(locals.Request.isHomepage) { + bodyClass += ' page-homepage'; + } + + // Pagination class + if(locals.pagination) { + bodyClass += ' page-' + locals.pagination.currentPage; + } + + return chunk.write(bodyClass); + }; + + // + // Outputs the post content. If no post is specified, the current post context will be used. + // + // Examples: + // + // {@content/} + // {@content editable="true"/} + // + dust.helpers.content = (chunk, context, bodies, params) => { + let isEditor = context.options.locals.isEditor; + let editable = (context.resolve(params.editable) + '') === 'true'; + let post = context.resolve(params.post); + let content = post ? post.content : context.get('content') || ''; + + // Add editable wrappers when the post is being rendered in the editor + if(isEditor && editable) { + content = ` +
    + ` + content + ` +
    + `; + } + + return chunk.write(content); + }; + + // + // Generates a signed URL for a dynamic image. + // + // Examples: + // + // {@dynamicImage src="/uploads/2017/03/image.jpg" width="100"/} + // {@dynamicImage src="/uploads/2017/03/image.jpg" grayscale="true" blur="10" rotate="90"/} + // + dust.helpers.dynamicImage = (chunk, context, bodies, params) => { + let src = context.resolve(params.src); + let query = []; + + // Don't modify full-qualified URLs or hashes + if(typeof src === 'string' && src.match(/^(http|https|mailto|#):/i)) { + return chunk.write(src); + } + + // Build the query string + Object.keys(params).forEach((key) => { + if(key !== 'src') { + query.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key])); + } + }); + + // Generate a signed URL + return chunk.write( + SignedUrl.sign(src + '?' + query.join('&'), process.env.AUTH_SECRET) + ); + }; + + // + // Generates an excerpt. If no content is specified, the current post context will be used. + // + // Examples: + // + // {@excerpt/} + // {@excerpt content="

    ...

    " paragraphs="2" words="50" tags="a,em,strong"/} + // + dust.helpers.excerpt = (chunk, context, bodies, params) => { + let content = context.resolve(params.content) || context.get('content') || ''; + let paragraphs = context.resolve(params.paragraphs) || 1; + let words = parseInt(context.resolve(params.words)); + let tags = context.resolve(params.tags) || 'a,abbr,b,bdi,bdo,blockquote,br,cite,code,data,dd,del,dfn,dl,dt,em,i,ins,kbd,li,mark,ol,p,pre,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,ul,var,wbr'; + let $ = Cheerio.load(content); + let excerpt = ''; + + // Get paragraphs from content (top level matches only) + let p = $('p:not(* > p)').slice(0, paragraphs); + + // Concatenate matching paragraphs + $(p).each((index, el) => { + excerpt += '

    ' + $(el).html() + '

    '; + }); + + // Truncate by words + if(words) { + excerpt = TruncateHtml(excerpt, words, { + byWords: true, + ellipsis: '…' + }); + } + + // Strip disallowed tags + if(tags) { + excerpt = Striptags(excerpt, tags.split(',').map((val) => Trim(val))); + } + + return chunk.write(excerpt); + }; + + // + // Outputs required foot data. + // + // Examples: + // + // {@foot/} + // + dust.helpers.foot = (chunk, context) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(locals.Settings); + + let isEditor = context.options.locals.isEditor; + let toolbar = Path.join(__basedir, 'source/views/partials/theme_toolbar.dust'); + let script = MakeUrl.raw('assets/js/tinymce.bundle.js'); + let html = ''; + + // Editor scripts + if(isEditor) { + html += ` + + `; + } + + // Inject foot code + html += locals.Settings.footCode || ''; + html += '\n'; + + // Render the theme toolbar partial + if(locals.User) { + chunk.partial(toolbar, context).end(); + } + + chunk.write(html); + + return chunk.end(); + }); + }; + + // + // Gets one or more authors. + // + // Examples: + // + // {@getAuthors count="10" offset="0" sortBy="name" sortOrder="desc"} + // {#authors} + // {name} {email} + // {:else} + // No authors + // {/authors} + // {/getAuthors} + // + dust.helpers.getAuthors = (chunk, context, bodies, params) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const models = locals.Database.sequelize.models; + let id = context.resolve(params.id); + let email = context.resolve(params.email); + let username = context.resolve(params.username); + let sortBy = context.resolve(params.sortBy); + let sortOrder = context.resolve(params.sortOrder); + let count = context.resolve(params.count); + let offset = context.resolve(params.offset); + + // Resolve all params + for(let key in params) { + params[key] = context.resolve(params[key]); + } + + // Filter by attributes + let where = {}; + if(id) where.id = { $in: id.split(',').map(Trim) }; + if(email) where.email = { $in: email.split(',').map(Trim) }; + if(username) where.username = { $in: username.split(',').map(Trim) }; + + // Sort + sortBy = (sortBy || '').match(/^(id|name|email|username|createdAt)$/) ? sortBy : 'name'; + sortOrder = (sortOrder || '').match(/^(asc|desc)$/) ? sortOrder.toUpperCase() : 'ASC'; + + // Fetch authors + models.user + .findAll({ + where: where, + offset: offset || 0, + limit: count || 10, + order: [ + [sortBy, sortOrder] + ] + }) + .then((authors) => { + // Render the block with the authors context + chunk = bodies.block(chunk, context.push({ authors: authors })); + + return chunk.end(); + }) + .catch(() => chunk.end()); + }); + }; + + // + // Parses HTML content and returns elements that match the specified selector. Useful for many + // purposes, including finding an image to display as a visual excerpt or parsing elements or + // attributes. If no content is specified, the current post context will be used. + // + // Examples: + // + // {@getElements content="

    ...

    " selector="img" count="1" offset="0"} + // {#elements} + // Name: {name} + // Attr: {attributes.src} + // HTML: {html} + // {:else} + // No matches + // {/elements} + // {/getElements} + // + dust.helpers.getElements = (chunk, context, bodies, params) => { + let content = context.resolve(params.content) || context.get('content') || ''; + let selector = context.resolve(params.selector) || '*'; + let count = context.resolve(params.count) || 10; + let offset = context.resolve(params.offset) || 0; + let $ = Cheerio.load(content); + let matches = $(selector).slice(offset, count); + let elements = []; + + // Append each element to the body context + matches.map((index, element) => { + elements.push({ + name: element.name, + attributes: element.attribs, + html: $.html(element) + }); + }); + + // Render the block with the elements context + chunk = bodies.block(chunk, context.push({ elements: elements })); + + return chunk; + }; + + // + // Gets the next post. If no post is specified, the current post context will be used. + // + // Examples: + // + // {@getNextPost} + // {#post} + // {title} + // {:else} + // No next post + // {/post} + // {/getNextPost} + // + // {@getNextPost post=post previous="true"} ... {/getNextPost} + // + dust.helpers.getNextPost = (chunk, context, bodies, params) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const models = locals.Database.sequelize.models; + let post = context.resolve(params.post); + let previous = (context.resolve(params.previous) + '') === 'true'; + let id = post ? post.id : context.get('id'); + + // Fetch the target post + models.post + .findOne({ + where: { id: id } + }) + .then((post) => { + if(post && typeof post.getNext === 'function') { + return post.getNext({ previous: previous }); + } + + return null; + }) + .then((post) => { + // Render the block with the posts context + chunk = bodies.block(chunk, context.push({ post: post })); + + return chunk.end(); + }) + .catch(() => chunk.end()); + }); + }; + + // + // Gets one or more posts. + // + // Examples: + // + // {@getPosts count="10" offset="0" sortBy="name" sortOrder="desc"} + // {#posts} + // {title} + // {:else} + // No posts + // {/posts} + // {/getPosts} + // + dust.helpers.getPosts = (chunk, context, bodies, params) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const models = locals.Database.sequelize.models; + let id = context.resolve(params.id); + let slug = context.resolve(params.slug); + let sortBy = context.resolve(params.sortBy); + let sortOrder = context.resolve(params.sortOrder); + let count = context.resolve(params.count); + let offset = context.resolve(params.offset); + + // Resolve all params + for(let key in params) { + params[key] = context.resolve(params[key]); + } + + // Filter by attributes + let where = {}; + if(id) where.id = { $in: id.split(',').map(Trim) }; + if(slug) where.slug = { $in: slug.split(',').map(Trim) }; + + // Sort + sortBy = (sortBy || '').match(/^(id|slug|title|createdAt)$/) ? sortBy : 'title'; + sortOrder = (sortOrder || '').match(/^(asc|desc)$/) ? sortOrder.toUpperCase() : 'ASC'; + + // Fetch authors + models.post + .findAll({ + where: where, + include: [ + { + model: models.user, + as: 'author', + attributes: { exclude: ['password', 'resetToken'] } + }, + { + model: models.tag, + through: { attributes: [] }, // exclude postTags + where: null // also return posts that don't have tags + } + ], + offset: offset || 0, + limit: count || 10, + order: [ + [sortBy, sortOrder] + ] + }) + .then((posts) => { + // Render the block with the posts context + chunk = bodies.block(chunk, context.push({ posts: posts })); + + return chunk.end(); + }) + .catch(() => chunk.end()); + }); + }; + + // + // Gets posts that are related to the source post. If no post is specified, the current post + // context will be used. + // + // Examples: + // + // {@getRelatedPosts} + // {#posts} + // {title} + // {:else} + // No related posts + // {/posts} + // {/getRelatedPosts} + // + // {@getRelatedPosts post=post count="10" offset="0"} ... {/getRelatedPosts} + // + dust.helpers.getRelatedPosts = (chunk, context, bodies, params) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const models = locals.Database.sequelize.models; + let count = context.resolve(params.count) || 10; + let offset = context.resolve(params.offset) || 0; + let post = context.resolve(params.post); + let id = post ? post.id : context.get('id'); + + // Fetch the target post + models.post + .findOne({ + where: { + id: id + }, + include: [{ + model: models.tag + }] + }) + .then((post) => { + if(!post) return chunk.end(); + + // Fetch related posts + return post.getRelated({ + count: count, + offset: offset + }); + }) + .then((posts) => { + if(!posts) return chunk.end(); + + // Render the block with the posts context + chunk = bodies.block(chunk, context.push({ posts: posts })); + + return chunk.end(); + }) + .catch(() => chunk.end()); + }); + }; + + // + // Gets one or more tags. + // + // Examples: + // + // {@getTags slug="favorites"} + // {#tags} + // {name} + // {:else} + // No tags + // {/tags} + // {/getTags} + // + // {@getTags count="10" offset="0" sortBy="name" sortOrder="desc"} ... {/getTags} + // + dust.helpers.getTags = (chunk, context, bodies, params) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const models = locals.Database.sequelize.models; + let id = context.resolve(params.id); + let slug = context.resolve(params.slug); + let sortBy = context.resolve(params.sortBy); + let sortOrder = context.resolve(params.sortOrder); + let offset = context.resolve(params.offset); + let count = context.resolve(params.count); + + // Resolve all params + for(let key in params) { + params[key] = context.resolve(params[key]); + } + + // Filter by attributes + let where = {}; + if(id) where.id = { $in: id.split(',').map(Trim) }; + if(slug) where.slug = { $in: slug.split(',').map(Trim) }; + + // Sort + sortBy = (sortBy || '').match(/^(id|slug|name|createdAt)$/) ? sortBy : 'name'; + sortOrder = (sortOrder || '').match(/^(asc|desc)$/) ? sortOrder.toUpperCase() : 'ASC'; + + // Fetch tags + models.tag + .findAll({ + where: where, + offset: offset || 0, + limit: count || 10, + order: [ + [sortBy, sortOrder] + ] + }) + .then((tags) => { + // Render the block with the tags context + chunk = bodies.block(chunk, context.push({ tags: tags })); + + return chunk.end(); + }) + .catch(() => chunk.end()); + }); + }; + + // + // Outputs required head data. + // + // Examples: + // + // {@head/} + // + // To disable meta outputs: + // + // {@head jsonLD="false" openGraph="false" twitterCard="false"/} + // + dust.helpers.head = (chunk, context, bodies, params) => { + const locals = context.options.locals; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(locals.Settings); + + let isEditor = context.options.locals.isEditor; + let jsonLD = (context.resolve(params.jsonLD) + '') !== 'false'; + let openGraph = (context.resolve(params.openGraph) + '') !== 'false'; + let twitterCard = (context.resolve(params.twitterCard) + '') !== 'false'; + let meta = context.get('meta') || {}; + let html = ''; + + // Inject head code + html += locals.Settings.headCode || ''; + html += '\n'; + + // Generator meta + html += '\n'; + + // Theme toolbar styles + if(locals.User) { + html += ` + + `; + } + + // Base tag, editor styles, and the Postleaf object + if(isEditor) { + html += ` + + + + `; + } + + // JSON Linked Data + if(jsonLD && meta.jsonLD) { + html += '\n'; + } + + // Open Graph data + if(openGraph && meta.openGraph) { + for(let i in meta.openGraph) { + if(meta.openGraph[i]) { + html += + '\n'; + } + } + } + + // Twitter Card data + if(twitterCard && meta.twitterCard) { + for(let i in meta.twitterCard) { + if(meta.twitterCard[i]) { + html += + '\n'; + } + } + } + + return chunk.write(html); + }; + + // + // Gets the site's navigation. + // + // Examples: + // + // {@navigation} + //
    + // {label} + // + // {/navigation} + // + dust.helpers.navigation = (chunk, context, bodies) => { + const locals = context.options.locals; + let navigation = locals.Navigation; + + if(!navigation.length) { + // No nav items, do {:else} + if(bodies['else']) { + chunk = chunk.render(bodies['else'], context); + } + return chunk; + } + + // Append each element to the body context + navigation.map((item) => { + chunk = bodies.block(chunk, context.push({ + label: item.label, + link: item.link + })); + }); + + return chunk; + }; + + // + // Outputs one or more classes that should be applied to posts in your theme. If no post is + // specified, the current post context will be used. + // + // Examples: + // + // {@postClass/} + // + dust.helpers.postClass = (chunk, context, bodies, params) => { + let post = context.resolve(params.post); + let status = post ? post.status : context.get('status'); + let isPage = post ? post.isPage : context.get('isPage'); + let isFeatured = post ? post.isFeatured : context.get('isFeatured'); + let isSticky = post ? post.isSticky : context.get('isSticky'); + let tags = post ? post.tags : context.get('tags'); + let postClass = 'post'; + + // Post status + if(status) postClass += ' post-status-' + status; + + // Post flags + if(isPage) postClass += ' post-page'; + if(isFeatured) postClass += ' post-featured'; + if(isSticky) postClass += ' post-sticky'; + + // Post tags + if(tags) { + for(let i in tags) { + postClass += ' tag-' + tags[i].slug; + } + } + return chunk.write(postClass); + }; + + // + // Returns the number of posts for a given author or tag. + // + // Posts can be filtered by any of the available flags using a `true` or `false` value. If an + // argument is omitted, the flag will be ignored. + // + // The special flag `isPublic` can be used to filter by posts that are publicly visible. + // + // Examples: + // + // {@postCount/} + // {@postCount author="bob"/} + // {@postCount tag="favorites"/} + // {@postCount author="bob" tag="favorites"/} + // {@postCount isPublic="true"/} + // + dust.helpers.postCount = (chunk, context, bodies, params) => { + // Async wrapper + return chunk.map((chunk) => { + const locals = context.options.locals; + const models = locals.Database.sequelize.models; + let author = context.resolve(params.author); + let tag = context.resolve(params.tag); + let status = context.resolve(params.status); + let isFeatured = context.resolve(params.isFeatured); + let isPage = context.resolve(params.isPage); + let isSticky = context.resolve(params.isSticky); + let isPublic = context.resolve(params.isPublic); + + // Cast options to proper booleans + if(typeof isFeatured !== 'undefined') isFeatured = (author === 'true'); + if(typeof isPage !== 'undefined') isPage = (isPage === 'true'); + if(typeof isSticky !== 'undefined') isSticky = (isSticky === 'true'); + if(typeof isPublic !== 'undefined') isPublic = (isPublic === 'true'); + + // Get the count + models.post + .getCount({ + author, + tag, + status, + isFeatured, + isPage, + isSticky, + isPublic + }) + .then((count) => { + // Output the total + chunk.write(count); + + return chunk.end(); + }) + .catch(() => chunk.end()); + }); + }; + + // + // Determines if a post is publicly visible (i.e. published but not scheduled). If no post is + // specified, the current post context will be used. + // + // Examples: + // + // {@isPublic} + // Post is public + // {:else} + // Post is not public + // {/isPublic} + // + dust.helpers.postIsPublic = (chunk, context, bodies, params) => { + let post = context.resolve(params.post); + let status = post ? post.status : context.get('status'); + let publishedAt = post ? post.publishedAt : context.get('publishedAt'); + + // Post must be published + if(status === 'published') { + // Publish date can't be in the future + let pubDate = new Moment(publishedAt); + let now = new Moment.utc(); + + if(pubDate.isSameOrBefore(now)) { + chunk = bodies.block(chunk, context); + return chunk; + } + } + + // Render else block + if(bodies['else']) { + chunk = chunk.render(bodies['else'], context); + } + + return chunk; + }; + + // + // Returns the approximate number of minutes to read the specified content. If no content is + // specified, the current post context will be used. + // + // Examples: + // + // {@readingTime/} + // {@readingTime content="Lorem ipsum..."/} + // {@readingTime wordPerMinute="225"/} + // + dust.helpers.readingTime = (chunk, context, bodies, params) => { + let content = context.resolve(params.content) || context.get('content') || ''; + let text = Striptags(content); + let numWords = text.split(' ').length; + let wordsPerMinute = context.resolve(params.wordsPerMinute) || 225; + + return chunk.write(Math.max(1, Math.ceil(numWords / wordsPerMinute))); + }; + + // + // Outputs the post title. If no post is specified, the title will be fetched from the current + // context. + // + // Examples: + // + // {@title/} + // {@title editable="true"/} + // + dust.helpers.title = (chunk, context, bodies, params) => { + let isEditor = context.options.locals.isEditor; + let editable = (context.resolve(params.editable) + '') === 'true'; + let post = context.resolve(params.post); + let title = post ? post.title : context.get('title') || ''; + + // Add editable wrappers when the post is being rendered in the editor + if(isEditor && editable) { + title = ` +
    + ` + title + ` +
    + `; + } + + return chunk.write(title); + }; + +}; diff --git a/source/modules/helpers/utility_helpers.js b/source/modules/helpers/utility_helpers.js new file mode 100644 index 0000000..b73a156 --- /dev/null +++ b/source/modules/helpers/utility_helpers.js @@ -0,0 +1,364 @@ +'use strict'; + +const FormatNumber = require('format-number'); +const He = require('he'); +const Moment = require('moment'); +const Striptags = require('striptags'); +const Path = require('path'); +const Url = require('url'); +const Markdown = require(Path.join(__basedir, 'source/modules/markdown.js')); + +module.exports = (dust) => { + + ////////////////////////////////////////////////////////////////////////////////////////////////// + // Filters + ////////////////////////////////////////////////////////////////////////////////////////////////// + + // + // Converts HTML to plain text. + // + dust.filters.htmlToText = (value) => { + return Striptags(value); + }; + + // + // Converts Markdown to HTML. + // + dust.filters.markdownToHtml = (value) => { + return Markdown.toHtml(value); + }; + + // + // Converts Markdown to plain text. + // + dust.filters.markdownToText = (value) => { + return Markdown.toText(value); + }; + + ////////////////////////////////////////////////////////////////////////////////////////////////// + // Helpers + ////////////////////////////////////////////////////////////////////////////////////////////////// + + // + // Outputs a date in the specified format. If date isn't specified, the current time will be used. + // If format isn't specified, 'YYYY-MM-DD HH:mm:ss' will be used. If timeZone isn't specified, + // the time zone from settings will be used. + // + // Format can be any format supported by Moment.js: https://momentjs.com/docs/#/displaying/ + // + // Examples: + // + // {@date date=publishedAt format="YYYY-MM-DD"/} ==> 2017-01-02 + // {@date date="2017-01-02 12:00:00" format="ddd, hA"/} ==> Sun, 3PM + // {@date date=publishedAt format="relative"/} ==> 3 days ago + // + dust.helpers.date = (chunk, context, bodies, params) => { + const I18n = context.options.locals.I18n; + const Settings = context.options.locals.Settings; + let locale = I18n.term('momentjs_locale', { type: 'meta' }); + let date = params.date ? new Moment(context.resolve(params.date)) : new Moment(); + let format = context.resolve(params.format) || 'YYYY-MM-DD HH:mm:ss'; + let relative = context.resolve(params.relative) === 'true'; + let timeZone = context.resolve(params.timeZone) || Settings.timeZone; + + // Set locale + date.locale(locale); + + if(relative) { + return chunk.write(date.tz(timeZone).fromNow()); + } else { + return chunk.write(date.tz(timeZone).format(format)); + } + }; + + // + // Compares two dates. + // + // Examples: + // + // {@dateCompare key=publishedAt operand="<" value="now"}...{/dateCompare} + // {@dateCompare key=publishedAt operand="between" start="2016-01-01" end="2016-12-31"}...{/dateCompare} + // + // Notes: + // + // - Dates format should be a supported ISO 8601 string: https://momentjs.com/docs/#/parsing/ + // - You can use 'now' to indicate the current date/time. + // + dust.helpers.dateCompare = (chunk, context, bodies, params) => { + let key = context.resolve(params.key); + let value = context.resolve(params.value); + let start = context.resolve(params.start); + let end = context.resolve(params.end); + let operand = context.resolve(params.operand); + let result; + + key = Moment(key === 'now' ? undefined : key); + value = Moment(value === 'now' ? undefined : value); + start = Moment(start === 'now' ? undefined : start); + end = Moment(end === 'now' ? undefined : end); + + switch(operand) { + case '<': + result = key.isBefore(value); + break; + case '<=': + result = key.isSameOrBefore(value); + break; + case '>': + result = key.isAfter(value); + break; + case '>=': + result = key.isSameOfAfter(value); + break; + case 'between': + result = key.isBetween(start, end); + break; + default: // = + result = key.isSame(value); + break; + } + + // Handle result + if(result) { + chunk = chunk.render(bodies.block, context); + } else if(bodies['else']) { + chunk = chunk.render(bodies['else'], context); + } + + return chunk; + }; + + // + // Formats a size in bytes. + // + // Examples: + // + // {@formatBytes bytes="32000000"/} ==> 32MB + // + dust.helpers.formatBytes = (chunk, context, bodies, params) => { + let bytes = context.resolve(params.bytes); + let sizes = [' bytes', ' KB', ' MB', ' GB', ' TB']; + if(bytes < 1) return '0'; + let index = parseInt(Math.floor(Math.log(bytes) / Math.log(1024))); + + return chunk.write(Math.round(bytes / Math.pow(1024, index), 2) + sizes[index]); + }; + + // + // Formats a number. + // + // Examples: + // + // {@formatNumber number="25000"/} + // {@formatNumber number="50.75" places="2"/} + // {@formatNumber number="25000" decimal="," thousands=" "/} + // + dust.helpers.formatNumber = (chunk, context, bodies, params) => { + const I18n = context.options.locals.I18n; + let number = parseFloat(context.resolve(params.number) || 0); + let places = parseInt(context.resolve(params.places) || 0); + let decimal = context.resolve(params.decimal) || I18n.term('decimal', { type: 'symbol' }); + let thousands = context.resolve(params.thousands) || I18n.term('thousands', { type: 'symbol' }); + + return chunk.write( + FormatNumber({ + integerSeparator: thousands, + decimal: decimal, + truncate: places + })(number) + ); + }; + + // + // Outputs a localized language term. + // + // Examples: + // + // {@i18n term="term"/} + // {@i18n term="term_with_[this]_[that]" this="place" that="holders"/} + // {@i18n term="decimal" type="symbol"/} + // {@i18n term="thousands" type="symbol"/} + // {@i18n term="name" type="meta"} + // {@i18n term="term_with_[this]" this="HTML" allowHtml="true"/} + // + dust.helpers.i18n = (chunk, context, bodies, params) => { + const I18n = context.options.locals.I18n; + let placeholders = []; + let term = context.resolve(params.term); + let type = context.resolve(params.type); + let allowHtml = context.resolve(params.allowHtml) === 'true'; + + // Attach + for(let i in params) { + // Skip known attributes + if(i.match(/^(term|symbol|meta)$/)) continue; + + // Assume all other attribute are placeholders + placeholders[i] = params[i]; + } + + term = I18n.term(term, { + type: type || 'term', + placeholders: placeholders + }); + + // Escape HTML by default + if(!allowHtml) { + term = He.encode(term, { useNamedReferences: true }); + } + + return chunk.write(term); + }; + + // + // Checks an array or a CSV string for the given value. + // + // Examples: + // + // {@in key=User.role value="editor,contributor,admin"}...{:else}...{/in} + // + dust.helpers.in = (chunk, context, bodies, params) => { + let key = context.resolve(params.key); + let value = context.resolve(params.value); + + // Split strings to CSV and strim + if(typeof value === 'string') value = value.split(','); + + // Cast to array + if(!Array.isArray(value)) value = [value]; + + // No match, do else + if(!value.includes(key)) { + if(bodies['else']) { + chunk = chunk.render(bodies['else'], context); + } + return chunk; + } + + chunk = chunk.render(bodies.block, context); + + return chunk; + }; + + // + // Returns a plural or non-plural string based on a number. + // + // Examples: + // + // {@plural count="2" none="No posts" one="One post" many="% posts"/} + // + dust.helpers.plural = (chunk, context, bodies, params) => { + let count = parseInt(context.resolve(params.count)); + let output = context.resolve(params.many) || ''; + if(count === 0) output = context.resolve(params.none) || ''; + if(count === 1) output = context.resolve(params.one) || ''; + + return chunk.write(output.replace(/%/g, count)); + }; + + // + // Outputs the current Postleaf version number. + // + // Examples: + // + // {@postleafVersion/} + // + dust.helpers.postleafVersion = (chunk) => { + return chunk.write(__version); + }; + + // + // Truncates text after a certain number of characters or words. + // + // Examples: + // + // {@truncateWords text="Lorem ipsum..." chars="140" append="…"/} + // {@truncateWords text="Lorem ipsum..." words="20" append="…"/} + // + dust.helpers.truncateWords = (chunk, context, bodies, params) => { + let text = context.resolve(params.text); + let chars = parseInt(context.resolve(params.chars)) || 140; + let words = parseInt(context.resolve(params.words)); + let append = context.resolve(params.append) || '…'; + let output; + + if(words) { + // Limit by words + output = text.split(' ').splice(0, words).join(' '); + if(text.split(' ').length > words) output += append; + } else { + // Limit by chars + output = text.substring(0, chars); + + // Stop at last space before the limit + if(text.length > chars && text.substring(chars - 1, chars) !== ' ') { + output = output.substring(0, output.lastIndexOf(' ')); + } + + // Trim whitespace + output = output.replace(/ +$/, ''); + + if(output.length < text.length) output += append; + } + + return chunk.write(output); + }; + + // + // Generates a URL. + // + // Examples: + // + // {@url/} + // {@url path="/path/to/file.ext"/} + // {@url type="author" username="bob" page="2"/} + // + dust.helpers.url = (chunk, context, bodies, params) => { + const locals = context.options.locals; + const MakeUrl = require(Path.join(__basedir, 'source/modules/make_url.js'))(locals.Settings); + + // Resolve all params + for(let key in params) { + params[key] = context.resolve(params[key]); + } + + params.type = context.resolve(params.type) || 'raw'; + + if(typeof(MakeUrl[params.type]) === 'function') { + return chunk.write(MakeUrl[params.type](params)); + } + }; + + // + // Compares two URLs. Compares against the current URL if `to` is not set. + // + // Examples: + // + // {@urlCompare url="/path/to/compare"/}...{/urlCompare} + // {@urlCompare url="/path/to/compare" to="/another/path"}...{/urlCompare} + // {@urlCompare url="/path/to/compare"/}...{:else}...{/urlCompare} + // + dust.helpers.urlCompare = (chunk, context, bodies, params) => { + const locals = context.options.locals; + let to = Url.parse(context.resolve(params.to) || locals.Request.path); + let url = Url.parse(context.resolve(params.url) || ''); + let match = + // The URLs must have the same paths + (to.pathname === url.pathname) && + // The URLs must have a matching host or be relative + (to.host === url.host || !url.host); + + // No match, do else + if(!match) { + if(bodies['else']) { + chunk = chunk.render(bodies['else'], context); + } + return chunk; + } + + chunk = chunk.render(bodies.block, context); + + return chunk; + }; + +}; diff --git a/source/modules/i18n.js b/source/modules/i18n.js new file mode 100644 index 0000000..14598ee --- /dev/null +++ b/source/modules/i18n.js @@ -0,0 +1,178 @@ +'use strict'; + +const Extend = require('extend'); +const Fs = require('fs'); +const Path = require('path'); + +let i18n; + +module.exports = { + + // + // Gets all installed language packs. + // + // Returns a promise that resolves with an array of theme objects. + // + getLanguagePacks: () => { + return new Promise((resolve, reject) => { + + let langDir = Path.join(__basedir, 'source/languages'); + + Fs.readdir(langDir, (err, files) => { + if(err) { + throw new Error('Unable to list directory: ' + langDir); + } + + let queue = []; + + // Loop through files + files.forEach((file) => { + let path = Path.join(langDir, file); + + // Build queue to fetch info from each language pack + queue.push( + new Promise((res, rej) => { + Fs.stat(path, (err, stat) => { + if(err) return res(); + + // Must be a file with a .json extension + if(stat.isFile() && Path.extname(path).toLowerCase() === '.json') { + + // Read the file + Fs.readFile(path, (err, data) => { + if(err) { + return rej('Unable to read file: ' + path); + } + + // Decode it + try { + let json = JSON.parse(data); + + // Only return the name and language code + res({ + name: json.name, + code: json.code + }); + } catch(err) { + rej('Unable to parse file: ' + path + '. ' + err); + } + }); + + } else { + res(); + } + }); + }) + ); + }); + + // Wait for all queue to resolve + Promise.all(queue) + .then((languagePacks) => { + // Remove empties and sort by name + languagePacks = languagePacks + .filter((val) => !!val) + .sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase()); + + resolve(languagePacks); + }) + .catch((err) => { + reject(err); + }); + }); + }); + }, + + // + // Loads a language pack. + // + // Returns a promise that resolve with a language pack object. + // + load: (langCode) => { + return new Promise((resolve, reject) => { + // Load the language pack + let defaultFile = Path.join(__basedir, 'source/languages/en_us.json'); + let targetFile = Path.join( + __basedir, + 'source/languages/' + langCode.toLowerCase().replace('-', '_') + '.json' + ); + let defaultLang; + let targetLang; + + // Always load the default language pack first (missing terms will fall back to us-en) + if(!Fs.existsSync(defaultFile)) { + reject('The default language pack is missing: ' + defaultFile); + } + try { + defaultLang = JSON.parse(Fs.readFileSync(defaultFile)); + } catch(err) { + reject(err + ' (in ' + defaultFile + ')'); + } + + // Load the target language pack + if(langCode !== 'en-us') { + if(!Fs.existsSync(targetFile)) { + reject('The target language pack is missing: ' + targetFile); + } + try { + targetLang = JSON.parse(Fs.readFileSync(targetFile)); + } catch(err) { + reject(err + ' (in ' + targetFile + ')'); + } + } + + // Merge target with default + i18n = Extend(true, defaultLang, targetLang); + + resolve(i18n); + }); + }, + + // + // Outputs a localized language term. + // + // term* (string) - The term to output. + // params (object) + // - type (string) - One of 'term', 'symbol', or 'meta'. + // - placeholders (object) - A key/value object of placeholders to insert. + // + // Returns a string. + // + term: (term, params) => { + params = params || {}; + let type = params.type || 'term'; + let placeholders = params.placeholders || []; + + // Check for a language pack + if(!i18n) { + throw new Error('Cannot use i18n without loading a language pack first.'); + } + + // Terms + if(type === 'term') { + // Find the desired term. If it doesn't exist, surround the key with square brackets to + // allow us to identify missing terms more easily. + let translation = i18n.terms[term] || '[' + term + ']'; + + // Update placeholders + for(let key in placeholders) { + translation = translation.replace('[' + key + ']', placeholders[key]); + } + + return translation; + } + + // Symbols + if(type === 'symbol') { + return i18n.symbols[term]; + } + + // Meta + if(type === 'meta') { + return i18n[term]; + } + + throw new Error('Invalid arguments for i18n.term.'); + } + +}; diff --git a/source/modules/includes/admin_menu.js b/source/modules/includes/admin_menu.js new file mode 100644 index 0000000..5e1c5e1 --- /dev/null +++ b/source/modules/includes/admin_menu.js @@ -0,0 +1,56 @@ +// +// Toggle the mobile menu +// + +/* eslint-env browser, jquery */ +$(() => { + // Show/hide the mobile menu with animation + function toggleMenu(on) { + // Show/hide with animation + $('.admin-menu-items') + .addClass('transition') + .toggleClass('on', on) + .on('transitionend', function() { + $(this).removeClass('transition'); + }); + + $('.admin-menu-toggle i') + .toggleClass('fa-navicon', !on) + .toggleClass('fa-remove', on); + + // Watch for ESC + if(on) { + $(document).on('keydown.admin-menu', (event) => { + if(event.keyCode === 27) { + toggleMenu(false); + } + }); + } else { + $(document).off('.admin-menu'); + } + } + + // Toggle the mobile menu + $('.admin-menu-toggle').on('click', (event) => { + event.preventDefault(); + toggleMenu(!$('.admin-menu-items').is('.on')); + }); + + // Keep admin menu dropdown inside the viewport + $('.admin-menu-user-dropdown').on('shown.bs.dropdown', function() { + let dropdown = $(this).find('.dropdown-menu'); + + $(this) + // Remove alignment class to check position + .removeClass('dropup') + // Assign alignment class if the menu is off-screen + .toggleClass('dropup', $(dropdown).is(':off-bottom')); + }); + + // Enable tooltips (except for touch devices since tooltips prevent taps) + if(!('ontouchstart' in document.documentElement)) { + $('.admin-menu-item').tooltip({ + placement: 'right' + }); + } +}); diff --git a/source/modules/includes/ajax_submit_defaults.js b/source/modules/includes/ajax_submit_defaults.js new file mode 100644 index 0000000..227baca --- /dev/null +++ b/source/modules/includes/ajax_submit_defaults.js @@ -0,0 +1,9 @@ +// +// Custom ajaxSubmit defaults +// + +/* eslint-env browser, jquery */ +$(() => { + $.ajaxSubmit.defaults.messageSuccessClasses = 'alert alert-success'; + $.ajaxSubmit.defaults.messageErrorClasses = 'alert alert-warning'; +}); diff --git a/source/modules/includes/alertable_defaults.js b/source/modules/includes/alertable_defaults.js new file mode 100644 index 0000000..2de57a6 --- /dev/null +++ b/source/modules/includes/alertable_defaults.js @@ -0,0 +1,42 @@ +// +// Custom alertable defaults +// + +/* eslint-env browser, jquery */ +$(() => { + $.alertable.defaults.show = function() { + var modal = this.modal; + var overlay = this.overlay; + + function reposition() { + var height = $(modal).outerHeight(); + var winHeight = $(window).height(); + var top = (winHeight * .45) - (height / 2); // slightly above halfway up + + $(modal).css('top', top + 'px'); + } + + // Maintain vertical position on resize + reposition(); + $(window).on('resize.alertable', reposition); + + // Show it + $(modal).add(overlay).stop(true, true).fadeIn(100); + + // Brief delay before focusing to let the transition show the modal + setTimeout(() => { + if($(modal).find('.alertable-prompt').length) { + // Focus on first prompt input + $(modal).find('.alertable-prompt :input:first').focus(); + } else { + // Focus on the submit button + $(modal).find(':submit').focus(); + } + }, 10); + }; + + $.alertable.defaults.hide = function() { + $(window).off('.alertable'); + $(this.modal).add(this.overlay).stop(true, true).fadeOut(100); + }; +}); diff --git a/source/modules/includes/dropdown_animations.js b/source/modules/includes/dropdown_animations.js new file mode 100644 index 0000000..fc507b1 --- /dev/null +++ b/source/modules/includes/dropdown_animations.js @@ -0,0 +1,14 @@ +// +// Dropdown animations +// + +/* eslint-env browser, jquery */ +$(() => { + $(document) + .on('show.bs.dropdown', '.dropdown', function() { + $(this).find('.dropdown-menu').stop(true, true).fadeIn(100); + }) + .on('hide.bs.dropdown', '.dropdown', function() { + $(this).find('.dropdown-menu').stop(true, true).fadeOut(100); + }); +}); diff --git a/source/modules/includes/html_classes.js b/source/modules/includes/html_classes.js new file mode 100644 index 0000000..e716912 --- /dev/null +++ b/source/modules/includes/html_classes.js @@ -0,0 +1,16 @@ +// +// Helper classes +// + +/* eslint-env browser, jquery */ +$(() => { + // Platform classes on + $('html') + .toggleClass('ios', /iPad|iPhone|iPod/.test(navigator.platform)) + .toggleClass('mac', navigator.appVersion.indexOf('Mac') > -1) + .toggleClass('linux', navigator.appVersion.indexOf('Linux') > -1) + .toggleClass('windows', navigator.appVersion.indexOf('Windows') > -1); + + // Remove preload class to prevent transitions (see _overrides.scss) + $('body').removeClass('preload'); +}); diff --git a/source/modules/includes/image_control.js b/source/modules/includes/image_control.js new file mode 100644 index 0000000..f33c97a --- /dev/null +++ b/source/modules/includes/image_control.js @@ -0,0 +1,151 @@ +/* eslint-env browser, jquery */ + +if(jQuery) (function($) { + 'use strict'; + + $.extend($.fn, { + + imageControl: function() { + + $(this).each(function() { + let control = this; + let uploadAction = $(control).attr('data-upload-action'); + let input = $(control).find('input[type="hidden"]'); + let mimeTypes = ['image/gif', 'image/jpeg', 'image/png', 'image/svg+xml']; + + // Hides the dropzone + function hideDropzone() { + $(control).removeClass('image-control-dragging'); + } + + // Returns true if the user is dragging an actual file + function isDraggingFile(event) { + if(event.originalEvent === undefined) return false; + if(event.originalEvent.dataTransfer === undefined) return false; + return $.inArray('Files', event.originalEvent.dataTransfer.types) > -1; + } + + // Shows the dropzone + function showDropzone() { + $(control).addClass('image-control-dragging'); + } + + // Uploads a file + function upload(file) { + let input = $(control).find('input[type="hidden"]'); + let formData = new FormData(); + + // Append image file + formData.append('file', file); + + // Upload the image + $.ajax({ + url: uploadAction, + type: 'POST', + data: formData, + dataType: 'json', + contentType: false, + processData: false, + cache: false, + progress: function(event) { + if(event.lengthComputable) { + // Trigger the uploadProgress event with % + $(control).trigger('uploadProgress.imageControl', event.loaded / event.total); + } + } + }) + .done((res) => { + // Update the image + if(res.upload && mimeTypes.includes(res.upload.mimeType)) { + let src = res.upload.path; + + $(control).attr('style', 'background-image: url("' + src + '");'); + $(control).find('[data-remove]').prop('hidden', false); + $(input).val(src).trigger('change'); + } + }) + .fail((jqXHR) => { + // Show error message + if(jqXHR.responseJSON.message) { + $.announce.warning(jqXHR.responseJSON.message); + } + }) + .always(() => { + // Reset the input + $(control).find(':file').val(''); + + // Trigger the uploadComplete event + $(control).trigger('uploadComplete.imageControl'); + }); + } + + // Remove images + $(control) + .find('[data-remove]').on('click', function() { + $(this).prop('hidden', true); + $(control).removeAttr('style'); + $(input).val(''); + }); + + // Browse for images + $(control).find('[data-browse]').on('click', () => { + Postleaf.FileManager.select({ + mimeTypes: mimeTypes, + multiSelect: false, + onSelect: (file) => $(input).val(file.path).trigger('change') + }); + }); + + // Watch for file changes or drag and drop if uploads are enabled + $(control) + .on('change', ':file', (event) => { + // Upload it + if(event.target.files.length) { + upload(event.target.files[0]); + } + }) + .on('dragover', (event) => { + event.preventDefault(); + if(isDraggingFile(event)) { + showDropzone.call(control); + } + }) + .on('dragleave', (event) => { + event.preventDefault(); + hideDropzone.call(control); + }) + .on('drop', (event) => { + let file = event.originalEvent.dataTransfer.files[0]; + let image = mimeTypes.includes(file.type); + + hideDropzone.call(control); + event.preventDefault(); + + // Only upload the file if it's an image + if(!image) return; + + // Upload it + upload(file); + }); + + // Update the preview when the input changes + $(input).on('change', () => { + let path = $(input).val(); + + if(path !== '') { + $(control).attr('style', 'background-image: url("' + path + '");'); + $(control).find('[data-remove]').prop('hidden', false); + } else { + $(control).removeAttr('style'); + $(control).find('[data-remove]').prop('hidden', true); + } + + }); + }); + + return this; + } + + }); + +})(jQuery); diff --git a/source/modules/includes/locater.js b/source/modules/includes/locater.js new file mode 100644 index 0000000..57b31b2 --- /dev/null +++ b/source/modules/includes/locater.js @@ -0,0 +1,197 @@ +/* eslint-env browser, jquery */ +$(() => { + 'use strict'; + + let isAvailable = $('#locater').length > 0; + let action = $('#locater').attr('data-action'); + let searchTimeout; + let lastQuery; + let request; + + // Hides the locater control + function hide() { + // Remove bindings + $(document).off('.locater'); + $('#locater-overlay').off('.locater'); + $('#locater-input').off('.locater'); + + // Hide it + $('html').removeClass('has-modal'); + $('#locater, #locater-overlay').animateCSS('fadeOut', 100, function() { + $(this).prop('hidden', true); + }); + } + + // Ensures the selected item is visible + function keepInView(direction) { + let selected = $('#locater-results').find('.active'); + let height = $('#locater-results').outerHeight(); + let scrollTop = $('#locater-results').scrollTop(); + let selectedTop = $(selected).position().top + scrollTop; + let selectedHeight = $(selected).outerHeight(); + + // Is it partially hidden? + if(selectedTop < scrollTop || selectedTop + selectedHeight > scrollTop + height) { + if(direction === 'up') { + $('#locater-results').scrollTop(selectedTop); + } else { + $('#locater-results').scrollTop(selectedTop - height + selectedHeight); + } + } + } + + // Moves the selection up or down + function move(direction) { + let items = $('#locater-results a'); + let selected = $('#locater-results .active'); + + if($(selected).length) { + // Clear selection + $(items).removeClass('active'); + + if(direction === 'up') { + if($(selected).prev('a').length) { + // Select adjacent item + $(selected).prev('a').addClass('active'); + } else { + // Cycle to last item + $(items).last().addClass('active'); + } + } else { + if($(selected).next('a').length) { + // Select adjacent item + $(selected).next('a').addClass('active'); + } else { + // Cycle to first item + $(items).first().addClass('active'); + } + } + } + + keepInView(direction); + } + + // Resets the control to its original state + function reset() { + $('#locater').removeClass('loading'); + $('#locater-input').val(''); + $('#locater-results').html(''); + lastQuery = ''; + } + + // Shows the locater control + function show() { + // Don't show if there's another modal showing + if($('html').hasClass('has-modal')) return false; + + // Reset it + reset(); + + // Show it + $('html').addClass('has-modal'); + $('#locater, #locater-overlay') + .prop('hidden', false) + .css('opacity', 0) + .animateCSS('fadeIn', 100, function() { + $(this).css('opacity', 1); + $('#locater-input').focus(); + }); + + // Watch for key presses + $(document).on('keydown.locater', (event) => { + // Escape closes it + if(event.keyCode === 27) { + event.preventDefault(); + hide(); + } + + // Enter selects it + if(event.keyCode === 13) { + event.preventDefault(); + + // Go to the selected item + if($('#locater-results .active').length) { + location.href = $('#locater-results .active').attr('href'); + } + + hide(); + } + + // Move up / down + if(event.keyCode === 38 || event.keyCode === 40) { + event.preventDefault(); + move(event.keyCode === 38 ? 'up' : 'down'); + } + }); + + // Close when the overlay is clicked + $('#locater-overlay').on('click.locater', hide); + + // Watch the search field for changes + $('#locater-input').on('keyup.locater', function() { + let query = $(this).val(); + + // Debounce requests + clearTimeout(searchTimeout); + if(request) request.abort(); + + // Reset the UI when the search is cleared + if(query === '') { + reset(); + return; + } + + // Nothing to do if the query hasn't changed + if(query === lastQuery) { + $('#locater').removeClass('loading'); + return; + } + + // Fetch results + $('#locater').addClass('loading'); + searchTimeout = setTimeout(() => { + request = $.ajax({ + url: action, + type: 'GET', + data: { + search: query, + render: 'locaterResults' + } + }) + .done((res) => { + request = null; + lastQuery = query; + + // Show the results, or clear them if none were found + if(res.html) { + $('#locater-results').html(res.results.length ? res.html : ''); + $('#locater-results a:first').addClass('active'); + } + }) + .always(() => $('#locater').removeClass('loading')); + }, 300); + }); + } + + $(document) + // Toggle with CMD|CTRL + SHIFT + F + .on('keydown', (event) => { + if((event.metaKey || event.ctrlKey) && event.shiftKey && event.keyCode === 70) { + event.preventDefault(); + + // Only show if the locater is available + if(isAvailable) { + $('#locater').is(':visible') ? hide() : show(); + } + } + }) + // Show when clicking [href="#locater"] + .on('click', '[href="#locater"]', (event) => { + event.preventDefault(); + + // Only show if the locater is available + if(isAvailable) { + $('#locater').is(':visible') ? hide() : show(); + } + }); +}); diff --git a/source/modules/includes/panel.js b/source/modules/includes/panel.js new file mode 100644 index 0000000..d05fa18 --- /dev/null +++ b/source/modules/includes/panel.js @@ -0,0 +1,142 @@ +// +// A simple panel implementation. +// +// Usage: +// +// +// +//
    +// ... +//
    +// +// Notes: +// - You can watch for events on the panel element +// - show.panel - fires before the panel is shown. +// - shown.panel - fires after the panel is shown. +// - hide.panel - fires before the panel is hidden. +// - hidden.panel - fires after the panel is hidden. +// +// Wishlist: +// - This would probably make a great micro-plugin. +// + +/* eslint-env browser, jquery */ +if(jQuery) (function($) { + 'use strict'; + + // + // Shows the specified panel. + // + // panel* (string) - A selector targetting the panel to show. + // + // No return value. + // + function show(panel) { + // Don't show if there's a modal showing + if($('html').hasClass('has-modal')) return false; + + // Hide existing panels + hide(); + + // Fire the show.panel event + let event = $.Event('show.panel'); + $(panel).trigger(event); + if(event.isDefaultPrevented()) return false; + + // Show the specified panel + $(panel) + .on('transitionend.panel', () => { + $(panel) + .off('transitionend.panel') + .trigger('shown.panel'); + }) + .addClass('active'); + + $(document) + // Watch for keypresses or clicks outside the panel + .on('touchstart.panel keydown.panel mousedown.panel', (event) => { + if( + // Is it outside the panel? + !$(event.target).parents().addBack().is(panel) && + // Ignore modifier keypresses + !(event.metaKey || event.cmdKey || event.shiftKey) + ) { + hide(); + } + }) + // Watch for the escape key + .on('keydown.panel', (event) => { + if(event.keyCode === 27) { + event.preventDefault(); + hide(); + } + }); + + // Watch for form submission + $(panel).find('form').on('submit.panel', (event) => { + event.preventDefault(); + hide(); + }); + + // Watch for clicks on the close button + $(panel).find('[data-panel-hide]').on('click.panel', (event) => { + event.preventDefault(); + hide(); + }); + } + + // + // Hides the specified panel or all panels. + // + // No return value. + // + function hide() { + let panel = '.panel.active'; + + // Fire the hide.panel event + let event = $.Event('hide.panel'); + $(panel).trigger(event); + if(event.isDefaultPrevented()) return false; + + // Don't hide the panel if there's an active alertable modal. We do this because we don't want + // interactions made while an alertable (alert, confirm, prompt) is open to hide the active + // panel. + if($('.alertable:visible').length) return; + + // Remove bindings + $(panel).find('[data-panel-hide]').off('.panel'); + $(document).off('.panel'); + + // Hide the panel + $(panel) + .on('transitionend.panel', () => { + $(panel) + .off('transitionend.panel') + .trigger('hidden.panel'); + }) + .removeClass('active'); + } + + // Expose the API + $.extend($.fn, { + panel: function(method) { + switch(method) { + case 'show': + show(this); + break; + case 'hide': + hide(); + break; + } + } + }); + + // Wait for the DOM + $(() => { + // Show panels when any element with data-toggle="panel" is selected + $(document).on('click', '[data-panel-show]', function(event) { + event.preventDefault(); + show($(this).attr('data-panel-show')); + }); + }); +})(jQuery); diff --git a/source/modules/includes/shortcuts.js b/source/modules/includes/shortcuts.js new file mode 100644 index 0000000..3caab53 --- /dev/null +++ b/source/modules/includes/shortcuts.js @@ -0,0 +1,74 @@ +/* eslint-env browser, jquery */ +$(() => { + 'use strict'; + + let isAvailable = $('#locater').length > 0; + + // Hides the shortcuts screen + function hide() { + // Remove bindings + $(document).off('.shortcuts'); + $('#shortcuts').off('.shortcuts'); + + // Hide it + $('html').removeClass('has-modal'); + $('#shortcuts, #shortcuts-overlay').animateCSS('fadeOut', 100, function() { + $(this).prop('hidden', true); + }); + } + + // Shows the shortcuts screen + function show() { + // Don't show if there's another modal showing + if($('html').hasClass('has-modal')) return false; + + // Show it + $('html').addClass('has-modal'); + $('#shortcuts, #shortcuts-overlay') + .prop('hidden', false) + .css('opacity', 0) + .animateCSS('fadeIn', 100, function() { + $(this).css('opacity', 1); + }); + + // Escape or enter closes it + $(document).on('keydown.shortcuts', (event) => { + if(event.keyCode === 27 || event.keyCode === 13) { + event.preventDefault(); + hide(); + } + }); + + // Close when the overlay is clicked. Note that this particular control has certain styles to + // allow the window scroll when it's too tall, to we actually have to check for clicks on + // #shortcuts (but not #shortcuts-body). + $('#shortcuts').on('click.shortcuts', (event) => { + if(!$(event.target).parents().addBack().is('#shortcuts-body')) { + hide(); + } + }); + } + + $(document) + // Show with f1 + .on('keydown', (event) => { + if(event.keyCode === 112) { + event.preventDefault(); + + // Only show if shortcuts are available + if(isAvailable) { + show(); + } + } + }) + // Show when clicking on data-shortcuts="show" + .on('click', '[data-shortcuts="show"]', (event) => { + event.preventDefault(); + show(); + }) + // Show when clicking on data-shortcuts="hide" + .on('click', '[data-shortcuts="hide"]', (event) => { + event.preventDefault(); + hide(); + }); +}); diff --git a/source/modules/includes/stretch.js b/source/modules/includes/stretch.js new file mode 100644 index 0000000..4cb7c1c --- /dev/null +++ b/source/modules/includes/stretch.js @@ -0,0 +1,15 @@ +// +// Stretch helpers (see source/styles/_stretch.scss) +// + +/* eslint-env browser, jquery */ +$(() => { + function stretchDown() { + var winHeight = $(window).height(); + $('.stretch-down').each(function() { + $(this).outerHeight(winHeight - $(this).offset().top); + }); + } + $(window).on('resize.postleaf', stretchDown); + stretchDown(); +}); diff --git a/source/modules/includes/toggle_password.js b/source/modules/includes/toggle_password.js new file mode 100644 index 0000000..acda486 --- /dev/null +++ b/source/modules/includes/toggle_password.js @@ -0,0 +1,19 @@ +// Show/hide password fields when [data-toggle-password=".input-selector"] + +/* eslint-env browser, jquery */ +$(() => { + $(document).on('click', '[data-toggle-password]', function() { + let trigger = this; + let icon = $(trigger).find('.fa-eye, .fa-eye-slash'); + let target = $(trigger).attr('data-toggle-password'); + let type = $(target).prop('type') === 'password' ? 'text' : 'password'; + + // Toggle the field type + $(target).prop('type', type); + + // Toggle the icon + $(icon) + .toggleClass('fa-eye', type === 'password') + .toggleClass('fa-eye-slash', type !== 'password'); + }); +}); diff --git a/source/modules/includes/xhr_progress.js b/source/modules/includes/xhr_progress.js new file mode 100644 index 0000000..fbbaf80 --- /dev/null +++ b/source/modules/includes/xhr_progress.js @@ -0,0 +1,25 @@ +// +// Add a progress callback for XHR uploads +// + +/* eslint-env browser, jquery */ +(function addXhrProgressEvent($) { + var originalXhr = $.ajaxSettings.xhr; + $.ajaxSetup({ + progress: function() { }, + xhr: function() { + var xhr = originalXhr(); + var req = this; + + if(xhr.upload) { + if(typeof xhr.upload.addEventListener === 'function') { + xhr.upload.addEventListener('progress', (evt) => { + req.progress(evt); + }, false); + } + } + + return xhr; + } + }); +})(jQuery); diff --git a/source/modules/make_url.js b/source/modules/make_url.js new file mode 100644 index 0000000..be55462 --- /dev/null +++ b/source/modules/make_url.js @@ -0,0 +1,286 @@ +'use strict'; + +const Url = require('url'); + +// +// Builds a query string from an object or string. +// +// Returns a string. +// +function appendQueryString(url, params) { + let queryString = ''; + + // Start the query string or append to the existing one + queryString += url.indexOf('?') === -1 ? '?' : '&'; + + if(params && typeof(params) === 'object') { + for(let key in params) { + queryString += + encodeURIComponent(key) + '=' + + encodeURIComponent(params[key]) + '&'; + } + queryString = queryString.replace(/&$/, ''); + } else if(typeof(params) === 'string') { + queryString += params; + } + + return url + queryString; +} + +module.exports = (Settings) => { + + const self = { + // + // Converts a relative URL to an absolute URL. If an absolute URL is passed, it will be returned + // unmodified. + // + absolute: (url) => { + let parsed = Url.parse(url); + + // Skip absoulte URLs and URLs where the path is empty + if(!parsed.hostname && parsed.path) { + url = process.env.APP_URL.replace(/\/$/, '') + '/' + parsed.path.replace(/^\//, ''); + } + + return url; + }, + + // + // Generates an admin URL. This method accepts two argument signatures: (path, options) or + // (options) + // + // path (string) - A path to append to the URL. + // options (object) + // - query (string|object) - Optional query string to append to the URL + // - hash - Optional hash to append to the URL + // - absolute (bool) - Set to true to return an absolute URL. + // + admin: (path, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof path === 'object') { + options = path; + path = options.path; + } + + let url = '/' + Settings.pathForAdmin; + if(path) url += '/' + encodeURI(path || '').replace(/^\/+/, ''); + if(options.query) url = appendQueryString(url, options.query); + if(options.hash) url += '#' + options.hash; + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates an API URL. This method accepts two argument signatures: (path, options) or + // (options) + // + // path (string) - A path to append to the URL. + // options (object) + // - query (string|object) - Optional query string to append to the URL + // - absolute (bool) - Set to true to return an absolute URL. + // + api: (path, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof path === 'object') { + options = path; + path = options.path; + } + + let url = '/' + Settings.pathForAPI; + if(path) url += '/' + encodeURI(path || '').replace(/^\/+/, ''); + if(options.query) url = appendQueryString(url, options.query); + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates an author URL. This method accepts two argument signatures: (username, options) or + // (username) + // + // username* (string) - The author's username. + // options (object) + // - page (int) - Optional page number to link to. + // - absolute (bool) - Set to true to return an absolute URL. + // + author: (username, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof username === 'object') { + options = username; + username = options.username; + } + + if(typeof username === 'undefined') throw new Error('Missing argument `username` MakeUrl.author().'); + let url = '/' + Settings.pathForAuthor + '/' + encodeURIComponent(username); + if(options.page > 1) url += '/' + Settings.pathForPage + '/' + options.page; + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a blog URL. + // + // options (object) + // - page (int) - Optional page number to link to. + // - absolute (bool) - Set to true to return an absolute URL. + // + blog: (options) => { + options = options || {}; + let url = Settings.homepage ? '/' + Settings.pathForBlog : '/'; + if(options.page > 1) url = url.replace(/\/+$/, '') + '/' + Settings.pathForPage + '/' + options.page; + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a feed URL. + // + // options (object) + // - absolute (bool) - Set to true to return an absolute URL. + // + feed: (options) => { + options = options || {}; + let url = '/' + Settings.pathForFeed; + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a post URL. This method accepts two argument signatures: (path, options) or + // (options) + // + // slug (string) - The post's slug. + // options (object) + // - absolute (bool) - Set to true to return an absolute URL. + // + post: (slug, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof slug === 'object') { + options = slug; + slug = options.slug; + } + + if(typeof slug === 'undefined') throw new Error('Missing argument `slug` MakeUrl.post().'); + let url = '/' + encodeURIComponent(slug); + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a raw URL. If a fully-qualified URL is passed in, it will be returned unmodified. + // This method accepts two argument signatures: (path, options) or (options) + // + // path (string) - A path to append to the URL. + // options (object) + // - query (string|object) - Optional query string to append to the URL. + // - hash (string) - Optional hash to append to the URL. + // - absolute (bool) - Set to true to return an absolute URL. + // + raw: (path, options) => { + options = options || {}; + + // Normalize arguments when only an object is passed in + if(typeof path === 'object') { + options = path; + path = options.path; + } + + // Don't modify full-qualified URLs or hashes + if(typeof path === 'string' && path.match(/^(http|https|mailto|#):/i)) { + return path; + } + + options = options || {}; + let url = '/' + encodeURI(path || '').replace(/^\/+/, ''); + if(options.query) url = appendQueryString(url, options.query); + if(options.hash) url += '#' + options.hash; + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a search URL. This method accepts two argument signatures: (path, options) or + // (options) + // + // search (string) - A search term. + // options (object) + // - page (int) - Optional page number to link to. + // - absolute (bool) - Set to true to return an absolute URL. + // + search: (search, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof search === 'object') { + options = search; + search = options.search; + } + + let url = '/' + Settings.pathForSearch; + if(options.page > 1 && search) url += '/' + Settings.pathForPage + '/' + options.page; + if(search) url += '?s=' + encodeURIComponent(search); + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a tag URL. This method accepts two argument signatures: (path, options) or + // (options) + // + // slug* (string) - The tags's slug. + // options (object) + // - page (int) - Optional page number to link to. + // - absolute (bool) - Set to true to return an absolute URL. + // + tag: (slug, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof slug === 'object') { + options = slug; + slug = options.slug; + } + + if(typeof slug === 'undefined') throw new Error('Missing argument `slug` MakeUrl.tag().'); + let url = '/' + Settings.pathForTag + '/' + encodeURIComponent(slug); + if(options.page > 1) url += '/' + Settings.pathForPage + '/' + options.page; + + return options.absolute ? self.absolute(url) : url; + }, + + // + // Generates a URL for the current theme. This method accepts two argument signatures: + // (path, options) or (options) + // + // path (string) - A path to append to the URL. + // options (object) + // - themeId (string) - The ID of the theme (defaults to the current theme). + // - absolute (bool) - Set to true to return an absolute URL. + // + theme: (path, options) => { + options = options || {}; + + // Normalize arguments if only an object was passed in + if(typeof path === 'object') { + options = path; + path = options.path; + } + + let url = '/themes/' + (options.themeId || Settings.theme); + if(path) url += '/' + encodeURI(path || '').replace(/^\/+/, ''); + + return options.absolute ? self.absolute(url) : url; + } + + }; + + return self; + +}; diff --git a/source/modules/markdown.js b/source/modules/markdown.js new file mode 100644 index 0000000..99e599f --- /dev/null +++ b/source/modules/markdown.js @@ -0,0 +1,54 @@ +'use strict'; + +const He = require('he'); +const Marked = require('marked'); +const Striptags = require('striptags'); +const Trim = require('trim'); + +// Create a custom renderer +let renderer = new Marked.Renderer(); + +// Convert code blocks to
     instead of 
    
    +renderer.code = (code, lang) => {
    +  let pre;
    +
    +  pre = lang ? '
    ' : '
    ';
    +  pre += He.encode(code, { useNamedReferences: true });
    +  pre += '
    '; + + return pre; +}; + +const self = { + + // + // Converts a markdown string to HTML. + // + // text* (string) - The markdown string to convert. + // + // Returns an HTML string. + // + toHtml: (text) => { + text = typeof text === 'string' ? text : ''; + + return Marked(text, { + renderer: renderer + }); + }, + + // + // Converts a markdown string to plain text. + // + // text* (string) - The markdown string to convert. + // + toText: (text) => { + text = typeof text === 'string' ? text : ''; + + return Trim(Striptags(He.decode(Marked(text, { + sanitize: true + })))); + } + +}; + +module.exports = self; diff --git a/source/modules/paginate.js b/source/modules/paginate.js new file mode 100644 index 0000000..051f567 --- /dev/null +++ b/source/modules/paginate.js @@ -0,0 +1,38 @@ +'use strict'; + +const self = { + + // + // Generates pagination data. + // + // totalItems* (int) - The total number of items in the collection. + // itemsPerPage* (int) - The number of items per page. + // currentPage (int) - The current page (default 1). + // urlCallback (function) - A callback function accepting a page argument that generates a URL. + // + get: (totalItems, itemsPerPage, currentPage, urlCallback) => { + totalItems = parseInt(totalItems); + itemsPerPage = parseInt(itemsPerPage) || 1; + currentPage = parseInt(currentPage) || 1; + + let totalPages = Math.ceil(totalItems / itemsPerPage); + let prevPage = currentPage > 1 ? currentPage - 1 : null; + let nextPage = currentPage < totalPages ? currentPage + 1 : null; + let prevPageUrl = urlCallback && prevPage ? urlCallback(prevPage) : null; + let nextPageUrl = urlCallback && nextPage ? urlCallback(nextPage) : null; + + return { + totalItems, + itemsPerPage, + currentPage, + totalPages, + nextPage, + nextPageUrl, + prevPage, + prevPageUrl + }; + } + +}; + +module.exports = self; diff --git a/source/modules/signed_url.js b/source/modules/signed_url.js new file mode 100644 index 0000000..de0889a --- /dev/null +++ b/source/modules/signed_url.js @@ -0,0 +1,89 @@ +'use strict'; + +const Crypto = require('crypto'); +const Url = require('url'); + +// +// Converts an object to a query string, sorted alphabetically by key. Sorting alphabetically +// provides a bit of flexibility when generating URLs, as params don't need to be in a specific +// order. It also let us work around the pre-ES2016 issue of objects not having a guarantted order +// when we parse the query string into an object. +// +// obj (object) - The object to convert. +// +// Returns a string. +// +function objectToQueryString(obj) { + let query = []; + + Object.keys(obj).forEach((key) => { + query.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key])); + }); + + return query.sort().join('&'); +} + +const self = { + + // + // Generates a key for use with a signed URL. + // + // hostname* (string) - The full URL to generate a key for. + // secret* (string) - A cryptographically secure string. + // + // Returns a string. + // + generateKey: (url, secret) => { + url = Url.parse(url, true); + let query = objectToQueryString(url.query); + + return Crypto + .createHash('sha256') + .update(secret + url.hostname + url.pathname + query) + .digest('hex'); + }, + + // + // Generates a key and appends it to the given URL. + // + // url* (string) - The URL to sign. + // secret* (string) - A cryptographically secure string. + // + // Returns a string. + // + sign: (url, secret) => { + let key = self.generateKey(url, secret); + let signedUrl = Url.parse(url); + + // Append the key. Note that Url.format() builds the query string from `search`, not `query`. + signedUrl.search += '&key=' + encodeURIComponent(key); + + return Url.format(signedUrl); + }, + + // + // Verifies a signed URL. + // + // url* (string) - The full URL to verify. + // secret* (string) - The secret used to generate the signed URL. + // + // Returns a boolean. + // + verify: (url, secret) => { + url = Url.parse(url, true); + let query = url.query; + let key = url.query.key; + + // Remove key from query + delete url.query.key; + query = objectToQueryString(query); + + // Rebuild the URL and compare keys. Note that Url.format() builds the query string from `search`, not `query`. + url.search = '?' + query; + + return key === self.generateKey(Url.format(url), secret); + } + +}; + +module.exports = self; diff --git a/source/modules/slug.js b/source/modules/slug.js new file mode 100644 index 0000000..8aa1ea8 --- /dev/null +++ b/source/modules/slug.js @@ -0,0 +1,26 @@ +'use strict'; + +const Slugify = require('slugify'); + +// +// Generates a slug. +// +// string* (string) - The string to convert. +// +// Returns a string; +// +module.exports = (string) => { + if(typeof string !== 'string') return ''; + + // Convert Unicode characters to Latin equivalents + return Slugify(string) + .toLowerCase() + // Convert spaces and underscores to dashes + .replace(/(\s|_)/g, '-') + // Remove unsafe characters + .replace(/[^a-z0-9-]/g, '') + // Remove duplicate dashes + .replace(/-+/g, '-') + // Remove starting and ending dashes + .replace(/(^-|-$)/g, ''); +}; diff --git a/source/modules/themes.js b/source/modules/themes.js new file mode 100644 index 0000000..e769588 --- /dev/null +++ b/source/modules/themes.js @@ -0,0 +1,122 @@ +'use strict'; + +const Extend = require('extend'); +const Fs = require('fs'); +const Path = require('path'); + +const self = { + + // + // Gets all post templates for the specified theme. + // + // themeId* (string) - A theme id. + // + // Returns a promise that resolves with an array of post template objects. + // + getPostTemplates: (themeId) => { + return new Promise((resolve, reject) => { + let themeConfig = Path.join(__basedir, 'themes', themeId, 'theme.json'); + let themeData; + + // Read the theme's config file + Fs.readFile(themeConfig, 'utf8', (err, data) => { + if(err) { + return reject('Unable to find theme.json.'); + } + + // Parse it + try { + themeData = JSON.parse(data); + } catch(err) { + return reject('Unable to parse theme.json.'); + } + + // Return an array of available templates + return resolve( + Array.isArray(themeData.customPostTemplates) ? themeData.customPostTemplates : [] + ); + }); + + }); + }, + + // + // Gets all installed themes. + // + // Returns a promise that resolves with an array of theme objects: { id: '', path: '' } + // + getThemes: () => { + return new Promise((resolve, reject) => { + + let themeDir = Path.join(__basedir, 'themes'); + + Fs.readdir(themeDir, (err, files) => { + if(err) { + return reject('Unable to list directory: ' + themeDir); + } + + let queue = []; + + // Loop through directories + files.forEach((file) => { + let path = Path.join(themeDir, file); + + // Build queue to fetch info from each theme + queue.push( + new Promise((resolve, reject) => { + Fs.stat(path, (err, stat) => { + if(err) return resolve(); + + // Is this a directory? + if(stat.isDirectory()) { + + // Look for theme.json + let configPath = Path.join(path, 'theme.json'); + Fs.stat(configPath, (err) => { + if(err) return resolve(); + + // Read theme.json + Fs.readFile(configPath, (err, data) => { + if(err) { + return reject('Unable to read file: ' + configPath); + } + + // Decode it + try { + return resolve( + Extend(JSON.parse(data), { + id: file, // name of theme directory + path: Path.dirname(configPath) // full path to theme directory + }) + ); + } catch(err) { + return reject('Unable to parse file: ' + configPath + '. ' + err); + } + }); + }); + } else { + return resolve(); + } + }); + }) + ); + }); + + // Wait for the queue to resolve + Promise.all(queue) + .then((themes) => { + // Remove empties and sort by name + themes = themes + .filter((val) => !!val) + .sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase()); + + return resolve(themes); + }) + .catch((err) => reject(err)); + }); + }); + } + +}; + +module.exports = self; diff --git a/source/routers/admin_router.js b/source/routers/admin_router.js new file mode 100644 index 0000000..9938b29 --- /dev/null +++ b/source/routers/admin_router.js @@ -0,0 +1,237 @@ +'use strict'; + +const Express = require('express'); +const Path = require('path'); + +module.exports = (app) => { + + const router = Express.Router({ + caseSensitive: app.get('case sensitive routing'), + strict: app.get('strict routing') + }); + + // Router-level middleware + const AuthMiddleware = require(Path.join(__basedir, 'source/middleware/auth_middleware.js')); + const InstallMiddleware = require(Path.join(__basedir, 'source/middleware/install_middleware.js')); + + // Controllers + const DashboardController = require(Path.join(__basedir, 'source/controllers/admin/dashboard_controller.js')); + const EditPostController = require(Path.join(__basedir, 'source/controllers/admin/edit_post_controller.js')); + const EditTagController = require(Path.join(__basedir, 'source/controllers/admin/edit_tag_controller.js')); + const EditUserController = require(Path.join(__basedir, 'source/controllers/admin/edit_user_controller.js')); + const InstallController = require(Path.join(__basedir, 'source/controllers/admin/install_controller.js')); + const LoginController = require(Path.join(__basedir, 'source/controllers/admin/login_controller.js')); + const LogoutController = require(Path.join(__basedir, 'source/controllers/admin/logout_controller.js')); + const NavigationController = require(Path.join(__basedir, 'source/controllers/admin/navigation_controller.js')); + const PostsController = require(Path.join(__basedir, 'source/controllers/admin/posts_controller.js')); + const QuickPostController = require(Path.join(__basedir, 'source/controllers/admin/quick_post_controller.js')); + const RecoverPasswordController = require(Path.join(__basedir, 'source/controllers/admin/recover_password_controller.js')); + const ResetPasswordController = require(Path.join(__basedir, 'source/controllers/admin/reset_password_controller.js')); + const SettingsController = require(Path.join(__basedir, 'source/controllers/admin/settings_controller.js')); + const TagsController = require(Path.join(__basedir, 'source/controllers/admin/tags_controller.js')); + const UsersController = require(Path.join(__basedir, 'source/controllers/admin/users_controller.js')); + + // + // Install + // + // GET /admin/install + // + router.get( + '/install', + InstallController.view + ); + + // + // Login + // + // GET /admin/login + // + router.get( + '/login', + AuthMiddleware.forwardAuth, + LoginController.view + ); + + // + // Recover password + // + // GET /admin/login/recover + // + router.get( + '/login/recover', + AuthMiddleware.forwardAuth, + RecoverPasswordController.view + ); + + // + // Reset password + // + // GET /admin/login/reset + // + router.get( + '/login/reset', + AuthMiddleware.forwardAuth, + ResetPasswordController.view + ); + + // + // Logout + // + // GET /admin/logout + // + router.get( + '/logout', + LogoutController.view + ); + + // + // Dashboard + // + // GET /admin + // + router.get( + '/', + AuthMiddleware.requireAuth, + DashboardController.view + ); + + // + // Posts + // + // GET /admin/posts + // + router.get( + '/posts', + AuthMiddleware.requireAuth, + PostsController.view + ); + + // + // Edit posts + // + // GET /admin/posts/new + // GET /admin/posts/edit/:id + // + router.get( + '/posts/new', + AuthMiddleware.requireAuth, + EditPostController.view + ); + router.get( + '/posts/edit/:id', + AuthMiddleware.requireAuth, + EditPostController.view + ); + + // + // Quick post + // + // GET /admin/posts/quick + // + router.get( + '/posts/quick', + AuthMiddleware.requireAuth, + QuickPostController.view + ); + + // + // Tags + // + // GET /admin/tags + // + router.get( + '/tags', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + TagsController.view + ); + + // + // Edit tags + // + // GET /admin/tags/new + // GET /admin/tags/edit/:id + // + router.get( + '/tags/new', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + EditTagController.view + ); + router.get( + '/tags/edit/:id', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + EditTagController.view + ); + + // + // Navigation + // + // GET /admin/navigation + // + router.get( + '/navigation', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + NavigationController.view + ); + + // + // Users + // + // GET /admin/users + // + router.get( + '/users', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + UsersController.view + ); + + // + // Edit user + // + // GET /admin/users/new + // GET /admin/users/edit/:id + // + router.get( + '/users/new', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + EditUserController.view + ); + router.get( + '/users/edit/:id', + AuthMiddleware.requireAuth, + (req, res, next) => { + // Allow users to edit their own profile + if(req.User.id === req.params.id) { + return next(); + } + + return AuthMiddleware.requireRole(['owner', 'admin'])(req, res, next); + }, + EditUserController.view + ); + + // + // Settings + // + // GET /admin/settings + // + router.get( + '/settings', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + SettingsController.view + ); + + // Attach the router to the app + app.use( + '/' + app.locals.Settings.pathForAdmin + '/', + InstallMiddleware.checkInstallation, + router + ); + +}; diff --git a/source/routers/api_router.js b/source/routers/api_router.js new file mode 100644 index 0000000..04338ba --- /dev/null +++ b/source/routers/api_router.js @@ -0,0 +1,359 @@ +'use strict'; + +const Express = require('express'); +const Path = require('path'); + +module.exports = (app) => { + + const router = Express.Router({ + caseSensitive: app.get('case sensitive routing'), + strict: app.get('strict routing') + }); + + // Router-level middleware + const AuthMiddleware = require(Path.join(__basedir, 'source/middleware/auth_middleware.js')); + + // Controllers + const AuthController = require(Path.join(__basedir, 'source/controllers/api/auth_controller.js')); + const BackupController = require(Path.join(__basedir, 'source/controllers/api/backup_controller.js')); + const InstallController = require(Path.join(__basedir, 'source/controllers/api/install_controller.js')); + const NavigationController = require(Path.join(__basedir, 'source/controllers/api/navigation_controller.js')); + const OEmbedController = require(Path.join(__basedir, 'source/controllers/api/oembed_controller.js')); + const PostsController = require(Path.join(__basedir, 'source/controllers/api/posts_controller.js')); + const RevisionsController = require(Path.join(__basedir, 'source/controllers/api/revisions_controller.js')); + const TagsController = require(Path.join(__basedir, 'source/controllers/api/tags_controller.js')); + const SearchController = require(Path.join(__basedir, 'source/controllers/api/search_controller.js')); + const SettingsController = require(Path.join(__basedir, 'source/controllers/api/settings_controller.js')); + const UploadsController = require(Path.join(__basedir, 'source/controllers/api/uploads_controller.js')); + const UsersController = require(Path.join(__basedir, 'source/controllers/api/users_controller.js')); + + // + // Install + // + // POST /api/install + // + router.post( + '/install', + InstallController.install + ); + + // + // Auth + // + // POST /api/auth + // POST /api/auth/recover + // POST /api/auth/reset + // + router.post( + '/auth', + AuthController.authenticate + ); + router.post( + '/auth/recover', + AuthController.recoverPassword + ); + router.post( + '/auth/reset', + AuthController.resetPassword + ); + + // + // Backups + // + // GET /api/backup + // PUT /api/backup + // + router.get( + '/backup', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + BackupController.create + ); + router.put( + '/backup', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + BackupController.restore + ); + + // + // Navigation + // + // GET /api/navigation + // PUT /api/navigation + // + router.get( + '/navigation', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + NavigationController.index + ); + router.put( + '/navigation', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + NavigationController.update + ); + + // + // oEmbed + // + // GET /api/oembed + // + router.get( + '/oembed', + AuthMiddleware.requireAuth, + OEmbedController.getFromProvider + ); + + // + // Posts + // + // GET /api/posts + // POST /api/posts + // GET /api/posts/:id + // GET /api/posts/:id/preview + // POST /api/posts/:id/preview + // PUT /api/posts/:id + // DELETE /api/posts/:id + // + router.get( + '/posts', + AuthMiddleware.requireAuth, + PostsController.index + ); + router.post( + '/posts', + AuthMiddleware.requireAuth, + PostsController.create + ); + router.get( + '/posts/:id', + AuthMiddleware.requireAuth, + PostsController.read + ); + router.get( + '/posts/:id/preview', + AuthMiddleware.requireAuth, + PostsController.preview + ); + router.post( + '/posts/:id/preview', + AuthMiddleware.requireAuth, + PostsController.preview + ); + router.put( + '/posts/:id', + AuthMiddleware.requireAuth, + PostsController.update + ); + router.delete( + '/posts/:id', + AuthMiddleware.requireAuth, + PostsController.delete + ); + + // + // Revisions + // + // GET /api/revisions + // POST /api/revisions + // GET /api/revisions/:id + // GET /api/posts/:id/preview + // PUT /api/revisions/:id + // DELETE /api/revisions/:id + // + router.get( + '/revisions', + AuthMiddleware.requireAuth, + RevisionsController.index + ); + router.post( + '/revisions', + AuthMiddleware.requireAuth, + RevisionsController.create + ); + router.get( + '/revisions/:id', + AuthMiddleware.requireAuth, + RevisionsController.read + ); + router.get( + '/revisions/:id/preview', + AuthMiddleware.requireAuth, + RevisionsController.preview + ); + router.put( + '/revisions/:id', + AuthMiddleware.requireAuth, + RevisionsController.update + ); + router.delete( + '/revisions/:id', + AuthMiddleware.requireAuth, + RevisionsController.delete + ); + + // + // Search + // + // GET /api/search + // + router.get( + '/search', + AuthMiddleware.requireAuth, + SearchController.index + ); + + // + // Settings + // + // GET /api/settings + // PUT /api/settings + // + router.get( + '/settings', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + SettingsController.index + ); + router.put( + '/settings', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + SettingsController.update + ); + + // + // Tags + // + // GET /api/tags + // POST /api/tags + // GET /api/tags/:id + // PUT /api/tags/:id + // DELETE /api/tags/:id + // + router.get( + '/tags', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + TagsController.index + ); + router.post( + '/tags', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + TagsController.create + ); + router.get( + '/tags/:id', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + TagsController.read + ); + router.put( + '/tags/:id', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + TagsController.update + ); + router.delete( + '/tags/:id', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin', 'editor']), + TagsController.delete + ); + + // + // Uploads + // + // GET /api/uploads + // POST /api/uploads + // GET /api/uploads/:id + // GET /api/uploads/:id/download + // PUT /api/uploads/:id + // DELETE /api/uploads/:id + // + router.get( + '/uploads', + AuthMiddleware.requireAuth, + UploadsController.index + ); + router.post( + '/uploads', + AuthMiddleware.requireAuth, + UploadsController.create + ); + router.get( + '/uploads/:id', + AuthMiddleware.requireAuth, + UploadsController.read + ); + router.get( + '/uploads/:id/download', + AuthMiddleware.requireAuth, + UploadsController.download + ); + router.put( + '/uploads/:id', + AuthMiddleware.requireAuth, + UploadsController.update + ); + router.delete( + '/uploads/:id', + AuthMiddleware.requireAuth, + UploadsController.delete + ); + + // + // Users + // + // GET /api/users + // POST /api/users + // GET /api/users/:id + // PUT /api/users/:id + // DELETE /api/users/:id + // + router.get( + '/users', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + UsersController.index + ); + router.post( + '/users', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + UsersController.create + ); + router.get( + '/users/:id', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + UsersController.read + ); + router.put( + '/users/:id', + AuthMiddleware.requireAuth, + (req, res, next) => { + // Allow users to edit their own profile + if(req.User.id === req.params.id) { + return next(); + } + + // Otherwise + return AuthMiddleware.requireRole(['owner', 'admin'])(req, res, next); + }, + UsersController.update + ); + router.delete( + '/users/:id', + AuthMiddleware.requireAuth, + AuthMiddleware.requireRole(['owner', 'admin']), + UsersController.delete + ); + + // Attach the router to the app + app.use('/' + app.locals.Settings.pathForAPI, router); + +}; diff --git a/source/routers/theme_router.js b/source/routers/theme_router.js new file mode 100644 index 0000000..8d6de2c --- /dev/null +++ b/source/routers/theme_router.js @@ -0,0 +1,107 @@ +'use strict'; + +const Express = require('express'); +const Path = require('path'); + +module.exports = (app) => { + + // Create a router + const router = Express.Router({ + caseSensitive: app.get('case sensitive routing'), + strict: app.get('strict routing') + }); + + // Router-level middleware + const InstallMiddleware = require(Path.join(__basedir, 'source/middleware/install_middleware.js')); + const ViewMiddleware = require(Path.join(__basedir, 'source/middleware/view_middleware.js')); + + // Controllers + const AuthorController = require(Path.join(__basedir, 'source/controllers/theme/author_controller.js')); + const BlogController = require(Path.join(__basedir, 'source/controllers/theme/blog_controller.js')); + const FeedController = require(Path.join(__basedir, 'source/controllers/theme/feed_controller.js')); + const PostController = require(Path.join(__basedir, 'source/controllers/theme/post_controller.js')); + const SearchController = require(Path.join(__basedir, 'source/controllers/theme/search_controller.js')); + const TagController = require(Path.join(__basedir, 'source/controllers/theme/tag_controller.js')); + const Settings = app.locals.Settings; + + // + // Blog + // + // GET / + // GET /page/:page + // + // With custom homepage: + // + // GET /blog + // GET /blog/page/:page + // + if(app.locals.Settings.homepage) { + // Custom homepage + router.get('/', PostController.customHomepage); + router.get([ + '/' + Settings.pathForBlog, + '/' + Settings.pathForBlog + '/' + Settings.pathForPage + '/:page' + ], ViewMiddleware.checkPageNumbers, BlogController.view); + } else { + // Without custom homepage + router.get([ + '/', + '/' + Settings.pathForPage + '/:page' + ], ViewMiddleware.checkPageNumbers, BlogController.view); + } + + // + // Author + // + // GET /author/:username + // GET /author/:username/page/:page + // + router.get([ + '/' + Settings.pathForAuthor + '/:username', + '/' + Settings.pathForAuthor + '/:username/' + Settings.pathForPage + '/:page' + ], ViewMiddleware.checkPageNumbers, AuthorController.view); + + // + // Tag + // + // GET /tag/:slug + // GET /tag/:slug/page/:page + // + router.get([ + '/' + Settings.pathForTag + '/:slug', + '/' + Settings.pathForTag + '/:slug/' + Settings.pathForPage + '/:page' + ], ViewMiddleware.checkPageNumbers, TagController.view); + + // + // Search + // + // GET /search + // GET /search/page/:page + // + router.get([ + '/' + Settings.pathForSearch, + '/' + Settings.pathForSearch + '/' + Settings.pathForPage + '/:page' + ], ViewMiddleware.checkPageNumbers, SearchController.view); + + // + // Feed + // + // GET /feed + // + router.get('/' + Settings.pathForFeed, FeedController.view); + + // + // Post + // + // GET /:slug + // + router.get('/:slug', PostController.view); + + // Attach the router to the app + app.use( + '/', + InstallMiddleware.checkInstallation, + router + ); + +}; diff --git a/source/scripts/edit_post.js b/source/scripts/edit_post.js new file mode 100644 index 0000000..3a4f31d --- /dev/null +++ b/source/scripts/edit_post.js @@ -0,0 +1,1367 @@ +/* eslint-env browser, jquery */ +'use strict'; + +const Cookie = require('js-cookie'); +const NProgress = require('nprogress'); +const Screenfull = require('screenfull'); +const Editor = require('../modules/editor.js'); + +$(() => { + + // + // Disables or enables the toolbar. + // + // disabled* (boolean) - True to disable, false to enable. + // + // No return value. + // + function disableToolbar(disabled) { + $('.admin-toolbar').toggleClass('disabled', disabled); + } + + // + // Called when the user double clicks something in the content editor. + // + // No return value. + // + function handleDoubleClick(event) { + // Show appropriate panels on double-click + if($(event.target).is('a[href]')) $('#link-panel').panel('show'); + if($(event.target).is('figure.image, img')) $('#image-panel').panel('show'); + if($(event.target).is('[data-embed]')) $('#embed-panel').panel('show'); + } + + // + // Called when the user drags something off of the page. + // + // event* (object) - A drag event. + // + // No return value. + // + function handleDragLeave(event) { + event.preventDefault(); + hideDropzone(); + } + + // + // Called when the user drags something onto page. + // + // event* (object) - A drag event. + // + // No return value. + // + function handleDragOver(event) { + // Don't show the dropzone if the file manager is activated + if($('#file-manager').is(':visible')) return; + + event.preventDefault(); + + if(isDraggingFile(event)) { + showDropzone(event.target); + } + } + + // + // Called when files are dropped into the page. + // + // event* (object) - A drop event. + // + // No return value. + // + function handleDrop(event) { + let target = $(event.target).closest('.dropzone-target').attr('data-target'); + + event.preventDefault(); + hideDropzone(); + + // Don't do anything if the file was dropped outside of a target + if(!target) return; + + // Upload the dropped file + if(isDraggingFile(event)) { + upload({ + file: event.originalEvent.dataTransfer.files[0], + action: uploadAction, + method: 'POST' + }) + .then((res) => { + // Insert an image + if(res.upload && res.upload.filename.match(/\.(gif|jpg|jpeg|png|svg)$/i)) { + if(target === 'post:image') { + // Set post image + $('#image').val(res.upload.path).trigger('change'); + + // Update preview + loadPreview(serializePost()); + return; + } else { + // Insert into post content + contentEditor.insertImage(res.upload.path); + return; + } + } + + // Insert a link + if(res.upload && target === 'post:content') { + contentEditor.insertContent( + $('') + .attr('href', res.upload.path) + .text(res.upload.filename) + .get(0) + .outerHTML + ); + return; + } + }) + .catch((res) => { + // Show error message + if(res.message) { + $.announce.warning(res.message); + } + }); + } + } + + // + // Called when a key is pressed in the content editor. Handles editor-specific keyboard shortcuts + // and commands. + // + // event* (object) - A keydown event. + // + // No return value. + // + function handleKeyDown(event) { + let isMac = $('html').is('.mac'); + let cmd = isMac ? event.metaKey : event.ctrlKey; + + // Link (CMD + K) + if(cmd && event.keyCode === 75) { + event.preventDefault(); + $('#link-panel').panel('show'); + } + + // Image (CMD + SHIFT + I) + if(cmd && event.shiftKey && event.keyCode === 73) { + event.preventDefault(); + $('#image-panel').panel('show'); + } + + // Embed (CMD + SHIFT + E) + if(cmd && event.shiftKey && event.keyCode === 69) { + event.preventDefault(); + $('#embed-panel').panel('show'); + } + + // New section (CMD + ENTER) + if(cmd && event.keyCode === 13) { + this.insertContent('
    '); + } + + // Update word count + clearTimeout(wordCountTimeout); + wordCountTimeout = setTimeout(updateWordCount, 500); + } + + // + // Called when the selection changes in the content editor. + // + // No return value. + // + function handleSelectionChange() { + updateToolbar(); + } + + // + // Called when content is pasted into the content editor. Converts image URLs to images and grabs + // embed code from various providers. + // + // event* (object) - A paste event. + // + // No return value. + // + function handlePaste(event) { + let pastedData = event.content; + + // Check for anything that looks like an image and insert it into the editor + if(pastedData.match(/^https?:\/\/(.*?)\.(gif|jpg|jpeg|png|svg)$/i)) { + event.stopPropagation(); + event.preventDefault(); + contentEditor.insertImage(pastedData); + return; + } + + // Check for anything that looks the beginning of a URL and grab the oEmbed code + if(pastedData.match(/^https?:\/\//i)) { + event.stopPropagation(); + event.preventDefault(); + + // Fetch oEmbed code + NProgress.start(); + $.ajax({ + url: oEmbedAction, + type: 'GET', + data: { + url: pastedData + } + }) + .done((res) => { + if(res.embed && res.embed.html) { + // A provider was found and they provide HTML, insert the embed code + contentEditor.insertEmbed(res.embed.html, { + provider: res.embed.provider_name + }); + } else if(res.embed && res.embed.type === 'photo' && res.embed.url) { + // A provider was found and it's an image, insert the image + contentEditor.insertImage(res.embed.url); + } else { + // No provider was found, insert the raw paste data + contentEditor.insertContent(pastedData); + } + }) + .fail(() => { + // The request failed, just insert the URL + contentEditor.insertContent(pastedData); + }) + .always(() => NProgress.done()); + + return; + } + } + + // + // Hides the drop zone. + // + // No return value. + // + function hideDropzone() { + // Hide the dropzone after a short delay to prevent flickering in some browsers when dragging + // over a child element of the dropzone. + dropzoneTimeout = setTimeout(() => { + $('#dropzone').prop('hidden', true); + $('#dropzone .dropzone-target').removeClass('active'); + }, 10); + } + + // + // Tells if the editor's state has unsaved changes. + // + // Returns a boolean. + // + function isDirty() { + return cleanState !== JSON.stringify(serializePost()); + } + + // + // Tells if the user is dragging a file (as opposed to an HTML element). + // + // Returns a boolean. + // + function isDraggingFile(event) { + if(event.originalEvent === undefined) return false; + if(event.originalEvent.dataTransfer === undefined) return false; + return $.inArray('Files', event.originalEvent.dataTransfer.types) > -1; + } + + // + // Called when the frame loads. Disables certain interactions and initializes content editors. + // + // No return value. + // + function loadFrame() { + // Keep a reference to the frame's document object + frameDoc = $('#editor-frame').get(0).contentWindow.document; + + // Hide the loader + $('.main-container').removeClass('loading'); + + // Check for missing helpers by scanning for their output + for(let helper of [ + { code: '{@head/}', selector: '[data-postleaf-editor="styles"]' }, + { code: '{@foot/}', selector: '[data-postleaf-editor="scripts"]' }, + { code: '{@title editable="true"/}', selector: '[data-postleaf-region="title"]' }, + { code: '{@content editable="true/}', selector: '[data-postleaf-region="content"]' } + ]) { + if(!$(helper.selector, frameDoc).length) { + $('#missing-helper') + .find('code').text(helper.code).end() + .prop('hidden', false); + return; + } + } + + // Show the frame + $('#editor-frame').prop('hidden', false); + + $(frameDoc) + // Prevent links from loading other pages + .on('click mousedown', 'a, area', function(event) { + // Skip [data-postleaf] elements + if(!$(this).parents().addBack().is('[data-postleaf-region]')) { + event.preventDefault(); + } + }) + // Prevent form submissions + .on('submit', 'form', (event) => event.preventDefault()) + // Pass these events through to the main document + .on('click keydown mousedown touchstart', (event) => $(document).trigger(event)); + + // Watch for drag and drop on the main document or the frame if uploads are enabled + $(document).add(frameDoc) + .on('dragover', handleDragOver) + .on('dragleave', handleDragLeave) + .on('drop', handleDrop); + + // Title region + titleEditor = new Editor({ + element: $('[data-postleaf-region="title"]', frameDoc).get(0), + baseUrl: $('#editor-frame').attr('data-base-url'), + placeholder: $('#editor-frame').attr('data-default-title'), + textOnly: true, + allowNewlines: false, + onReady: () => { + makeClean(); + titleEditor.focus(); + } + }); + + // Content region + contentEditor = new Editor({ + element: $('[data-postleaf-region="content"]', frameDoc).get(0), + baseUrl: $('#editor-frame').attr('data-base-url'), + captionPlaceholder: $('#editor-frame').attr('data-caption-placeholder'), + convertMarkdown: true, + placeholder: $('#editor-frame').attr('data-default-content'), + onDoubleClick: handleDoubleClick, + onKeyDown: handleKeyDown, + onPaste: handlePaste, + onSelectionChange: handleSelectionChange, + onReady: () => { + makeClean(); + disableToolbar(false); + updateToolbar(); + updateWordCount(); + } + }); + } + + // + // Renders and loads a preview with a smooth transition. This method essentially wraps + // renderPreview but takes care of the loading state and fade in/out animations. + // + // Returns a promise that resolves after the preview loads and all animations are complete. + // + function loadPreview(postData) { + return new Promise((resolve) => { + // Show the loader + $('.main-container').addClass('loading'); + + // Fade the frame out while we switch templates. This provides a smooth transition as styles + // and other resources are loaded. + $('#editor-frame').animateCSS('fadeOut', 100, function() { + $(this).css('opacity', 0); + + // Render the updated preview + renderPreview(postData).then(() => { + // Hide the loader + $('.main-container').removeClass('loading'); + + // Fade the frame back in once the preview has loaded + $('#editor-frame').animateCSS('fadeIn', 100, function() { + $(this).css('opacity', 1); + + resolve(); + }); + }); + }); + }); + } + + // + // Resets the clean state. + // + // No return value. + // + function makeClean() { + cleanState = JSON.stringify(serializePost()); + } + + // + // Renders a preview using the specified post data and hot swaps the page in the editor. + // + // postData* (object) - The data to render the post with. + // + // Returns a promise. + // + function renderPreview(postData) { + return new Promise((resolve) => { + // + // How it works: + // + // 1. Create a dummy form and insert the cmd, options, and post data + // 2. Create a dummy iframe that will receive the form + // 3. Trigger the form to submit to the iframe + // 4. Swap out the head and body elements + // 5. Replace the new content regions with the old editor instances + // 6. Magic! + // + // Capture title and content elements. We do this because they are linked to the editor and + // we don't want to reinitialize the editors and lose their undo/redo history. We're + // basically hot swapping the editors from one template to another. + // + let title = titleEditor.element; + let content = contentEditor.element; + let form = $('
    '); + + // Remove any pending requests that might still be around + $('form[target="dummy_frame"], iframe[name="dummy_frame"]').remove(); + + // Create a dummy frame + $(' + + {! Status bar !} +
    + {! Word count !} + + + {! Zen mode theme !} + +
    + + {! Dropzone !} + + + {! Panels !} + {>"partials/embed_panel.dust"/} + {>"partials/image_panel.dust"/} + {>"partials/link_panel.dust"/} + {>"partials/settings_panel.dust"/} + +{/body} diff --git a/source/views/edit_tag.dust b/source/views/edit_tag.dust new file mode 100644 index 0000000..0f211a3 --- /dev/null +++ b/source/views/edit_tag.dust @@ -0,0 +1,158 @@ +{>"layout"/} + +{! Header !} +{ +
    + {! Toolbar title !} +

    + {@i18n term="tags"/} + + {?tag} + {tag.name} + {:else} + {@i18n term="new_tag"/} + {/tag} +

    +
    +
    + {! Save / cancel !} + {@i18n term="cancel"/} + +
    + +{/header} + +{! Body !} +{ + {! Sidebar !} + + + {! Main content !} + + {! Website !} +
    +
    +
    + + {! Name !} +
    + + +
    + + {! Description !} +
    + + {@i18n term="markdown"/} + +
    + + {! Slug !} +
    + + +

    + {@i18n term="slugs_must_start_with_a_letter_and_can_only_contain"/} +

    +
    + + {! Image !} +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +

    + {@i18n term="cover_images_are_used_by_themes_to_provide_a_unique_visual_experience"/} +

    +
    + +
    +
    +
    + + {! Meta data !} +
    +
    +
    + + {! Meta data !} +

    {@i18n term="metadata"/}

    +

    + {@i18n term="metadata_is_used_by_search_engines_and_other_apps"/} +

    + + {! Meta title !} +
    + + +
    + + {! Meta description !} +
    + + +
    + + {! Preview !} +

    {@i18n term="preview"/}

    +
    +
    +
    + {@url type="tag" slug="" absolute="true"/} +
    +
    +
    +

    + {@i18n term="this_is_how_search_engines_might_display_your_content"/} +

    + +
    +
    +
    + + {! Hidden button so ENTER will trigger form submits !} + + + +{/body} diff --git a/source/views/edit_user.dust b/source/views/edit_user.dust new file mode 100644 index 0000000..467839f --- /dev/null +++ b/source/views/edit_user.dust @@ -0,0 +1,263 @@ +{>"layout"/} + +{! Header !} +{ +
    + {! Toolbar title !} +

    + {@in key=User.role value="owner,admin"} + {@i18n term="users"/} + + {/in} + + {?user} + {user.name} + {:else} + {@i18n term="new_user"/} + {/user} +

    +
    +
    + {! Cancel !} + {@in key=User.role value="owner,admin"} + {@i18n term="cancel"/} + {/in} + + {! Save !} + +
    + +{/header} + +{! Body !} +{ + {! Sidebar !} + + + {! Main content !} +
    + {! User !} +
    +
    +
    + {! Name !} +
    + + +
    + + {! Email !} +
    + + +
    + +
    + {! Username !} +
    +
    + + +

    + {@i18n term="usernames_must_be_lowercase_and_can_only_contain"/} +

    +
    +
    + + {! Role !} +
    +
    + + +

    + {@i18n term="roles_determine_what_features_a_user_has_access_to"/} +

    +
    +
    +
    + + {! Change password !} + {?user.id} +

    {@i18n term="change_password"/}

    +
    + +
    + + + + +
    +

    + {@i18n term="passwords_need_to_be_at_least_eight_characters_long"/} +

    +
    + {/user.id} +
    +
    +
    + + {! Profile !} +
    +
    +
    + {! Profile !} +

    {@i18n term="profile"/}

    +

    + {@i18n term="your_profile_tells_visitors_a_little_bit_about_who_you_are"/} +

    + +
    + {! Website !} +
    +
    + + +
    +
    + + {! Location !} +
    +
    + + +
    +
    +
    + + {! Bio !} +
    + + {@i18n term="markdown"/} + +

    + {@i18n term="share_a_few_sentences_about_yourself"/} +

    +
    + + {! Avatar and image !} +
    + {! Avatar !} +
    +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +

    + {@i18n term="avatars_are_public_and_often_displayed_on_your_website"/} +

    +
    +
    + + {! Image !} +
    +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +

    + {@i18n term="cover_images_are_used_by_themes_to_provide_a_unique_visual_experience"/} +

    +
    +
    +
    +
    +
    +
    + + {! Hidden button so ENTER will trigger form submits !} + +
    + +{/body} diff --git a/source/views/feed.dust b/source/views/feed.dust new file mode 100644 index 0000000..d5bc3b9 --- /dev/null +++ b/source/views/feed.dust @@ -0,0 +1,26 @@ + + + + {! Channel info !} + {Settings.title} + + http://example.com/ + {Settings.tagline} + {Settings.language} + {@date format="ddd, DD MMM YYYY HH:mm:ss ZZ"/} + {@date format="ddd, DD MMM YYYY HH:mm:ss ZZ"/} + + {! Loop through post items !} + {#posts} + + {title} + {@url type="post" slug=slug absolute="true"/} + {@url type="post" slug=slug absolute="true"/} + {@date date=publishedAt format="ddd, DD MMM YYYY HH:mm:ss ZZ"/} + + + {/posts} + + diff --git a/source/views/install.dust b/source/views/install.dust new file mode 100644 index 0000000..ac55e32 --- /dev/null +++ b/source/views/install.dust @@ -0,0 +1,73 @@ +{>"layout"/} + +{! No nav for this page !} +{ + {! Logo !} + + +

    + {@i18n term="lets_create_your_account"/} +

    + + {! Install form !} +
    + {! Name !} +
    + + +
    + + {! Email !} +
    + + +
    + + {! Username !} +
    + + +

    + {@i18n term="usernames_must_be_lowercase_and_can_only_contain"/} +

    +
    + + {! Password !} +
    + +
    + + + + +
    +

    + {@i18n term="passwords_need_to_be_at_least_eight_characters_long"/} +

    +
    + + {! Create my account !} +
    + +
    +
    + +{/body} + +{! No panels for this page !} +{ + + + {meta.title} + + + + {! Meta description !} + {?meta.description} + + {/meta.description} + + {! Robots !} + {?meta.noIndex} + + {/meta.noIndex} + + + + + {! Styles !} + {#styles} + + {/styles} + + + + {! Default nav !} + {+nav} + {>"partials/admin_menu"/} + {/nav} + + {! Header !} + {+header}{/header} + + {! Body !} + {+body}{/body} + + {! Panels !} + {+panels} + {! Shortcuts !} + {>"partials/shortcuts.dust"/} + + {! Locater !} + {>"partials/locater.dust"/} + + {! File manager !} + {>"partials/file_manager.dust"/} + {/panels} + + + {! Scripts !} + {#scripts} + + {/scripts} + + diff --git a/source/views/login.dust b/source/views/login.dust new file mode 100644 index 0000000..e64477c --- /dev/null +++ b/source/views/login.dust @@ -0,0 +1,54 @@ +{>"layout"/} + +{! No nav for this page !} +{ + {! Logo !} + + + {! Login form !} +
    + {! Username !} +
    + + +
    + + {! Password !} +
    + +
    + + + + + + +
    +
    + + {! Login button !} +
    + +
    +
    + + {! Site meta !} +

    + {Settings.title} +

    + +{/body} + +{! No panels for this page !} +{"layout"/} + +{! Header !} +{ +
    +

    {meta.title}

    +
    +
    + + + +
    + +{/header} + +{! Body !} +{ + + {! Navigation items !} + + + +{/body} diff --git a/source/views/not_allowed.dust b/source/views/not_allowed.dust new file mode 100644 index 0000000..b38a3fc --- /dev/null +++ b/source/views/not_allowed.dust @@ -0,0 +1 @@ +{>"application_error"/} diff --git a/source/views/not_found.dust b/source/views/not_found.dust new file mode 100644 index 0000000..b38a3fc --- /dev/null +++ b/source/views/not_found.dust @@ -0,0 +1 @@ +{>"application_error"/} diff --git a/source/views/partials/admin_menu.dust b/source/views/partials/admin_menu.dust new file mode 100644 index 0000000..6128f0c --- /dev/null +++ b/source/views/partials/admin_menu.dust @@ -0,0 +1,109 @@ +{! Main menu !} + diff --git a/source/views/partials/embed_panel.dust b/source/views/partials/embed_panel.dust new file mode 100644 index 0000000..91ac750 --- /dev/null +++ b/source/views/partials/embed_panel.dust @@ -0,0 +1,35 @@ +{! Embed panel !} +
    +
    + {! Close button !} + + + {! Panel header !} +
    +

    {@i18n term="embed"/}

    +
    + + {! Panel body !} +
    + {! Code !} +
    + + {@i18n term="html"/} + + {@i18n term="paste_embed_code_or_a_url_here"/} +
    +
    + + {! Panel footer !} +
    + {! Delete !} + + + {! Insert / cancel !} + + +
    +
    +
    diff --git a/source/views/partials/file_manager.dust b/source/views/partials/file_manager.dust new file mode 100644 index 0000000..f111274 --- /dev/null +++ b/source/views/partials/file_manager.dust @@ -0,0 +1,80 @@ + + diff --git a/source/views/partials/file_manager_items.dust b/source/views/partials/file_manager_items.dust new file mode 100644 index 0000000..54bb88c --- /dev/null +++ b/source/views/partials/file_manager_items.dust @@ -0,0 +1,38 @@ +{#uploads} + +
    +
    +
    + {! Icon !} + + {! Name !} +
    + {filename} +
    + {! Size !} +
    + {@formatBytes bytes=size/} +
    +
    +
    +
    + +{/uploads} diff --git a/source/views/partials/image_panel.dust b/source/views/partials/image_panel.dust new file mode 100644 index 0000000..6f288b6 --- /dev/null +++ b/source/views/partials/image_panel.dust @@ -0,0 +1,93 @@ +{! Image panel !} +
    +
    + {! Close button !} + + + {! Panel header !} +
    +

    {@i18n term="image"/}

    +
    + + {! Panel body !} +
    + {! URL !} +
    + +
    + + + {! Upload !} + + + + + {! Browse !} + + + +
    +
    + + {! Description !} +
    + + +

    + {@i18n term="enter_a_description_for_users_who_cant_see_images"/} +

    +
    + + {! Caption !} +
    + {@htmlCheckbox name="caption" id="image-caption"} + {@i18n term="caption"/} + {/htmlCheckbox} +
    + + {! Alignment !} +
    + +
    +
    + + + + +
    +
    +
    +
    + + {! Panel footer !} + +
    +
    diff --git a/source/views/partials/link_panel.dust b/source/views/partials/link_panel.dust new file mode 100644 index 0000000..58e4546 --- /dev/null +++ b/source/views/partials/link_panel.dust @@ -0,0 +1,68 @@ +{! Link panel !} + diff --git a/source/views/partials/locater.dust b/source/views/partials/locater.dust new file mode 100644 index 0000000..da485b0 --- /dev/null +++ b/source/views/partials/locater.dust @@ -0,0 +1,12 @@ +{?User} + + +{/User} diff --git a/source/views/partials/locater_results.dust b/source/views/partials/locater_results.dust new file mode 100644 index 0000000..f248858 --- /dev/null +++ b/source/views/partials/locater_results.dust @@ -0,0 +1,23 @@ +{#results} + + + {! Image or icon !} + {?image} + {description} + {:else} + + {/image} + + {! Title !} +
    + {title} +
    + + {! Description !} + {?description} +
    + {description} +
    + {/description} +
    +{/results} diff --git a/source/views/partials/nav_item.dust b/source/views/partials/nav_item.dust new file mode 100644 index 0000000..d16465e --- /dev/null +++ b/source/views/partials/nav_item.dust @@ -0,0 +1,16 @@ + diff --git a/source/views/partials/post_items.dust b/source/views/partials/post_items.dust new file mode 100644 index 0000000..dcf90ee --- /dev/null +++ b/source/views/partials/post_items.dust @@ -0,0 +1,78 @@ +{#posts} +
    + {! Title !} +

    + {title} +

    + + {! Details !} +
    + {! Avatar !} + {?author.avatar} + {author.name} + {/author.avatar} + + {! Date !} + + {@date date=publishedAt relative="true"/} + + + {! Post meta !} +
    + {! No index !} + {?isPage} + {@htmlPostBadge type="page"/} + {/isPage} + + {! Featured !} + {?isFeatured} + {@htmlPostBadge type="featured"/} + {/isFeatured} + + {! Sticky !} + {?isSticky} + {@htmlPostBadge type="sticky"/} + {/isSticky} + + {! Status !} + {@select key=status} + {! Live / scheduled !} + {@eq value="published"} + {@postIsPublic} + {@htmlPostBadge type="live"/} + {:else} + {@htmlPostBadge type="scheduled"/} + {/postIsPublic} + {/eq} + + {! Draft !} + {@eq value="draft"} + {@htmlPostBadge type="draft"/} + {/eq} + + {! Pending !} + {@eq value="pending"} + {@htmlPostBadge type="pending"/} + {/eq} + + {! Rejected !} + {@eq value="rejected"} + {@htmlPostBadge type="rejected"/} + {/eq} + {/select} +
    +
    +
    +{/posts} diff --git a/source/views/partials/revisions_table.dust b/source/views/partials/revisions_table.dust new file mode 100644 index 0000000..78e767f --- /dev/null +++ b/source/views/partials/revisions_table.dust @@ -0,0 +1,72 @@ +{! Revisions table !} + + + {#revisions} + + + + + {/revisions} + +
    + {! Date !} +
    + {@date date=createdAt format="LLL"/} + {@date date=createdAt format="LL"/} +
    + + {! Author !} +
    + {?author.avatar} + {author.name} + {/author.avatar} + {author.name} +
    +
    +
    + {! Open !} + + + {! Revert !} + + + {! Delete !} + +
    +
    + +{! No revisions !} +
    +
    +
    + +
    + {@i18n term="no_revisions"/} +
    +
    diff --git a/source/views/partials/settings_panel.dust b/source/views/partials/settings_panel.dust new file mode 100644 index 0000000..e3a0526 --- /dev/null +++ b/source/views/partials/settings_panel.dust @@ -0,0 +1,239 @@ +{! Settings panel !} +
    +
    + + {! Close button !} + + + {! Panel header !} +
    +

    {@i18n term="post_settings"/}

    +
    + + {! Panel body !} +
    + {! Tabs !} + + + {! Tab panes !} +
    + {! Settings !} +
    + {! Slug !} +
    + + +
    + +
    + {! Date !} +
    +
    + + +
    +
    + + {! Time !} +
    +
    + + +
    +
    +
    + + {! Template !} +
    + + +
    + + {! Tags !} +
    + + +
    + +
    + {! Status !} +
    +
    + + +
    +
    + + {! Author !} + {@in key=User.role value="owner,admin,editor"} + {! Owners/admins/editors can assign posts to anyone !} +
    +
    + + +
    +
    + {:else} + {! Contributors can only assign posts to themselves !} + + {/in} +
    + + {! Flags !} +
    + {! Featured !} + {@htmlCheckbox name="is-featured" id="is-featured" value="1" checked=post.isFeatured} + {@i18n term="featured"/} + + {@i18n term="featured_posts_are_given_special_attention_by_your_theme"/} + + {/htmlCheckbox} + + {! Sticky !} + {@htmlCheckbox name="is-sticky" id="is-sticky" value="1" checked=post.isSticky} + {@i18n term="sticky"/} + + {@i18n term="sticky_posts_show_up_first_in_your_blog_index"/} + + {/htmlCheckbox} + + {! Page !} + {@htmlCheckbox name="is-page" id="is-page" value="1" checked=post.isPage} + {@i18n term="page"/} + + {@i18n term="pages_dont_show_up_in_the_blog_index"/} + + {/htmlCheckbox} +
    +
    + + {! Metadata !} +
    + {! Meta title !} +
    + + +
    + + {! Meta description !} +
    + + +
    + + {! Post image !} +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +
    + + {! Preview !} +
    + +
    +
    {post.title}
    +
    + {@url type="post" slug="" absolute="true"/}{post.slug} +
    +
    +
    +

    + {@i18n term="this_is_how_search_engines_might_display_your_content"/} +

    +
    +
    + + {! Revisions !} +
    + {! Dynamically loaded !} +
    +
    + + + + {! Allow forms to be submitted with ENTER !} + +
    +
    +
    diff --git a/source/views/partials/shortcuts.dust b/source/views/partials/shortcuts.dust new file mode 100644 index 0000000..d363cfa --- /dev/null +++ b/source/views/partials/shortcuts.dust @@ -0,0 +1,101 @@ + + diff --git a/source/views/partials/tag_cards.dust b/source/views/partials/tag_cards.dust new file mode 100644 index 0000000..45fae39 --- /dev/null +++ b/source/views/partials/tag_cards.dust @@ -0,0 +1,28 @@ +{#tags} +
    +
    +
    +
    +
    +
    +
    + + {@postCount tag=slug/} + +

    {name}

    +

    + {@truncateWords text="{description|markdownToText}" chars="50"/} +

    +
    +
    +
    +{/tags} diff --git a/source/views/partials/theme_toolbar.dust b/source/views/partials/theme_toolbar.dust new file mode 100644 index 0000000..c84060d --- /dev/null +++ b/source/views/partials/theme_toolbar.dust @@ -0,0 +1,35 @@ +
    + {! Dashboard !} + + + + + {! New post!} + + + + + {! Only show edit buttons to owners/admins/editors !} + {@in key=User.role value="owner,admin,editor"} + {! Edit post !} + {?post} + + + + {/post} + + {! Edit tag !} + {?tag} + + + + {/tag} + + {! Edit author !} + {?author} + + + + {/author} + {/in} +
    diff --git a/source/views/partials/user_cards.dust b/source/views/partials/user_cards.dust new file mode 100644 index 0000000..84e2fa7 --- /dev/null +++ b/source/views/partials/user_cards.dust @@ -0,0 +1,45 @@ +{#users} +
    +
    +
    +
    +
    + {?avatar} +
    + {name} +
    + {/avatar} +
    +
    + + {@postCount author=username/} + +

    {name}

    +

    + {@select key=role} + {@eq value="owner"}{@i18n term="owner"/}{/eq} + {@eq value="admin"}{@i18n term="administrator"/}{/eq} + {@eq value="editor"}{@i18n term="editor"/}{/eq} + {@eq value="contributor"}{@i18n term="contributor"/}{/eq} + {/select} +

    +
    +
    +
    +{/users} diff --git a/source/views/posts.dust b/source/views/posts.dust new file mode 100644 index 0000000..5ce4e6b --- /dev/null +++ b/source/views/posts.dust @@ -0,0 +1,175 @@ +{>"layout"/} + +{! Header !} +{ +
    +
    + + {! Filter !} +
    + + +
    +
    +
    +
    +
    + {! Open !} + + + {! Edit !} + + + {! Delete !} + +
    + + {! New post !} + + {@i18n term="new_post"/} + +
    + +{/header} + +{! Body !} +{ +
    + + {! Posts !} +
    +
    + {>"partials/post_items"/} +
    + + {! Empty !} + +
    + + {! Preview !} +
    + {! No posts selected !} +
    +
    +
    + {@i18n term="no_posts_selected"/} +
    +
    +
    + + {! Many selected !} + + + {! Preview frame !} + +
    + +
    + +{/body} diff --git a/source/views/quick_post.dust b/source/views/quick_post.dust new file mode 100644 index 0000000..9626881 --- /dev/null +++ b/source/views/quick_post.dust @@ -0,0 +1,89 @@ +{>"layout"/} + +{! No header for this page !} +{ + +
    +
    +
    +
    +
    + {! Title !} +
    + +
    + + {! Template !} +
    + {?templates} + + {/templates} +
    +
    +
    + + {! Content !} +
    + +
    + + + + {! Mobile tip !} +

    + {@i18n term="post_things_faster_by_adding_this_page_to_your_device"/} +

    + + {! Hidden fields !} + + + + + +
    +
    +
    + + +{/body} diff --git a/source/views/recover_password.dust b/source/views/recover_password.dust new file mode 100644 index 0000000..c920682 --- /dev/null +++ b/source/views/recover_password.dust @@ -0,0 +1,42 @@ +{>"layout"/} + +{! No nav for this page !} +{ + {! Logo !} + + + {! Recover form !} +
    + {! Username !} +
    + + +
    + + {! Submit button !} +
    + + {@i18n term="cancel"/} +
    +
    + + {! Site meta !} +

    + {Settings.title} +

    + +{/body} + +{! No panels for this page !} +{"layout"/} + +{! No nav for this page !} +{ + {! Logo !} + + + {! Reset form !} +
    + {! New password !} +
    + +
    + + + + +
    +
    + + {! Submit button !} +
    + + + + {@i18n term="cancel"/} +
    +
    + + {! Site meta !} +

    + {Settings.title} +

    + +{/body} + +{! No panels for this page !} +{"layout"/} + +{! Header !} +{ +
    +

    {meta.title}

    +
    +
    + +
    + +{/header} + +{! Body !} +{ + {! Sidebar !} + + + {! Main content !} +
    + {! Website !} +
    +
    +
    + {! Title !} +
    + + +
    + + {! Tagline !} +
    + + +
    + + {! Custom homepage and posts per page !} +
    + {! Custom homepage !} +
    +
    + + +
    +
    + + {! Posts per page !} +
    +
    + + +
    +
    +
    + + {! Cover photo !} +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +

    + {@i18n term="cover_images_are_used_by_themes_to_provide_a_unique_visual_experience"/} +

    +
    + + {! Logo and website icon !} +
    + {! Logo !} +
    +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +

    + {@i18n term="logos_are_often_displayed_on_your_website"/} +

    +
    +
    + + {! Website icon !} +
    +
    + +
    + {! Hidden input !} + +
    +
    + {! Upload !} + + + {! Browse !} + + + {! Remove !} + +
    +
    +
    +

    + {@i18n term="website_icons_are_displayed_in_browser_tabs_and_bookmarks"/} +

    +
    +
    +
    + +
    +
    +
    + + {! Theme !} +
    + +
    + {#themes} +
    +
    +
    +
    +
    +
    + + {version} + +

    {name}

    +

    {author}

    + {?organization} +

    {organization}

    + {/organization} +

    {description}

    +
    +
    +
    + {/themes} +
    +
    + + {! Preferences !} +
    +
    +
    + +

    {@i18n term="locale"/}

    + + {! Language !} +
    + + +
    + + {! Time Zone !} +
    + + +
    + +
    +
    +
    + + {! Backups !} +
    +
    +
    + + {! Create a backup !} +

    {@i18n term="backups"/}

    +

    + {@i18n term="postleaf_can_backup_your_data_to_a_single_file"/} +

    +
    + {@htmlCheckbox value="data" checked="true"}{@i18n term="data"/}{/htmlCheckbox} + {@htmlCheckbox value="themes" checked="true"}{@i18n term="themes"/}{/htmlCheckbox} + {@htmlCheckbox value="uploads" checked="true"}{@i18n term="uploads"/}{/htmlCheckbox} +
    +
    + {! Download backup !} + +
    + + {! Restore from backup !} +

    {@i18n term="restore_from_backup"/}

    +

    + {@i18n term="upload_a_backup_file_to_restore_your_website"/} +

    +
    + {! Upload and restore !} + +
    + +
    +
    +
    + + {! Advanced !} +
    +
    +
    + + {! Editor !} +

    {@i18n term="editor"/}

    + + {! Default post title !} +
    + + +
    + + {! Default post content !} +
    + + {@i18n term="markdown"/} + +
    + + {! Custom Code !} +

    {@i18n term="custom_code"/}

    + + {! Head code !} +
    + + {@i18n term="html"/} + +

    + {@i18n term="this_code_will_be_injected_into_every_page_by_the_[helper]_helper" helper="{@head/}" allowHtml="true"/} +

    +
    + + {! Foot code !} +
    + + {@i18n term="html"/} + +

    + {@i18n term="this_code_will_be_injected_into_every_page_by_the_[helper]_helper" helper="{@foot/}" allowHtml="true"/} +

    +
    + +
    +
    +
    + + {! About !} +
    +
    +
    + {! Postleaf logo !} +

    + Postleaf®® +

    +

    + Postleaf is a simple, beautiful, decentralized publishing platform that anyone can + use. It's free, open source, and built for the modern publisher. +

    +

    + This software is the result of many years of development by creator and maintainer + Cory LaViska. It was built + for the greater good, so please do good things with it. +

    +

    + Here are some links you might find useful: +

    + + {! Links !} + + + + + + + + + + + + + + + + + + + + + + + +
    + + postleaf.org + + +
      +
    • Product info
    • +
    • News and updates
    • +
    +
    + + github.com/postleaf + + +
      +
    • Source code
    • +
    • Bug reports
    • +
    • Feature requests
    • +
    +
    + + community.postleaf.org + + +
      +
    • General discussion
    • +
    • Community support
    • +
    • Troubleshooting
    • +
    +
    + + twitter.com/postleafapp + + +
      +
    • News and updates
    • +
    • Developer rants
    • +
    +
    + + paypal.me/abeautifulsite + + +
      +
    • Donate to the project
    • +
    • Support future development
    • +
    +
    + + {! Trademark and business info !} +

    + + “Postleaf” and the Postleaf logo are registered tradmarks of A Beautiful Site, LLC, + a service-disabled veteran-owned business based in Central Florida. You should never + have to pay for this software. + +

    + + {! Always do good !} +

    + + Always do good. Build amazing things. Go forth and create! + +

    + + {! Version !} +

    + + Postleaf version {@postleafVersion/} + +

    +
    +
    +
    + + {! Hidden button so ENTER will trigger form submits !} + +
    + +{/body} diff --git a/source/views/tags.dust b/source/views/tags.dust new file mode 100644 index 0000000..7ccbb6d --- /dev/null +++ b/source/views/tags.dust @@ -0,0 +1,78 @@ +{>"layout"/} + +{! Header !} +{ +
    + +
    +
    +
    + {! Open !} + + + {! Edit !} + + + {! Delete !} + +
    + + {! New tag !} + + {@i18n term="new_tag"/} + +
    + +{/header} + +{! Body !} +{ + + {! Tags !} +
    + {>"partials/tag_cards"/} +
    + + {! Empty !} + + + +{/body} diff --git a/source/views/users.dust b/source/views/users.dust new file mode 100644 index 0000000..0fc82b3 --- /dev/null +++ b/source/views/users.dust @@ -0,0 +1,78 @@ +{>"layout"/} + +{! Header !} +{ +
    + +
    +
    +
    + {! Open !} + + + {! Edit !} + + + {! Delete !} + +
    + + {! New user !} + + {@i18n term="new_user"/} + +
    + +{/header} + +{! Body !} +{ + + {! Users !} +
    + {>"partials/user_cards"/} +
    + + {! Empty !} + + + +{/body} diff --git a/source/views/zen_mode.dust b/source/views/zen_mode.dust new file mode 100644 index 0000000..f64e460 --- /dev/null +++ b/source/views/zen_mode.dust @@ -0,0 +1,21 @@ + + + + + {post.metaTitle} + + + + {@head/} + + + {#post} +
    +

    {@title editable="true"/}

    +
    {@content editable="true"/}
    +
    + {/post} + + {@foot/} + +