├── .gitignore ├── README.md ├── client ├── .browserslistrc ├── .env ├── .eslintrc.js ├── README.md ├── babel.config.js ├── dist │ ├── assets │ │ ├── demo │ │ │ ├── chart-area-demo.js │ │ │ ├── chart-bar-demo.js │ │ │ └── chart-pie-demo.js │ │ ├── fonts │ │ │ └── metropolis │ │ │ │ ├── Metropolis-Black.otf │ │ │ │ ├── Metropolis-BlackItalic.otf │ │ │ │ ├── Metropolis-Bold.otf │ │ │ │ ├── Metropolis-BoldItalic.otf │ │ │ │ ├── Metropolis-ExtraBold.otf │ │ │ │ ├── Metropolis-ExtraBoldItalic.otf │ │ │ │ ├── Metropolis-ExtraLight.otf │ │ │ │ ├── Metropolis-ExtraLightItalic.otf │ │ │ │ ├── Metropolis-Light.otf │ │ │ │ ├── Metropolis-LightItalic.otf │ │ │ │ ├── Metropolis-Medium.otf │ │ │ │ ├── Metropolis-MediumItalic.otf │ │ │ │ ├── Metropolis-Regular.otf │ │ │ │ ├── Metropolis-RegularItalic.otf │ │ │ │ ├── Metropolis-SemiBold.otf │ │ │ │ ├── Metropolis-SemiBoldItalic.otf │ │ │ │ ├── Metropolis-Thin.otf │ │ │ │ ├── Metropolis-ThinItalic.otf │ │ │ │ └── SIL Open Font License.txt │ │ └── img │ │ │ ├── 404.svg │ │ │ ├── backgrounds │ │ │ ├── bg-angles.svg │ │ │ ├── bg-pattern-shapes.png │ │ │ └── bg-waves.svg │ │ │ ├── demo │ │ │ ├── cards │ │ │ │ ├── card-img-bottom.jpg │ │ │ │ ├── card-img-left.jpg │ │ │ │ ├── card-img-overlay.jpg │ │ │ │ ├── card-img-right.jpg │ │ │ │ └── card-img-top.jpg │ │ │ ├── demo-logo.svg │ │ │ ├── demo-ocean-lg.jpg │ │ │ ├── demo-ocean-sm.jpg │ │ │ ├── pug.svg │ │ │ └── user-placeholder.svg │ │ │ ├── favicon.png │ │ │ ├── heart_animation.png │ │ │ ├── illustrations │ │ │ ├── 400-error-bad-request.svg │ │ │ ├── 401-error-unauthorized.svg │ │ │ ├── 403-error-forbidden.svg │ │ │ ├── 404-error-with-a-cute-animal.svg │ │ │ ├── 404-error.svg │ │ │ ├── 500-internal-server-error.svg │ │ │ ├── 503-error-service-unavailable.svg │ │ │ ├── 504-error-gateway-timeout.svg │ │ │ ├── CREDITS.md │ │ │ ├── at-work.svg │ │ │ ├── browser-stats.svg │ │ │ ├── data-report.svg │ │ │ ├── problem-solving.svg │ │ │ ├── processing.svg │ │ │ ├── profiles │ │ │ │ ├── profile-1.png │ │ │ │ ├── profile-2.png │ │ │ │ ├── profile-3.png │ │ │ │ ├── profile-4.png │ │ │ │ ├── profile-5.png │ │ │ │ └── profile-6.png │ │ │ ├── statistics.svg │ │ │ ├── team-spirit.svg │ │ │ └── windows.svg │ │ │ ├── logo.png │ │ │ └── logo2.png │ ├── css │ │ ├── app.b0d4ddc6.css │ │ ├── chunk-vendors.bf3b53a4.css │ │ ├── style.css │ │ └── styles.css │ ├── favicon.ico │ ├── img │ │ └── icons │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── android-chrome-maskable-192x192.png │ │ │ ├── android-chrome-maskable-512x512.png │ │ │ ├── apple-touch-icon-120x120.png │ │ │ ├── apple-touch-icon-152x152.png │ │ │ ├── apple-touch-icon-180x180.png │ │ │ ├── apple-touch-icon-60x60.png │ │ │ ├── apple-touch-icon-76x76.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── msapplication-icon-144x144.png │ │ │ ├── mstile-150x150.png │ │ │ └── safari-pinned-tab.svg │ ├── index.html │ ├── js │ │ ├── app.625fbd3c.js │ │ ├── app.625fbd3c.js.map │ │ ├── chunk-vendors.64b6268c.js │ │ ├── chunk-vendors.64b6268c.js.map │ │ ├── datatables │ │ │ └── datatables-simple-demo.js │ │ ├── litepicker.js │ │ ├── markdown.js │ │ ├── scripts.js │ │ └── toasts.js │ ├── manifest.json │ ├── offline.html │ ├── robots.txt │ ├── service-worker.js │ ├── service-worker.js.map │ ├── workbox-79ffe3e0.js │ ├── workbox-79ffe3e0.js.map │ └── worker.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── public │ ├── assets │ │ ├── demo │ │ │ ├── chart-area-demo.js │ │ │ ├── chart-bar-demo.js │ │ │ └── chart-pie-demo.js │ │ ├── fonts │ │ │ └── metropolis │ │ │ │ ├── Metropolis-Black.otf │ │ │ │ ├── Metropolis-BlackItalic.otf │ │ │ │ ├── Metropolis-Bold.otf │ │ │ │ ├── Metropolis-BoldItalic.otf │ │ │ │ ├── Metropolis-ExtraBold.otf │ │ │ │ ├── Metropolis-ExtraBoldItalic.otf │ │ │ │ ├── Metropolis-ExtraLight.otf │ │ │ │ ├── Metropolis-ExtraLightItalic.otf │ │ │ │ ├── Metropolis-Light.otf │ │ │ │ ├── Metropolis-LightItalic.otf │ │ │ │ ├── Metropolis-Medium.otf │ │ │ │ ├── Metropolis-MediumItalic.otf │ │ │ │ ├── Metropolis-Regular.otf │ │ │ │ ├── Metropolis-RegularItalic.otf │ │ │ │ ├── Metropolis-SemiBold.otf │ │ │ │ ├── Metropolis-SemiBoldItalic.otf │ │ │ │ ├── Metropolis-Thin.otf │ │ │ │ ├── Metropolis-ThinItalic.otf │ │ │ │ └── SIL Open Font License.txt │ │ └── img │ │ │ ├── 404.svg │ │ │ ├── backgrounds │ │ │ ├── bg-angles.svg │ │ │ ├── bg-pattern-shapes.png │ │ │ └── bg-waves.svg │ │ │ ├── demo │ │ │ ├── cards │ │ │ │ ├── card-img-bottom.jpg │ │ │ │ ├── card-img-left.jpg │ │ │ │ ├── card-img-overlay.jpg │ │ │ │ ├── card-img-right.jpg │ │ │ │ └── card-img-top.jpg │ │ │ ├── demo-logo.svg │ │ │ ├── demo-ocean-lg.jpg │ │ │ ├── demo-ocean-sm.jpg │ │ │ ├── pug.svg │ │ │ └── user-placeholder.svg │ │ │ ├── favicon.png │ │ │ ├── heart_animation.png │ │ │ ├── illustrations │ │ │ ├── 400-error-bad-request.svg │ │ │ ├── 401-error-unauthorized.svg │ │ │ ├── 403-error-forbidden.svg │ │ │ ├── 404-error-with-a-cute-animal.svg │ │ │ ├── 404-error.svg │ │ │ ├── 500-internal-server-error.svg │ │ │ ├── 503-error-service-unavailable.svg │ │ │ ├── 504-error-gateway-timeout.svg │ │ │ ├── CREDITS.md │ │ │ ├── at-work.svg │ │ │ ├── browser-stats.svg │ │ │ ├── data-report.svg │ │ │ ├── problem-solving.svg │ │ │ ├── processing.svg │ │ │ ├── profiles │ │ │ │ ├── profile-1.png │ │ │ │ ├── profile-2.png │ │ │ │ ├── profile-3.png │ │ │ │ ├── profile-4.png │ │ │ │ ├── profile-5.png │ │ │ │ └── profile-6.png │ │ │ ├── statistics.svg │ │ │ ├── team-spirit.svg │ │ │ └── windows.svg │ │ │ ├── logo.png │ │ │ └── logo2.png │ ├── css │ │ ├── style.css │ │ └── styles.css │ ├── favicon.ico │ ├── img │ │ └── icons │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── android-chrome-maskable-192x192.png │ │ │ ├── android-chrome-maskable-512x512.png │ │ │ ├── apple-touch-icon-120x120.png │ │ │ ├── apple-touch-icon-152x152.png │ │ │ ├── apple-touch-icon-180x180.png │ │ │ ├── apple-touch-icon-60x60.png │ │ │ ├── apple-touch-icon-76x76.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── msapplication-icon-144x144.png │ │ │ ├── mstile-150x150.png │ │ │ └── safari-pinned-tab.svg │ ├── index.html │ ├── js │ │ ├── datatables │ │ │ └── datatables-simple-demo.js │ │ ├── litepicker.js │ │ ├── markdown.js │ │ ├── scripts.js │ │ └── toasts.js │ ├── offline.html │ ├── robots.txt │ └── worker.js ├── src │ ├── App.vue │ ├── components │ │ └── HomeComponent.vue │ ├── functions.js │ ├── i18n.js │ ├── locales │ │ └── tr.json │ ├── main.js │ ├── registerServiceWorker.js │ ├── router │ │ └── index.js │ ├── services │ │ ├── admin.service.js │ │ ├── api.service.js │ │ ├── authentication.service.js │ │ ├── db.service.js │ │ ├── main.service.js │ │ ├── panel.service.js │ │ ├── site.service.js │ │ └── storage.service.js │ ├── store │ │ └── index.js │ └── views │ │ ├── Admin │ │ ├── EditTabs │ │ │ ├── ApiTab.vue │ │ │ ├── GeneralTab.vue │ │ │ ├── MailTab.vue │ │ │ ├── SeoTab.vue │ │ │ └── SiteTab.vue │ │ ├── GroupView.vue │ │ ├── MenuView.vue │ │ ├── ReportView.vue │ │ ├── RoleView.vue │ │ ├── SettingsView.vue │ │ └── UserView.vue │ │ ├── Panel │ │ ├── Authentication │ │ │ ├── ForgotPasswordView.vue │ │ │ ├── LoginView.vue │ │ │ ├── RegisterView.vue │ │ │ └── ResetPasswordView.vue │ │ ├── Blog │ │ │ ├── AddView.vue │ │ │ ├── EditView.vue │ │ │ └── ListView.vue │ │ ├── DashboardView.vue │ │ └── User │ │ │ ├── EditTabs │ │ │ ├── BillingTab.vue │ │ │ ├── NotificationsTab.vue │ │ │ ├── ProfileTab.vue │ │ │ └── SecurityTab.vue │ │ │ └── EditView.vue │ │ ├── Site │ │ ├── Blog │ │ │ ├── AddView.vue │ │ │ └── IndexView.vue │ │ ├── ErrorView.vue │ │ ├── HomeView.vue │ │ ├── ProfileView.vue │ │ └── Tag │ │ │ ├── IndexView.vue │ │ │ └── ListView.vue │ │ └── Templates │ │ ├── AuthenticationTemplate.vue │ │ ├── PanelTemplate.vue │ │ └── SiteTemplate.vue └── vue.config.js ├── screenshots ├── 1.png ├── 10.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png ├── 9.png └── text └── server ├── .env ├── app.js ├── configs ├── database.config.js └── loggers │ ├── system.logger.js │ └── user.logger.js ├── controllers ├── admin.controller.js ├── authentication.controller.js ├── feed.controller.js ├── main.controller.js ├── panel.controller.js ├── site.controller.js └── sitemap.controller.js ├── log ├── system │ ├── .0521975b2d7046bdc01aa55b15e8c95a3756e9f0-audit.json │ ├── .095257b99fa65c7014911e6b95759395920f26dc-audit.json │ ├── .410d22ff0ad82247cbde49515d7a73455e133389-audit.json │ ├── .81cbf2ee9613ae7423e921db8707044548ba70a7-audit.json │ ├── .9fd1769ee3492c93eaebb4dd7f37625dec8d1f58-audit.json │ ├── .c523672ed86b928201866292010907d7fd27f0b7-audit.json │ ├── 2022-09-10-15-results.log │ ├── 2022-09-10-16-results.log │ ├── 2022-09-10-results.log │ ├── 2022-09-11-results.log │ ├── 2022-09-12-results.log │ ├── 2022-09-13-results.log │ ├── 2022-09-14-results.log │ ├── 2022-09-15-results.log │ ├── 2022-09-16-results.log │ ├── 2022-09-17-results.log │ ├── 2022-09-18-results.log │ ├── 2022-09-19-results.log │ ├── 2022-09-20-results.log │ ├── 2022-09-21-results.log │ ├── 2022-09-22-results.log │ ├── 2022-09-23-results.log │ ├── 2022-09-24-results.log │ ├── 2022-09-25-results.log │ ├── 2022-09-26-results.log │ ├── 2022-09-28-results.log │ ├── 2022-09-29-results.log │ ├── 2022-09-30-results.log │ ├── 2022-10-01-results.log │ └── 2022-10-results.log └── user │ ├── 631c9141dbb3b21df9108004 │ ├── .79436d5b4fa426e8c4a4b39f5026faec57d0351b-audit.json │ └── 2022-09-10-results.log │ ├── 631c923a635d77b8036effa6 │ ├── .2eaf85e2f82f2af2bf086ec6e3d2826639feedb1-audit.json │ └── 2022-09-10-results.log │ ├── 631c926214afd56a2743be81 │ ├── .6b80d536bf99d2119eafce146809545c1e645f37-audit.json │ └── 2022-09-10-results.log │ ├── 631c95c909c237d8349f8d06 │ ├── .3ee627f8edb738c5cc9244aa7ea2924b7cfbd13c-audit.json │ ├── .9a75b3a9054ad2930124d0a2630d41ae4d2a5ab1-audit.json │ ├── .c073fbb6f1a29297f993c1f3300e9bbe51b0c138-audit.json │ ├── 2022-09-10-results.log │ ├── 2022-09-11-results.log │ ├── 2022-09-12-results.log │ ├── 2022-09-13-results.log │ ├── 2022-09-14-results.log │ ├── 2022-09-15-results.log │ ├── 2022-09-16-results.log │ ├── 2022-09-17-results.log │ ├── 2022-09-18-results.log │ ├── 2022-09-19-results.log │ ├── 2022-09-20-results.log │ ├── 2022-09-21-results.log │ ├── 2022-09-22-results.log │ ├── 2022-09-23-results.log │ ├── 2022-09-24-results.log │ ├── 2022-09-25-results.log │ ├── 2022-09-26-results.log │ ├── 2022-09-28-results.log │ ├── 2022-09-29-results.log │ ├── 2022-09-30-results.log │ └── 2022-10-results.log │ ├── 6326e3d77f54899fac644e4e │ ├── .f3408afa72ab48210fcde276f78808ba4a29123f-audit.json │ ├── 2022-09-18-results.log │ ├── 2022-09-24-results.log │ └── 2022-09-25-results.log │ ├── 632e7fc49f95b1f517887ada │ ├── .24d4dd9fa1b2c596559aeed84342b607b8e957cb-audit.json │ └── 2022-09-24-results.log │ ├── 63302785e6dcd3299f7ed86e │ ├── .6d7f66e55954e70dbb34a3f3b9dcb4e84ef7c95b-audit.json │ └── 2022-09-25-results.log │ └── 633028ee056d37f20fb826af │ ├── .0aa72b9bd6bdbc7aefe9f7cb18585b3350b6c6b6-audit.json │ └── 2022-09-25-results.log ├── middlewares ├── can.middleware.js └── guard.middleware.js ├── models ├── blog.model.js ├── comment.model.js ├── follow.model.js ├── group.model.js ├── menu.model.js ├── redirect.model.js ├── report.model.js ├── role.model.js ├── settings.model.js ├── tag.model.js └── user.model.js ├── package-lock.json ├── package.json ├── public ├── email_favicon.png ├── email_logo.png ├── email_logo.svg ├── favicon.png ├── favicon.svg ├── logo.png └── user │ ├── 631c95c909c237d8349f8d06.png │ └── 6326e3d77f54899fac644e4e.png ├── routes ├── admin.routes.js ├── authentication.routes.js ├── feed.routes.js ├── main.routes.js ├── panel.routes.js ├── site.routes.js └── sitemap.routes.js ├── services ├── aws.service.js ├── cache.service.js ├── cronjob.service.js ├── drive.service.js ├── index.service.js ├── logger.service.js ├── notification.service.js ├── recommendation.service.js ├── upload.service.js └── validator.service.js └── templates ├── comment-replied.html ├── failed-login-attempt.html ├── forgot-password.html └── verify-email.html /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | client/node_modules 3 | server/node_modules 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /client/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | not ie 11 5 | -------------------------------------------------------------------------------- /client/.env: -------------------------------------------------------------------------------- 1 | VUE_APP_SERVER_URL = "http://127.0.0.1:8081/api/" -------------------------------------------------------------------------------- /client/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/vue3-essential', 8 | 'eslint:recommended' 9 | ], 10 | parserOptions: { 11 | parser: '@babel/eslint-parser' 12 | }, 13 | rules: { 14 | 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 15 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # client 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | npm run lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /client/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /client/dist/assets/demo/chart-pie-demo.js: -------------------------------------------------------------------------------- 1 | // Set new default font family and font color to mimic Bootstrap's default styling 2 | (Chart.defaults.global.defaultFontFamily = "Metropolis"), 3 | '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; 4 | Chart.defaults.global.defaultFontColor = "#858796"; 5 | 6 | // Pie Chart Example 7 | var ctx = document.getElementById("myPieChart"); 8 | var myPieChart = new Chart(ctx, { 9 | type: "doughnut", 10 | data: { 11 | labels: ["Direct", "Referral", "Social"], 12 | datasets: [{ 13 | data: [55, 30, 15], 14 | backgroundColor: [ 15 | "rgba(0, 97, 242, 1)", 16 | "rgba(0, 172, 105, 1)", 17 | "rgba(88, 0, 232, 1)" 18 | ], 19 | hoverBackgroundColor: [ 20 | "rgba(0, 97, 242, 0.9)", 21 | "rgba(0, 172, 105, 0.9)", 22 | "rgba(88, 0, 232, 0.9)" 23 | ], 24 | hoverBorderColor: "rgba(234, 236, 244, 1)" 25 | }] 26 | }, 27 | options: { 28 | maintainAspectRatio: false, 29 | tooltips: { 30 | backgroundColor: "rgb(255,255,255)", 31 | bodyFontColor: "#858796", 32 | borderColor: "#dddfeb", 33 | borderWidth: 1, 34 | xPadding: 15, 35 | yPadding: 15, 36 | displayColors: false, 37 | caretPadding: 10 38 | }, 39 | legend: { 40 | display: false 41 | }, 42 | cutoutPercentage: 80 43 | } 44 | }); 45 | -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-Black.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-BlackItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-Bold.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-BoldItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-ExtraBold.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-ExtraBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-ExtraBoldItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-ExtraLight.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-ExtraLightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-ExtraLightItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-Light.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-LightItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-Medium.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-MediumItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-Regular.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-RegularItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-RegularItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-SemiBold.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-SemiBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-SemiBoldItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-Thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-Thin.otf -------------------------------------------------------------------------------- /client/dist/assets/fonts/metropolis/Metropolis-ThinItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/fonts/metropolis/Metropolis-ThinItalic.otf -------------------------------------------------------------------------------- /client/dist/assets/img/backgrounds/bg-angles.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /client/dist/assets/img/backgrounds/bg-pattern-shapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/backgrounds/bg-pattern-shapes.png -------------------------------------------------------------------------------- /client/dist/assets/img/backgrounds/bg-waves.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /client/dist/assets/img/demo/cards/card-img-bottom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/cards/card-img-bottom.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/cards/card-img-left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/cards/card-img-left.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/cards/card-img-overlay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/cards/card-img-overlay.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/cards/card-img-right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/cards/card-img-right.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/cards/card-img-top.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/cards/card-img-top.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/demo-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/dist/assets/img/demo/demo-ocean-lg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/demo-ocean-lg.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/demo-ocean-sm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/demo/demo-ocean-sm.jpg -------------------------------------------------------------------------------- /client/dist/assets/img/demo/user-placeholder.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/dist/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/favicon.png -------------------------------------------------------------------------------- /client/dist/assets/img/heart_animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/heart_animation.png -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/CREDITS.md: -------------------------------------------------------------------------------- 1 | # Illustration Credits 2 | 3 | The illustrations in this directory are sourced 4 | from Stories by Freepik. 5 | 6 | Freepik offers hundreds of free, high quality 7 | illustrations you can use in your projects. You 8 | can view them all here: 9 | 10 | 11 | 12 | Make sure to view their licensing terms to make 13 | sure you are attributing the image authors 14 | correctly when using their assets. 15 | -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/profiles/profile-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/illustrations/profiles/profile-1.png -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/profiles/profile-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/illustrations/profiles/profile-2.png -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/profiles/profile-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/illustrations/profiles/profile-3.png -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/profiles/profile-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/illustrations/profiles/profile-4.png -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/profiles/profile-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/illustrations/profiles/profile-5.png -------------------------------------------------------------------------------- /client/dist/assets/img/illustrations/profiles/profile-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/illustrations/profiles/profile-6.png -------------------------------------------------------------------------------- /client/dist/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/logo.png -------------------------------------------------------------------------------- /client/dist/assets/img/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/assets/img/logo2.png -------------------------------------------------------------------------------- /client/dist/css/app.b0d4ddc6.css: -------------------------------------------------------------------------------- 1 | #oopss[data-v-25341512]{background:linear-gradient(-45deg,#fff300,#efe400);position:fixed;left:0;top:0;width:100%;height:100%;line-height:1.5em;z-index:9999}#oopss #error-text[data-v-25341512]{font-size:40px;display:flex;flex-direction:column;align-items:center;font-family:Tahoma,sans-serif;color:#000}#oopss #error-text img[data-v-25341512]{margin:85px auto 20px;height:342px}#oopss #error-text span[data-v-25341512]{position:relative;font-size:3.3em;font-weight:900;margin-bottom:50px}#oopss #error-text .back[data-v-25341512]{background:#fff;color:#000;font-size:30px;text-decoration:none;margin:2em auto 0;padding:.7em 2em;border-radius:500px;box-shadow:0 20px 70px 4px rgba(0,0,0,.1),inset 7px 33px 0 0 #fff300;font-weight:900;transition:all .3s ease}#oopss #error-text .back[data-v-25341512]:hover{transform:translateY(-13px);box-shadow:0 35px 90px 4px rgba(0,0,0,.3),inset 0 0 0 3px #000}img[data-v-0863f2a4]{height:100px}.col-md-8[data-v-0863f2a4]{height:600px;overflow-y:auto;overflow-x:hidden} -------------------------------------------------------------------------------- /client/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/favicon.ico -------------------------------------------------------------------------------- /client/dist/img/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /client/dist/img/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /client/dist/img/icons/android-chrome-maskable-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/android-chrome-maskable-192x192.png -------------------------------------------------------------------------------- /client/dist/img/icons/android-chrome-maskable-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/android-chrome-maskable-512x512.png -------------------------------------------------------------------------------- /client/dist/img/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /client/dist/img/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /client/dist/img/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /client/dist/img/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /client/dist/img/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /client/dist/img/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /client/dist/img/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/favicon-16x16.png -------------------------------------------------------------------------------- /client/dist/img/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/favicon-32x32.png -------------------------------------------------------------------------------- /client/dist/img/icons/msapplication-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/msapplication-icon-144x144.png -------------------------------------------------------------------------------- /client/dist/img/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/dist/img/icons/mstile-150x150.png -------------------------------------------------------------------------------- /client/dist/img/icons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /client/dist/index.html: -------------------------------------------------------------------------------- 1 |
-------------------------------------------------------------------------------- /client/dist/js/datatables/datatables-simple-demo.js: -------------------------------------------------------------------------------- 1 | window.addEventListener('DOMContentLoaded', event => { 2 | // Simple-DataTables 3 | // https://github.com/fiduswriter/Simple-DataTables/wiki 4 | 5 | const datatablesSimple = document.getElementById('datatablesSimple'); 6 | if (datatablesSimple) { 7 | new simpleDatatables.DataTable(datatablesSimple); 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /client/dist/js/litepicker.js: -------------------------------------------------------------------------------- 1 | // Litepicker 2 | // 3 | // The date pickers in Material Admin Pro 4 | // are powered by the Litepicker plugin. 5 | // Litepicker is a lightweight, no dependencies 6 | // date picker that allows for date ranges 7 | // and other options. For more usage details 8 | // visit the Litepicker docs. 9 | // 10 | // Litepicker Documentation 11 | // https://wakirin.github.io/Litepicker 12 | 13 | window.addEventListener('DOMContentLoaded', event => { 14 | 15 | const litepickerSingleDate = document.getElementById('litepickerSingleDate'); 16 | if (litepickerSingleDate) { 17 | new Litepicker({ 18 | element: litepickerSingleDate, 19 | format: 'MMM DD, YYYY' 20 | }); 21 | } 22 | 23 | const litepickerDateRange = document.getElementById('litepickerDateRange'); 24 | if (litepickerDateRange) { 25 | new Litepicker({ 26 | element: litepickerDateRange, 27 | singleMode: false, 28 | format: 'MMM DD, YYYY' 29 | }); 30 | } 31 | 32 | const litepickerDateRange2Months = document.getElementById('litepickerDateRange2Months'); 33 | if (litepickerDateRange2Months) { 34 | new Litepicker({ 35 | element: litepickerDateRange2Months, 36 | singleMode: false, 37 | numberOfMonths: 2, 38 | numberOfColumns: 2, 39 | format: 'MMM DD, YYYY' 40 | }); 41 | } 42 | 43 | const litepickerRangePlugin = document.getElementById('litepickerRangePlugin'); 44 | if (litepickerRangePlugin) { 45 | new Litepicker({ 46 | element: litepickerRangePlugin, 47 | startDate: new Date(), 48 | endDate: new Date(), 49 | singleMode: false, 50 | numberOfMonths: 2, 51 | numberOfColumns: 2, 52 | format: 'MMM DD, YYYY', 53 | plugins: ['ranges'] 54 | }); 55 | } 56 | }); 57 | -------------------------------------------------------------------------------- /client/dist/js/markdown.js: -------------------------------------------------------------------------------- 1 | var easyMDE = new EasyMDE({ 2 | element: document.getElementById('postEditor'), 3 | toolbar: ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', '|', 'preview', 'guide'] 4 | }); 5 | -------------------------------------------------------------------------------- /client/dist/js/toasts.js: -------------------------------------------------------------------------------- 1 | // For more details see: https://getbootstrap.com/docs/5.0/components/toasts/#usage 2 | 3 | window.addEventListener('DOMContentLoaded', event => { 4 | 5 | const toastBasicEl = document.getElementById('toastBasic'); 6 | const toastNoAutohideEl = document.getElementById('toastNoAutohide'); 7 | 8 | const toastBasic = new bootstrap.Toast(toastBasicEl); 9 | const toastNoAutohide = new bootstrap.Toast(toastNoAutohideEl); 10 | 11 | const toastBasicTrigger = document.getElementById('toastBasicTrigger'); 12 | if (toastBasicTrigger) { 13 | toastBasicTrigger.addEventListener('click', event => { 14 | console.log('asd'); 15 | toastBasic.show(); 16 | }); 17 | } 18 | 19 | const toastNoAutohideTrigger = document.getElementById('toastNoAutohideTrigger'); 20 | if (toastNoAutohideTrigger) { 21 | toastNoAutohideTrigger.addEventListener('click', event => { 22 | toastNoAutohide.show(); 23 | }); 24 | } 25 | 26 | }) 27 | -------------------------------------------------------------------------------- /client/dist/manifest.json: -------------------------------------------------------------------------------- 1 | {"name":"client","short_name":"client","theme_color":"#4DBA87","icons":[{"src":"./img/icons/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"./img/icons/android-chrome-512x512.png","sizes":"512x512","type":"image/png"},{"src":"./img/icons/android-chrome-maskable-192x192.png","sizes":"192x192","type":"image/png","purpose":"maskable"},{"src":"./img/icons/android-chrome-maskable-512x512.png","sizes":"512x512","type":"image/png","purpose":"maskable"}],"start_url":".","display":"standalone","background_color":"#000000"} -------------------------------------------------------------------------------- /client/dist/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /client/dist/worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015, 2019, 2020, 2021 Google LLC. All Rights Reserved. 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | http://www.apache.org/licenses/LICENSE-2.0 7 | Unless required by applicable law or agreed to in writing, software 8 | distributed under the License is distributed on an "AS IS" BASIS, 9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | See the License for the specific language governing permissions and 11 | limitations under the License. 12 | */ 13 | 14 | // Incrementing OFFLINE_VERSION will kick off the install event and force 15 | // previously cached resources to be updated from the network. 16 | // This variable is intentionally declared and unused. 17 | // Add a comment for your linter if you want: 18 | // eslint-disable-next-line no-unused-vars 19 | 20 | // Listen for the install event 21 | 22 | const OFFLINE_VERSION = 1 23 | const CACHE_NAME = "offline"; 24 | // Customize this with a different URL if needed. 25 | const OFFLINE_URL = "offline.html"; 26 | 27 | self.addEventListener("install", (event) => { 28 | event.waitUntil( 29 | (async () => { 30 | const cache = await caches.open(CACHE_NAME); 31 | // Setting {cache: 'reload'} in the new request ensures that the 32 | // response isn't fulfilled from the HTTP cache; i.e., it will be 33 | // from the network. 34 | await cache.add(new Request(OFFLINE_URL, { cache: "reload" })); 35 | })() 36 | ); 37 | // Force the waiting service worker to become the active service worker. 38 | self.skipWaiting(); 39 | }); 40 | 41 | self.addEventListener("activate", (event) => { 42 | event.waitUntil( 43 | (async () => { 44 | // Enable navigation preload if it's supported. 45 | // See https://developers.google.com/web/updates/2017/02/navigation-preload 46 | if ("navigationPreload" in self.registration) { 47 | await self.registration.navigationPreload.enable(); 48 | } 49 | })() 50 | ); 51 | 52 | // Tell the active service worker to take control of the page immediately. 53 | self.clients.claim(); 54 | }); 55 | 56 | self.addEventListener("fetch", (event) => { 57 | // Only call event.respondWith() if this is a navigation request 58 | // for an HTML page. 59 | if (event.request.mode === "navigate") { 60 | event.respondWith( 61 | (async () => { 62 | try { 63 | // First, try to use the navigation preload response if it's 64 | // supported. 65 | const preloadResponse = await event.preloadResponse; 66 | if (preloadResponse) { 67 | return preloadResponse; 68 | } 69 | 70 | // Always try the network first. 71 | const networkResponse = await fetch(event.request); 72 | return networkResponse; 73 | } catch (error) { 74 | // catch is only triggered if an exception is thrown, which is 75 | // likely due to a network error. 76 | // If fetch() returns a valid HTTP response with a response code in 77 | // the 4xx or 5xx range, the catch() will NOT be called. 78 | console.log("Fetch failed; returning offline page instead.", error); 79 | 80 | const cache = await caches.open(CACHE_NAME); 81 | const cachedResponse = await cache.match(OFFLINE_URL); 82 | return cachedResponse; 83 | } 84 | })() 85 | ); 86 | } 87 | 88 | // If our if() condition is false, then this fetch handler won't 89 | // intercept the request. If there are any other fetch handlers 90 | // registered, they will get a chance to call event.respondWith(). 91 | // If no fetch handlers call event.respondWith(), the request 92 | // will be handled by the browser as if there were no service 93 | // worker involvement. 94 | }); -------------------------------------------------------------------------------- /client/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "esnext", 5 | "baseUrl": "./", 6 | "moduleResolution": "node", 7 | "paths": { 8 | "@/*": [ 9 | "src/*" 10 | ] 11 | }, 12 | "lib": [ 13 | "esnext", 14 | "dom", 15 | "dom.iterable", 16 | "scripthost" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "NodBlog client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "@vueup/vue-quill": "^1.0.0-beta.10", 12 | "chart.js": "^3.9.1", 13 | "core-js": "^3.8.3", 14 | "idb": "^7.1.0", 15 | "register-service-worker": "^1.7.2", 16 | "swiper": "^8.4.2", 17 | "vue": "^3.2.13", 18 | "vue-awesome-swiper": "^5.0.1", 19 | "vue-i18n": "^9.3.0-beta.3", 20 | "vue-router": "^4.0.3", 21 | "vue-toastification": "^2.0.0-rc.5", 22 | "vue3-select2-component": "^0.1.7", 23 | "vuex": "^4.0.0" 24 | }, 25 | "devDependencies": { 26 | "@babel/core": "^7.12.16", 27 | "@babel/eslint-parser": "^7.12.16", 28 | "@vue/cli-plugin-babel": "~5.0.0", 29 | "@vue/cli-plugin-eslint": "~5.0.0", 30 | "@vue/cli-plugin-pwa": "~5.0.0", 31 | "@vue/cli-plugin-router": "~5.0.0", 32 | "@vue/cli-plugin-vuex": "~5.0.0", 33 | "@vue/cli-service": "~5.0.0", 34 | "eslint": "^7.32.0", 35 | "eslint-plugin-vue": "^8.0.3" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /client/public/assets/demo/chart-pie-demo.js: -------------------------------------------------------------------------------- 1 | // Set new default font family and font color to mimic Bootstrap's default styling 2 | (Chart.defaults.global.defaultFontFamily = "Metropolis"), 3 | '-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif'; 4 | Chart.defaults.global.defaultFontColor = "#858796"; 5 | 6 | // Pie Chart Example 7 | var ctx = document.getElementById("myPieChart"); 8 | var myPieChart = new Chart(ctx, { 9 | type: "doughnut", 10 | data: { 11 | labels: ["Direct", "Referral", "Social"], 12 | datasets: [{ 13 | data: [55, 30, 15], 14 | backgroundColor: [ 15 | "rgba(0, 97, 242, 1)", 16 | "rgba(0, 172, 105, 1)", 17 | "rgba(88, 0, 232, 1)" 18 | ], 19 | hoverBackgroundColor: [ 20 | "rgba(0, 97, 242, 0.9)", 21 | "rgba(0, 172, 105, 0.9)", 22 | "rgba(88, 0, 232, 0.9)" 23 | ], 24 | hoverBorderColor: "rgba(234, 236, 244, 1)" 25 | }] 26 | }, 27 | options: { 28 | maintainAspectRatio: false, 29 | tooltips: { 30 | backgroundColor: "rgb(255,255,255)", 31 | bodyFontColor: "#858796", 32 | borderColor: "#dddfeb", 33 | borderWidth: 1, 34 | xPadding: 15, 35 | yPadding: 15, 36 | displayColors: false, 37 | caretPadding: 10 38 | }, 39 | legend: { 40 | display: false 41 | }, 42 | cutoutPercentage: 80 43 | } 44 | }); 45 | -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-Black.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-Black.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-BlackItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-BlackItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-Bold.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-BoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-BoldItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-ExtraBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-ExtraBold.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-ExtraBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-ExtraBoldItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-ExtraLight.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-ExtraLight.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-ExtraLightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-ExtraLightItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-Light.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-Light.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-LightItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-LightItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-Medium.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-MediumItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-MediumItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-Regular.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-RegularItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-RegularItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-SemiBold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-SemiBold.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-SemiBoldItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-SemiBoldItalic.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-Thin.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-Thin.otf -------------------------------------------------------------------------------- /client/public/assets/fonts/metropolis/Metropolis-ThinItalic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/fonts/metropolis/Metropolis-ThinItalic.otf -------------------------------------------------------------------------------- /client/public/assets/img/backgrounds/bg-angles.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /client/public/assets/img/backgrounds/bg-pattern-shapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/backgrounds/bg-pattern-shapes.png -------------------------------------------------------------------------------- /client/public/assets/img/backgrounds/bg-waves.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 13 | 14 | -------------------------------------------------------------------------------- /client/public/assets/img/demo/cards/card-img-bottom.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/cards/card-img-bottom.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/cards/card-img-left.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/cards/card-img-left.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/cards/card-img-overlay.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/cards/card-img-overlay.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/cards/card-img-right.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/cards/card-img-right.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/cards/card-img-top.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/cards/card-img-top.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/demo-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/public/assets/img/demo/demo-ocean-lg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/demo-ocean-lg.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/demo-ocean-sm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/demo/demo-ocean-sm.jpg -------------------------------------------------------------------------------- /client/public/assets/img/demo/user-placeholder.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/public/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/favicon.png -------------------------------------------------------------------------------- /client/public/assets/img/heart_animation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/heart_animation.png -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/CREDITS.md: -------------------------------------------------------------------------------- 1 | # Illustration Credits 2 | 3 | The illustrations in this directory are sourced 4 | from Stories by Freepik. 5 | 6 | Freepik offers hundreds of free, high quality 7 | illustrations you can use in your projects. You 8 | can view them all here: 9 | 10 | 11 | 12 | Make sure to view their licensing terms to make 13 | sure you are attributing the image authors 14 | correctly when using their assets. 15 | -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/profiles/profile-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/illustrations/profiles/profile-1.png -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/profiles/profile-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/illustrations/profiles/profile-2.png -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/profiles/profile-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/illustrations/profiles/profile-3.png -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/profiles/profile-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/illustrations/profiles/profile-4.png -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/profiles/profile-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/illustrations/profiles/profile-5.png -------------------------------------------------------------------------------- /client/public/assets/img/illustrations/profiles/profile-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/illustrations/profiles/profile-6.png -------------------------------------------------------------------------------- /client/public/assets/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/logo.png -------------------------------------------------------------------------------- /client/public/assets/img/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/assets/img/logo2.png -------------------------------------------------------------------------------- /client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/favicon.ico -------------------------------------------------------------------------------- /client/public/img/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /client/public/img/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /client/public/img/icons/android-chrome-maskable-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/android-chrome-maskable-192x192.png -------------------------------------------------------------------------------- /client/public/img/icons/android-chrome-maskable-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/android-chrome-maskable-512x512.png -------------------------------------------------------------------------------- /client/public/img/icons/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /client/public/img/icons/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /client/public/img/icons/apple-touch-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/apple-touch-icon-180x180.png -------------------------------------------------------------------------------- /client/public/img/icons/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /client/public/img/icons/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /client/public/img/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /client/public/img/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/favicon-16x16.png -------------------------------------------------------------------------------- /client/public/img/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/favicon-32x32.png -------------------------------------------------------------------------------- /client/public/img/icons/msapplication-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/msapplication-icon-144x144.png -------------------------------------------------------------------------------- /client/public/img/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/client/public/img/icons/mstile-150x150.png -------------------------------------------------------------------------------- /client/public/img/icons/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 17 | 18 | 19 | 20 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /client/public/js/datatables/datatables-simple-demo.js: -------------------------------------------------------------------------------- 1 | window.addEventListener('DOMContentLoaded', event => { 2 | // Simple-DataTables 3 | // https://github.com/fiduswriter/Simple-DataTables/wiki 4 | 5 | const datatablesSimple = document.getElementById('datatablesSimple'); 6 | if (datatablesSimple) { 7 | new simpleDatatables.DataTable(datatablesSimple); 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /client/public/js/litepicker.js: -------------------------------------------------------------------------------- 1 | // Litepicker 2 | // 3 | // The date pickers in Material Admin Pro 4 | // are powered by the Litepicker plugin. 5 | // Litepicker is a lightweight, no dependencies 6 | // date picker that allows for date ranges 7 | // and other options. For more usage details 8 | // visit the Litepicker docs. 9 | // 10 | // Litepicker Documentation 11 | // https://wakirin.github.io/Litepicker 12 | 13 | window.addEventListener('DOMContentLoaded', event => { 14 | 15 | const litepickerSingleDate = document.getElementById('litepickerSingleDate'); 16 | if (litepickerSingleDate) { 17 | new Litepicker({ 18 | element: litepickerSingleDate, 19 | format: 'MMM DD, YYYY' 20 | }); 21 | } 22 | 23 | const litepickerDateRange = document.getElementById('litepickerDateRange'); 24 | if (litepickerDateRange) { 25 | new Litepicker({ 26 | element: litepickerDateRange, 27 | singleMode: false, 28 | format: 'MMM DD, YYYY' 29 | }); 30 | } 31 | 32 | const litepickerDateRange2Months = document.getElementById('litepickerDateRange2Months'); 33 | if (litepickerDateRange2Months) { 34 | new Litepicker({ 35 | element: litepickerDateRange2Months, 36 | singleMode: false, 37 | numberOfMonths: 2, 38 | numberOfColumns: 2, 39 | format: 'MMM DD, YYYY' 40 | }); 41 | } 42 | 43 | const litepickerRangePlugin = document.getElementById('litepickerRangePlugin'); 44 | if (litepickerRangePlugin) { 45 | new Litepicker({ 46 | element: litepickerRangePlugin, 47 | startDate: new Date(), 48 | endDate: new Date(), 49 | singleMode: false, 50 | numberOfMonths: 2, 51 | numberOfColumns: 2, 52 | format: 'MMM DD, YYYY', 53 | plugins: ['ranges'] 54 | }); 55 | } 56 | }); 57 | -------------------------------------------------------------------------------- /client/public/js/markdown.js: -------------------------------------------------------------------------------- 1 | var easyMDE = new EasyMDE({ 2 | element: document.getElementById('postEditor'), 3 | toolbar: ['bold', 'italic', 'heading', '|', 'quote', 'unordered-list', 'ordered-list', '|', 'link', 'image', '|', 'preview', 'guide'] 4 | }); 5 | -------------------------------------------------------------------------------- /client/public/js/toasts.js: -------------------------------------------------------------------------------- 1 | // For more details see: https://getbootstrap.com/docs/5.0/components/toasts/#usage 2 | 3 | window.addEventListener('DOMContentLoaded', event => { 4 | 5 | const toastBasicEl = document.getElementById('toastBasic'); 6 | const toastNoAutohideEl = document.getElementById('toastNoAutohide'); 7 | 8 | const toastBasic = new bootstrap.Toast(toastBasicEl); 9 | const toastNoAutohide = new bootstrap.Toast(toastNoAutohideEl); 10 | 11 | const toastBasicTrigger = document.getElementById('toastBasicTrigger'); 12 | if (toastBasicTrigger) { 13 | toastBasicTrigger.addEventListener('click', event => { 14 | console.log('asd'); 15 | toastBasic.show(); 16 | }); 17 | } 18 | 19 | const toastNoAutohideTrigger = document.getElementById('toastNoAutohideTrigger'); 20 | if (toastNoAutohideTrigger) { 21 | toastNoAutohideTrigger.addEventListener('click', event => { 22 | toastNoAutohide.show(); 23 | }); 24 | } 25 | 26 | }) 27 | -------------------------------------------------------------------------------- /client/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /client/public/worker.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2015, 2019, 2020, 2021 Google LLC. All Rights Reserved. 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | http://www.apache.org/licenses/LICENSE-2.0 7 | Unless required by applicable law or agreed to in writing, software 8 | distributed under the License is distributed on an "AS IS" BASIS, 9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | See the License for the specific language governing permissions and 11 | limitations under the License. 12 | */ 13 | 14 | // Incrementing OFFLINE_VERSION will kick off the install event and force 15 | // previously cached resources to be updated from the network. 16 | // This variable is intentionally declared and unused. 17 | // Add a comment for your linter if you want: 18 | // eslint-disable-next-line no-unused-vars 19 | 20 | // Listen for the install event 21 | 22 | const OFFLINE_VERSION = 1 23 | const CACHE_NAME = "offline"; 24 | // Customize this with a different URL if needed. 25 | const OFFLINE_URL = "offline.html"; 26 | 27 | self.addEventListener("install", (event) => { 28 | event.waitUntil( 29 | (async () => { 30 | const cache = await caches.open(CACHE_NAME); 31 | // Setting {cache: 'reload'} in the new request ensures that the 32 | // response isn't fulfilled from the HTTP cache; i.e., it will be 33 | // from the network. 34 | await cache.add(new Request(OFFLINE_URL, { cache: "reload" })); 35 | })() 36 | ); 37 | // Force the waiting service worker to become the active service worker. 38 | self.skipWaiting(); 39 | }); 40 | 41 | self.addEventListener("activate", (event) => { 42 | event.waitUntil( 43 | (async () => { 44 | // Enable navigation preload if it's supported. 45 | // See https://developers.google.com/web/updates/2017/02/navigation-preload 46 | if ("navigationPreload" in self.registration) { 47 | await self.registration.navigationPreload.enable(); 48 | } 49 | })() 50 | ); 51 | 52 | // Tell the active service worker to take control of the page immediately. 53 | self.clients.claim(); 54 | }); 55 | 56 | self.addEventListener("fetch", (event) => { 57 | // Only call event.respondWith() if this is a navigation request 58 | // for an HTML page. 59 | if (event.request.mode === "navigate") { 60 | event.respondWith( 61 | (async () => { 62 | try { 63 | // First, try to use the navigation preload response if it's 64 | // supported. 65 | const preloadResponse = await event.preloadResponse; 66 | if (preloadResponse) { 67 | return preloadResponse; 68 | } 69 | 70 | // Always try the network first. 71 | const networkResponse = await fetch(event.request); 72 | return networkResponse; 73 | } catch (error) { 74 | // catch is only triggered if an exception is thrown, which is 75 | // likely due to a network error. 76 | // If fetch() returns a valid HTTP response with a response code in 77 | // the 4xx or 5xx range, the catch() will NOT be called. 78 | console.log("Fetch failed; returning offline page instead.", error); 79 | 80 | const cache = await caches.open(CACHE_NAME); 81 | const cachedResponse = await cache.match(OFFLINE_URL); 82 | return cachedResponse; 83 | } 84 | })() 85 | ); 86 | } 87 | 88 | // If our if() condition is false, then this fetch handler won't 89 | // intercept the request. If there are any other fetch handlers 90 | // registered, they will get a chance to call event.respondWith(). 91 | // If no fetch handlers call event.respondWith(), the request 92 | // will be handled by the browser as if there were no service 93 | // worker involvement. 94 | }); -------------------------------------------------------------------------------- /client/src/App.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | -------------------------------------------------------------------------------- /client/src/i18n.js: -------------------------------------------------------------------------------- 1 | import { createI18n } from 'vue-i18n'; 2 | 3 | function loadLocaleMessages () { 4 | const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.json$/i) 5 | const messages = {} 6 | locales.keys().forEach(key => { 7 | const matched = key.match(/([A-Za-z0-9-_]+)\./i) 8 | if (matched && matched.length > 1) { 9 | const locale = matched[1] 10 | messages[locale] = locales(key) 11 | } 12 | }) 13 | return messages 14 | } 15 | 16 | export default createI18n({ 17 | legacy: false, 18 | locale: 'tr', 19 | fallbackLocale: 'tr', 20 | messages: loadLocaleMessages() 21 | }) -------------------------------------------------------------------------------- /client/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import router from './router' 4 | import store from './store' 5 | import functions from './functions' 6 | import Toast, { POSITION } from "vue-toastification"; 7 | import "vue-toastification/dist/index.css"; 8 | import i18n from './i18n' 9 | import Select2 from 'vue3-select2-component'; 10 | import { QuillEditor } from '@vueup/vue-quill' 11 | import '@vueup/vue-quill/dist/vue-quill.bubble.css'; 12 | import VueAwesomeSwiper from 'vue-awesome-swiper' 13 | import SwiperClass, {Navigation, Pagination, Autoplay} from 'swiper' 14 | import 'swiper/css' 15 | import 'swiper/css/navigation' 16 | import 'swiper/css/pagination' 17 | import './registerServiceWorker' 18 | SwiperClass.use([Navigation, Pagination, Autoplay]) 19 | createApp(App).component('QuillEditor', QuillEditor).component('Select2', Select2).use(VueAwesomeSwiper).use(store).use(router).use(Toast, { position: POSITION.BOTTOM_LEFT }).use(functions).use(i18n).mount('#app') 20 | -------------------------------------------------------------------------------- /client/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | 3 | import { register } from 'register-service-worker' 4 | register(`${process.env.BASE_URL}worker.js`, { 5 | ready () { 6 | console.log( 7 | 'App is being served from cache by a service worker.\n' + 8 | 'For more details, visit https://goo.gl/AFskqB' 9 | ) 10 | }, 11 | registered () { 12 | console.log('Service worker has been registered.') 13 | }, 14 | cached () { 15 | console.log('Content has been cached for offline use.') 16 | }, 17 | updatefound () { 18 | console.log('New content is downloading.') 19 | }, 20 | updated () { 21 | console.log('New content is available; please refresh.') 22 | }, 23 | offline () { 24 | console.log('No internet connection found. App is running in offline mode.') 25 | }, 26 | error (error) { 27 | console.error('Error during service worker registration:', error) 28 | } 29 | }) -------------------------------------------------------------------------------- /client/src/services/admin.service.js: -------------------------------------------------------------------------------- 1 | import Api from "./api.service"; 2 | export default { 3 | async getSettings(credentials = []){ 4 | return await Api("admin/get-settings",credentials) 5 | }, 6 | async changeImage(credentials = []){ 7 | return await Api("admin/change-image",credentials) 8 | }, 9 | async saveSettings(credentials = []){ 10 | return await Api("admin/save-settings",credentials) 11 | }, 12 | async menuList(credentials = []){ 13 | return await Api("admin/menu-list",credentials) 14 | }, 15 | async menuAdd(credentials = []){ 16 | return await Api("admin/menu-add",credentials) 17 | }, 18 | async menuDelete(credentials = []){ 19 | return await Api("admin/menu-delete",credentials) 20 | }, 21 | async menuSave(credentials = []){ 22 | return await Api("admin/menu-save",credentials) 23 | }, 24 | async userList(credentials = []){ 25 | return await Api("admin/user-list",credentials) 26 | }, 27 | async userSave(credentials = []){ 28 | return await Api("admin/user-save",credentials) 29 | }, 30 | async userLoginAs(credentials = []){ 31 | return await Api("admin/user-login-as",credentials) 32 | }, 33 | async userChangeImage(credentials = []){ 34 | return await Api("admin/user-change-image",credentials) 35 | }, 36 | async groupList(credentials = []){ 37 | return await Api("admin/group-list",credentials) 38 | }, 39 | async groupAdd(credentials = []){ 40 | return await Api("admin/group-add",credentials) 41 | }, 42 | async groupSave(credentials = []){ 43 | return await Api("admin/group-save",credentials) 44 | }, 45 | async groupDelete(credentials = []){ 46 | return await Api("admin/group-delete",credentials) 47 | }, 48 | async roleList(credentials = []){ 49 | return await Api("admin/role-list",credentials) 50 | }, 51 | async roleAdd(credentials = []){ 52 | return await Api("admin/role-add",credentials) 53 | }, 54 | async roleSave(credentials = []){ 55 | return await Api("admin/role-save",credentials) 56 | }, 57 | async permissionList(credentials = []){ 58 | return await Api("admin/permission-list",credentials) 59 | }, 60 | async reportList(credentials = []){ 61 | return await Api("admin/report-list",credentials) 62 | }, 63 | async reportDelete(credentials = []){ 64 | return await Api("admin/report-delete",credentials) 65 | }, 66 | async reportActionDelete(credentials = []){ 67 | return await Api("admin/report-action-delete",credentials) 68 | }, 69 | async reportActionBan(credentials = []){ 70 | return await Api("admin/report-action-ban",credentials) 71 | }, 72 | } -------------------------------------------------------------------------------- /client/src/services/api.service.js: -------------------------------------------------------------------------------- 1 | import { useToast } from "vue-toastification"; 2 | const toast = useToast(); 3 | window.toast = toast 4 | export default async (url,credentials) => { 5 | var headers = { 6 | 'Accept': 'application/json', 7 | 'Cache-Control': 'no-cache', 8 | 'Access-Control-Allow-Credentials' : true 9 | } 10 | if(!(credentials instanceof FormData)){ 11 | headers['Content-Type'] = 'application/json' 12 | } 13 | const rawResponse = await fetch(process.env.VUE_APP_SERVER_URL + url, { 14 | method: 'POST', 15 | credentials: 'include', 16 | withCredentials: true, 17 | xhrFields: { withCredentials: true}, 18 | headers: headers, 19 | body: credentials instanceof FormData ? credentials : JSON.stringify(credentials) 20 | }); 21 | if([404].includes(rawResponse.status)){ 22 | window.$router.push({name : 'site-error' , params : {code: rawResponse.status}}) 23 | } 24 | const content = await rawResponse.json(); 25 | if(content.redirect){ 26 | if(content.refresh){ 27 | if(content.resolve){ 28 | window.location.href= window.$router.resolve({name: content.redirect , params : content.params ? content.params : {}}).href 29 | }else { 30 | window.location.href= content.redirect 31 | } 32 | }else { 33 | window.$router.push({name : content.redirect , params : content.params ? content.params : {}}) 34 | } 35 | } 36 | if(content.status == 0 && content.message){ 37 | toast.error(window.t(content.message)) 38 | } 39 | if(content.status == 1 && content.message){ 40 | toast.success(window.t(content.message)) 41 | } 42 | if(content.modal){ 43 | switch (content.modal) { 44 | case 'login': 45 | document.querySelector('[data-bs-target="#kt_modal_login"]').click() 46 | break; 47 | case 'register': 48 | document.querySelector('[data-bs-target="#kt_modal_register"]').click() 49 | break; 50 | case 'verify': 51 | document.querySelector('[data-bs-target="#kt_modal_verify"]').click() 52 | break; 53 | } 54 | } 55 | return content; 56 | } -------------------------------------------------------------------------------- /client/src/services/authentication.service.js: -------------------------------------------------------------------------------- 1 | import Api from "./api.service"; 2 | export default { 3 | async login(credentials = []){ 4 | return await Api("authentication/login",credentials) 5 | }, 6 | async register(credentials = []){ 7 | return await Api("authentication/register",credentials) 8 | }, 9 | async logout(credentials = []){ 10 | return await Api("authentication/logout",credentials) 11 | }, 12 | async sendForgotPassword(credentials = []){ 13 | return await Api("authentication/send-forgot-password",credentials) 14 | }, 15 | async submitForgotPassword(credentials = []){ 16 | return await Api("authentication/submit-forgot-password",credentials) 17 | }, 18 | } -------------------------------------------------------------------------------- /client/src/services/db.service.js: -------------------------------------------------------------------------------- 1 | import { openDB } from 'idb' 2 | const dbPromise = () => { 3 | if (!('indexedDB' in window)) { 4 | throw new Error('Browser does not support IndexedDB') 5 | } 6 | return openDB('OfflineDb', 1, upgradeDb => { 7 | if (!upgradeDb.objectStoreNames.contains('blogs')) { 8 | upgradeDb.createObjectStore('blogs') 9 | } 10 | }) 11 | } 12 | 13 | const saveToStorage = async (storeName, datas) => { 14 | try { 15 | const db = await dbPromise() 16 | const tx = db.transaction(storeName, 'readwrite') 17 | const store = tx.objectStore(storeName) 18 | store.put(datas, storeName) 19 | return tx.complete 20 | } catch (error) { 21 | return error 22 | } 23 | } 24 | 25 | const checkStorage = async storeName => { 26 | try { 27 | const db = await dbPromise() 28 | const tx = db.transaction(storeName, 'readonly') 29 | const store = tx.objectStore(storeName) 30 | return store.get(storeName) 31 | } catch (error) { 32 | return error 33 | } 34 | } 35 | 36 | export default { 37 | checkStorage, 38 | saveToStorage 39 | } -------------------------------------------------------------------------------- /client/src/services/main.service.js: -------------------------------------------------------------------------------- 1 | import Api from "./api.service"; 2 | export default { 3 | async info(credentials = []){ 4 | return await Api("main/info",credentials) 5 | }, 6 | async tagList(credentials = []){ 7 | return await Api("main/tag-list",credentials) 8 | } 9 | } -------------------------------------------------------------------------------- /client/src/services/panel.service.js: -------------------------------------------------------------------------------- 1 | import Api from "./api.service"; 2 | export default { 3 | async userGetEdit(credentials = []){ 4 | return await Api("panel/user-get-edit",credentials) 5 | }, 6 | async userSaveEdit(credentials = []){ 7 | return await Api("panel/user-save-edit",credentials) 8 | }, 9 | async userChangeImage(credentials = []){ 10 | return await Api("panel/user-change-image",credentials) 11 | }, 12 | async blogList(credentials = []){ 13 | return await Api("panel/blog-list",credentials) 14 | }, 15 | async blogAdd(credentials= []){ 16 | return await Api("panel/blog-add",credentials) 17 | }, 18 | async blogGetEdit(credentials= []){ 19 | return await Api("panel/blog-get-edit",credentials) 20 | }, 21 | async blogSaveEdit(credentials= []){ 22 | return await Api("panel/blog-save-edit",credentials) 23 | }, 24 | async blogDelete(credentials= []){ 25 | return await Api("panel/blog-delete",credentials) 26 | }, 27 | } -------------------------------------------------------------------------------- /client/src/services/site.service.js: -------------------------------------------------------------------------------- 1 | import Api from "./api.service"; 2 | export default { 3 | async home(credentials = []){ 4 | return await Api("site/home",credentials) 5 | }, 6 | async homeBlog(credentials = []){ 7 | return await Api("site/home-blog",credentials) 8 | }, 9 | async homePopular(credentials = []){ 10 | return await Api("site/home-popular",credentials) 11 | }, 12 | async blogIndex(credentials = []){ 13 | return await Api("site/blog-index",credentials) 14 | }, 15 | async blogLike(credentials = []){ 16 | return await Api("site/blog-like",credentials) 17 | }, 18 | async blogReport(credentials = []){ 19 | return await Api("site/blog-report",credentials) 20 | }, 21 | async blogDislike(credentials = []){ 22 | return await Api("site/blog-dislike",credentials) 23 | }, 24 | async commentAdd(credentials = []){ 25 | return await Api("site/comment-add",credentials) 26 | }, 27 | async commentLike(credentials = []){ 28 | return await Api("site/comment-like",credentials) 29 | }, 30 | async blogComment(credentials = []){ 31 | return await Api("site/comment-report",credentials) 32 | }, 33 | async profile(credentials = []){ 34 | return await Api("site/profile",credentials) 35 | }, 36 | async profileBlog(credentials = []){ 37 | return await Api("site/profile-blog",credentials) 38 | }, 39 | async profileFollow(credentials = []){ 40 | return await Api("site/profile-follow",credentials) 41 | }, 42 | async tagIndex(credentials = []){ 43 | return await Api("site/tag-index",credentials) 44 | }, 45 | async tagBlog(credentials = []){ 46 | return await Api("site/tag-blog",credentials) 47 | }, 48 | async search(credentials = []){ 49 | return await Api("site/search",credentials) 50 | }, 51 | } -------------------------------------------------------------------------------- /client/src/services/storage.service.js: -------------------------------------------------------------------------------- 1 | function isJsonString(str) { 2 | try { 3 | JSON.parse(str); 4 | } catch (e) { 5 | return false; 6 | } 7 | return true; 8 | } 9 | 10 | const set = async (key, value) => { 11 | try { 12 | if(typeof value === 'object') value = JSON.stringify(value) 13 | return localStorage.setItem(key,value) 14 | } catch (error) { 15 | return error 16 | } 17 | } 18 | 19 | const get = async (key) => { 20 | try { 21 | var value = localStorage.getItem(key) 22 | if(isJsonString(value)) value = JSON.parse(value) 23 | return value 24 | } catch (error) { 25 | return error 26 | } 27 | } 28 | 29 | const push = async (key,value,multiple = false,upsert = true) => { 30 | try { 31 | var data = await get(key) 32 | if(!data){ 33 | data = {} 34 | } 35 | if(typeof value === 'object') value = JSON.stringify(value) 36 | if(Object.values(data).indexOf(value) > -1 && !multiple) { 37 | if(!upsert) return false; 38 | data[Object.values(data).indexOf(value)] = value 39 | }else { 40 | data[Object.keys(data).length] = value 41 | } 42 | return set(key,data) 43 | } catch (error) { 44 | return error 45 | } 46 | } 47 | 48 | const check = async (key) => { 49 | try { 50 | return localStorage.getItem(key) !== null 51 | } catch (error) { 52 | return error 53 | } 54 | } 55 | 56 | const remove = async (key) => { 57 | try { 58 | return localStorage.removeItem(key) 59 | } catch (error) { 60 | return error 61 | } 62 | } 63 | 64 | const clear = async () => { 65 | try { 66 | return localStorage.clear() 67 | } catch (error) { 68 | return error 69 | } 70 | } 71 | 72 | export default { 73 | set, 74 | get, 75 | push, 76 | check, 77 | remove, 78 | clear 79 | } -------------------------------------------------------------------------------- /client/src/store/index.js: -------------------------------------------------------------------------------- 1 | import { createStore } from 'vuex' 2 | 3 | export default createStore({ 4 | state: { 5 | user: false, 6 | informations: { 7 | logo: {}, 8 | head: {} 9 | } 10 | }, 11 | getters: { 12 | }, 13 | mutations: { 14 | login(state,data){ 15 | state.user = data 16 | }, 17 | logout(state){ 18 | state.user = false 19 | }, 20 | informations(state,data){ 21 | state.informations = data 22 | } 23 | }, 24 | actions: { 25 | }, 26 | modules: { 27 | } 28 | }) 29 | -------------------------------------------------------------------------------- /client/src/views/Admin/SettingsView.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | -------------------------------------------------------------------------------- /client/src/views/Panel/Authentication/ForgotPasswordView.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | -------------------------------------------------------------------------------- /client/src/views/Panel/Authentication/LoginView.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | -------------------------------------------------------------------------------- /client/src/views/Panel/Authentication/ResetPasswordView.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | -------------------------------------------------------------------------------- /client/src/views/Panel/User/EditTabs/NotificationsTab.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | -------------------------------------------------------------------------------- /client/src/views/Panel/User/EditView.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | -------------------------------------------------------------------------------- /client/src/views/Site/ErrorView.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /client/src/views/Site/HomeView.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | -------------------------------------------------------------------------------- /client/src/views/Site/Tag/ListView.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | -------------------------------------------------------------------------------- /client/src/views/Templates/AuthenticationTemplate.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /client/vue.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('@vue/cli-service') 2 | module.exports = defineConfig({ 3 | transpileDependencies: true, 4 | 5 | devServer: { 6 | port: 80 7 | }, 8 | 9 | pluginOptions: { 10 | i18n: { 11 | locale: 'tr', 12 | fallbackLocale: 'tr', 13 | localeDir: 'locales', 14 | enableLegacy: false, 15 | runtimeOnly: false, 16 | compositionOnly: false, 17 | fullInstall: true 18 | } 19 | } 20 | }) 21 | -------------------------------------------------------------------------------- /screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/1.png -------------------------------------------------------------------------------- /screenshots/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/10.png -------------------------------------------------------------------------------- /screenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/2.png -------------------------------------------------------------------------------- /screenshots/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/3.png -------------------------------------------------------------------------------- /screenshots/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/4.png -------------------------------------------------------------------------------- /screenshots/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/5.png -------------------------------------------------------------------------------- /screenshots/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/6.png -------------------------------------------------------------------------------- /screenshots/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/7.png -------------------------------------------------------------------------------- /screenshots/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/8.png -------------------------------------------------------------------------------- /screenshots/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/screenshots/9.png -------------------------------------------------------------------------------- /screenshots/text: -------------------------------------------------------------------------------- 1 | asd 2 | -------------------------------------------------------------------------------- /server/.env: -------------------------------------------------------------------------------- 1 | APP_PORT = 8081 2 | 3 | SESSION_SECRET_TOKEN = "2E31A7A1C743D1B67DDD79814D6E2" 4 | 5 | PROD_MONGODB = "mongodb://localhost:27017/yue" 6 | 7 | BACKEND_URL = "http://127.0.0.1:8081" 8 | CLIENT_URL = "http://127.0.0.1" -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const app = express() 3 | const http = require('http').createServer(app) 4 | const bodyParser = require('body-parser') 5 | const cors = require('cors') 6 | const cookieParser = require('cookie-parser') 7 | const helmet = require('helmet') 8 | const database = require('./configs/database.config') 9 | const session = require('express-session') 10 | const MongoStore = require('connect-mongo') 11 | const fs = require('fs') 12 | const path = require('path'); 13 | const serveStatic = require('serve-static'); 14 | const rateLimit = require('express-rate-limit') 15 | require('dotenv').config({path: './.env'}) 16 | 17 | global.__basedir = __dirname 18 | 19 | app.use(cookieParser()); 20 | app.use(bodyParser.urlencoded({ extended: true, limit : '50mb' })); 21 | app.use(bodyParser.json({ limit : '50mb' })) 22 | app.use(session({ 23 | secret: process.env.SESSION_SECRET_TOKEN, 24 | saveUninitialized:true, 25 | cookie: { maxAge: 1000 * 60 * 60 * 24 , secure : false }, 26 | resave: false, 27 | store: MongoStore.create({ 28 | mongoUrl: process.env.PROD_MONGODB 29 | }) 30 | })) 31 | 32 | // app.use(helmet({ 33 | // crossOriginEmbedderPolicy: false, 34 | // contentSecurityPolicy: { 35 | // directives: { 36 | // defaultSrc: ["'self'", 'google.com', 'youtube.com'], 37 | // styleSrc: ["'self'", 'google.com', 'youtube.com', "'unsafe-inline'"], 38 | // scriptSrc: ["'self'", 'google.com', 'youtube.com', "'unsafe-inline'"], 39 | // imgSrc: ["'self'", 'google.com', 'youtube.com', 'data:', 'blob:', 'instagram.com'], 40 | // connectSrc: ["'self'", 'google.com', 'youtube.com', 'ws:', 'wss:'], 41 | // frameSrc: ["'self'", 'google.com', 'youtube.com'], 42 | // frameAncestors: ["'self'", 'google.com', 'youtube.com'], 43 | // mediaSrc: ["'self'", 'google.com', 'youtube.com', 'data:', 'blob:'], 44 | // }, 45 | // } 46 | // })) 47 | 48 | app.use( 49 | cors({ 50 | origin: process.env.CLIENT_URL, 51 | credentials: true, 52 | }) 53 | ); 54 | 55 | app.use(rateLimit({ 56 | windowMs: 1 * 60 * 1000, // 15 minutes 57 | max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes) 58 | standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers 59 | legacyHeaders: false, // Disable the `X-RateLimit-*` headers 60 | })) 61 | 62 | database.connect() 63 | 64 | app.use(require('./middlewares/guard.middleware')) 65 | app.use(serveStatic("../client/dist")); 66 | app.get('*(?!(api|rss|sitemap)\w+)', (req,res) => { 67 | res.sendFile(path.join(__dirname, '../client/dist/index.html')); 68 | }); 69 | app.use("/public", express.static(path.join(__dirname, 'public'))); 70 | fs.readdir('./routes/', (err, files) => { 71 | files.forEach(file => { 72 | app.use(`/api/${file.split('.')[0]}`,require(`./routes/${file}`)) 73 | }) 74 | }) 75 | http.listen(process.env.APP_PORT, () => { 76 | console.log(`Server running on port : ${process.env.APP_PORT}`); 77 | }) -------------------------------------------------------------------------------- /server/configs/database.config.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config({ path : '../.env' }) 2 | const mongoose = require('mongoose') 3 | 4 | module.exports = { 5 | connect () { 6 | mongoose.connect(`${process.env.PROD_MONGODB}`) 7 | .then(() => console.log('MongoDB connected')) 8 | .catch((err) => console.log(err)) 9 | }, 10 | mongoose 11 | } -------------------------------------------------------------------------------- /server/configs/loggers/system.logger.js: -------------------------------------------------------------------------------- 1 | const { createLogger, format, transports } = require('winston'); 2 | require('winston-daily-rotate-file'); 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const env = process.env.NODE_ENV || 'development'; 6 | const logDir = global.__basedir + '/log/system' 7 | const datePatternConfiguration = { 8 | everMonth: 'YYYY-MM', 9 | default: 'YYYY-MM-DD', 10 | everHour: 'YYYY-MM-DD-HH', 11 | everMinute: 'YYYY-MM-DD-THH-mm', 12 | }; 13 | numberOfDaysToKeepLog = 30; 14 | fileSizeToRotate = 1; 15 | 16 | if (!fs.existsSync(logDir)) { 17 | fs.mkdirSync(logDir); 18 | } 19 | 20 | const dailyRotateFileTransport = new transports.DailyRotateFile({ 21 | filename: `${logDir}/%DATE%-results.log`, 22 | datePattern: datePatternConfiguration.everMonth, 23 | zippedArchive: true, 24 | maxSize: `${fileSizeToRotate}m`, 25 | maxFiles: `${numberOfDaysToKeepLog}d` 26 | }) 27 | 28 | const logger = createLogger({ 29 | level: env === 'development' ? 'verbose' : 'info', 30 | handleExceptions: true, 31 | format: format.combine( 32 | format.label({ label: path.basename(module.parent.filename) }), 33 | format.timestamp({ 34 | format: 'YYYY-MM-DD HH:mm:ss', 35 | }), 36 | format.printf(info => `${info.timestamp}[${info.label}] ${info.level}: ${JSON.stringify(info.message)}`), 37 | ), 38 | transports: [ 39 | new transports.Console({ 40 | level: 'info', 41 | handleExceptions: true, 42 | format: format.combine( 43 | format.label({ label: path.basename(module.parent.filename) }), 44 | format.colorize(), 45 | format.printf( 46 | info => `${info.timestamp}[${info.label}] ${info.level}: ${info.message}`, 47 | ), 48 | ), 49 | }), 50 | dailyRotateFileTransport, 51 | ], 52 | }); 53 | 54 | logger.stream = { 55 | write: (message) => { 56 | logger.info(message); 57 | }, 58 | }; 59 | 60 | module.exports = logger -------------------------------------------------------------------------------- /server/configs/loggers/user.logger.js: -------------------------------------------------------------------------------- 1 | module.exports = function(user){ 2 | const { createLogger, format, transports } = require('winston'); 3 | require('winston-daily-rotate-file'); 4 | const fs = require('fs'); 5 | const path = require('path'); 6 | const env = process.env.NODE_ENV || 'development'; 7 | const logDir = global.__basedir + '/log/user/' + user._id 8 | const datePatternConfiguration = { 9 | everMonth: 'YYYY-MM', 10 | default: 'YYYY-MM-DD', 11 | everHour: 'YYYY-MM-DD-HH', 12 | everMinute: 'YYYY-MM-DD-THH-mm', 13 | }; 14 | numberOfDaysToKeepLog = 30; 15 | fileSizeToRotate = 1; 16 | 17 | if (!fs.existsSync(logDir)) { 18 | fs.mkdirSync(logDir); 19 | } 20 | 21 | const dailyRotateFileTransport = new transports.DailyRotateFile({ 22 | filename: `${logDir}/%DATE%-results.log`, 23 | datePattern: datePatternConfiguration.everMonth, 24 | zippedArchive: true, 25 | maxSize: `${fileSizeToRotate}m`, 26 | maxFiles: `${numberOfDaysToKeepLog}d` 27 | }); 28 | 29 | const logger = createLogger({ 30 | level: env === 'development' ? 'verbose' : 'info', 31 | handleExceptions: true, 32 | format: format.combine( 33 | format.label({ label: path.basename(module.parent.filename) }), 34 | format.timestamp({ 35 | format: 'YYYY-MM-DD HH:mm:ss', 36 | }), 37 | format.printf(info => `${info.timestamp}[${info.label}] ${info.level}: ${JSON.stringify(info.message)}`), 38 | ), 39 | transports: [ 40 | new transports.Console({ 41 | level: 'info', 42 | handleExceptions: true, 43 | format: format.combine( 44 | format.label({ label: path.basename(module.parent.filename) }), 45 | format.colorize(), 46 | format.printf( 47 | info => `${info.timestamp}[${info.label}] ${info.level}: ${info.message}`, 48 | ), 49 | ), 50 | }), 51 | dailyRotateFileTransport, 52 | ], 53 | }); 54 | 55 | logger.stream = { 56 | write: (message) => { 57 | logger.info(message); 58 | }, 59 | }; 60 | return logger 61 | } -------------------------------------------------------------------------------- /server/controllers/feed.controller.js: -------------------------------------------------------------------------------- 1 | const xml = require('xml') 2 | const Blog = require('../models/blog.model') 3 | const Tag = require('../models/tag.model') 4 | const Feed = require('feed').Feed 5 | const Cache = require('../services/cache.service') 6 | module.exports = { 7 | async index(req,res) { 8 | var feed = await Cache.get('feed-index') 9 | if(!req.settings.api.redis.rss.display || !feed){ 10 | const blogs = await Blog.find({},{title:1, __id:1, slug:1, excerpt:1, content:1, user:1, image:1, created_at:1}).populate({ 11 | path: 'user', 12 | select: 'name username' 13 | }) 14 | 15 | const tags = await Tag.find({},{key: 1}) 16 | 17 | feed = new Feed({ 18 | title: req.settings.head.title, 19 | description: req.settings.head.meta.description, 20 | id: req.settings.url.site, 21 | link: req.settings.url.site, 22 | language: "tr", 23 | image: req.settings.logo.value, 24 | favicon: req.settings.favicon, 25 | copyright: `All rights reserved ${new Date().getFullYear()}, ${req.settings.name}`, 26 | updated: new Date(2013, 6, 14), 27 | generator: "awesome", 28 | }); 29 | 30 | blogs.forEach(post => { 31 | feed.addItem({ 32 | title: post.title, 33 | id: post.__id, 34 | link: req.settings.url.site + 'post/' + post.slug + '/' + post.__id, 35 | description: post.excerpt, 36 | content: post.content, 37 | author: [ 38 | { 39 | name: Object.values(post.user.name).join(' '), 40 | link: req.settings.url.site + 'profile/' + post.user.username, 41 | } 42 | ], 43 | date: post.created_at, 44 | image: post.image 45 | }); 46 | }); 47 | 48 | tags.forEach(tag => { 49 | feed.addCategory(tag.key); 50 | }) 51 | 52 | if(req.settings.api.redis.rss.display){ 53 | Cache.set('feed-index', JSON.stringify(feed),req.settings.api.redis.rss.ttl) 54 | } 55 | }else { 56 | feed = JSON.parse(feed) 57 | } 58 | 59 | res.set('Content-Type', 'application/rss+xml') 60 | res.send(feed) 61 | } 62 | } -------------------------------------------------------------------------------- /server/controllers/main.controller.js: -------------------------------------------------------------------------------- 1 | const Menu = require('../models/menu.model') 2 | const Tag = require('../models/tag.model') 3 | 4 | module.exports = { 5 | async info (req,res) { 6 | const informations = { 7 | favicon: req.settings.favicon, 8 | head: req.settings.head, 9 | logo: req.settings.logo, 10 | name: req.settings.name, 11 | url: req.settings.url, 12 | social: req.settings.site.social 13 | } 14 | const user = req.user ? { 15 | name: req.user.name, 16 | image: req.user.image, 17 | username: req.user.username, 18 | can: { 19 | 'settings': req.user.role.permission.includes('admin-get-settings'), 20 | 'menu': req.user.role.permission.includes('admin-get-menu'), 21 | 'user': req.user.role.permission.includes('admin-get-user'), 22 | 'group': req.user.role.permission.includes('admin-get-group'), 23 | 'role': req.user.role.permission.includes('admin-get-role'), 24 | 'report': req.user.role.permission.includes('admin-get-report'), 25 | } 26 | } : false 27 | const menu = await Menu.find({},{_id:1, title:1, href:1, menu:1, parent:1, icon:1}).populate({ 28 | path: 'parent', 29 | select: '_id title href menu parent' 30 | }).lean() 31 | const tags = await Tag.find({},{_id:0, key:1}).sort('-count').limit(14) 32 | return res.json({status:1, informations, user, menu, tags, custom: req.settings.api.custom}) 33 | }, 34 | 35 | async tagList (req,res) { 36 | const tags = await Tag.find({},{_id:0, name:1, key:1, count:1}) 37 | return res.json({status:1, tags}) 38 | } 39 | } -------------------------------------------------------------------------------- /server/log/system/.0521975b2d7046bdc01aa55b15e8c95a3756e9f0-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "log\\system\\.0521975b2d7046bdc01aa55b15e8c95a3756e9f0-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662812275861, 10 | "name": "log\\system\\2022-09-10-15-results.log", 11 | "hash": "6154b7a75539f7ae55b2a6825143ef3c9b5635166330e815c27562910baf2fd1" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/system/.095257b99fa65c7014911e6b95759395920f26dc-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\.095257b99fa65c7014911e6b95759395920f26dc-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662816443985, 10 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-10-results.log", 11 | "hash": "65f58f2ce08dc348fe3ecd4804974aa5c86941911e43345785281381c85cce58" 12 | }, 13 | { 14 | "date": 1662874765789, 15 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-11-results.log", 16 | "hash": "1d16f86343f63975672217c592fc046dc5b10be4a86043b8c3b8724aed8f0f4e" 17 | }, 18 | { 19 | "date": 1662987489689, 20 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-12-results.log", 21 | "hash": "4b2f2b139eff7d1b869db98c35f45fda0c34a3fb65b830d7b9bad3ce1cb22fc6" 22 | }, 23 | { 24 | "date": 1663080236797, 25 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-13-results.log", 26 | "hash": "0db7b20b3d86a9eb4c04e99d4b5d507102da830f7ec87d07de000ed9afa03289" 27 | }, 28 | { 29 | "date": 1663129628836, 30 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-14-results.log", 31 | "hash": "1392d99d47bb0cab34b6fe09309e965f162cdcb1cc2b1edede670c74223b5666" 32 | }, 33 | { 34 | "date": 1663217519523, 35 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-15-results.log", 36 | "hash": "8add907ea81cd9128473723a3d23184e1eb4c35201065b41ff41c5ea21d8238e" 37 | }, 38 | { 39 | "date": 1663316890259, 40 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-16-results.log", 41 | "hash": "04fe6977fac64b79ff49fec07cda4e0c0c8f4f88eb9a91c2ea34d6e7689a0ca7" 42 | } 43 | ], 44 | "hashType": "sha256" 45 | } -------------------------------------------------------------------------------- /server/log/system/.410d22ff0ad82247cbde49515d7a73455e133389-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\.410d22ff0ad82247cbde49515d7a73455e133389-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662812614467, 10 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-10-15-results.log", 11 | "hash": "a934d44b49ebe3eb6ba7db2ce6743e1e3270b8245a40ce82d0d732a7e35c49f7" 12 | }, 13 | { 14 | "date": 1662814966669, 15 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\system\\2022-09-10-16-results.log", 16 | "hash": "271dd5f3e48df61c378164a1c897d50b248a131c121bc2393094cac1b1e36760" 17 | } 18 | ], 19 | "hashType": "sha256" 20 | } -------------------------------------------------------------------------------- /server/log/system/.81cbf2ee9613ae7423e921db8707044548ba70a7-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\.81cbf2ee9613ae7423e921db8707044548ba70a7-audit.json", 7 | "files": [ 8 | { 9 | "date": 1664597675116, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-10-results.log", 11 | "hash": "cbd80a84fc5a327eeec5c0cced78942fc7ff108838aae374e87f8368d8d7b063" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/system/.9fd1769ee3492c93eaebb4dd7f37625dec8d1f58-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "log\\system\\.9fd1769ee3492c93eaebb4dd7f37625dec8d1f58-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662812265290, 10 | "name": "log\\system\\2022-09-10-15-results.log", 11 | "hash": "ef13cb2ac9a275eb5c2da24ed61d4d1f0e1124167272ba6e83480f22ceac3d34" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/system/.c523672ed86b928201866292010907d7fd27f0b7-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\.c523672ed86b928201866292010907d7fd27f0b7-audit.json", 7 | "files": [ 8 | { 9 | "date": 1663346430282, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-16-results.log", 11 | "hash": "1d142c33ebb22e9d298750e75a3f4ccce00ec50897533ad9b4f5b81eb6181a1e" 12 | }, 13 | { 14 | "date": 1663414369069, 15 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-17-results.log", 16 | "hash": "cc88b035b35d4cdc6f336174ae62d2dd6f92e02952351e68a65e74e9eb72c606" 17 | }, 18 | { 19 | "date": 1663448414441, 20 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-18-results.log", 21 | "hash": "d346c6e0b8b805fe03c5f60e9f6667be6fdaa3e30dd05b5943a2f83266401f6e" 22 | }, 23 | { 24 | "date": 1663563633407, 25 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-19-results.log", 26 | "hash": "207fe8ba94c33990205df1df79d1340583fdfb1165ba2ec476a02d0559f61884" 27 | }, 28 | { 29 | "date": 1663672434538, 30 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-20-results.log", 31 | "hash": "61efd485a3841864a83f430a558746caf3f0c86502e6e3174467be4bf810da64" 32 | }, 33 | { 34 | "date": 1663734483433, 35 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-21-results.log", 36 | "hash": "725bc51eb52f488f4dafb8fa91559d70ead7b282ef51e3d5ba51f911c3ece2dd" 37 | }, 38 | { 39 | "date": 1663819266748, 40 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-22-results.log", 41 | "hash": "49897079619634fb559684039606c143f3904ec3b010593cee7b37c92bfdfa22" 42 | }, 43 | { 44 | "date": 1663931345379, 45 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-23-results.log", 46 | "hash": "5a6da094c9b7e0ba307633cc8be882e1ae898d45b0359df1ed26bbd69c81bacd" 47 | }, 48 | { 49 | "date": 1663981379638, 50 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-24-results.log", 51 | "hash": "868e7c7e2c852e7debbd331503b5c03d596d356177a9491a5096771dbc2968f6" 52 | }, 53 | { 54 | "date": 1664080119678, 55 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-25-results.log", 56 | "hash": "8e9ed057bb3389e25220f61ea937f3e9db6b8221c0313cad0717c95372ee5995" 57 | }, 58 | { 59 | "date": 1664172013404, 60 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-26-results.log", 61 | "hash": "66fcbaf1062f751db48f0a8de5d0ed2e59372f9f082f867d212a9e92aa193d67" 62 | }, 63 | { 64 | "date": 1664381122838, 65 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-28-results.log", 66 | "hash": "d186edad2940cd85b7358252973e319df509c4b171d8a6e0fdb3b3fe9cb72223" 67 | }, 68 | { 69 | "date": 1664451721888, 70 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-29-results.log", 71 | "hash": "e6f79a7da7ad958c0bbf42744e0b2e85f48fae22f0d05af4041dfb21362a12a3" 72 | }, 73 | { 74 | "date": 1664568353932, 75 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-09-30-results.log", 76 | "hash": "479c4b876a945108fd5f126ce81a3b198476d1aed10a76e4215f6a953eb84c39" 77 | }, 78 | { 79 | "date": 1664597584512, 80 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\system\\2022-10-01-results.log", 81 | "hash": "0c535908bb14d324bb01943e299b0714b13ffb85fa34f6088a99a57eef6236b7" 82 | } 83 | ], 84 | "hashType": "sha256" 85 | } -------------------------------------------------------------------------------- /server/log/system/2022-09-10-15-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-10-15-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-10-16-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-10-16-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-10-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-10-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-11-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-11-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-12-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-12-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-13-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-13-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-14-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-14-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-15-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-15-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-16-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-16-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-17-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-17-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-18-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-18-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-19-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-19-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-20-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-20-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-21-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-21-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-22-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-22-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-23-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-23-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-24-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-24-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-25-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-25-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-26-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-26-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-28-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-28-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-29-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-29-results.log -------------------------------------------------------------------------------- /server/log/system/2022-09-30-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-09-30-results.log -------------------------------------------------------------------------------- /server/log/system/2022-10-01-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-10-01-results.log -------------------------------------------------------------------------------- /server/log/system/2022-10-results.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/log/system/2022-10-results.log -------------------------------------------------------------------------------- /server/log/user/631c9141dbb3b21df9108004/.79436d5b4fa426e8c4a4b39f5026faec57d0351b-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c9141dbb3b21df9108004\\.79436d5b4fa426e8c4a4b39f5026faec57d0351b-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662816577215, 10 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c9141dbb3b21df9108004\\2022-09-10-results.log", 11 | "hash": "1d182a315e684519d9827e21e52497d633ffb24b7d663fac1e7d0e1b83c36c42" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/631c9141dbb3b21df9108004/2022-09-10-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-10 16:29:37[logger.service.js] info: "Register" 2 | -------------------------------------------------------------------------------- /server/log/user/631c923a635d77b8036effa6/.2eaf85e2f82f2af2bf086ec6e3d2826639feedb1-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c923a635d77b8036effa6\\.2eaf85e2f82f2af2bf086ec6e3d2826639feedb1-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662816881329, 10 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c923a635d77b8036effa6\\2022-09-10-results.log", 11 | "hash": "f46b55d8239acdb2aceda99ceb988f115701255138ce1dd23e382f69f9f220d9" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/631c923a635d77b8036effa6/2022-09-10-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-10 16:34:41[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c926214afd56a2743be81/.6b80d536bf99d2119eafce146809545c1e645f37-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c926214afd56a2743be81\\.6b80d536bf99d2119eafce146809545c1e645f37-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662816866239, 10 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c926214afd56a2743be81\\2022-09-10-results.log", 11 | "hash": "7e8047bcbf383e9853462c750f8889ac47a32d826d81916a601b0b52ddb25ab3" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/631c926214afd56a2743be81/2022-09-10-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-10 16:34:26[logger.service.js] info: "Register" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/.9a75b3a9054ad2930124d0a2630d41ae4d2a5ab1-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\631c95c909c237d8349f8d06\\.9a75b3a9054ad2930124d0a2630d41ae4d2a5ab1-audit.json", 7 | "files": [ 8 | { 9 | "date": 1664657380289, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-10-results.log", 11 | "hash": "9282755d10574cae5c260d7f3fec0f91806603c34a150a3b725b9b885959e703" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/.c073fbb6f1a29297f993c1f3300e9bbe51b0c138-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\.c073fbb6f1a29297f993c1f3300e9bbe51b0c138-audit.json", 7 | "files": [ 8 | { 9 | "date": 1662817737754, 10 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-09-10-results.log", 11 | "hash": "c81d3c247438effb761c69579ee2d78000e06c4d41c54b6560273789b868a89b" 12 | }, 13 | { 14 | "date": 1662875622360, 15 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-09-11-results.log", 16 | "hash": "39f1ebf1e7f90072fb6800b4c903f833e7839a72f4b1db1ef8b65985fd7f35b3" 17 | }, 18 | { 19 | "date": 1662987552177, 20 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-09-12-results.log", 21 | "hash": "1aab59a6c6b5a904ed38aa2dd116c6c75935b43896a08dfad21c54fe6ec08e7c" 22 | }, 23 | { 24 | "date": 1663081660271, 25 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-09-13-results.log", 26 | "hash": "29f9c03cf5d8ea24c9411777ed0a9af886b1e421f58a28af7356f2b3793db990" 27 | }, 28 | { 29 | "date": 1663169717818, 30 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-09-14-results.log", 31 | "hash": "568ff08c50feecbbe4fee2638b41b9e6bc8c6a38e7070bf068cf65b358fced7d" 32 | }, 33 | { 34 | "date": 1663256138510, 35 | "name": "D:\\xampp\\htdocs\\fenomedya\\server\\log\\user\\631c95c909c237d8349f8d06\\2022-09-15-results.log", 36 | "hash": "47265e3c4a40d11c23d2c054fab9e28bc7f43534f06728d5fd56ea8200dbfc7c" 37 | } 38 | ], 39 | "hashType": "sha256" 40 | } -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-10-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-10 16:48:57[logger.service.js] info: "Register" 2 | 2022-09-10 17:09:05[logger.service.js] info: "Login" 3 | 2022-09-10 17:10:33[logger.service.js] info: "Login" 4 | 2022-09-10 18:34:10[logger.service.js] info: "Logout" 5 | 2022-09-10 18:34:19[logger.service.js] info: "Login" 6 | 2022-09-10 18:34:52[logger.service.js] info: "Logout" 7 | 2022-09-10 18:35:02[logger.service.js] info: "Login" 8 | 2022-09-10 18:42:53[logger.service.js] info: "Logout" 9 | 2022-09-10 18:43:00[logger.service.js] info: "Login" 10 | 2022-09-10 18:43:14[logger.service.js] info: "Login" 11 | 2022-09-10 18:43:17[logger.service.js] info: "Login" 12 | 2022-09-10 18:43:22[logger.service.js] info: "Logout" 13 | 2022-09-10 18:44:52[logger.service.js] info: "Login" 14 | 2022-09-10 18:45:06[logger.service.js] info: "Logout" 15 | 2022-09-10 18:46:42[logger.service.js] info: "Login" 16 | 2022-09-10 18:48:26[logger.service.js] info: "Logout" 17 | 2022-09-10 18:51:40[logger.service.js] info: "Login" 18 | 2022-09-10 18:51:46[logger.service.js] info: "Logout" 19 | 2022-09-10 18:51:52[logger.service.js] info: "Login" 20 | 2022-09-10 23:37:44[logger.service.js] info: "Logout" 21 | 2022-09-10 23:37:53[logger.service.js] info: "Login" 22 | 2022-09-10 23:38:21[logger.service.js] info: "Logout" 23 | 2022-09-10 23:38:30[logger.service.js] info: "Login" 24 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-11-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-11 08:53:42[logger.service.js] info: "Logout" 2 | 2022-09-11 08:54:54[logger.service.js] info: "Forgot Password Mail Sended" 3 | 2022-09-11 08:54:55[logger.service.js] info: "Forgot Password Mail Sended" 4 | 2022-09-11 08:54:56[logger.service.js] info: "Forgot Password Mail Sended" 5 | 2022-09-11 08:55:09[logger.service.js] info: "Forgot Password Mail Sended" 6 | 2022-09-11 08:55:25[logger.service.js] info: "Forgot Password Mail Sended" 7 | 2022-09-11 08:55:48[logger.service.js] info: "Forgot Password Mail Sended" 8 | 2022-09-11 08:56:05[logger.service.js] info: "Forgot Password Mail Sended" 9 | 2022-09-11 08:57:01[logger.service.js] info: "Login" 10 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-12-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-12 15:59:12[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-13-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-13 18:07:40[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-14-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-14 18:35:17[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-15-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-15 18:35:38[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-16-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-16 19:46:38[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-17-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-17 20:37:04[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-18-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-18 12:23:27[logger.service.js] info: "Logout" 2 | 2022-09-18 12:27:00[logger.service.js] info: "Login" 3 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-19-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-19 12:27:48[logger.service.js] info: "Login" 2 | 2022-09-19 16:32:30[logger.service.js] info: "Login" 3 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-20-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-20 14:25:20[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-21-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-21 19:53:50[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-22-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-22 19:54:52[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-23-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-23 20:24:47[logger.service.js] info: "Login" 2 | 2022-09-23 21:21:32[logger.service.js] info: "Logout" 3 | 2022-09-23 21:38:52[logger.service.js] info: "Login" 4 | 2022-09-23 21:39:10[logger.service.js] info: "Logout" 5 | 2022-09-23 21:46:45[logger.service.js] info: "Forgot Password Mail Sended" 6 | 2022-09-23 22:09:05[logger.service.js] info: "Login" 7 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-24-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-24 06:55:13[logger.service.js] info: "Logout" 2 | 2022-09-24 07:17:29[logger.service.js] info: "Login" 3 | 2022-09-24 08:20:43[logger.service.js] info: "Logout" 4 | 2022-09-24 08:23:58[logger.service.js] info: "Login" 5 | 2022-09-24 08:24:39[logger.service.js] info: "Logout" 6 | 2022-09-24 08:26:18[logger.service.js] info: "Login" 7 | 2022-09-24 13:12:31[logger.service.js] info: "Logout" 8 | 2022-09-24 16:47:26[logger.service.js] info: "Login" 9 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-25-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-25 13:02:31[logger.service.js] info: "Logout" 2 | 2022-09-25 13:13:02[logger.service.js] info: "Login" 3 | 2022-09-25 16:13:15[logger.service.js] info: "Logout" 4 | 2022-09-25 16:14:03[logger.service.js] info: "Login" 5 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-26-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-26 21:54:48[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-28-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-28 19:41:25[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-29-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-29 21:01:31[logger.service.js] info: "Login" 2 | 2022-09-29 22:55:53[logger.service.js] info: "Logout" 3 | 2022-09-29 22:57:35[logger.service.js] info: "Login" 4 | 2022-09-29 22:57:38[logger.service.js] info: "Logout" 5 | 2022-09-29 22:57:44[logger.service.js] info: "Login" 6 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-09-30-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-30 23:22:03[logger.service.js] info: "Login" 2 | -------------------------------------------------------------------------------- /server/log/user/631c95c909c237d8349f8d06/2022-10-results.log: -------------------------------------------------------------------------------- 1 | 2022-10-01 23:49:40[logger.service.js] info: "Login" 2 | 2022-10-03 12:46:29[logger.service.js] info: "Login" 3 | -------------------------------------------------------------------------------- /server/log/user/6326e3d77f54899fac644e4e/.f3408afa72ab48210fcde276f78808ba4a29123f-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\6326e3d77f54899fac644e4e\\.f3408afa72ab48210fcde276f78808ba4a29123f-audit.json", 7 | "files": [ 8 | { 9 | "date": 1663493079653, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\6326e3d77f54899fac644e4e\\2022-09-18-results.log", 11 | "hash": "b0b1f8e744561737549284482f9cd5cb315454e15c644797faa645c473f1009f" 12 | }, 13 | { 14 | "date": 1663996859183, 15 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\6326e3d77f54899fac644e4e\\2022-09-24-results.log", 16 | "hash": "867b9a02f6b109455ce63799a44dbb23436884413e263b39e24c4fdd20aad475" 17 | }, 18 | { 19 | "date": 1664100157040, 20 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\6326e3d77f54899fac644e4e\\2022-09-25-results.log", 21 | "hash": "b15572c97b0358341cf79798572632c16588ef8266814bca8ac44962902c63b9" 22 | } 23 | ], 24 | "hashType": "sha256" 25 | } -------------------------------------------------------------------------------- /server/log/user/6326e3d77f54899fac644e4e/2022-09-18-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-18 12:24:39[logger.service.js] info: "Register" 2 | -------------------------------------------------------------------------------- /server/log/user/6326e3d77f54899fac644e4e/2022-09-24-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-24 08:20:59[logger.service.js] info: "Login" 2 | 2022-09-24 08:23:22[logger.service.js] info: "Logout" 3 | 2022-09-24 08:24:52[logger.service.js] info: "Login" 4 | 2022-09-24 08:26:09[logger.service.js] info: "Logout" 5 | 2022-09-24 13:13:00[logger.service.js] info: "Login" 6 | 2022-09-24 16:47:22[logger.service.js] info: "Logout" 7 | -------------------------------------------------------------------------------- /server/log/user/6326e3d77f54899fac644e4e/2022-09-25-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-25 13:02:37[logger.service.js] info: "Login" 2 | 2022-09-25 13:03:23[logger.service.js] info: "Logout" 3 | -------------------------------------------------------------------------------- /server/log/user/632e7fc49f95b1f517887ada/.24d4dd9fa1b2c596559aeed84342b607b8e957cb-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\632e7fc49f95b1f517887ada\\.24d4dd9fa1b2c596559aeed84342b607b8e957cb-audit.json", 7 | "files": [ 8 | { 9 | "date": 1663991748514, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\632e7fc49f95b1f517887ada\\2022-09-24-results.log", 11 | "hash": "7780a08f050b2480175ff87d16ffd4e5e70cd574b852c86f305f12b352f11baa" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/632e7fc49f95b1f517887ada/2022-09-24-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-24 06:55:48[logger.service.js] info: "Register" 2 | 2022-09-24 06:56:29[logger.service.js] info: "Login" 3 | 2022-09-24 07:17:24[logger.service.js] info: "Logout" 4 | -------------------------------------------------------------------------------- /server/log/user/63302785e6dcd3299f7ed86e/.6d7f66e55954e70dbb34a3f3b9dcb4e84ef7c95b-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\63302785e6dcd3299f7ed86e\\.6d7f66e55954e70dbb34a3f3b9dcb4e84ef7c95b-audit.json", 7 | "files": [ 8 | { 9 | "date": 1664100229099, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\63302785e6dcd3299f7ed86e\\2022-09-25-results.log", 11 | "hash": "15aa62da0475108d0bbd106af8b759d9530d3e502f6c067c25499b151b545430" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/63302785e6dcd3299f7ed86e/2022-09-25-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-25 13:03:49[logger.service.js] info: "Register" 2 | 2022-09-25 13:03:53[logger.service.js] info: "Login" 3 | 2022-09-25 13:09:27[logger.service.js] info: "Logout" 4 | 2022-09-25 16:13:21[logger.service.js] info: "Login" 5 | 2022-09-25 16:13:58[logger.service.js] info: "Logout" 6 | -------------------------------------------------------------------------------- /server/log/user/633028ee056d37f20fb826af/.0aa72b9bd6bdbc7aefe9f7cb18585b3350b6c6b6-audit.json: -------------------------------------------------------------------------------- 1 | { 2 | "keep": { 3 | "days": true, 4 | "amount": 30 5 | }, 6 | "auditLog": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\633028ee056d37f20fb826af\\.0aa72b9bd6bdbc7aefe9f7cb18585b3350b6c6b6-audit.json", 7 | "files": [ 8 | { 9 | "date": 1664100590484, 10 | "name": "D:\\xampp\\htdocs\\yue\\server\\log\\user\\633028ee056d37f20fb826af\\2022-09-25-results.log", 11 | "hash": "d36958f2942b97f2d2ae942cf7b279b614209c5b0b307805029ca387f839f9b7" 12 | } 13 | ], 14 | "hashType": "sha256" 15 | } -------------------------------------------------------------------------------- /server/log/user/633028ee056d37f20fb826af/2022-09-25-results.log: -------------------------------------------------------------------------------- 1 | 2022-09-25 13:09:50[logger.service.js] info: "Register" 2 | 2022-09-25 13:09:55[logger.service.js] info: "Login" 3 | 2022-09-25 13:12:56[logger.service.js] info: "Logout" 4 | -------------------------------------------------------------------------------- /server/middlewares/can.middleware.js: -------------------------------------------------------------------------------- 1 | module.exports = (permission) => { 2 | return (req, res, next) => { 3 | if(!req.user){ 4 | return res.status(301).json({status : 0, message : 'need_to_login', 'redirect' : 'panel-login'}) 5 | } 6 | if(!permission){ 7 | return next() 8 | } 9 | 10 | if(req.user.role.permission.includes(permission)){ 11 | return next() 12 | } 13 | return res.status(301).json({status : 0, message : 'permission_denied'}) 14 | } 15 | } -------------------------------------------------------------------------------- /server/middlewares/guard.middleware.js: -------------------------------------------------------------------------------- 1 | const User = require('../models/user.model') 2 | const Setting = require('../models/settings.model') 3 | module.exports = async (req,res,next) => { 4 | if(req.session.user){ 5 | const user = await User.findOne({_id : req.session.user}).populate('role') 6 | req.user = user 7 | } 8 | const settings = await Setting.findOne() 9 | req.settings = settings 10 | next() 11 | } -------------------------------------------------------------------------------- /server/models/blog.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | const shortid = require('shortid'); 3 | shortid.characters('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'); 4 | 5 | const Schema = new mongoose.Schema({ 6 | __id: { 7 | type: String, 8 | default: shortid.generate() 9 | }, 10 | title: { 11 | type: String, 12 | required: true 13 | }, 14 | slug: { 15 | type: String, 16 | required: true, 17 | lowercase: true 18 | }, 19 | image: { 20 | type: String, 21 | default: null 22 | }, 23 | content: { 24 | type: String, 25 | required: true 26 | }, 27 | excerpt: { 28 | type: String, 29 | required: true 30 | }, 31 | tag: [{ 32 | type: String 33 | }], 34 | resource: [{ 35 | type: String 36 | }], 37 | user: { 38 | type: mongoose.Types.ObjectId, 39 | ref: 'users', 40 | required: true, 41 | }, 42 | status: { 43 | type: String, 44 | enum: ['draft','pending','published'], 45 | default: 'draft' 46 | }, 47 | stats: { 48 | view: { 49 | type: Number, 50 | default: 0 51 | }, 52 | like: { 53 | type: Number, 54 | default: 0 55 | } 56 | }, 57 | created_at : { 58 | type : Date 59 | }, 60 | updated_at : { 61 | type : Date 62 | } 63 | }) 64 | 65 | Schema.pre('save', function(next) { 66 | now = new Date(); 67 | this.updated_at = now; 68 | if ( !this.created_at ) { 69 | this.created_at = now; 70 | } 71 | return next() 72 | }) 73 | 74 | module.exports = mongoose.model('blogs', Schema) -------------------------------------------------------------------------------- /server/models/comment.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | blog: { 5 | type: mongoose.Types.ObjectId, 6 | ref: 'blogs', 7 | required: true 8 | }, 9 | user: { 10 | type: mongoose.Types.ObjectId, 11 | ref: 'users', 12 | required: true 13 | }, 14 | content: { 15 | type: String, 16 | required: true 17 | }, 18 | stats: { 19 | view: { 20 | type: Number, 21 | default: 0 22 | }, 23 | like: { 24 | type: Number, 25 | default: 0 26 | } 27 | }, 28 | created_at : { 29 | type : Date 30 | }, 31 | updated_at : { 32 | type : Date 33 | } 34 | }) 35 | 36 | Schema.pre('save', function(next) { 37 | now = new Date(); 38 | this.updated_at = now; 39 | if ( !this.created_at ) { 40 | this.created_at = now; 41 | } 42 | return next() 43 | }) 44 | 45 | module.exports = mongoose.model('comments', Schema) -------------------------------------------------------------------------------- /server/models/follow.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | follower: { 5 | type: mongoose.Types.ObjectId, 6 | ref: 'users' 7 | }, 8 | following: { 9 | type: mongoose.Types.ObjectId, 10 | ref: 'users' 11 | }, 12 | created_at : { 13 | type : Date 14 | }, 15 | updated_at : { 16 | type : Date 17 | } 18 | }) 19 | 20 | Schema.pre('save', function(next) { 21 | now = new Date(); 22 | this.updated_at = now; 23 | if ( !this.created_at ) { 24 | this.created_at = now; 25 | } 26 | return next() 27 | }) 28 | 29 | module.exports = mongoose.model('follows', Schema) -------------------------------------------------------------------------------- /server/models/group.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | title: { 5 | type: String, 6 | required: true 7 | }, 8 | default: { 9 | type: Boolean 10 | }, 11 | created_at : { 12 | type : Date 13 | }, 14 | updated_at : { 15 | type : Date 16 | } 17 | }) 18 | 19 | Schema.pre('save', function(next) { 20 | now = new Date(); 21 | this.updated_at = now; 22 | if ( !this.created_at ) { 23 | this.created_at = now; 24 | } 25 | return next() 26 | }) 27 | 28 | module.exports = mongoose.model('groups', Schema) -------------------------------------------------------------------------------- /server/models/menu.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | title: { 5 | type: String, 6 | required: true 7 | }, 8 | href: { 9 | type: { 10 | type: String, 11 | enum: ['url','router'] 12 | }, 13 | value: { 14 | type: String, 15 | required: true 16 | }, 17 | target: { 18 | type: String, 19 | enum: ['_self','_blank'] 20 | }, 21 | params: String 22 | }, 23 | icon: String, 24 | menu: { 25 | type: String, 26 | enum: ['header','footer','left'] 27 | }, 28 | parent: { 29 | type: mongoose.Types.ObjectId, 30 | ref: 'menus' 31 | }, 32 | created_at : { 33 | type : Date 34 | }, 35 | updated_at : { 36 | type : Date 37 | } 38 | }) 39 | 40 | Schema.pre('save', function(next) { 41 | now = new Date(); 42 | this.updated_at = now; 43 | if ( !this.created_at ) { 44 | this.created_at = now; 45 | } 46 | return next() 47 | }) 48 | 49 | module.exports = mongoose.model('menus', Schema) -------------------------------------------------------------------------------- /server/models/redirect.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | const shortid = require('shortid'); 3 | shortid.characters('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_'); 4 | 5 | const Schema = new mongoose.Schema({ 6 | __id: { 7 | type: String 8 | }, 9 | slug: { 10 | type: String 11 | }, 12 | blog: { 13 | type: mongoose.Types.ObjectId, 14 | ref: 'blogs' 15 | }, 16 | created_at : { 17 | type : Date 18 | }, 19 | updated_at : { 20 | type : Date 21 | } 22 | }) 23 | 24 | Schema.pre('save', function(next) { 25 | now = new Date(); 26 | this.updated_at = now; 27 | if ( !this.created_at ) { 28 | this.created_at = now; 29 | } 30 | return next() 31 | }) 32 | 33 | module.exports = mongoose.model('redirects', Schema) -------------------------------------------------------------------------------- /server/models/report.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | blog: { 5 | type: mongoose.Types.ObjectId, 6 | ref: 'blogs' 7 | }, 8 | comment: { 9 | type: mongoose.Types.ObjectId, 10 | ref: 'comments' 11 | }, 12 | user: { 13 | type: mongoose.Types.ObjectId, 14 | ref: 'users' 15 | }, 16 | reason: { 17 | type: String, 18 | enum: ['spam','against_community_rules','rules_violation'], 19 | default: 'spam' 20 | }, 21 | status: { 22 | type: String, 23 | enum: ['active','pending','solved'], 24 | default: 'active' 25 | }, 26 | created_at : { 27 | type : Date 28 | }, 29 | updated_at : { 30 | type : Date 31 | } 32 | }) 33 | 34 | Schema.pre('save', function(next) { 35 | now = new Date(); 36 | this.updated_at = now; 37 | if ( !this.created_at ) { 38 | this.created_at = now; 39 | } 40 | return next() 41 | }) 42 | 43 | module.exports = mongoose.model('reports', Schema) -------------------------------------------------------------------------------- /server/models/role.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | title: { 5 | type: String, 6 | required: true 7 | }, 8 | permission: { 9 | type: [String], 10 | enum: [ 11 | 'login-site','register-site', 12 | 'admin-get-settings', 'admin-save-settings', 13 | 'admin-get-menu','admin-save-menu', 14 | 'admin-get-user','admin-save-user', 15 | 'admin-login-as', 16 | 'admin-get-role','admin-save-role', 17 | 'admin-get-group','admin-save-group', 18 | 'admin-get-report', 'admin-save-report', 19 | 'site-blog-like', 'site-blog-report', 20 | 'site-blog-dislike', 21 | 'site-comment-add', 'site-comment-like', 22 | 'site-comment-report', 'panel-blog-list', 23 | 'panel-blog-add', 'panel-blog-edit', 24 | 'panel-blog-save', 'panel-blog-delete', 25 | 'panel-user-edit', 'site-profile-follow' 26 | ] 27 | }, 28 | default: { 29 | type: Boolean 30 | }, 31 | banned: { 32 | type: Boolean 33 | }, 34 | image: { 35 | type: String 36 | }, 37 | created_at : { 38 | type : Date 39 | }, 40 | updated_at : { 41 | type : Date 42 | } 43 | }) 44 | 45 | Schema.pre('save', function(next) { 46 | now = new Date(); 47 | this.updated_at = now; 48 | if ( !this.created_at ) { 49 | this.created_at = now; 50 | } 51 | return next() 52 | }) 53 | 54 | module.exports = mongoose.model('roles', Schema) -------------------------------------------------------------------------------- /server/models/tag.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | 3 | const Schema = new mongoose.Schema({ 4 | key: { 5 | type: String 6 | }, 7 | count: { 8 | type: Number, 9 | min: 0 10 | }, 11 | created_at : { 12 | type : Date 13 | }, 14 | updated_at : { 15 | type : Date 16 | } 17 | }) 18 | 19 | Schema.pre('save', function(next) { 20 | now = new Date(); 21 | this.updated_at = now; 22 | if ( !this.created_at ) { 23 | this.created_at = now; 24 | } 25 | return next() 26 | }) 27 | 28 | module.exports = mongoose.model('tags', Schema) -------------------------------------------------------------------------------- /server/models/user.model.js: -------------------------------------------------------------------------------- 1 | const mongoose = require ('mongoose') 2 | const bcrypt = require('bcrypt') 3 | 4 | const Schema = new mongoose.Schema({ 5 | email: { 6 | type: String, 7 | lowercase: true, 8 | unique: true, 9 | required: true 10 | }, 11 | username: { 12 | type: String, 13 | lowercase: true, 14 | unique: true, 15 | required: true 16 | }, 17 | password: { 18 | type: String, 19 | required: true 20 | }, 21 | name: { 22 | first: { 23 | type: String, 24 | required: true 25 | }, 26 | last: { 27 | type: String, 28 | required: true 29 | } 30 | }, 31 | about: { 32 | type: String 33 | }, 34 | social: { 35 | instagram: String, 36 | linkedin: String, 37 | facebook: String, 38 | twitter: String 39 | }, 40 | image: { 41 | type : String, 42 | default: '/assets/img/illustrations/profiles/profile-1.png' 43 | }, 44 | role: { 45 | type: mongoose.Types.ObjectId, 46 | ref: 'roles' 47 | }, 48 | group: [ 49 | { 50 | type: mongoose.Types.ObjectId, 51 | ref: 'groups' 52 | } 53 | ], 54 | verify: { 55 | code : String, 56 | at : Date, 57 | send : Date 58 | }, 59 | forgot_password: { 60 | code : String, 61 | at : Date, 62 | send : Date 63 | }, 64 | notification: { 65 | email: { 66 | status: { 67 | type: Boolean, 68 | default: true 69 | }, 70 | failed_login_attempt: { 71 | type: Boolean, 72 | default: true 73 | } 74 | } 75 | }, 76 | fac: { 77 | type: { 78 | type: String, 79 | enum: ['off','email'], 80 | default: 'off' 81 | } 82 | }, 83 | created_at : { 84 | type : Date 85 | }, 86 | updated_at : { 87 | type : Date 88 | } 89 | }) 90 | 91 | Schema.pre('save', function(next) { 92 | const user = this 93 | now = new Date(); 94 | this.updated_at = now; 95 | if ( !this.created_at ) { 96 | this.created_at = now; 97 | } 98 | if (this.isModified('password') || this.isNew) { 99 | bcrypt.hash(user.password, 10, (error, hash) => { 100 | if (error) { 101 | return next(error) 102 | } 103 | user.password = hash 104 | next() 105 | }) 106 | } else { 107 | return next() 108 | } 109 | }) 110 | 111 | 112 | module.exports = mongoose.model('users', Schema) -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "NodBlog", 3 | "version": "1.0.0", 4 | "description": "NodBlog BackEnd", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "nodemon app.js" 9 | }, 10 | "keywords": [ 11 | "FenoMedya" 12 | ], 13 | "author": "Omer Faruk Demirel", 14 | "license": "ISC", 15 | "dependencies": { 16 | "aws-sdk": "^2.1225.0", 17 | "axios": "^0.27.2", 18 | "bcrypt": "^5.0.1", 19 | "body-parser": "^1.20.0", 20 | "cheerio": "^1.0.0-rc.12", 21 | "connect-mongo": "^4.6.0", 22 | "cookie-parser": "^1.4.6", 23 | "cors": "^2.8.5", 24 | "dotenv": "^16.0.2", 25 | "express": "^4.18.1", 26 | "express-rate-limit": "^6.6.0", 27 | "express-session": "^1.17.3", 28 | "feed": "^4.2.2", 29 | "ger": "^0.0.99", 30 | "googleapis": "^108.0.0", 31 | "handlebars": "^4.7.7", 32 | "helmet": "^6.0.0", 33 | "http": "^0.0.1-security", 34 | "instagram-web-api": "^2.2.2", 35 | "make-runnable": "^1.3.10", 36 | "mongoose": "^6.6.0", 37 | "multiparty": "^4.2.3", 38 | "nodemailer": "^6.7.8", 39 | "nodemon": "^2.0.19", 40 | "raccoon": "^0.2.8", 41 | "redis": "^4.3.1", 42 | "serve-static": "^1.15.0", 43 | "shortid": "^2.2.16", 44 | "winston": "^3.8.2", 45 | "winston-daily-rotate-file": "^4.7.1", 46 | "xml": "^1.0.1" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /server/public/email_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/public/email_favicon.png -------------------------------------------------------------------------------- /server/public/email_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/public/email_logo.png -------------------------------------------------------------------------------- /server/public/email_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/public/favicon.png -------------------------------------------------------------------------------- /server/public/favicon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/public/logo.png -------------------------------------------------------------------------------- /server/public/user/631c95c909c237d8349f8d06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/public/user/631c95c909c237d8349f8d06.png -------------------------------------------------------------------------------- /server/public/user/6326e3d77f54899fac644e4e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/omerfdmrl/NodBlog/75d711e3526f5ecdc49156454dba6fc430edb4b1/server/public/user/6326e3d77f54899fac644e4e.png -------------------------------------------------------------------------------- /server/routes/admin.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const AdminController = require('../controllers/admin.controller') 4 | const Can = require('../middlewares/can.middleware') 5 | 6 | router.post('/get-settings',Can('admin-get-settings'),(req,res) => { 7 | AdminController.getSettings(req,res) 8 | }) 9 | router.post('/change-image',Can('admin-save-settings'),(req,res) => { 10 | AdminController.changeImage(req,res) 11 | }) 12 | router.post('/save-settings',Can('admin-save-settings'),(req,res) => { 13 | AdminController.saveSettings(req,res) 14 | }) 15 | router.post('/menu-list',Can('admin-get-menu'),(req,res) => { 16 | AdminController.menuList(req,res) 17 | }) 18 | router.post('/menu-add',Can('admin-save-menu'),(req,res) => { 19 | AdminController.menuAdd(req,res) 20 | }) 21 | router.post('/menu-delete',Can('admin-save-menu'),(req,res) => { 22 | AdminController.menuDelete(req,res) 23 | }) 24 | router.post('/menu-save',Can('admin-save-menu'),(req,res) => { 25 | AdminController.menuSave(req,res) 26 | }) 27 | router.post('/user-list',Can('admin-get-user'),(req,res) => { 28 | AdminController.userList(req,res) 29 | }) 30 | router.post('/user-save',Can('admin-save-user'),(req,res) => { 31 | AdminController.userSave(req,res) 32 | }) 33 | router.post('/user-login-as',Can('admin-login-as'),(req,res) => { 34 | AdminController.userLoginAs(req,res) 35 | }) 36 | router.post('/user-change-image',Can('admin-save-user'),(req,res) => { 37 | AdminController.userChangeImage(req,res) 38 | }) 39 | router.post('/group-list',Can('admin-get-group'),(req,res) => { 40 | AdminController.groupList(req,res) 41 | }) 42 | router.post('/group-add',Can('admin-save-group'),(req,res) => { 43 | AdminController.groupAdd(req,res) 44 | }) 45 | router.post('/group-save',Can('admin-save-group'),(req,res) => { 46 | AdminController.groupSave(req,res) 47 | }) 48 | router.post('/group-delete',Can('admin-save-group'),(req,res) => { 49 | AdminController.groupDelete(req,res) 50 | }) 51 | router.post('/role-list',Can('admin-get-role'),(req,res) => { 52 | AdminController.roleList(req,res) 53 | }) 54 | router.post('/role-add',Can('admin-save-role'),(req,res) => { 55 | AdminController.roleAdd(req,res) 56 | }) 57 | router.post('/role-save',Can('admin-save-role'),(req,res) => { 58 | AdminController.roleSave(req,res) 59 | }) 60 | router.post('/permission-list',Can('admin-get-role'),(req,res) => { 61 | AdminController.permissionList(req,res) 62 | }) 63 | router.post('/report-list',Can('admin-get-report'),(req,res) => { 64 | AdminController.reportList(req,res) 65 | }) 66 | router.post('/report-delete',Can('admin-save-report'),(req,res) => { 67 | AdminController.reportDelete(req,res) 68 | }) 69 | router.post('/report-action-delete',Can('admin-save-report'),(req,res) => { 70 | AdminController.reportActionDelete(req,res) 71 | }) 72 | router.post('/report-action-ban',Can('admin-save-report'),(req,res) => { 73 | AdminController.reportActionBan(req,res) 74 | }) 75 | 76 | module.exports = router -------------------------------------------------------------------------------- /server/routes/authentication.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const Can = require('../middlewares/can.middleware') 4 | const AuthenticationController = require('../controllers/authentication.controller') 5 | 6 | router.post('/login',(req,res) => { 7 | AuthenticationController.login(req,res) 8 | }) 9 | router.post('/register',(req,res) => { 10 | AuthenticationController.register(req,res) 11 | }) 12 | router.post('/logout',(req,res) => { 13 | AuthenticationController.logout(req,res) 14 | }) 15 | router.post('/send-forgot-password',(req,res) => { 16 | AuthenticationController.sendForgotPassword(req,res) 17 | }) 18 | router.post('/submit-forgot-password',(req,res) => { 19 | AuthenticationController.submitForgotPassword(req,res) 20 | }) 21 | 22 | module.exports = router -------------------------------------------------------------------------------- /server/routes/feed.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const FeedController = require('../controllers/feed.controller') 4 | 5 | router.get('/',(req,res) => { 6 | FeedController.index(req,res) 7 | }) 8 | 9 | module.exports = router -------------------------------------------------------------------------------- /server/routes/main.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const MainController = require('../controllers/main.controller') 4 | 5 | router.post('/info',(req,res) => { 6 | MainController.info(req,res) 7 | }) 8 | router.post('/tag-list',(req,res) => { 9 | MainController.tagList(req,res) 10 | }) 11 | 12 | module.exports = router -------------------------------------------------------------------------------- /server/routes/panel.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const PanelController = require('../controllers/panel.controller') 4 | const Can = require('../middlewares/can.middleware') 5 | 6 | router.post('/blog-list',Can('panel-blog-list'),(req,res) => { 7 | PanelController.blogList(req,res) 8 | }) 9 | router.post('/blog-add',Can('panel-blog-add'),(req,res) => { 10 | PanelController.blogAdd(req,res) 11 | }) 12 | router.post('/blog-get-edit',Can('panel-blog-edit'),(req,res) => { 13 | PanelController.blogGetEdit(req,res) 14 | }) 15 | router.post('/blog-save-edit',Can('panel-blog-save'),(req,res) => { 16 | PanelController.blogSaveEdit(req,res) 17 | }) 18 | router.post('/blog-delete',Can('panel-blog-delete'),(req,res) => { 19 | PanelController.blogDelete(req,res) 20 | }) 21 | router.post('/user-get-edit',Can('panel-user-edit'),(req,res) => { 22 | PanelController.userGetEdit(req,res) 23 | }) 24 | router.post('/user-change-image',Can('panel-user-edit'),(req,res) => { 25 | PanelController.userChangeImage(req,res) 26 | }) 27 | router.post('/user-save-edit',Can('panel-user-edit'),(req,res) => { 28 | PanelController.userSaveEdit(req,res) 29 | }) 30 | 31 | module.exports = router -------------------------------------------------------------------------------- /server/routes/site.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const SiteController = require('../controllers/site.controller') 4 | const Can = require('../middlewares/can.middleware') 5 | 6 | router.post('/home',(req,res) => { 7 | SiteController.home(req,res) 8 | }) 9 | router.post('/home-blog',(req,res) => { 10 | SiteController.homeBlog(req,res) 11 | }) 12 | router.post('/home-popular',(req,res) => { 13 | SiteController.homePopular(req,res) 14 | }) 15 | router.post('/blog-index',(req,res) => { 16 | SiteController.blogIndex(req,res) 17 | }) 18 | router.post('/blog-like',Can('site-blog-like'),(req,res) => { 19 | SiteController.blogLike(req,res) 20 | }) 21 | router.post('/blog-report',Can('site-blog-report'),(req,res) => { 22 | SiteController.blogReport(req,res) 23 | }) 24 | router.post('/blog-dislike',Can('site-blog-dislike'),(req,res) => { 25 | SiteController.blogDislike(req,res) 26 | }) 27 | router.post('/comment-add',Can('site-comment-add'),(req,res) => { 28 | SiteController.commentAdd(req,res) 29 | }) 30 | router.post('/comment-like',Can('site-comment-like'),(req,res) => { 31 | SiteController.commentLike(req,res) 32 | }) 33 | router.post('/comment-report',Can('site-comment-report'),(req,res) => { 34 | SiteController.commentReport(req,res) 35 | }) 36 | router.post('/profile',(req,res) => { 37 | SiteController.profile(req,res) 38 | }) 39 | router.post('/profile-blog',(req,res) => { 40 | SiteController.profileBlog(req,res) 41 | }) 42 | router.post('/profile-follow',Can('site-profile-follow'),(req,res) => { 43 | SiteController.profileFollow(req,res) 44 | }) 45 | router.post('/tag-index',(req,res) => { 46 | SiteController.tagIndex(req,res) 47 | }) 48 | router.post('/tag-blog',(req,res) => { 49 | SiteController.tagBlog(req,res) 50 | }) 51 | router.post('/search',(req,res) => { 52 | SiteController.search(req,res) 53 | }) 54 | 55 | module.exports = router -------------------------------------------------------------------------------- /server/routes/sitemap.routes.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const router = express.Router(); 3 | const SitemapController = require('../controllers/sitemap.controller') 4 | 5 | router.get('/',(req,res) => { 6 | SitemapController.index(req,res) 7 | }) 8 | router.get('/blog',(req,res) => { 9 | SitemapController.blog(req,res) 10 | }) 11 | router.get('/user',(req,res) => { 12 | SitemapController.user(req,res) 13 | }) 14 | router.get('/tag',(req,res) => { 15 | SitemapController.tag(req,res) 16 | }) 17 | 18 | module.exports = router -------------------------------------------------------------------------------- /server/services/aws.service.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk') 2 | const fs = require('fs') 3 | const Settings = require('../models/settings.model') 4 | 5 | const init = async () => { 6 | const settings = await Settings.findOne({},{'api.aws': 1}) 7 | if(!settings.api.aws.display) { 8 | return { s3: false } 9 | } 10 | const s3 = await new AWS.S3({ 11 | accessKeyId: settings.api.aws.access, 12 | secretAccessKey: settings.api.aws.secret, 13 | region : settings.api.aws.region 14 | }) 15 | return {s3,settings}; 16 | } 17 | 18 | const upload = async (Filename,Filepath) => { 19 | const { s3, settings } = await init() 20 | if(!s3){ 21 | return false; 22 | } 23 | const fileStream = fs.createReadStream(Filepath) 24 | const upload = await s3.upload({ 25 | Bucket : settings.api.aws.bucket, 26 | Body : fileStream, 27 | Key : Filename, 28 | ACL:'public-read' 29 | }).promise() 30 | return upload; 31 | } 32 | 33 | const remove = async (File) => { 34 | const { s3, settings } = await init() 35 | if(!s3){ 36 | return false; 37 | } 38 | const upload = await s3.deleteObject({ 39 | Bucket : settings.api.aws.bucket, 40 | Key : File 41 | }).promise() 42 | return upload; 43 | } 44 | 45 | module.exports = { 46 | upload, 47 | remove 48 | } -------------------------------------------------------------------------------- /server/services/cache.service.js: -------------------------------------------------------------------------------- 1 | const { createClient } = require('redis'); 2 | const Setting = require('../models/settings.model') 3 | 4 | const init = async () => { 5 | const settings = await Setting.findOne({},{_id:0, 'api.redis': 1}) 6 | const client = createClient({ 7 | url: settings.api.redis.url 8 | }); 9 | client.on('error', (err) => console.log('Redis Client Error', err)); 10 | await client.connect(); 11 | return client; 12 | } 13 | 14 | const set = async (key,value,ttl = false) => { 15 | const client = await init() 16 | if(ttl){ 17 | client.setEx(key, ttl * 60, value) 18 | }else { 19 | client.set(key, value); 20 | } 21 | return true; 22 | } 23 | 24 | const get = async (key,defaultValue = null) => { 25 | const client = await init() 26 | const value = await client.get(key); 27 | return value ?? defaultValue; 28 | } 29 | 30 | module.exports = { 31 | init, 32 | set, 33 | get 34 | } -------------------------------------------------------------------------------- /server/services/cronjob.service.js: -------------------------------------------------------------------------------- 1 | const database = require('../configs/database.config') 2 | database.connect() 3 | const Blog = require('../models/blog.model') 4 | const Tag = require('../models/tag.model') 5 | 6 | const tag = async () => { 7 | var tags = {} 8 | const blogs = await Blog.find({}) 9 | for await(const blog of blogs){ 10 | blog.tag.forEach(tag => { 11 | if(tags[tag]){ 12 | tags[tag].count++ 13 | }else{ 14 | tags[tag] = {key: tag, count: 1} 15 | } 16 | }); 17 | } 18 | Tag.deleteMany({},(err) => { if(err) { return err } }) 19 | Tag.create(Object.values(tags),(err) => {if(err) { return err }}) 20 | } 21 | 22 | tag() -------------------------------------------------------------------------------- /server/services/drive.service.js: -------------------------------------------------------------------------------- 1 | const { google } = require('googleapis'); 2 | const Settings = require('../models/settings.model') 3 | 4 | const init = async () => { 5 | const settings = await Settings.findOne({},{'api.drive': 1}) 6 | if(!settings.api.drive.display) { 7 | return { drive: false } 8 | } 9 | const oauth2Client = await new google.auth.OAuth2( 10 | settings.api.drive.client, 11 | settings.api.drive.secret, 12 | settings.api.drive.redirect 13 | ); 14 | 15 | await oauth2Client.setCredentials({ refresh_token: settings.api.drive.refresh }); 16 | 17 | const drive = await google.drive({ 18 | version: 'v3', 19 | auth: oauth2Client, 20 | }); 21 | return {drive,settings}; 22 | } 23 | 24 | const createFolder = async (folderName) => { 25 | const { drive } = await init() 26 | if(!drive){ 27 | return false; 28 | } 29 | return await drive.files.create({ 30 | resource: { 31 | name: folderName, 32 | mimeType: 'application/vnd.google-apps.folder', 33 | }, 34 | fields: 'id, name', 35 | }); 36 | } 37 | 38 | const searchFolder = async (folderName) => { 39 | const { drive } = await init() 40 | if(!drive){ 41 | return false; 42 | } 43 | return new Promise((resolve, reject) => { 44 | drive.files.list({ 45 | q: `mimeType='application/vnd.google-apps.folder' and name='${folderName}'`, 46 | fields: 'files(id, name)', 47 | }, (err, res) => { 48 | if (err) { 49 | return reject(err); 50 | } 51 | return resolve(res.data.files ? res.data.files[0] : null); 52 | }); 53 | }); 54 | } 55 | 56 | const saveFile = async (fileName, filePath, fileMimeType, folderId = null) => { 57 | const { drive } = await init() 58 | if(!drive){ 59 | return false; 60 | } 61 | return await drive.files.create({ 62 | requestBody: { 63 | name: fileName, 64 | mimeType: fileMimeType, 65 | parents: folderId ? [folderId] : [], 66 | role: 'reader', 67 | type: 'anyone', 68 | }, 69 | media: { 70 | mimeType: fileMimeType, 71 | body: fs.createReadStream(filePath), 72 | }, 73 | }); 74 | } 75 | 76 | const deleteFile = async (fileId) => { 77 | const { drive } = await init() 78 | if(!drive){ 79 | return false; 80 | } 81 | return await drive.files.delete({ 82 | fileId 83 | }) 84 | } 85 | 86 | const getFile = async (fileId) => { 87 | const { drive } = await init() 88 | if(!drive){ 89 | return false; 90 | } 91 | return await drive.files.get({fileId}) 92 | } 93 | 94 | const getFileUrl = async (fileId) => { 95 | const { drive } = await init() 96 | if(!drive){ 97 | return false; 98 | } 99 | const result = await drive.files.get({ 100 | fileId: fileId, 101 | alt: 'media', 102 | fields : 'webViewLink' 103 | }); 104 | var imageType = result.headers['content-type']; 105 | var base64 = Buffer.from(result.data, 'utf8').toString('base64'); 106 | var dataURI = 'data:' + imageType + ';base64,' + base64; 107 | return dataURI; 108 | } 109 | 110 | module.exports = { 111 | searchFolder, 112 | createFolder, 113 | saveFile, 114 | getFileUrl, 115 | deleteFile, 116 | getFile 117 | } -------------------------------------------------------------------------------- /server/services/index.service.js: -------------------------------------------------------------------------------- 1 | var request = require("request"); 2 | var { google } = require("googleapis"); 3 | const Setting = require('../models/settings.model') 4 | 5 | const init = async () => { 6 | const settings = await Setting.findOne({},{_id:0, index: 1, url: 1}) 7 | if(!settings.api.index.display || !settings.api.index.email || !settings.api.index.key) { 8 | return false; 9 | } 10 | const client = new google.auth.JWT( 11 | settings.api.index.email, 12 | null, 13 | settings.api.index.key, 14 | ["https://www.googleapis.com/auth/indexing"], 15 | null 16 | ); 17 | client.authorize(function(err, tokens) { 18 | if (err) { 19 | console.log(err); 20 | return; 21 | } 22 | return { settings, token: tokens.access_token } 23 | }); 24 | if(!client){ 25 | return false; 26 | } 27 | } 28 | 29 | const updated = async (url) => { 30 | const client = await init() 31 | if(!client || !url){ 32 | return false; 33 | } 34 | let options = { 35 | url: "https://indexing.googleapis.com/v3/urlNotifications:publish", 36 | method: "POST", 37 | headers: { 38 | "Content-Type": "application/json" 39 | }, 40 | auth: { "bearer": client.token }, 41 | json: { 42 | "url": client.settings.url.site + url, 43 | "type": "URL_UPDATED" 44 | } 45 | }; 46 | request(options, function (error, response, body) { 47 | if(error){ 48 | console.log(error); 49 | return; 50 | } 51 | }); 52 | return true; 53 | } 54 | 55 | const deleted = async (url) => { 56 | const client = await init() 57 | if(!client || !url){ 58 | return false; 59 | } 60 | let options = { 61 | url: "https://indexing.googleapis.com/v3/urlNotifications:publish", 62 | method: "POST", 63 | headers: { 64 | "Content-Type": "application/json" 65 | }, 66 | auth: { "bearer": client.token }, 67 | json: { 68 | "url": client.settings.url.site + url, 69 | "type": "URL_DELETED" 70 | } 71 | }; 72 | request(options, function (error, response, body) { 73 | if(error){ 74 | console.log(error); 75 | return; 76 | } 77 | }); 78 | return true; 79 | } 80 | 81 | module.exports = { 82 | init, 83 | updated, 84 | deleted 85 | } -------------------------------------------------------------------------------- /server/services/logger.service.js: -------------------------------------------------------------------------------- 1 | const system = require('../configs/loggers/system.logger') 2 | const user = require('../configs/loggers/user.logger') 3 | 4 | module.exports = { 5 | system, 6 | user 7 | } -------------------------------------------------------------------------------- /server/services/notification.service.js: -------------------------------------------------------------------------------- 1 | const handlebars = require('handlebars') 2 | const fs = require('fs') 3 | const path = require('path') 4 | const Setting = require('../models/settings.model.js') 5 | const nodemailer = require('nodemailer') 6 | 7 | require('dotenv').config({path : '../.env'}) 8 | 9 | module.exports.sendMail = async({type, to, data, subject}) => { 10 | const settings = await Setting.findOne() 11 | const transport = nodemailer.createTransport({ 12 | host: settings.smtp.host, 13 | port: settings.smtp.port, 14 | auth: { 15 | user: settings.smtp.user, 16 | pass: settings.smtp.password 17 | }, 18 | pool: true, 19 | maxConnections: 1, 20 | rateDelta: 20000, 21 | rateLimit: 5, 22 | }); 23 | const filePath = path.join(global.__basedir, `/templates/${type}.html`); 24 | const source = fs.readFileSync(filePath, 'utf-8').toString(); 25 | const template = handlebars.compile(source); 26 | data.title = settings.email.title 27 | data.favicon = settings.email.favicon 28 | data.logo = settings.email.logo 29 | data.url = settings.email.url 30 | const replacements = data; 31 | const htmlToSend = template(replacements); 32 | return await transport.sendMail({ 33 | from: `"${data.title}" ${settings.smtp.user}`, 34 | to: to, 35 | subject: subject, 36 | html: htmlToSend 37 | }); 38 | } -------------------------------------------------------------------------------- /server/services/recommendation.service.js: -------------------------------------------------------------------------------- 1 | const raccoon = require('raccoon'); 2 | raccoon.config.className = 'yue'; 3 | 4 | const like = (slug,user,data) => { 5 | if(!user || !data) return false; 6 | raccoon.liked(user.toString(),slug + '-' + data.toString()) 7 | } 8 | 9 | const unlike = (slug,user,data) => { 10 | if(!user || !data) return false; 11 | raccoon.liked(user.toString(),slug + '-' + data.toString()) 12 | } 13 | 14 | const dislike = (slug,user,data) => { 15 | if(!user || !data) return false; 16 | raccoon.disliked(user.toString(),slug + '-' + data.toString()) 17 | } 18 | 19 | const undislike = (slug,user,data) => { 20 | if(!user || !data) return false; 21 | raccoon.undisliked(user.toString(),slug + '-' + data.toString()) 22 | } 23 | 24 | const recommend = async (user, skip = 0, take = 5) => { 25 | if(!user) return false; 26 | return await raccoon.recommendFor(user.toString(), skip,take); 27 | } 28 | 29 | const mostLiked = async (skip = 0, take = 5) => { 30 | return await raccoon.mostLiked(skip,take); 31 | } 32 | 33 | const bestRated = async (skip = 0, take = 5) => { 34 | return await raccoon.bestRated(skip,take); 35 | } 36 | 37 | const mostSimilarUsers = async (user, skip = 0, take = 5) => { 38 | if(!user) return false; 39 | return await raccoon.mostSimilarUsers(skip,take); 40 | } 41 | 42 | module.exports = { 43 | like, 44 | unlike, 45 | dislike, 46 | undislike, 47 | recommend, 48 | mostLiked, 49 | bestRated, 50 | mostSimilarUsers 51 | } -------------------------------------------------------------------------------- /server/services/upload.service.js: -------------------------------------------------------------------------------- 1 | const GoogleDriveService = require('./drive.service'); 2 | const AwsService = require('./aws.service') 3 | const fs = require('fs'); 4 | const Settings = require('../models/settings.model') 5 | 6 | const file = async (File,fileName,folderName = null,fileExtensions = ['png','jpg','jpeg','gif'], fileSize = 150) => { 7 | 8 | if(!File){ 9 | return {status:0, message: 'image_cant_upload'} 10 | } 11 | 12 | fileSize = 1024 * fileSize 13 | 14 | if(File.size > fileSize){ 15 | return {status : 0, message : 'invalid_image_size'} 16 | } 17 | 18 | let fileExtension = File.originalFilename.substring(File.originalFilename.lastIndexOf('.')+1, File.originalFilename.length) 19 | 20 | if(!fileExtensions.includes(fileExtension)){ 21 | return {status : 0 , message : 'invalid_image_extension'} 22 | } 23 | 24 | var filePath = __basedir + '/public/' 25 | if(folderName) filePath += folderName + '/' 26 | if(!fs.existsSync(filePath)){ 27 | fs.mkdirSync(filePath) 28 | } 29 | fileExtensions.forEach(element => { 30 | if(fileExtension !== element){ 31 | if(fs.existsSync(filePath + fileName + '.' + element)){ 32 | fs.unlinkSync(filePath + fileName + '.' + element) 33 | } 34 | } 35 | }); 36 | fileName = fileName + '.' + fileExtension 37 | filePath += fileName; 38 | var fileMimeType = File.type 39 | await fs.promises.copyFile(File.path,filePath) 40 | 41 | const settings = await Settings.findOne({},{'url':1, 'api':1}) 42 | 43 | if(settings.api.aws.display){ 44 | const location = (folderName ? folderName + '/' : '') + fileName 45 | const upload = await AwsService.upload(location,filePath) 46 | fs.unlinkSync(filePath) 47 | return {url : process.env.CDN_URL ? process.env.CDN_URL + location : upload.Location, id : null} 48 | }else if(settings.api.drive.display){ 49 | if(folderName){ 50 | var folder = await GoogleDriveService.searchFolder(folderName) 51 | if (!folder) { 52 | folder = await GoogleDriveService.createFolder(folderName) 53 | } 54 | }else { 55 | var folder = null 56 | } 57 | const response = await GoogleDriveService.saveFile(fileName,filePath,fileMimeType,folder ? folder.id : null) 58 | const fileId = response.data.id 59 | fs.unlinkSync(filePath) 60 | return {url : "https://drive.google.com/uc?export=view&id=" + fileId, id : fileId} 61 | }else { 62 | return {url : settings.url.backend + "public/" + (folderName ? folderName + '/' : '') + fileName, id : null} 63 | } 64 | 65 | } 66 | 67 | module.exports = { 68 | file 69 | } -------------------------------------------------------------------------------- /server/templates/comment-replied.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 12 | 13 | 14 | 39 | 40 | 41 |
8 | 9 | Logo 10 | 11 |
15 |
16 | 17 |
18 | Welcome {{ name }}! 19 |
20 |
This notice has been sent to inform you. We wanted to let you know as a response to your comment has been made. You can access the comment using the link below:
21 |
22 | {{{ content }}} 23 |
24 |
25 | Go To Post 26 |
27 |
This password reset link will expire in 60 minutes. If you did not request a password reset, no further action is required.
28 |
29 |
30 |

Button not working? Try pasting this URL into your browser:

31 | {{ url }}/{{ category }}/{{ slug }} 32 |
33 | 34 |
Kind regards, 35 |
{{ title }} 36 |
37 |
38 |
42 |
-------------------------------------------------------------------------------- /server/templates/failed-login-attempt.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 12 | 13 | 14 | 41 | 42 | 43 |
8 | 9 | Logo 10 | 11 |
15 |
16 | 17 |
18 | Welcome {{ name }}! 19 |
20 |
We noticed someone trying to access your account. I received a request to log in to my account with an incorrect password. If you did not make this request, we recommend that you change your password from the link below.
21 |
    22 |
  • Ip : {{ ip }}
  • 23 |
  • Browser : {{ browser }}
  • 24 |
  • Engine : {{ engine }}
  • 25 |
  • Os : {{ os }}
  • 26 |
27 |
28 | Change Password 29 |
30 |
31 |
32 |

Button not working? Try pasting this URL into your browser:

33 | {{ url }}/user/edit 34 |
35 | 36 |
Kind regards, 37 |
{{ title }} 38 |
39 |
40 |
44 |
-------------------------------------------------------------------------------- /server/templates/forgot-password.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 12 | 13 | 14 | 36 | 37 | 38 |
8 | 9 | Logo 10 | 11 |
15 |
16 | 17 |
18 | Welcome {{ name }}! 19 |
20 |
You are receiving this email because we received a password reset request for your account. To proceed with the password reset please click on the button below:
21 |
22 | Reset Password 23 |
24 |
This password reset link will expire in 60 minutes. If you did not request a password reset, no further action is required.
25 |
26 |
27 |

Button not working? Try pasting this URL into your browser:

28 | {{ url }}/panel/reset-password/{{ code }}/{{ email }} 29 |
30 | 31 |
Kind regards, 32 |
{{ title }} 33 |
34 |
35 |
39 |
-------------------------------------------------------------------------------- /server/templates/verify-email.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 12 | 13 | 14 | 36 | 37 | 38 |
8 | 9 | Logo 10 | 11 |
15 |
16 | 17 |
18 | Welcome {{ name }}! 19 |
20 |
To activate your account, please click on the button below to verify your email address. Once activated, you’ll have full access to our free and premium products.
21 |
22 | Activate Account 23 |
24 |
This link will expire in 60 minutes. If you did not request to verify, no further action is required.
25 |
26 |
27 |

Button not working? Try pasting this URL into your browser:

28 | {{ url }}/user/verify/{{ code }} 29 |
30 | 31 |
Kind regards, 32 |
{{ title }} 33 |
34 |
35 |
39 |
--------------------------------------------------------------------------------