From cf13a9a7ecfadf3af71ad7acdaeebd7e19ad7053 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Fri, 16 Feb 2024 21:50:49 +0100 Subject: [PATCH 01/34] first draft for update gmsUser --- backend/src/apis/gms/GmsClient.ts | 87 ++++++++++++++----- backend/src/apis/gms/model/GmsUser.ts | 1 + backend/src/graphql/resolver/UserResolver.ts | 16 ++++ .../util/compareGmsRelevantUserSettings.ts | 49 +++++++++++ 4 files changed, 129 insertions(+), 24 deletions(-) create mode 100644 backend/src/graphql/resolver/util/compareGmsRelevantUserSettings.ts diff --git a/backend/src/apis/gms/GmsClient.ts b/backend/src/apis/gms/GmsClient.ts index 46fa64006..87b4c0e95 100644 --- a/backend/src/apis/gms/GmsClient.ts +++ b/backend/src/apis/gms/GmsClient.ts @@ -117,30 +117,69 @@ export async function userByUuid(uuid: string): Promise { - const baseUrl = CONFIG.GMS_URL.endsWith('/') ? CONFIG.GMS_URL : CONFIG.GMS_URL.concat('/') - const service = 'community-user' - const config = { - headers: { - accept: 'application/json', - language: 'en', - timezone: 'UTC', - connection: 'keep-alive', - authorization: apiKey, - }, - } - try { - const result = await axios.post(baseUrl.concat(service), user, config) - logger.debug('POST-Response of community-user:', result) - if (result.status !== 200) { - throw new LogError('HTTP Status Error in community-user:', result.status, result.statusText) + if (CONFIG.GMS_ACTIVE) { + const baseUrl = CONFIG.GMS_URL.endsWith('/') ? CONFIG.GMS_URL : CONFIG.GMS_URL.concat('/') + const service = 'community-user' + const config = { + headers: { + accept: 'application/json', + language: 'en', + timezone: 'UTC', + connection: 'keep-alive', + authorization: apiKey, + }, } - logger.debug('responseData:', result.data.responseData) - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - // const gmsUser = JSON.parse(result.data.responseData) - // logger.debug('gmsUser:', gmsUser) - return true - } catch (error: any) { - logger.error('Error in Get community-user:', error) - throw new LogError(error.message) + try { + const result = await axios.post(baseUrl.concat(service), user, config) + logger.debug('POST-Response of community-user:', result) + if (result.status !== 200) { + throw new LogError('HTTP Status Error in community-user:', result.status, result.statusText) + } + logger.debug('responseData:', result.data.responseData) + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + // const gmsUser = JSON.parse(result.data.responseData) + // logger.debug('gmsUser:', gmsUser) + return true + } catch (error: any) { + logger.error('Error in post community-user:', error) + throw new LogError(error.message) + } + } else { + logger.info('GMS-Communication disabled per ConfigKey GMS_ACTIVE=false!') + return false + } +} + +export async function updateGmsUser(apiKey: string, user: GmsUser): Promise { + if (CONFIG.GMS_ACTIVE) { + const baseUrl = CONFIG.GMS_URL.endsWith('/') ? CONFIG.GMS_URL : CONFIG.GMS_URL.concat('/') + const service = 'community-user' + const config = { + headers: { + accept: 'application/json', + language: 'en', + timezone: 'UTC', + connection: 'keep-alive', + authorization: apiKey, + }, + } + try { + const result = await axios.patch(baseUrl.concat(service), user, config) + logger.debug('PATCH-Response of community-user:', result) + if (result.status !== 200) { + throw new LogError('HTTP Status Error in community-user:', result.status, result.statusText) + } + logger.debug('responseData:', result.data.responseData) + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + // const gmsUser = JSON.parse(result.data.responseData) + // logger.debug('gmsUser:', gmsUser) + return true + } catch (error: any) { + logger.error('Error in patch community-user:', error) + throw new LogError(error.message) + } + } else { + logger.info('GMS-Communication disabled per ConfigKey GMS_ACTIVE=false!') + return false } } diff --git a/backend/src/apis/gms/model/GmsUser.ts b/backend/src/apis/gms/model/GmsUser.ts index 7f7db7660..0b16f00fb 100644 --- a/backend/src/apis/gms/model/GmsUser.ts +++ b/backend/src/apis/gms/model/GmsUser.ts @@ -8,6 +8,7 @@ export class GmsUser { constructor(user: dbUser) { this.userUuid = user.gradidoID // this.communityUuid = user.communityUuid + this.language = user.language this.email = this.getGmsEmail(user) this.countryCode = this.getGmsCountryCode(user) this.mobile = this.getGmsPhone(user) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 3f70ce112..fa7f1582b 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -30,6 +30,8 @@ import { SearchAdminUsersResult } from '@model/AdminUser' import { User } from '@model/User' import { UserAdmin, SearchUsersResult } from '@model/UserAdmin' +import { updateGmsUser } from '@/apis/gms/GmsClient' +import { GmsUser } from '@/apis/gms/model/GmsUser' import { subscribe } from '@/apis/KlicktippController' import { encode } from '@/auth/JWT' import { RIGHTS } from '@/auth/RIGHTS' @@ -69,6 +71,7 @@ import { randombytes_random } from 'sodium-native' import { FULL_CREATION_AVAILABLE } from './const/const' import { getHomeCommunity } from './util/communities' +import { compareGmsRelevantUserSettings } from './util/compareGmsRelevantUserSettings' import { getUserCreations } from './util/creations' import { findUserByIdentifier } from './util/findUserByIdentifier' import { findUsers } from './util/findUsers' @@ -573,6 +576,8 @@ export class UserResolver { } const user = getUser(context) + const backupOriginalUser = user + // try { if (firstName) { user.firstName = firstName @@ -649,6 +654,17 @@ export class UserResolver { logger.info('updateUserInfos() successfully finished...') await EVENT_USER_INFO_UPDATE(user) + // validate if user settings are changed with relevance to update gms-user + if (compareGmsRelevantUserSettings(user, backupOriginalUser)) { + logger.debug(`changed user-settings relevant for gms-user update...`) + const homeCom = await getHomeCommunity() + if (homeCom.gmsApiKey !== null) { + logger.debug(`gms-user update...`, user) + await updateGmsUser(homeCom.gmsApiKey, new GmsUser(user)) + logger.debug(`gms-user update successfully.`) + } + } + return true } diff --git a/backend/src/graphql/resolver/util/compareGmsRelevantUserSettings.ts b/backend/src/graphql/resolver/util/compareGmsRelevantUserSettings.ts new file mode 100644 index 000000000..330086278 --- /dev/null +++ b/backend/src/graphql/resolver/util/compareGmsRelevantUserSettings.ts @@ -0,0 +1,49 @@ +import { Point } from '@dbTools/typeorm' +import { User as DbUser } from '@entity/User' + +import { LogError } from '@/server/LogError' +import { backendLogger as logger } from '@/server/logger' + +import { Point2Location } from './Location2Point' + +export function compareGmsRelevantUserSettings(orgUser: DbUser, changedUser: DbUser): boolean { + if (!orgUser && !changedUser) { + throw new LogError('comparison without any user is impossible') + } + logger.debug('compareGmsRelevantUserSettings:', orgUser, changedUser) + if (orgUser.alias !== changedUser.alias) { + return true + } + if (orgUser.firstName !== changedUser.firstName || orgUser.lastName !== changedUser.lastName) { + return true + } + if (orgUser.gmsAllowed !== changedUser.gmsAllowed) { + return true + } + if (orgUser.gmsPublishLocation !== changedUser.gmsPublishLocation) { + return true + } + if (orgUser.gmsPublishName !== changedUser.gmsPublishName) { + return true + } + if (orgUser.language !== changedUser.language) { + return true + } + if (orgUser.location === null && changedUser.location !== null) { + return true + } + if (orgUser.location !== null && changedUser.location === null) { + return true + } + if (orgUser.location !== null && changedUser.location !== null) { + const orgLocation = Point2Location(orgUser.location as Point) + const changedLocation = Point2Location(changedUser.location as Point) + if ( + orgLocation.latitude !== changedLocation.latitude || + orgLocation.longitude !== changedLocation.longitude + ) { + return true + } + } + return false +} From 420febfa9e7812702591668ab771afc6f1101fb3 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 20 Feb 2024 09:57:42 +0100 Subject: [PATCH 02/34] fix problems with deploy script, lost update? --- deployment/hetzner_cloud/install.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/deployment/hetzner_cloud/install.sh b/deployment/hetzner_cloud/install.sh index 06b92ecaf..798e77862 100755 --- a/deployment/hetzner_cloud/install.sh +++ b/deployment/hetzner_cloud/install.sh @@ -127,7 +127,13 @@ cp $SCRIPT_PATH/logrotate/gradido.conf /etc/logrotate.d/gradido.conf export DB_USER=gradido # create a new password only if it not already exist if [ -z "${DB_PASSWORD}" ]; then - export DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo); + export DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32; echo); +fi + +# Check if DB_PASSWORD is still empty, then exit with an error +if [ -z "${DB_PASSWORD}" ]; then + echo "Error: Failed to generate DB_PASSWORD." + exit 1 fi mysql < $PROJECT_ROOT/database/.env # Configure backend -export JWT_SECRET=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo); +export JWT_SECRET=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32; echo); envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/backend/.env.template > $PROJECT_ROOT/backend/.env # Configure frontend @@ -149,7 +155,7 @@ envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env # Configure dht-node -export FEDERATION_DHT_SEED=$(< /dev/urandom tr -dc a-f0-9 | head -c 32;echo); +export FEDERATION_DHT_SEED=$(< /dev/urandom tr -dc a-f0-9 | head -c 32; echo); envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/dht-node/.env.template > $PROJECT_ROOT/dht-node/.env # Configure federation @@ -163,4 +169,4 @@ sudo -u gradido crontab < $LOCAL_SCRIPT_DIR/crontabs.txt # Start gradido # Note: on first startup some errors will occur - nothing serious -sudo -u gradido $SCRIPT_PATH/start.sh \ No newline at end of file +sudo -u gradido $SCRIPT_PATH/start.sh $1 \ No newline at end of file From 8241907bc7df8ad05616d45ee25885e15d89d6b3 Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Wed, 21 Feb 2024 16:22:35 +0100 Subject: [PATCH 03/34] =?UTF-8?q?test=20workaround=20f=C3=BCr=20forgotPass?= =?UTF-8?q?word?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/graphql/resolver/UserResolver.test.ts | 6 ++++++ backend/src/graphql/resolver/UserResolver.ts | 1 - backend/src/seeds/factory/user.ts | 8 ++++++-- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index c570dbd9f..51d5b0694 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -1043,6 +1043,12 @@ describe('UserResolver', () => { describe('duration not expired', () => { it('throws an error', async () => { + // TODO: because of confusing time settings in user.createdAt and user.updatedAt increases duration a lot more than 10min necessary + // example: user directly created in userFactory for the testcase + // user.emailContacts.updatedAt=2024-02-21T12:18:30.000Z createdAt=2024-02-21T12:18:30.382Z + // timeElapsed = Date.now() - new Date(updatedAt).getTime() + // BUT HERE: Date.now=2024-02-21T13:18:30.889Z differs one hour from the user date settings !?!?!?!?!?!?! + CONFIG.EMAIL_CODE_REQUEST_TIME = 1000 await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( expect.objectContaining({ errors: [ diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index fa7f1582b..607ef21a6 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -398,7 +398,6 @@ export class UserResolver { logger.warn(`no user found with ${email}`) return true } - if (!canEmailResend(user.emailContact.updatedAt || user.emailContact.createdAt)) { throw new LogError( `Email already sent less than ${printTimeDuration(CONFIG.EMAIL_CODE_REQUEST_TIME)} ago`, diff --git a/backend/src/seeds/factory/user.ts b/backend/src/seeds/factory/user.ts index 3ddddf336..f0bda3a3f 100644 --- a/backend/src/seeds/factory/user.ts +++ b/backend/src/seeds/factory/user.ts @@ -39,8 +39,12 @@ export const userFactory = async ( dbUser = await User.findOneOrFail({ where: { id }, relations: ['userRoles'] }) if (user.createdAt || user.deletedAt || user.role) { - if (user.createdAt) dbUser.createdAt = user.createdAt - if (user.deletedAt) dbUser.deletedAt = user.deletedAt + if (user.createdAt) { + dbUser.createdAt = user.createdAt + } + if (user.deletedAt) { + dbUser.deletedAt = user.deletedAt + } if (user.role && (user.role === RoleNames.ADMIN || user.role === RoleNames.MODERATOR)) { await setUserRole(dbUser, user.role) } From 15eccbb315894dc66bbd228b8a788942889437cc Mon Sep 17 00:00:00 2001 From: Claus-Peter Huebner Date: Wed, 21 Feb 2024 17:20:55 +0100 Subject: [PATCH 04/34] remove workaround for forgotPassword-test --- backend/src/graphql/resolver/UserResolver.test.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/backend/src/graphql/resolver/UserResolver.test.ts b/backend/src/graphql/resolver/UserResolver.test.ts index 51d5b0694..c570dbd9f 100644 --- a/backend/src/graphql/resolver/UserResolver.test.ts +++ b/backend/src/graphql/resolver/UserResolver.test.ts @@ -1043,12 +1043,6 @@ describe('UserResolver', () => { describe('duration not expired', () => { it('throws an error', async () => { - // TODO: because of confusing time settings in user.createdAt and user.updatedAt increases duration a lot more than 10min necessary - // example: user directly created in userFactory for the testcase - // user.emailContacts.updatedAt=2024-02-21T12:18:30.000Z createdAt=2024-02-21T12:18:30.382Z - // timeElapsed = Date.now() - new Date(updatedAt).getTime() - // BUT HERE: Date.now=2024-02-21T13:18:30.889Z differs one hour from the user date settings !?!?!?!?!?!?! - CONFIG.EMAIL_CODE_REQUEST_TIME = 1000 await expect(mutate({ mutation: forgotPassword, variables })).resolves.toEqual( expect.objectContaining({ errors: [ From ffddfea699a9162c6373302393172243bc4d1014 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 26 Feb 2024 10:02:52 +0100 Subject: [PATCH 05/34] update remade, add migration script --- deployment/hetzner_cloud/README.md | 6 +- .../migration/2_2_0-2_2_1/README.md | 18 +++++ .../migration/2_2_0-2_2_1/fixInstall.sh | 66 +++++++++++++++++++ 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 deployment/hetzner_cloud/migration/2_2_0-2_2_1/README.md create mode 100644 deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh diff --git a/deployment/hetzner_cloud/README.md b/deployment/hetzner_cloud/README.md index d03ff0b46..5aec75ed5 100644 --- a/deployment/hetzner_cloud/README.md +++ b/deployment/hetzner_cloud/README.md @@ -1,7 +1,7 @@ -# Setup on Hetzner Cloud Server -Suggested minimal Plan: CX41 -4x vCPU, 16 GB Ram, 160 GB Disk Space, 20.71 € per month (04.01.2024) +# Migration +[Migration from 2.2.0 to 2.2.1](migration/2_2_0-2_2_1/README.md) +# Setup on Hetzner Cloud Server Suggested OS: Debian 12 diff --git a/deployment/hetzner_cloud/migration/2_2_0-2_2_1/README.md b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/README.md new file mode 100644 index 000000000..38c4e8330 --- /dev/null +++ b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/README.md @@ -0,0 +1,18 @@ +## Migrate from Gradido Version 2.2.0 to 2.2.1 +### What was wrong +In [hetzner_cloud/install.sh](../../install.sh) there was an error. +$DB_PASSWORD and $JWT_SECRET password generation method don't work with `release-2_2_0` as parameter for install.sh + +The Parameter forwarding from branch, `release-2_2_0` in this case to start.sh was also missing. + +### What you can do now +You need to only run this [fixInstall.sh](fixInstall.sh) with `release_2_2_1` as parameter +```bash +cd /home/gradido/gradido/deployment/hetzner_cloud/migration/2_2_0-2_2_1 +sudo ./fixInstall.sh `release_2_2_1` +``` + +Basically it will create a new $DB_PASSWORD, $JWT_SECRET and $FEDERATION_DHT_SEED, +update db user with new db password and update .env files in module folders. +Then it will call start.sh with first parameter if ./fixInstall.sh as his first parameter + diff --git a/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh new file mode 100644 index 000000000..5aad9c12d --- /dev/null +++ b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh @@ -0,0 +1,66 @@ +#!/bin/bash +# check for parameter +if [ -z "$1" ]; then + echo "Usage: Please provide a branch name as the first argument." + exit 1 +fi + +set -o allexport +SCRIPT_PATH=$(realpath ../../../bare_metal) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) +LOCAL_SCRIPT_PATH=$(realpath $0) +LOCAL_SCRIPT_DIR=$(dirname $LOCAL_SCRIPT_PATH) +PROJECT_ROOT=$SCRIPT_DIR/../../.. +set +o allexport + + +# Load .env or .env.dist if not present +# NOTE: all config values will be in process.env when starting +# the services and will therefore take precedence over the .env +if [ -f "$SCRIPT_PATH/.env" ]; then + set -o allexport + source $SCRIPT_PATH/.env + set +o allexport +else + set -o allexport + source $SCRIPT_PATH/.env.dist + set +o allexport +fi + +# create db user +export DB_USER=gradido +# create a new password only if it not already exist +export DB_PASSWORD=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32; echo); + + +mysql < $PROJECT_ROOT/database/.env + +# Configure backend +export JWT_SECRET=$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c 32; echo); +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/backend/.env.template > $PROJECT_ROOT/backend/.env + +# Configure frontend +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env.template > $PROJECT_ROOT/frontend/.env + +# Configure admin +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env + +# Configure dht-node +export FEDERATION_DHT_SEED=$(< /dev/urandom tr -dc a-f0-9 | head -c 32; echo); +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/dht-node/.env.template > $PROJECT_ROOT/dht-node/.env + +# Configure federation +envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/federation/.env.template > $PROJECT_ROOT/federation/.env + +# set all created or modified files back to belonging to gradido +chown -R gradido:gradido $PROJECT_ROOT + +# Start gradido +# Note: on first startup some errors will occur - nothing serious +sudo -u gradido $SCRIPT_PATH/start.sh $1 \ No newline at end of file From 93f68e4d475bec171bed265da8283df8edd2e4b9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 26 Feb 2024 10:04:00 +0100 Subject: [PATCH 06/34] release --- CHANGELOG.md | 8 ++++++++ admin/package.json | 2 +- backend/package.json | 2 +- database/package.json | 2 +- dht-node/package.json | 2 +- dlt-connector/package.json | 2 +- federation/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 9 files changed, 16 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bbb49eaf5..b05bd3e70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,16 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [2.2.1](https://github.com/gradido/gradido/compare/2.2.0...2.2.1) + +- fix(other): deployment bugfixes [`#3290`](https://github.com/gradido/gradido/pull/3290) + #### [2.2.0](https://github.com/gradido/gradido/compare/2.1.1...2.2.0) +> 9 February 2024 + +- chore(release): v2.2.0 [`#3283`](https://github.com/gradido/gradido/pull/3283) +- fix(backend): prevent warning, fix env error [`#3282`](https://github.com/gradido/gradido/pull/3282) - feat(frontend): update news text [`#3279`](https://github.com/gradido/gradido/pull/3279) - feat(frontend): use params instead of query for send/identifier route [`#3277`](https://github.com/gradido/gradido/pull/3277) - fix(other): deployment bugfixes [`#3276`](https://github.com/gradido/gradido/pull/3276) diff --git a/admin/package.json b/admin/package.json index a28adad43..8157bbdaa 100644 --- a/admin/package.json +++ b/admin/package.json @@ -3,7 +3,7 @@ "description": "Administraion Interface for Gradido", "main": "index.js", "author": "Moriz Wahl", - "version": "2.2.0", + "version": "2.2.1", "license": "Apache-2.0", "private": false, "scripts": { diff --git a/backend/package.json b/backend/package.json index cdf35b725..e08d5ea5e 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "gradido-backend", - "version": "2.2.0", + "version": "2.2.1", "description": "Gradido unified backend providing an API-Service for Gradido Transactions", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/backend", diff --git a/database/package.json b/database/package.json index 2b31e033b..31ccfcc1f 100644 --- a/database/package.json +++ b/database/package.json @@ -1,6 +1,6 @@ { "name": "gradido-database", - "version": "2.2.0", + "version": "2.2.1", "description": "Gradido Database Tool to execute database migrations", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/database", diff --git a/dht-node/package.json b/dht-node/package.json index 7a73791d5..a4859e394 100644 --- a/dht-node/package.json +++ b/dht-node/package.json @@ -1,6 +1,6 @@ { "name": "gradido-dht-node", - "version": "2.2.0", + "version": "2.2.1", "description": "Gradido dht-node module", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/", diff --git a/dlt-connector/package.json b/dlt-connector/package.json index 5bc9673de..9713e740f 100644 --- a/dlt-connector/package.json +++ b/dlt-connector/package.json @@ -1,6 +1,6 @@ { "name": "gradido-dlt-connector", - "version": "2.2.0", + "version": "2.2.1", "description": "Gradido DLT-Connector", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/", diff --git a/federation/package.json b/federation/package.json index fcfaa0e46..9a74201ab 100644 --- a/federation/package.json +++ b/federation/package.json @@ -1,6 +1,6 @@ { "name": "gradido-federation", - "version": "2.2.0", + "version": "2.2.1", "description": "Gradido federation module providing Gradido-Hub-Federation and versioned API for inter community communication", "main": "src/index.ts", "repository": "https://github.com/gradido/gradido/federation", diff --git a/frontend/package.json b/frontend/package.json index 2a3eeb56a..22ad16c5d 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "bootstrap-vue-gradido-wallet", - "version": "2.2.0", + "version": "2.2.1", "private": true, "scripts": { "start": "node run/server.js", diff --git a/package.json b/package.json index b85be6f24..8ed31de63 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gradido", - "version": "2.2.0", + "version": "2.2.1", "description": "Gradido", "main": "index.js", "repository": "git@github.com:gradido/gradido.git", From f750603151f691a0f962f70aca127bb07e3db417 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 26 Feb 2024 10:05:17 +0100 Subject: [PATCH 07/34] make script runnable --- deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh diff --git a/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh old mode 100644 new mode 100755 From 7c18fd6736535a5466e255595dafc77a36346eb4 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 26 Feb 2024 10:06:32 +0100 Subject: [PATCH 08/34] fix --- deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh index 5aad9c12d..1995b220d 100755 --- a/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh +++ b/deployment/hetzner_cloud/migration/2_2_0-2_2_1/fixInstall.sh @@ -10,7 +10,7 @@ SCRIPT_PATH=$(realpath ../../../bare_metal) SCRIPT_DIR=$(dirname $SCRIPT_PATH) LOCAL_SCRIPT_PATH=$(realpath $0) LOCAL_SCRIPT_DIR=$(dirname $LOCAL_SCRIPT_PATH) -PROJECT_ROOT=$SCRIPT_DIR/../../.. +PROJECT_ROOT=$SCRIPT_DIR/.. set +o allexport From 03c566919cb59203b300d40ec40608b55e426f93 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 26 Feb 2024 14:06:13 +0100 Subject: [PATCH 09/34] add gms switch and name type --- .../src/graphql/arg/UpdateUserInfosArgs.ts | 12 +- backend/src/graphql/model/User.ts | 8 + backend/src/graphql/resolver/UserResolver.ts | 23 +-- .../UserSettings/UserGMSNamingFormat.vue | 84 ++++++++ .../components/UserSettings/UserGMSSwitch.vue | 45 ++++ frontend/src/graphql/mutations.js | 4 +- frontend/src/locales/de.json | 16 ++ frontend/src/locales/en.json | 16 ++ frontend/src/pages/Settings.vue | 192 +++++++++++------- frontend/src/store/store.js | 12 ++ 10 files changed, 317 insertions(+), 95 deletions(-) create mode 100644 frontend/src/components/UserSettings/UserGMSNamingFormat.vue create mode 100644 frontend/src/components/UserSettings/UserGMSSwitch.vue diff --git a/backend/src/graphql/arg/UpdateUserInfosArgs.ts b/backend/src/graphql/arg/UpdateUserInfosArgs.ts index 0920fb3bc..22b548f91 100644 --- a/backend/src/graphql/arg/UpdateUserInfosArgs.ts +++ b/backend/src/graphql/arg/UpdateUserInfosArgs.ts @@ -1,6 +1,7 @@ -import { IsBoolean, IsInt, IsString } from 'class-validator' +import { IsBoolean, IsEnum, IsInt, IsString } from 'class-validator' import { ArgsType, Field, InputType, Int } from 'type-graphql' +import { GmsPublishNameType } from '@enum/GmsPublishNameType' import { Location } from '@model/Location' import { isValidLocation } from '@/graphql/validator/Location' @@ -48,9 +49,12 @@ export class UpdateUserInfosArgs { @IsBoolean() gmsAllowed?: boolean - @Field(() => Int, { nullable: true, defaultValue: 0 }) - @IsInt() - gmsPublishName?: number | null + @Field(() => GmsPublishNameType, { + nullable: true, + defaultValue: GmsPublishNameType.GMS_PUBLISH_NAME_ALIAS_OR_INITALS, + }) + @IsEnum(GmsPublishNameType) + gmsPublishName?: GmsPublishNameType | null @Field(() => Location, { nullable: true }) @isValidLocation() diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts index d24a717c4..0d3cfccc7 100644 --- a/backend/src/graphql/model/User.ts +++ b/backend/src/graphql/model/User.ts @@ -29,6 +29,8 @@ export class User { this.hasElopage = null this.hideAmountGDD = user.hideAmountGDD this.hideAmountGDT = user.hideAmountGDT + this.gmsAllowed = user.gmsAllowed + this.gmsPublishName = user.gmsPublishName } } @@ -74,6 +76,12 @@ export class User { @Field(() => Boolean) hideAmountGDT: boolean + @Field(() => Boolean) + gmsAllowed: boolean + + @Field(() => Int, { nullable: true }) + gmsPublishName: number | null + // This is not the users publisherId, but the one of the users who recommend him @Field(() => Int, { nullable: true }) publisherId: number | null diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 3f70ce112..8f6b36652 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -561,17 +561,6 @@ export class UserResolver { logger.info( `updateUserInfos(${firstName}, ${lastName}, ${alias}, ${language}, ***, ***, ${hideAmountGDD}, ${hideAmountGDT}, ${gmsAllowed}, ${gmsPublishName}, ${gmsLocation}, ${gmsPublishLocation})...`, ) - // check default arg settings - if (gmsAllowed === null || gmsAllowed === undefined) { - gmsAllowed = true - } - if (!gmsPublishName) { - gmsPublishName = GmsPublishNameType.GMS_PUBLISH_NAME_ALIAS_OR_INITALS - } - if (!gmsPublishLocation) { - gmsPublishLocation = GmsPublishLocationType.GMS_LOCATION_TYPE_RANDOM - } - const user = getUser(context) // try { if (firstName) { @@ -620,12 +609,18 @@ export class UserResolver { user.hideAmountGDT = hideAmountGDT } - user.gmsAllowed = gmsAllowed - user.gmsPublishName = gmsPublishName + if (gmsAllowed) { + user.gmsAllowed = gmsAllowed + } + if (gmsPublishName) { + user.gmsPublishName = gmsPublishName + } if (gmsLocation) { user.location = Location2Point(gmsLocation) } - user.gmsPublishLocation = gmsPublishLocation + if (gmsPublishLocation) { + user.gmsPublishLocation = gmsPublishLocation + } // } catch (err) { // console.log('error:', err) // } diff --git a/frontend/src/components/UserSettings/UserGMSNamingFormat.vue b/frontend/src/components/UserSettings/UserGMSNamingFormat.vue new file mode 100644 index 000000000..d12dde0ce --- /dev/null +++ b/frontend/src/components/UserSettings/UserGMSNamingFormat.vue @@ -0,0 +1,84 @@ + + + diff --git a/frontend/src/components/UserSettings/UserGMSSwitch.vue b/frontend/src/components/UserSettings/UserGMSSwitch.vue new file mode 100644 index 000000000..6958f4e57 --- /dev/null +++ b/frontend/src/components/UserSettings/UserGMSSwitch.vue @@ -0,0 +1,45 @@ + + diff --git a/frontend/src/graphql/mutations.js b/frontend/src/graphql/mutations.js index cade098da..184a712ab 100644 --- a/frontend/src/graphql/mutations.js +++ b/frontend/src/graphql/mutations.js @@ -35,7 +35,7 @@ export const updateUserInfos = gql` $hideAmountGDD: Boolean $hideAmountGDT: Boolean $gmsAllowed: Boolean - $gmsPublishName: Int + $gmsPublishName: GmsPublishNameType $gmsLocation: Location $gmsPublishLocation: Int ) { @@ -172,6 +172,8 @@ export const login = gql` klickTipp { newsletterState } + gmsAllowed + gmsPublishName hasElopage publisherId roles diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 337722940..f1ba3b2f7 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -5,8 +5,10 @@ "1000thanks": "1000 Dank, weil du bei uns bist!", "125": "125%", "85": "85%", + "ExternServices": "Verknüpfte Dienste", "GDD": "GDD", "GDT": "GDT", + "GMS": "Gradido Karte", "PersonalDetails": "Persönliche Angaben", "advanced-calculation": "Vorausberechnung", "asterisks": "****", @@ -290,6 +292,20 @@ }, "settings": { "emailInfo": "Kann aktuell noch nicht geändert werden.", + "GMS": { + "disabled": "Daten werden nicht nach GMS exportiert", + "enabled": "Daten werden nach GMS exportiert", + "naming-format": "Namensformat im GMS", + "publish-name": { + "alias-or-initials": "Benutzername, falls vorhanden, oder die Initialen von Vorname und Nachname", + "first": "nur Vornamen", + "first-initial": "Vorname plus Anfangsbuchstabe des Nachnamens", + "initials": "Initialen von Vor- und Nachname unabhängig von der Existenz des Benutzernamens", + "name-full": "vollständiger Name: Vorname plus Nachname", + "updated": "Namensformat für GMS aktualisiert" + }, + "switch": "Erlaubnis Daten nach GMS zu exportieren." + }, "hideAmountGDD": "Dein GDD Betrag ist versteckt.", "hideAmountGDT": "Dein GDT Betrag ist versteckt.", "info": "Transaktionen können nun per Benutzername oder E-Mail-Adresse getätigt werden.", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 982d22159..4756c00bf 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -5,8 +5,10 @@ "1000thanks": "1000 thanks for being with us!", "125": "125%", "85": "85%", + "ExternServices": "Extern Services", "GDD": "GDD", "GDT": "GDT", + "GMS": "Gradido Map", "PersonalDetails": "Personal details", "advanced-calculation": "Advanced calculation", "asterisks": "****", @@ -290,6 +292,20 @@ }, "settings": { "emailInfo": "Cannot be changed at this time.", + "GMS": { + "disabled": "Data not exported to GMS", + "enabled": "Data exported to GMS", + "naming-format": "Format of name in GMS", + "publish-name": { + "alias-or-initials": "username if exists or Initials of firstname and lastname", + "first": "firstname only", + "first-initial": "firstname plus initial of lastname", + "initials": "Initials of firstname and lastname independent if username exists", + "name-full": "fullname: firstname plus lastname", + "updated": "format of name for GMS updated" + }, + "switch": "Allow data export to GMS" + }, "hideAmountGDD": "Your GDD amount is hidden.", "hideAmountGDT": "Your GDT amount is hidden.", "info": "Transactions can now be made by username or email address.", diff --git a/frontend/src/pages/Settings.vue b/frontend/src/pages/Settings.vue index 1530e5e97..38a3317bf 100644 --- a/frontend/src/pages/Settings.vue +++ b/frontend/src/pages/Settings.vue @@ -1,81 +1,113 @@