diff --git a/admin/package.json b/admin/package.json index 93fbed8ae..e8d78d457 100644 --- a/admin/package.json +++ b/admin/package.json @@ -28,12 +28,12 @@ "babel-plugin-component": "^1.1.1", "babel-preset-env": "^1.7.0", "babel-preset-vue": "^2.0.2", - "bootstrap": "^5.1.3", + "bootstrap": "4.3.1", "bootstrap-vue": "^2.21.2", "core-js": "^3.6.5", "dotenv-webpack": "^7.0.3", - "graphql": "^15.6.1", "express": "^4.17.1", + "graphql": "^15.6.1", "identity-obj-proxy": "^3.0.0", "jest": "26.6.3", "moment": "^2.29.1", diff --git a/admin/src/components/CreationFormular.vue b/admin/src/components/CreationFormular.vue index 49993d14a..3c8c914e2 100644 --- a/admin/src/components/CreationFormular.vue +++ b/admin/src/components/CreationFormular.vue @@ -3,9 +3,11 @@ {{ $t('creation_form.form') }}
- +
- +
+ + - + - +
@@ -71,8 +73,8 @@ >
- - +
+
- +
- + {{ $t('creation_form.reset') }} diff --git a/admin/src/components/EditCreationFormular.vue b/admin/src/components/EditCreationFormular.vue index 172ae5509..2fa45dd8e 100644 --- a/admin/src/components/EditCreationFormular.vue +++ b/admin/src/components/EditCreationFormular.vue @@ -2,8 +2,10 @@
- +
+
+ - +
@@ -85,8 +87,8 @@ >
- - +
+
- +
- + {{ $t('creation_form.reset') }} diff --git a/admin/src/locales/de.json b/admin/src/locales/de.json index d71b6cb25..61d158f56 100644 --- a/admin/src/locales/de.json +++ b/admin/src/locales/de.json @@ -39,7 +39,7 @@ "overlay": { "confirm": { "no": "Nein, nicht speichern.", - "question": "Willst du diese vorgespeicherte Schöpfung wirklich vollziehen und entgültig speichern?", + "question": "Willst du diese vorgespeicherte Schöpfung wirklich vollziehen und endgültig speichern?", "text": "Nach dem Speichern ist der Datensatz nicht mehr änderbar und kann auch nicht mehr gelöscht werden. Bitte überprüfe genau, dass alles stimmt.", "title": "Schöpfung bestätigen!", "yes": "Ja, Schöpfung bestätigen und speichern!" diff --git a/admin/yarn.lock b/admin/yarn.lock index 46b5aaa93..99768d3a2 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -3634,16 +3634,16 @@ bootstrap-vue@^2.21.2: portal-vue "^2.1.7" vue-functional-data-merge "^3.1.0" +bootstrap@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.3.1.tgz#280ca8f610504d99d7b6b4bfc4b68cec601704ac" + integrity sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag== + "bootstrap@>=4.5.3 <5.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== -bootstrap@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34" - integrity sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q== - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" diff --git a/backend/.env.dist b/backend/.env.dist index 785b2c15d..b1b16972f 100644 --- a/backend/.env.dist +++ b/backend/.env.dist @@ -1,8 +1,11 @@ +# Server PORT=4000 JWT_SECRET=secret123 JWT_EXPIRES_IN=10m GRAPHIQL=false GDT_API_URL=https://gdt.gradido.net + +# Database DB_HOST=localhost DB_PORT=3306 DB_USER=root @@ -10,29 +13,34 @@ DB_PASSWORD= DB_DATABASE=gradido_community TYPEORM_LOGGING_RELATIVE_PATH=typeorm.backend.log -#EMAIL=true -#EMAIL_USERNAME= -#EMAIL_SENDER= -#EMAIL_PASSWORD= -#EMAIL_SMTP_URL= -#EMAIL_SMTP_PORT=587 -#RESEND_TIME=1 minute, 60 => 1hour, 1440 (60 minutes * 24 hours) => 24 hours -#RESEND_TIME= -RESEND_TIME=10 +# Klicktipp +KLICKTIPP=false +KLICKTTIPP_API_URL=https://api.klicktipp.com +KLICKTIPP_USER=gradido_test +KLICKTIPP_PASSWORD=secret321 +KLICKTIPP_APIKEY_DE=SomeFakeKeyDE +KLICKTIPP_APIKEY_EN=SomeFakeKeyEN -#EMAIL_LINK_VERIFICATION=http://localhost/checkEmail/{code} -#EMAIL_LINK_SETPASSWORD=http://localhost/reset/{code} +# Community +COMMUNITY_NAME=Gradido Entwicklung +COMMUNITY_URL=http://localhost/ +COMMUNITY_REGISTER_URL=http://localhost/register +COMMUNITY_DESCRIPTION=Die lokale Entwicklungsumgebung von Gradido. -#KLICKTIPP_USER= -#KLICKTIPP_PASSWORD= -#KLICKTIPP_APIKEY_DE= -#KLICKTIPP_APIKEY_EN= -#KLICKTIPP=true -COMMUNITY_NAME= -COMMUNITY_URL= -COMMUNITY_REGISTER_URL= -COMMUNITY_DESCRIPTION= +# Login Server LOGIN_APP_SECRET=21ffbbc616fe LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a +# EMail +EMAIL=false +EMAIL_USERNAME=gradido_email +EMAIL_SENDER=info@gradido.net +EMAIL_PASSWORD=xxx +EMAIL_SMTP_URL=gmail.com +EMAIL_SMTP_PORT=587 +EMAIL_LINK_VERIFICATION=http://localhost/checkEmail/{code} +EMAIL_LINK_SETPASSWORD=http://localhost/reset/{code} +RESEND_TIME=10 + +# Webhook WEBHOOK_ELOPAGE_SECRET=secret \ No newline at end of file diff --git a/backend/.env.template b/backend/.env.template index 6507692b8..b3a5eb4c6 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -1,8 +1,10 @@ -PORT=4000 +# Server JWT_SECRET=$JWT_SECRET JWT_EXPIRES_IN=10m GRAPHIQL=false GDT_API_URL=$GDT_API_URL + +# Database DB_HOST=localhost DB_PORT=3306 DB_USER=$DB_USER @@ -10,26 +12,35 @@ DB_PASSWORD=$DB_PASSWORD DB_DATABASE=gradido_community TYPEORM_LOGGING_RELATIVE_PATH=$TYPEORM_LOGGING_RELATIVE_PATH +# Klicktipp +KLICKTIPP=$KLICKTIPP +KLICKTTIPP_API_URL=https://api.klicktipp.com +KLICKTIPP_USER=$KLICKTIPP_USER +KLICKTIPP_PASSWORD=$KLICKTIPP_PASSWORD +KLICKTIPP_APIKEY_DE=$KLICKTIPP_APIKEY_DE +KLICKTIPP_APIKEY_EN=$KLICKTIPP_APIKEY_EN + +# Community +COMMUNITY_NAME=$COMMUNITY_NAME +COMMUNITY_URL=$COMMUNITY_URL +COMMUNITY_REGISTER_URL=$COMMUNITY_REGISTER_URL +COMMUNITY_DESCRIPTION=$COMMUNITY_DESCRIPTION + +# Login Server +LOGIN_APP_SECRET=21ffbbc616fe +LOGIN_SERVER_KEY=a51ef8ac7ef1abf162fb7a65261acd7a + +# EMail +RESEND_TIME=10 EMAIL=$EMAIL EMAIL_USERNAME=$EMAIL_USERNAME EMAIL_SENDER=$EMAIL_SENDER EMAIL_PASSWORD=$EMAIL_PASSWORD EMAIL_SMTP_URL=$EMAIL_SMTP_URL EMAIL_SMTP_PORT=587 -#RESEND_TIME=1 minute, 60 => 1hour, 1440 (60 minutes * 24 hours) => 24 hours -RESEND_TIME=10 - EMAIL_LINK_VERIFICATION=$EMAIL_LINK_VERIFICATION EMAIL_LINK_SETPASSWORD=$EMAIL_LINK_SETPASSWORD +RESEND_TIME=10 -#KLICKTIPP_USER= -#KLICKTIPP_PASSWORD= -#KLICKTIPP_APIKEY_DE= -#KLICKTIPP_APIKEY_EN= -#KLICKTIPP=true -COMMUNITY_NAME=$COMMUNITY_NAME -COMMUNITY_URL=$COMMUNITY_URL -COMMUNITY_REGISTER_URL=$COMMUNITY_REGISTER_URL -COMMUNITY_DESCRIPTION=$COMMUNITY_DESCRIPTION - +# Webhook WEBHOOK_ELOPAGE_SECRET=$WEBHOOK_ELOPAGE_SECRET \ No newline at end of file diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 7ca55eba1..5d5324808 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -43,6 +43,7 @@ const loginServer = { LOGIN_SERVER_KEY: process.env.LOGIN_SERVER_KEY || 'a51ef8ac7ef1abf162fb7a65261acd7a', } +// TODO: Hannes if I find you... this looks like blasphemy const resendTime = parseInt(process.env.RESEND_TIME ? process.env.RESEND_TIME : 'null') const email = { EMAIL: process.env.EMAIL === 'true' || false, diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index 8a7e034a5..9ca558a9c 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -23,6 +23,7 @@ import { UserTransactionRepository } from '../../typeorm/repository/UserTransact import { BalanceRepository } from '../../typeorm/repository/Balance' import { calculateDecay } from '../../util/decay' import { LoginUserRepository } from '../../typeorm/repository/LoginUser' +import { LoginPendingTasksAdmin } from '@entity/LoginPendingTasksAdmin' @Resolver() export class AdminResolver { @@ -113,22 +114,32 @@ export class AdminResolver { const user = await userRepository.findByEmail(email) const loginPendingTasksAdminRepository = getCustomRepository(LoginPendingTasksAdminRepository) - const updatedCreation = await loginPendingTasksAdminRepository.findOneOrFail({ id }) + const pendingCreationToUpdate = await loginPendingTasksAdminRepository.findOneOrFail({ id }) - if (updatedCreation.userId !== user.id) + if (pendingCreationToUpdate.userId !== user.id) { throw new Error('user of the pending creation and send user does not correspond') + } - updatedCreation.amount = BigInt(amount * 10000) - updatedCreation.memo = memo - updatedCreation.date = new Date(creationDate) - updatedCreation.moderator = moderator + const creationDateObj = new Date(creationDate) + let creations = await getUserCreations(user.id) + if (pendingCreationToUpdate.date.getMonth() === creationDateObj.getMonth()) { + creations = updateCreations(creations, pendingCreationToUpdate) + } - await loginPendingTasksAdminRepository.save(updatedCreation) + if (!isCreationValid(creations, amount, creationDateObj)) { + throw new Error('Creation is not valid') + } + pendingCreationToUpdate.amount = BigInt(amount * 10000) + pendingCreationToUpdate.memo = memo + pendingCreationToUpdate.date = new Date(creationDate) + pendingCreationToUpdate.moderator = moderator + + await loginPendingTasksAdminRepository.save(pendingCreationToUpdate) const result = new UpdatePendingCreation() result.amount = parseInt(amount.toString()) - result.memo = updatedCreation.memo - result.date = updatedCreation.date - result.moderator = updatedCreation.moderator + result.memo = pendingCreationToUpdate.memo + result.date = pendingCreationToUpdate.date + result.moderator = pendingCreationToUpdate.moderator result.creation = await getUserCreations(user.id) return result @@ -322,6 +333,28 @@ async function getUserCreations(id: number): Promise { ] } +function updateCreations(creations: number[], pendingCreation: LoginPendingTasksAdmin): number[] { + const dateMonth = moment().format('YYYY-MM') + const dateLastMonth = moment().subtract(1, 'month').format('YYYY-MM') + const dateBeforeLastMonth = moment().subtract(2, 'month').format('YYYY-MM') + const creationDateMonth = moment(pendingCreation.date).format('YYYY-MM') + + switch (creationDateMonth) { + case dateMonth: + creations[2] += parseInt(pendingCreation.amount.toString()) + break + case dateLastMonth: + creations[1] += parseInt(pendingCreation.amount.toString()) + break + case dateBeforeLastMonth: + creations[0] += parseInt(pendingCreation.amount.toString()) + break + default: + throw new Error('UpdatedCreationDate is not in the last three months') + } + return creations +} + function isCreationValid(creations: number[], amount: number, creationDate: Date) { const dateMonth = moment().format('YYYY-MM') const dateLastMonth = moment().subtract(1, 'month').format('YYYY-MM') diff --git a/deployment/bare_metal/.env.dist b/deployment/bare_metal/.env.dist index 6634284da..f69ce862e 100644 --- a/deployment/bare_metal/.env.dist +++ b/deployment/bare_metal/.env.dist @@ -37,6 +37,12 @@ COMMUNITY_URL=https://stage1.gradido.net/ COMMUNITY_REGISTER_URL=https://stage1.gradido.net/register COMMUNITY_DESCRIPTION=Gradido Development Stage1 Test Community +KLICKTIPP=false +KLICKTIPP_USER= +KLICKTIPP_PASSWORD= +KLICKTIPP_APIKEY_DE= +KLICKTIPP_APIKEY_EN= + # frontend GRAPHQL_URI=https://stage1.gradido.net/graphql ADMIN_AUTH_URL=https://stage1.gradido.net/admin/authenticate?token={token} diff --git a/docu/ReleasePlaning/2022-01-27_V-1.6.0_Releaseplan.md b/docu/ReleasePlaning/2022-01-27_V-1.6.0_Releaseplan.md new file mode 100644 index 000000000..3f555e464 --- /dev/null +++ b/docu/ReleasePlaning/2022-01-27_V-1.6.0_Releaseplan.md @@ -0,0 +1,25 @@ +# Releaseplan V1.6.0 + +Die folgenden Schritte dienen zur Vorbereitung und Durchführung der Inbetriebnahme von Release V-1.6.0. + + +| LfdNr. | Aktion | verantwortlich | Status
(Ok / Err / Ongoing) | Startzeit | Dauer in min | Endezeit | +| ------ | ----------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------- | --------- | ------------ | -------- | +| 1 | Finish all PRs & Finally merge everything | **@Hannes** **@ogerly** **@moriz** **@ulfgebh** | | | | | +| 2 | Make a new version 1.6.0 | **@Developer** | | | | | +| 2a | Deploy V1.6.0 on Stage 2 and make Tests to confirm a working release build | **@Developer @Bernd von Gradido** | | | | | +| 3 | Setup Klicktip settings from old production on new production (?)Make a new version 1.6.0 | ****@ulfgebhardt** **@einhornimmon**** | | | | | +| 4 | Deploy 1.6.0 on gdd.gradido.net and make sure things work as expected(rudimentary) | **@ulfgebhardt** | | | | | +| 5a | Disable Klicktipp Hook to current production gdd1.gradido.com | **@einhornimmond** | | | | | +| 5b | Disable Elopage Hook to current production gdd1.gradido.com | **@einhornimmond** | | | | | +| 6 | Deploy Maintenance page to current production & enable it | **@einhornimmond** | | | | | +| 7 | Shut down current production servers except mariadb & nginx serving the maintenance page | **@einhornimmond** | | | | | +| 8 | Create backup from production (correct format & correct data) | **@einhornimmond** | | | | | +| 9 | Shut down mariadb server | **@einhornimmond** | | | | | +| 10 | Transmit backup to new production | **@ulfgebhardt** | | | | | +| 11 | Import production data on new production | **@ulfgebhardt** | | | | | +| 12a | Enable new Klicktipp hook to new production | **@einhornimmond** **@ulfgebhard** | | | | | +| 12b | Enable new Elopage hooks to new production | **@einhornimmond** **@ulfgebhard** | | | | | +| 13 | Do extended tests on the new production | **@Team** | | | | | +| 14 | Have a permanent redirect from all old urls to the new production server:
Which one?
- URL1
- URL2
- etc. | **@einhornimmond** | | | | | +| 15 | Update links on Wordpress to the new production server | **@Bernd von Gradido** | | | | |