├── .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 |
We're sorry but client doesn't work properly without JavaScript enabled. Please enable it to continue.
--------------------------------------------------------------------------------
/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 |
21 | We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.
22 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | {{ informations.head.title }}
19 |
20 |
21 |
22 |
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 |
2 |
16 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/client/src/views/Panel/Authentication/ForgotPasswordView.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
{{ $t('enter_your_email_address_and_we_will_send_you_a_link_to_reset_your_password.') }}
10 |
11 |
23 |
24 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/client/src/views/Panel/Authentication/LoginView.vue:
--------------------------------------------------------------------------------
1 |
2 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/client/src/views/Panel/Authentication/ResetPasswordView.vue:
--------------------------------------------------------------------------------
1 |
2 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/client/src/views/Panel/User/EditTabs/NotificationsTab.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
31 |
32 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/client/src/views/Panel/User/EditView.vue:
--------------------------------------------------------------------------------
1 |
2 |
16 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/client/src/views/Site/ErrorView.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{ $t('0_error', {code: $route.params.code}) }}
6 |
{{ $t('back_to_home_page...') }}
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/client/src/views/Site/HomeView.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | {{ $t('stay_cool') }}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/client/src/views/Site/Tag/ListView.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
{{ $t('tags') }}
9 |
10 |
11 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 | {{ tag.key }}
31 | ({{ tag.count }})
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/client/src/views/Templates/AuthenticationTemplate.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
17 |
18 |
--------------------------------------------------------------------------------
/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 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
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 |
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 |
33 |
34 |
Kind regards,
35 | {{ title }}
36 |
37 |
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/server/templates/failed-login-attempt.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
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 |
30 |
31 |
35 |
36 |
Kind regards,
37 | {{ title }}
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/server/templates/forgot-password.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
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 |
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 |
30 |
31 |
Kind regards,
32 | {{ title }}
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/server/templates/verify-email.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
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 |
24 |
This link will expire in 60 minutes. If you did not request to verify, no further action is required.
25 |
26 |
30 |
31 |
Kind regards,
32 | {{ title }}
33 |
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------