From e0eb9f8a03c2cfdefdb606a60a4bfc52c89709d9 Mon Sep 17 00:00:00 2001 From: rob Date: Thu, 3 Mar 2022 08:15:38 -0500 Subject: [PATCH] catching up with progress from Sites and Soapbox --- .env.default | 6 +- .vscode/launch.json | 10 +- LICENSE | 4 +- NOTES.md | 23 +--- app/controllers/admin.js | 2 +- app/controllers/admin/content-report.js | 2 +- app/controllers/admin/host.js | 2 +- app/controllers/admin/job-queue.js | 2 +- app/controllers/admin/log.js | 2 +- app/controllers/admin/newsletter.js | 2 +- app/controllers/admin/page.js | 2 +- app/controllers/admin/post.js | 2 +- app/controllers/admin/settings.js | 2 +- app/controllers/admin/user.js | 2 +- app/controllers/auth.js | 2 +- app/controllers/comment.js | 2 +- app/controllers/content-report.js | 2 +- app/controllers/home.js | 2 +- app/controllers/image.js | 2 +- app/controllers/manifest.js | 2 +- app/controllers/newsletter.js | 2 +- app/controllers/page.js | 2 +- app/controllers/post.js | 2 +- app/controllers/user.js | 2 +- app/controllers/welcome.js | 2 +- app/models/category.js | 2 +- app/models/chat-message.js | 2 +- app/models/comment.js | 2 +- app/models/connect-token.js | 2 +- app/models/content-report.js | 2 +- app/models/content-vote.js | 2 +- app/models/csrf-token.js | 2 +- app/models/email-blacklist.js | 2 +- app/models/email-body.js | 2 +- app/models/email.js | 2 +- app/models/image.js | 2 +- app/models/lib/geo-types.js | 2 +- app/models/lib/resource-stats.js | 2 +- app/models/log.js | 2 +- app/models/net-host-stats.js | 2 +- app/models/net-host.js | 2 +- app/models/newsletter-recipient.js | 2 +- app/models/newsletter.js | 2 +- app/models/otp-account.js | 2 +- app/models/page.js | 2 +- app/models/post.js | 2 +- app/models/resource-view.js | 2 +- app/models/resource-visit.js | 2 +- app/models/user-block.js | 2 +- app/models/user-notification.js | 2 +- app/models/user.js | 2 +- app/services/cache.js | 2 +- app/services/chat.js | 2 +- app/services/comment.js | 2 +- app/services/content-report.js | 2 +- app/services/content-vote.js | 2 +- app/services/crypto.js | 2 +- app/services/csrf-token.js | 2 +- app/services/display-engine.js | 2 +- app/services/email.js | 2 +- app/services/gab-tv.js | 2 +- app/services/host-cache.js | 2 +- app/services/image.js | 2 +- app/services/job-queue.js | 2 +- app/services/limiter.js | 2 +- app/services/log.js | 2 +- app/services/markdown.js | 2 +- app/services/media.js | 2 +- app/services/minio.js | 2 +- app/services/newsletter.js | 2 +- app/services/otp-auth.js | 2 +- app/services/page.js | 2 +- app/services/post.js | 2 +- app/services/resource.js | 2 +- app/services/session.js | 2 +- app/services/sms.js | 2 +- app/services/user-notification.js | 2 +- app/services/user.js | 2 +- app/workers/host-services.js | 14 ++- app/workers/newsletter.js | 113 ------------------ app/workers/reeeper.js | 16 ++- client/js/index-admin.js | 2 +- client/js/index.js | 2 +- client/js/site-admin-host-stats-app.js | 2 +- client/js/site-app.js | 2 +- client/less/site/site-home.less | 0 client/less/style.less | 1 - config/job-queues.js | 4 +- config/limiter.js | 2 +- config/site.js | 13 ++ docs/services.md | 2 +- ....code-workspace => dtp-base.code-workspace | 0 dtp-sites-cli.js => dtp-webapp-cli.js | 106 ++++++++++++---- dtp-sites.js => dtp-webapp.js | 28 +++-- lib/client/js/dtp-app.js | 2 +- lib/client/js/dtp-display-engine.js | 2 +- lib/client/js/dtp-log.js | 2 +- lib/client/js/dtp-plugin.js | 2 +- lib/client/js/dtp-socket.js | 2 +- lib/site-async.js | 2 +- lib/site-common.js | 2 +- lib/site-controller.js | 2 +- lib/site-error.js | 2 +- lib/site-ioserver.js | 2 +- lib/site-lib.js | 2 +- lib/site-log.js | 2 +- lib/site-platform.js | 2 +- lib/site-service.js | 2 +- package.json | 16 +-- release | 2 +- ssl/mkcert | 8 +- ssl/openssl.cnf | 4 +- start-local | 6 +- supervisord/dtp-sites.conf | 13 -- supervisord/dtp-webapp.conf | 13 ++ supervisord/host-services.conf | 8 +- 116 files changed, 279 insertions(+), 317 deletions(-) delete mode 100644 app/workers/newsletter.js delete mode 100644 client/less/site/site-home.less create mode 100644 config/site.js rename dtp-sites.code-workspace => dtp-base.code-workspace (100%) rename dtp-sites-cli.js => dtp-webapp-cli.js (66%) rename dtp-sites.js => dtp-webapp.js (70%) delete mode 100644 supervisord/dtp-sites.conf create mode 100644 supervisord/dtp-webapp.conf diff --git a/.env.default b/.env.default index 1c40be45..32bea879 100644 --- a/.env.default +++ b/.env.default @@ -22,7 +22,7 @@ MAILGUN_DOMAIN= # MONGODB_HOST=localhost:27017 -MONGODB_DATABASE=dtp-sites +MONGODB_DATABASE=dtp-webapp # # Redis configuration @@ -39,7 +39,7 @@ REDIS_PASSWORD= MINIO_ENDPOINT=localhost MINIO_PORT=9000 MINIO_USE_SSL=disabled -MINIO_ACCESS_KEY=dtp-sites +MINIO_ACCESS_KEY=dtp-webapp MINIO_SECRET_KEY= MINIO_IMAGE_BUCKET=site-images MINIO_VIDEO_BUCKET=site-videos @@ -60,7 +60,7 @@ DTP_LOG_CONSOLE=enabled DTP_LOG_MONGODB=enabled DTP_LOG_FILE=enabled -DTP_LOG_FILE_PATH=/tmp/dtp-sites/logs +DTP_LOG_FILE_PATH=/tmp/dtp-webapp/logs DTP_LOG_FILE_NAME_APP=justjoeradio-app.log DTP_LOG_FILE_NAME_HTTP=justjoeradio-access.log diff --git a/.vscode/launch.json b/.vscode/launch.json index b41e9f13..f84c9864 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,11 +7,11 @@ { "type": "pwa-node", "request": "launch", - "name": "web:dtp-sites", + "name": "web:dtp-webapp", "skipFiles": [ "/**" ], - "program": "${workspaceFolder:dtp-sites}/dtp-sites.js", + "program": "${workspaceFolder:dtp-base}/dtp-webapp.js", "console": "integratedTerminal", "env": { "HTTP_BIND_PORT": "3333" @@ -20,13 +20,13 @@ { "type": "pwa-node", "request": "launch", - "name": "cli:dtp-sites", + "name": "cli:dtp-webapp", "skipFiles": [ "/**" ], - "program": "${workspaceFolder:dtp-sites}/dtp-sites-cli.js", + "program": "${workspaceFolder:dtp-base}/dtp-webapp-cli.js", "console": "integratedTerminal", "args": ["--action=reset-indexes", "all"] } ] -} +} \ No newline at end of file diff --git a/LICENSE b/LICENSE index 5c062691..57a6f27f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2021 Digital Telepresence, LLC +Copyright 2022 DTP Technologies, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -10,4 +10,4 @@ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file +limitations under the License. diff --git a/NOTES.md b/NOTES.md index da8fc549..6609295a 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,22 +1 @@ -Want to tune in live -Want chat - -Most Recent Episode -Featured Clips - -Replays -About -Contact Us -Forum - -Suggestion Box -- "I want to see [name] on the show as a guest" - -Merch Store -- T-shirt -- Hat -- Tumbler / coffee mug - -Opie & Anthony (Cumia) - -restream.io \ No newline at end of file +2022-03-03: Forked from dtp-sites to become new base for all DTP web apps \ No newline at end of file diff --git a/app/controllers/admin.js b/app/controllers/admin.js index 5fdc4e89..a2c696ae 100644 --- a/app/controllers/admin.js +++ b/app/controllers/admin.js @@ -1,5 +1,5 @@ // admin.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/content-report.js b/app/controllers/admin/content-report.js index f15ad7f8..61db82d2 100644 --- a/app/controllers/admin/content-report.js +++ b/app/controllers/admin/content-report.js @@ -1,5 +1,5 @@ // admin/content-report.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/host.js b/app/controllers/admin/host.js index f6a945a6..1322eda3 100644 --- a/app/controllers/admin/host.js +++ b/app/controllers/admin/host.js @@ -1,5 +1,5 @@ // admin/host.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/job-queue.js b/app/controllers/admin/job-queue.js index bef0df6f..7d25dac8 100644 --- a/app/controllers/admin/job-queue.js +++ b/app/controllers/admin/job-queue.js @@ -1,5 +1,5 @@ // admin/job-queue.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/log.js b/app/controllers/admin/log.js index a6c9e561..f1cfc627 100644 --- a/app/controllers/admin/log.js +++ b/app/controllers/admin/log.js @@ -1,5 +1,5 @@ // admin/log.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/newsletter.js b/app/controllers/admin/newsletter.js index 78a8a050..721c48b3 100644 --- a/app/controllers/admin/newsletter.js +++ b/app/controllers/admin/newsletter.js @@ -1,5 +1,5 @@ // admin/newsletter.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/page.js b/app/controllers/admin/page.js index 69c9299e..e3562e4a 100644 --- a/app/controllers/admin/page.js +++ b/app/controllers/admin/page.js @@ -1,5 +1,5 @@ // admin/page.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/post.js b/app/controllers/admin/post.js index 499271ed..78f84f20 100644 --- a/app/controllers/admin/post.js +++ b/app/controllers/admin/post.js @@ -1,5 +1,5 @@ // admin/post.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/settings.js b/app/controllers/admin/settings.js index 1f6994f4..94c51e08 100644 --- a/app/controllers/admin/settings.js +++ b/app/controllers/admin/settings.js @@ -1,5 +1,5 @@ // admin/settings.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/admin/user.js b/app/controllers/admin/user.js index 0b88d73f..682247db 100644 --- a/app/controllers/admin/user.js +++ b/app/controllers/admin/user.js @@ -1,5 +1,5 @@ // admin/user.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/auth.js b/app/controllers/auth.js index 304a0233..a032ec2c 100644 --- a/app/controllers/auth.js +++ b/app/controllers/auth.js @@ -1,5 +1,5 @@ // auth.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/comment.js b/app/controllers/comment.js index 980e010a..f93d309a 100644 --- a/app/controllers/comment.js +++ b/app/controllers/comment.js @@ -1,5 +1,5 @@ // comment.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/content-report.js b/app/controllers/content-report.js index cc2e03c5..b01b34c5 100644 --- a/app/controllers/content-report.js +++ b/app/controllers/content-report.js @@ -1,5 +1,5 @@ // content-report.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/home.js b/app/controllers/home.js index 88067e2d..94523d13 100644 --- a/app/controllers/home.js +++ b/app/controllers/home.js @@ -1,5 +1,5 @@ // home.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/image.js b/app/controllers/image.js index 4cd3a65a..bafdb683 100644 --- a/app/controllers/image.js +++ b/app/controllers/image.js @@ -1,5 +1,5 @@ // page.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/manifest.js b/app/controllers/manifest.js index cbd83e5c..5d2767a7 100644 --- a/app/controllers/manifest.js +++ b/app/controllers/manifest.js @@ -1,5 +1,5 @@ // manifest.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/newsletter.js b/app/controllers/newsletter.js index 99247041..28bf9f9f 100644 --- a/app/controllers/newsletter.js +++ b/app/controllers/newsletter.js @@ -1,5 +1,5 @@ // newsletter.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/page.js b/app/controllers/page.js index d8abf3bb..7c236fb1 100644 --- a/app/controllers/page.js +++ b/app/controllers/page.js @@ -1,5 +1,5 @@ // page.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/post.js b/app/controllers/post.js index b5c728ec..546a33c5 100644 --- a/app/controllers/post.js +++ b/app/controllers/post.js @@ -1,5 +1,5 @@ // post.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/user.js b/app/controllers/user.js index cd3494c4..071b7c97 100644 --- a/app/controllers/user.js +++ b/app/controllers/user.js @@ -1,5 +1,5 @@ // user.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/controllers/welcome.js b/app/controllers/welcome.js index b77acb40..763456f1 100644 --- a/app/controllers/welcome.js +++ b/app/controllers/welcome.js @@ -1,5 +1,5 @@ // welcome.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/category.js b/app/models/category.js index 33cba637..34664181 100644 --- a/app/models/category.js +++ b/app/models/category.js @@ -1,5 +1,5 @@ // category.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/chat-message.js b/app/models/chat-message.js index c0c3d54c..2a3f47b0 100644 --- a/app/models/chat-message.js +++ b/app/models/chat-message.js @@ -1,5 +1,5 @@ // chat-message.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License Apache-2.0 'use strict'; diff --git a/app/models/comment.js b/app/models/comment.js index bce34200..d9d93e59 100644 --- a/app/models/comment.js +++ b/app/models/comment.js @@ -1,5 +1,5 @@ // comment.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/connect-token.js b/app/models/connect-token.js index 12096cd3..3a1b3b3e 100644 --- a/app/models/connect-token.js +++ b/app/models/connect-token.js @@ -1,5 +1,5 @@ // connect-token.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/content-report.js b/app/models/content-report.js index 6423f18c..fa6adadc 100644 --- a/app/models/content-report.js +++ b/app/models/content-report.js @@ -1,5 +1,5 @@ // content-report.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/content-vote.js b/app/models/content-vote.js index 0cbe24ab..490b0981 100644 --- a/app/models/content-vote.js +++ b/app/models/content-vote.js @@ -1,5 +1,5 @@ // content-vote.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/csrf-token.js b/app/models/csrf-token.js index 6969ab3e..81d75dfb 100644 --- a/app/models/csrf-token.js +++ b/app/models/csrf-token.js @@ -1,5 +1,5 @@ // csrf-token.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/email-blacklist.js b/app/models/email-blacklist.js index 230c8af5..ff03a3a7 100644 --- a/app/models/email-blacklist.js +++ b/app/models/email-blacklist.js @@ -1,5 +1,5 @@ // email-blacklist.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/email-body.js b/app/models/email-body.js index 3b973dfb..e8e38246 100644 --- a/app/models/email-body.js +++ b/app/models/email-body.js @@ -1,5 +1,5 @@ // email-body.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/email.js b/app/models/email.js index 6b8b446e..f76bcae0 100644 --- a/app/models/email.js +++ b/app/models/email.js @@ -1,5 +1,5 @@ // email.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/image.js b/app/models/image.js index 4ffe5909..d31e6da9 100644 --- a/app/models/image.js +++ b/app/models/image.js @@ -1,5 +1,5 @@ // image.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/lib/geo-types.js b/app/models/lib/geo-types.js index dd5cdce7..4c09c830 100644 --- a/app/models/lib/geo-types.js +++ b/app/models/lib/geo-types.js @@ -1,5 +1,5 @@ // geo-types.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/lib/resource-stats.js b/app/models/lib/resource-stats.js index 6d4dce82..016644df 100644 --- a/app/models/lib/resource-stats.js +++ b/app/models/lib/resource-stats.js @@ -1,5 +1,5 @@ // lib/resource-stats.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/log.js b/app/models/log.js index b2220d72..8b25f15d 100644 --- a/app/models/log.js +++ b/app/models/log.js @@ -1,5 +1,5 @@ // log.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/net-host-stats.js b/app/models/net-host-stats.js index fb295f81..084068e7 100644 --- a/app/models/net-host-stats.js +++ b/app/models/net-host-stats.js @@ -1,5 +1,5 @@ // net-host-stats.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/net-host.js b/app/models/net-host.js index 51144931..0646b2e3 100644 --- a/app/models/net-host.js +++ b/app/models/net-host.js @@ -1,5 +1,5 @@ // net-host.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/newsletter-recipient.js b/app/models/newsletter-recipient.js index d4340291..8347b0c7 100644 --- a/app/models/newsletter-recipient.js +++ b/app/models/newsletter-recipient.js @@ -1,5 +1,5 @@ // newsletter-recipient.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/newsletter.js b/app/models/newsletter.js index f1e8bdd2..673a8eaf 100644 --- a/app/models/newsletter.js +++ b/app/models/newsletter.js @@ -1,5 +1,5 @@ // newsletter.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/otp-account.js b/app/models/otp-account.js index 1b94a4bb..fcaea752 100644 --- a/app/models/otp-account.js +++ b/app/models/otp-account.js @@ -1,5 +1,5 @@ // otp-account.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/page.js b/app/models/page.js index 705fb822..15d2e859 100644 --- a/app/models/page.js +++ b/app/models/page.js @@ -1,5 +1,5 @@ // page.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/post.js b/app/models/post.js index 750ec457..3529c15a 100644 --- a/app/models/post.js +++ b/app/models/post.js @@ -1,5 +1,5 @@ // post.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/resource-view.js b/app/models/resource-view.js index 1f9f4473..ec002689 100644 --- a/app/models/resource-view.js +++ b/app/models/resource-view.js @@ -1,5 +1,5 @@ // resource-view.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/resource-visit.js b/app/models/resource-visit.js index f0bbcc99..770ce64a 100644 --- a/app/models/resource-visit.js +++ b/app/models/resource-visit.js @@ -1,5 +1,5 @@ // resource-visit.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/user-block.js b/app/models/user-block.js index 31e65052..20462677 100644 --- a/app/models/user-block.js +++ b/app/models/user-block.js @@ -1,5 +1,5 @@ // user-block.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/user-notification.js b/app/models/user-notification.js index 6d73366b..5e38510d 100644 --- a/app/models/user-notification.js +++ b/app/models/user-notification.js @@ -1,5 +1,5 @@ // user-notification.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/models/user.js b/app/models/user.js index a63dd691..c41e734c 100644 --- a/app/models/user.js +++ b/app/models/user.js @@ -1,5 +1,5 @@ // user.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/cache.js b/app/services/cache.js index 8e229865..50186f2d 100644 --- a/app/services/cache.js +++ b/app/services/cache.js @@ -1,5 +1,5 @@ // cache.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/chat.js b/app/services/chat.js index facb404f..1734766a 100644 --- a/app/services/chat.js +++ b/app/services/chat.js @@ -1,5 +1,5 @@ // chat.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/comment.js b/app/services/comment.js index 4189160c..da0cc85a 100644 --- a/app/services/comment.js +++ b/app/services/comment.js @@ -1,5 +1,5 @@ // comment.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/content-report.js b/app/services/content-report.js index ef432b52..b94c06b8 100644 --- a/app/services/content-report.js +++ b/app/services/content-report.js @@ -1,5 +1,5 @@ // content-report.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/content-vote.js b/app/services/content-vote.js index e4413656..df6948ef 100644 --- a/app/services/content-vote.js +++ b/app/services/content-vote.js @@ -1,5 +1,5 @@ // content-vote.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/crypto.js b/app/services/crypto.js index dc89f9e9..8e3568cb 100644 --- a/app/services/crypto.js +++ b/app/services/crypto.js @@ -1,5 +1,5 @@ // crypto.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/csrf-token.js b/app/services/csrf-token.js index 273d513c..08bba509 100644 --- a/app/services/csrf-token.js +++ b/app/services/csrf-token.js @@ -1,5 +1,5 @@ // csrf-token.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/display-engine.js b/app/services/display-engine.js index dcd95c37..ba725d41 100644 --- a/app/services/display-engine.js +++ b/app/services/display-engine.js @@ -1,5 +1,5 @@ // display-engine.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/email.js b/app/services/email.js index 13adde69..fef6d2bb 100644 --- a/app/services/email.js +++ b/app/services/email.js @@ -1,5 +1,5 @@ // email.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/gab-tv.js b/app/services/gab-tv.js index 9e10fa1f..1a9032fc 100644 --- a/app/services/gab-tv.js +++ b/app/services/gab-tv.js @@ -1,5 +1,5 @@ // gab-tv.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/host-cache.js b/app/services/host-cache.js index b4143e5b..ae60cd47 100644 --- a/app/services/host-cache.js +++ b/app/services/host-cache.js @@ -1,5 +1,5 @@ // host-cache.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/image.js b/app/services/image.js index dbb0f292..a7a99ddb 100644 --- a/app/services/image.js +++ b/app/services/image.js @@ -1,5 +1,5 @@ // minio.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/job-queue.js b/app/services/job-queue.js index 7e7b3233..19b9c6f0 100644 --- a/app/services/job-queue.js +++ b/app/services/job-queue.js @@ -1,5 +1,5 @@ // job-queue.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/limiter.js b/app/services/limiter.js index b06d05c9..6d512831 100644 --- a/app/services/limiter.js +++ b/app/services/limiter.js @@ -1,5 +1,5 @@ // limiter.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/log.js b/app/services/log.js index f6f5e57f..039b4d07 100644 --- a/app/services/log.js +++ b/app/services/log.js @@ -1,5 +1,5 @@ // log.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/markdown.js b/app/services/markdown.js index ff216103..9e624417 100644 --- a/app/services/markdown.js +++ b/app/services/markdown.js @@ -1,5 +1,5 @@ // markdown.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/media.js b/app/services/media.js index 4d2b72a6..0a589529 100644 --- a/app/services/media.js +++ b/app/services/media.js @@ -1,5 +1,5 @@ // article.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/minio.js b/app/services/minio.js index c5039a6b..6d23a7e1 100644 --- a/app/services/minio.js +++ b/app/services/minio.js @@ -1,5 +1,5 @@ // minio.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/newsletter.js b/app/services/newsletter.js index bcc4c898..270032a3 100644 --- a/app/services/newsletter.js +++ b/app/services/newsletter.js @@ -1,5 +1,5 @@ // newsletter.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/otp-auth.js b/app/services/otp-auth.js index edad956c..60731fd3 100644 --- a/app/services/otp-auth.js +++ b/app/services/otp-auth.js @@ -1,5 +1,5 @@ // otp-auth.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/page.js b/app/services/page.js index 7c8b15af..a13bd604 100644 --- a/app/services/page.js +++ b/app/services/page.js @@ -1,5 +1,5 @@ // page.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/post.js b/app/services/post.js index c4f14ced..bb5edba2 100644 --- a/app/services/post.js +++ b/app/services/post.js @@ -1,5 +1,5 @@ // post.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/resource.js b/app/services/resource.js index 7dc51969..a4f6d845 100644 --- a/app/services/resource.js +++ b/app/services/resource.js @@ -1,5 +1,5 @@ // resource.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/session.js b/app/services/session.js index 7c6f2263..aafc4f60 100644 --- a/app/services/session.js +++ b/app/services/session.js @@ -1,5 +1,5 @@ // session.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/sms.js b/app/services/sms.js index a4d3bb2a..f086adbd 100644 --- a/app/services/sms.js +++ b/app/services/sms.js @@ -1,5 +1,5 @@ // sms.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/user-notification.js b/app/services/user-notification.js index bbdb6f3a..9e15e717 100644 --- a/app/services/user-notification.js +++ b/app/services/user-notification.js @@ -1,5 +1,5 @@ // user-notification.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/services/user.js b/app/services/user.js index bd9cb227..8cac3b74 100644 --- a/app/services/user.js +++ b/app/services/user.js @@ -1,5 +1,5 @@ // user.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/app/workers/host-services.js b/app/workers/host-services.js index 19df2549..99cb011c 100644 --- a/app/workers/host-services.js +++ b/app/workers/host-services.js @@ -1,5 +1,5 @@ // host-services.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; @@ -585,6 +585,18 @@ module.expireNetHosts = async ( ) => { (async ( ) => { try { + process.on('unhandledRejection', (error, p) => { + module.log.error('Unhandled rejection', { + error: error, + promise: p, + stack: error.stack + }); + }); + + process.on('warning', (error) => { + module.log.alert('warning', { error }); + }); + process.once('SIGINT', async ( ) => { module.log.info('SIGINT received'); module.log.info('requesting shutdown...'); diff --git a/app/workers/newsletter.js b/app/workers/newsletter.js deleted file mode 100644 index 6fc3ee63..00000000 --- a/app/workers/newsletter.js +++ /dev/null @@ -1,113 +0,0 @@ -// newsletter.js -// Copyright (C) 2021 Digital Telepresence, LLC -// License: Apache-2.0 - -'use strict'; - -const DTP_COMPONENT_NAME = 'newsletter'; - -const path = require('path'); -require('dotenv').config({ path: path.resolve(__dirname, '..', '..', '.env') }); - -const mongoose = require('mongoose'); - -const { SitePlatform, SiteLog } = require(path.join(__dirname, '..', '..', 'lib', 'site-lib')); - -module.pkg = require(path.resolve(__dirname, '..', '..', 'package.json')); -module.config = { - componentName: DTP_COMPONENT_NAME, - root: path.resolve(__dirname, '..', '..'), -}; - -module.log = new SiteLog(module, module.config.componentName); - -module.sendNewsletter = async (job) => { - - module.log.info('newsletter email job received', { data: job.data }); - - const NewsletterRecipient = mongoose.model('NewsletterRecipient'); - - try { - /* - * Create one Bull Queue job per email to be delivered. - */ - await NewsletterRecipient - .find({ 'flags.isVerified': true, 'flags.isOptIn': true, 'flags.isRejected': false }) - .lean() - .cursor() - .eachAsync(async (recipient) => { - try { - const jobData = { - newsletterId: job.data.newsletterId, - recipient: recipient.address, - }; - const jobOptions = { - attempts: 3, - }; - await module.jobQueue.add('email-send', jobData, jobOptions); - } catch (error) { - module.log.error('failed to create newsletter email job'); - // but continue - } - }, { parallel: 4 }); - } catch (error) { - module.log('failed to send newsletter', { newsletterId: job.data.newsletterId, error }); - throw error; // throw error to Bull so it can report in job reports - } -}; - -module.sendNewsletterEmail = async (job) => { - const { newsletter: newsletterService, email: emailService } = module.services; - const { newsletterId, recipient } = job.data; - try { - - let newsletter = module.newsletters[newsletterId]; - - if (!newsletter) { - newsletter = await newsletterService.getById(newsletterId); - module.newsletters[newsletterId] = newsletter; //TODO: clean up memory leak of newsletter (remove when all emails are sent) - } - - if (!newsletter) { - throw new Error('newsletter not found'); - } - - const response = await emailService.send({ - from: 'demo@wherever.com', - to: recipient, - subject: newsletter.title, - html: newsletter.content.html, - text: newsletter.content.text, - }); - - job.log(`newsletter email sent: ${response}`); - } catch (error) { - module.error('failed to send newsletter email', { newsletterId, recipient, error }); - throw error; // throw error to Bull so it can report in job reports - } -}; - -(async ( ) => { - try { - /* - * Platform startup - */ - await SitePlatform.startPlatform(module); - - const { jobQueue: jobQueueService } = module.services; - - module.jobQueue = await jobQueueService.getJobQueue('newsletter', { - attempts: 3, - }); - module.jobQueue.process('email', module.sendNewsletter); - module.jobQueue.process('email-send', module.sendNewsletterEmail); - - /* - * Worker startup - */ - module.log.info(`${module.pkg.name} v${module.pkg.version} Newsletter worker started`); - } catch (error) { - module.log.error('failed to start Newsletter worker', { error }); - process.exit(-1); - } -})(); \ No newline at end of file diff --git a/app/workers/reeeper.js b/app/workers/reeeper.js index cb4a91b4..dacf7f9d 100644 --- a/app/workers/reeeper.js +++ b/app/workers/reeeper.js @@ -1,5 +1,5 @@ // host-services.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; @@ -46,11 +46,23 @@ module.expireCrashedHosts = async ( ) => { (async ( ) => { try { + process.on('unhandledRejection', (error, p) => { + module.log.error('Unhandled rejection', { + error: error, + promise: p, + stack: error.stack + }); + }); + + process.on('warning', (error) => { + module.log.alert('warning', { error }); + }); + process.once('SIGINT', async ( ) => { module.log.info('SIGINT received'); module.log.info('requesting shutdown...'); - const exitCode = await SitePlatform.shutdown(); + process.nextTick(( ) => { process.exit(exitCode); }); diff --git a/client/js/index-admin.js b/client/js/index-admin.js index fe110ed9..1f2b8e24 100644 --- a/client/js/index-admin.js +++ b/client/js/index-admin.js @@ -1,5 +1,5 @@ // index-admin.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/client/js/index.js b/client/js/index.js index e9908123..a053a127 100644 --- a/client/js/index.js +++ b/client/js/index.js @@ -1,5 +1,5 @@ // index.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/client/js/site-admin-host-stats-app.js b/client/js/site-admin-host-stats-app.js index 633f1197..d93f3117 100644 --- a/client/js/site-admin-host-stats-app.js +++ b/client/js/site-admin-host-stats-app.js @@ -1,5 +1,5 @@ // dtp-site-app.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/client/js/site-app.js b/client/js/site-app.js index 0115d67b..51f3cd4e 100644 --- a/client/js/site-app.js +++ b/client/js/site-app.js @@ -1,5 +1,5 @@ // site-app.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/client/less/site/site-home.less b/client/less/site/site-home.less deleted file mode 100644 index e69de29b..00000000 diff --git a/client/less/style.less b/client/less/style.less index c7c81a1c..be13fadb 100644 --- a/client/less/style.less +++ b/client/less/style.less @@ -15,7 +15,6 @@ @import "site/dashboard.less"; @import "site/site.less"; -@import "site/site-home.less"; @import "site/form.less"; @import "site/button.less"; diff --git a/config/job-queues.js b/config/job-queues.js index 1f814ec5..7c5dc581 100644 --- a/config/job-queues.js +++ b/config/job-queues.js @@ -1,11 +1,11 @@ // job-queues.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; module.exports = { - // 'dvr-ingest': { + // 'queue-name': { // attempts: 3, // }, }; \ No newline at end of file diff --git a/config/limiter.js b/config/limiter.js index 8cab4e78..3661cc78 100644 --- a/config/limiter.js +++ b/config/limiter.js @@ -1,5 +1,5 @@ // limiter.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/config/site.js b/config/site.js new file mode 100644 index 00000000..a44e42a0 --- /dev/null +++ b/config/site.js @@ -0,0 +1,13 @@ +// site.js +// Copyright (C) 2022 DTP Technologies, LLC +// License: Apache 2.0 + +'use strict'; + +module.exports = { + name: process.env.DTP_SITE_NAME, + description: process.env.DTP_SITE_DESCRIPTION, + domain: process.env.DTP_SITE_DOMAIN, + domainKey: process.env.DTP_SITE_DOMAIN_KEY, + company: process.env.DTP_SITE_COMPANY || 'Digital Telepresence, LLC', +}; \ No newline at end of file diff --git a/docs/services.md b/docs/services.md index d69d9b51..2cb68c69 100644 --- a/docs/services.md +++ b/docs/services.md @@ -1,4 +1,4 @@ -# DTP Sites: Services +# DTP Base: Services Services are common logic implemented in a centralized location made accessible to the rest of the application to perform tasks in a common way. They live in [app/services](app/services), and are scripts that export a specific structure that identifies the service and provides a way to create, start, and stop them. diff --git a/dtp-sites.code-workspace b/dtp-base.code-workspace similarity index 100% rename from dtp-sites.code-workspace rename to dtp-base.code-workspace diff --git a/dtp-sites-cli.js b/dtp-webapp-cli.js similarity index 66% rename from dtp-sites-cli.js rename to dtp-webapp-cli.js index b77f9af1..56d09bfc 100644 --- a/dtp-sites-cli.js +++ b/dtp-webapp-cli.js @@ -1,9 +1,11 @@ -// dtp-sites-cli.js -// Copyright (C) 2021 Digital Telepresence, LLC +// dtp-webapp-cli.js +// Copryright (C) DTP Technologies, LLC // License: Apache-2.0 'use strict'; +const DTP_COMPONENT_NAME = 'webapp-cli'; + require('dotenv').config(); const path = require('path'); @@ -16,17 +18,12 @@ const { SiteLog, } = require(path.join(__dirname, 'lib', 'site-lib')); -module.pkg = require(path.join(__dirname, 'package.json')); +module.rootPath = __dirname; +module.pkg = require(path.join(module.rootPath, 'package.json')); module.config = { - componentName: 'sites-cli', - root: __dirname, - site: { - name: process.env.DTP_SITE_NAME, - description: process.env.DTP_SITE_DESCRIPTION, - domain: process.env.DTP_SITE_DOMAIN, - domainKey: process.env.DTP_SITE_DOMAIN_KEY, - company: process.env.DTP_SITE_COMPANY || 'Digital Telepresence, LLC', - }, + componentName: DTP_COMPONENT_NAME, + root: module.rootPath, + site: require(path.join(module.rootPath, 'config', 'site')), }; module.log = new SiteLog(module, module.config.componentName); @@ -79,12 +76,6 @@ module.revokePermission = async (target, permission) => { } }; -module.dvrIngest = async (episodeId) => { - const jobQueue = module.services.jobQueue.getJobQueue('dvr-ingest', module.config.jobQueues['dvr-ingest']); - const job = await jobQueue.add({ episodeId }); - module.log.info('job created', { id: job.id }); -}; - module.deleteOtpAccount = async (target) => { const { otpAuth: otpAuthService } = module.services; const User = mongoose.model('User'); @@ -116,6 +107,67 @@ module.resetIndexes = async ( ) => { } }; +module.resetPassword = async (username) => { + const { user: userService } = module.services; + const User = mongoose.model('User'); + + const user = await User + .findOne({ + username_lc: username.trim().toLowerCase(), + }) + .lean(); + + if (!user) { + throw new Error('user not found'); + } + + const password = generatePassword(8, true); + module.log.info('updating user password', { username, password }); + await userService.updatePassword(user, password); +}; + +module.sendWelcomeEmail = async (username) => { + const User = mongoose.model('User'); + + if (username === 'all') { + await User + .find() + .select('+flags +optIn') + .cursor() + .eachAsync(module.sendUserWelcomeEmail, 4); + } else { + const user = await User + .findOne({ + username_lc: username.trim().toLowerCase(), + }) + .select('+flags +optIn') + .lean(); + if (!user) { + throw new Error('user not found'); + } + await module.sendUserWelcomeEmail(user); + } +}; + +module.sendUserWelcomeEmail = async (user) => { + const { user: userService } = module.services; + + if (user.flags.isEmailVerified) { + module.log.alert('user is email-verified (aboring welcome email)', { + user: user._id, + username: user.username, + }); + return; + } + + module.log.info('sending welcome email', { + user: user._id, + username: user.username, + email: user.email, + }); + await userService.sendWelcomeEmail(user); +}; + /* * SERVER INIT */ @@ -130,21 +182,21 @@ module.resetIndexes = async ( ) => { short: 'a', type: 'string', description: 'The action to perform', - example: 'sites-cli --action=grant --permission=moderator email email ...', + example: 'dtp-webapp-cli --action=grant --permission=moderator email email ...', }, { name: 'permission', short: 'p', type: 'string', description: 'The permission(s) being added or removed', - example: 'sites-cli --action=grant --permission=admin email email ...' + example: 'dtp-webapp-cli --action=grant --permission=admin email email ...' }, ]); try { await SitePlatform.startPlatform(module); } catch (error) { - module.log.error('failed to start DTP Sites platform', { error }); + module.log.error(`failed to start DTP ${DTP_COMPONENT_NAME} platform`, { error }); return; } @@ -162,10 +214,6 @@ module.resetIndexes = async ( ) => { await module.revokePermission(target, module.app.options.permission); break; - case 'dvr-ingest': - await module.dvrIngest(target); - break; - case 'make-bucket': await module.makeBucket(target); break; @@ -174,10 +222,18 @@ module.resetIndexes = async ( ) => { await module.deleteOtpAccount(target); break; + case 'reset-password': + await module.resetPassword(target); + break; + case 'reset-indexes': await module.resetIndexes(); break; + case 'welcome-email': + await module.sendWelcomeEmail(target); + break; + default: throw new Error(`invalid action: ${module.app.options.action}`); } diff --git a/dtp-sites.js b/dtp-webapp.js similarity index 70% rename from dtp-sites.js rename to dtp-webapp.js index 2deef8e6..4597acca 100644 --- a/dtp-sites.js +++ b/dtp-webapp.js @@ -1,26 +1,23 @@ -// dtp-sites.js -// Copryright (C) Digital Telepresence, LLC +// dtp-webapp.js +// Copryright (C) DTP Technologies, LLC // Licence: Apache-2.0 'use strict'; +const DTP_COMPONENT_NAME = 'webapp'; + require('dotenv').config(); const path = require('path'); const { SitePlatform, SiteLog } = require(path.join(__dirname, 'lib', 'site-lib')); -module.pkg = require(path.join(__dirname, 'package.json')); +module.rootPath = __dirname; +module.pkg = require(path.join(module.rootPath, 'package.json')); module.config = { - componentName: 'sites', - root: __dirname, - site: { - name: process.env.DTP_SITE_NAME, - description: process.env.DTP_SITE_DESCRIPTION, - domain: process.env.DTP_SITE_DOMAIN, - domainKey: process.env.DTP_SITE_DOMAIN_KEY, - company: process.env.DTP_SITE_COMPANY || 'Digital Telepresence, LLC', - }, + componentName: DTP_COMPONENT_NAME, + root: module.rootPath, + site: require(path.join(module.rootPath, 'config', 'site')), http: { address: process.env.HTTP_BIND_ADDRESS, port: parseInt(process.env.HTTP_BIND_PORT, 10), @@ -29,6 +26,10 @@ module.config = { module.log = new SiteLog(module, module.config.componentName); +module.shutdown = async ( ) => { + +}; + (async ( ) => { process.on('unhandledRejection', (error, p) => { @@ -46,6 +47,7 @@ module.log = new SiteLog(module, module.config.componentName); process.once('SIGINT', async ( ) => { module.log.info('SIGINT received'); module.log.info('requesting shutdown...'); + await module.shutdown(); const exitCode = await SitePlatform.shutdown(); process.nextTick(( ) => { process.exit(exitCode); @@ -61,7 +63,7 @@ module.log = new SiteLog(module, module.config.componentName); await SitePlatform.startPlatform(module); await SitePlatform.startWebServer(module); } catch (error) { - module.log.error('failed to start DTP Sites web server', { error }); + module.log.error(`failed to start DTP ${DTP_COMPONENT_NAME}`, { error }); process.exit(-1); } diff --git a/lib/client/js/dtp-app.js b/lib/client/js/dtp-app.js index 5835453f..ffa93970 100644 --- a/lib/client/js/dtp-app.js +++ b/lib/client/js/dtp-app.js @@ -1,5 +1,5 @@ // dtp-app.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/client/js/dtp-display-engine.js b/lib/client/js/dtp-display-engine.js index b0fc9dd5..27d922a5 100644 --- a/lib/client/js/dtp-display-engine.js +++ b/lib/client/js/dtp-display-engine.js @@ -1,5 +1,5 @@ // dtp-display-engine.js -// Copyright (C) 2021 Digital Telepresence, Inc. +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/client/js/dtp-log.js b/lib/client/js/dtp-log.js index 8434b33e..acea612b 100644 --- a/lib/client/js/dtp-log.js +++ b/lib/client/js/dtp-log.js @@ -1,5 +1,5 @@ // dtpweb-log.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/client/js/dtp-plugin.js b/lib/client/js/dtp-plugin.js index 474b65a7..c3954113 100644 --- a/lib/client/js/dtp-plugin.js +++ b/lib/client/js/dtp-plugin.js @@ -1,5 +1,5 @@ // dtp-plugin.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 /** diff --git a/lib/client/js/dtp-socket.js b/lib/client/js/dtp-socket.js index 809252f2..b0e1984d 100644 --- a/lib/client/js/dtp-socket.js +++ b/lib/client/js/dtp-socket.js @@ -1,5 +1,5 @@ // dtpweb-socket.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-async.js b/lib/site-async.js index 582e636a..2a1af762 100644 --- a/lib/site-async.js +++ b/lib/site-async.js @@ -1,5 +1,5 @@ // site-async.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-common.js b/lib/site-common.js index 1438cd46..4b5e8223 100644 --- a/lib/site-common.js +++ b/lib/site-common.js @@ -1,5 +1,5 @@ // site-common.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-controller.js b/lib/site-controller.js index 84196d4d..1b0b725a 100644 --- a/lib/site-controller.js +++ b/lib/site-controller.js @@ -1,5 +1,5 @@ // site-controller.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-error.js b/lib/site-error.js index 66018399..521b3d41 100644 --- a/lib/site-error.js +++ b/lib/site-error.js @@ -1,5 +1,5 @@ // site-error.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-ioserver.js b/lib/site-ioserver.js index d62c72b0..6cfeb660 100644 --- a/lib/site-ioserver.js +++ b/lib/site-ioserver.js @@ -1,5 +1,5 @@ // site-ioserver.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-lib.js b/lib/site-lib.js index 54cda917..882b5314 100644 --- a/lib/site-lib.js +++ b/lib/site-lib.js @@ -1,5 +1,5 @@ // site-lib.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-log.js b/lib/site-log.js index 825721e1..f894db09 100644 --- a/lib/site-log.js +++ b/lib/site-log.js @@ -1,5 +1,5 @@ // site-log.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-platform.js b/lib/site-platform.js index 1bed4239..569814d1 100644 --- a/lib/site-platform.js +++ b/lib/site-platform.js @@ -1,5 +1,5 @@ // site-platform.js -// Copyright (C) 2021 Digital Telepresence, LLC. +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/lib/site-service.js b/lib/site-service.js index 16fb463f..542089cb 100644 --- a/lib/site-service.js +++ b/lib/site-service.js @@ -1,5 +1,5 @@ // site-service.js -// Copyright (C) 2021 Digital Telepresence, LLC +// Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; diff --git a/package.json b/package.json index bcaefd6f..838e8e76 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { - "name": "dtp-sites", - "version": "0.2.14", - "description": "Open source blogging engine for the Digital Telepresence Platform.", - "main": "dtp-sites.js", - "author": "Digital Telepresence, LLC", + "name": "dtp-base", + "version": "0.1.0", + "description": "Open source web app engine for the Digital Telepresence Platform.", + "main": "dtp-webapp.js", + "author": "DTP Technologies, LLC", "license": "Apache-2.0", "private": true, "scripts": { - "start": "node dtp-sites.js", - "dev": "nodemon dtp-sites.js" + "start": "node dtp-webapp.js", + "dev": "nodemon dtp-webapp.js" }, "dependencies": { "@fortawesome/fontawesome-free": "^5.15.4", @@ -92,4 +92,4 @@ "webpack-stream": "^7.0.0", "workbox-webpack-plugin": "^6.4.2" } -} +} \ No newline at end of file diff --git a/release b/release index 0920766f..759e74df 100755 --- a/release +++ b/release @@ -20,4 +20,4 @@ git checkout master git pull . develop git push "$2" master -git checkout develop +git checkout develop \ No newline at end of file diff --git a/ssl/mkcert b/ssl/mkcert index dc605645..091f3f4f 100755 --- a/ssl/mkcert +++ b/ssl/mkcert @@ -1,7 +1,7 @@ #!/bin/bash -openssl genrsa -out dtp-sites.key -openssl req -new -out dtp-sites.csr -key dtp-sites.key -config openssl.cnf -openssl x509 -req -days 3650 -in dtp-sites.csr -signkey dtp-sites.key -out dtp-sites.crt -extensions v3_req -extfile openssl.cnf +openssl genrsa -out dtp-webapp.key +openssl req -new -out dtp-webapp.csr -key dtp-webapp.key -config openssl.cnf +openssl x509 -req -days 3650 -in dtp-webapp.csr -signkey dtp-webapp.key -out dtp-webapp.crt -extensions v3_req -extfile openssl.cnf -rm dtp-sites.csr \ No newline at end of file +rm dtp-webapp.csr \ No newline at end of file diff --git a/ssl/openssl.cnf b/ssl/openssl.cnf index 756f0d2b..d09b85a4 100644 --- a/ssl/openssl.cnf +++ b/ssl/openssl.cnf @@ -9,8 +9,8 @@ stateOrProvinceName = Pennsylvania stateOrProvinceName_default = Pennsylvania localityName = Pittsburgh localityName_default = Pittsburgh -organizationalUnitName = Digital Telepresence, LLC -organizationalUnitName_default = Digital Telepresence, LLC +organizationalUnitName = DTP Technologies, LLC +organizationalUnitName_default = DTP Technologies, LLC commonName = *.digitaltelepresence.com commonName_max = 64 diff --git a/start-local b/start-local index 2af3553f..7a3d4dd5 100755 --- a/start-local +++ b/start-local @@ -1,11 +1,13 @@ #!/bin/bash -MINIO_ROOT_USER="sites" -MINIO_ROOT_PASSWORD="1f1c7c9b-b833-4462-ae41-d56f52faa49c" +MINIO_ROOT_USER="base" +MINIO_ROOT_PASSWORD="302888b9-c3d8-40f5-92de-6a3c57186af5" export MINIO_ROOT_USER MINIO_ROOT_PASSWORD forever start --killSignal=SIGINT app/workers/host-services.js +forever start --killSignal=SIGINT app/workers/reeeper.js minio server ./data/minio --console-address ":9001" +forever stop app/workers/reeeper.js forever stop app/workers/host-services.js \ No newline at end of file diff --git a/supervisord/dtp-sites.conf b/supervisord/dtp-sites.conf deleted file mode 100644 index 2df7a0bf..00000000 --- a/supervisord/dtp-sites.conf +++ /dev/null @@ -1,13 +0,0 @@ -[program:dtp-sites] -numprocs=1 -process_name=%(program_name)s_%(process_num)02d -command=/home/dtp/.nvm/versions/node/v16.13.0/bin/node --optimize_for_size --max_old_space_size=1024 --gc_interval=100 dtp-sites.js -directory=/home/dtp/live/dtp-sites -autostart=true -autorestart=true -startretries=3 -stopsignal=INT -stderr_logfile=/var/log/dtp-sites/dtp-sites.err.log -stdout_logfile=/var/log/dtp-sites/dtp-sites.out.log -user=dtp -environment=HOME='/home/dtp/live/dtp-sites',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=dtp-sites \ No newline at end of file diff --git a/supervisord/dtp-webapp.conf b/supervisord/dtp-webapp.conf new file mode 100644 index 00000000..08e19716 --- /dev/null +++ b/supervisord/dtp-webapp.conf @@ -0,0 +1,13 @@ +[program:dtp-webapp] +numprocs=1 +process_name=%(program_name)s_%(process_num)02d +command=/home/dtp/.nvm/versions/node/v16.13.0/bin/node --optimize_for_size --max_old_space_size=1024 --gc_interval=100 dtp-webapp.js +directory=/home/dtp/live/dtp-webapp +autostart=true +autorestart=true +startretries=3 +stopsignal=INT +stderr_logfile=/var/log/dtp-webapp/dtp-webapp.err.log +stdout_logfile=/var/log/dtp-webapp/dtp-webapp.out.log +user=dtp +environment=HOME='/home/dtp/live/dtp-webapp',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=dtp-webapp \ No newline at end of file diff --git a/supervisord/host-services.conf b/supervisord/host-services.conf index ef11c578..1be12d66 100644 --- a/supervisord/host-services.conf +++ b/supervisord/host-services.conf @@ -2,12 +2,12 @@ numprocs=1 process_name=%(program_name)s_%(process_num)02d command=/home/dtp/.nvm/versions/node/v16.13.0/bin/node --optimize_for_size --max_old_space_size=1024 --gc_interval=100 app/workers/host-services.js -directory=/home/dtp/live/dtp-sites +directory=/home/dtp/live/dtp-webapp autostart=true autorestart=true startretries=3 stopsignal=INT -stderr_logfile=/var/log/dtp-sites/host-services.err.log -stdout_logfile=/var/log/dtp-sites/host-services.out.log +stderr_logfile=/var/log/dtp-webapp/host-services.err.log +stdout_logfile=/var/log/dtp-webapp/host-services.out.log user=dtp -environment=HOME='/home/dtp/live/dtp-sites',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=host-services \ No newline at end of file +environment=HOME='/home/dtp/live/dtp-webapp',HTTP_BIND_PORT=30%(process_num)02d,NODE_ENV=production,LOGNAME=host-services \ No newline at end of file