Merge branch 'master' into dlt_deferred_transfer

This commit is contained in:
einhornimmond 2025-01-10 20:29:19 +01:00
commit 2cea5a025f
37 changed files with 160 additions and 110 deletions

View File

@ -1,32 +0,0 @@
name: Gradido MariaDB Test CI
on: push
jobs:
files-changed:
name: Detect File Changes - MariaDB
runs-on: ubuntu-latest
outputs:
mariadb: ${{ steps.changes.outputs.mariadb }}
steps:
- uses: actions/checkout@v3.3.0
- name: Check for frontend file changes
uses: dorny/paths-filter@v2.11.1
id: changes
with:
token: ${{ github.token }}
filters: .github/file-filters.yml
list-files: shell
build_test:
if: needs.files-changed.outputs.mariadb == 'true'
name: Docker Build Test - MariaDB
needs: files-changed
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: MariaDB | Build 'test' image
run: docker build --target mariadb_server -t "gradido/mariadb:test" -f ./mariadb/Dockerfile ./

View File

@ -4,8 +4,64 @@ 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.4.1](https://github.com/gradido/gradido/compare/2.3.1...2.4.1)
- feat(backend): auto register new user in humhub [`#3386`](https://github.com/gradido/gradido/pull/3386)
- feat(backend): try and catch user sync [`#3385`](https://github.com/gradido/gradido/pull/3385)
- feat(backend): increase initialien count [`#3369`](https://github.com/gradido/gradido/pull/3369)
- feat(frontend): monterail vue3 migration [`#3383`](https://github.com/gradido/gradido/pull/3383)
- fix(frontend): fix postmigration fix [`#3382`](https://github.com/gradido/gradido/pull/3382)
- feat(frontend): update text [`#3373`](https://github.com/gradido/gradido/pull/3373)
- feat(frontend): fix postmigration fix [`#3378`](https://github.com/gradido/gradido/pull/3378)
- feat(frontend): map feature in vue 3 [`#3376`](https://github.com/gradido/gradido/pull/3376)
- feat(frontend): links and emails in messages [`#3377`](https://github.com/gradido/gradido/pull/3377)
- feat(frontend): add transaction link in latest transactions [`#3375`](https://github.com/gradido/gradido/pull/3375)
- fix(frontend): fix logout issue [`#3374`](https://github.com/gradido/gradido/pull/3374)
- fix(frontend): post migration fixes [`#3372`](https://github.com/gradido/gradido/pull/3372)
- feat(frontend): vue3 migration [`#3365`](https://github.com/gradido/gradido/pull/3365)
- fix(frontend): fix index.html [`#3368`](https://github.com/gradido/gradido/pull/3368)
- build(frontend): merged code from master [`#3367`](https://github.com/gradido/gradido/pull/3367)
- fix(frontend): vue3 migration pre deploy setup [`#3366`](https://github.com/gradido/gradido/pull/3366)
- fix(workflow): fix broken tests [`#3363`](https://github.com/gradido/gradido/pull/3363)
- fix(frontend): style fixes, admin fix [`#3364`](https://github.com/gradido/gradido/pull/3364)
- fix(frontend): gdt test [`#3361`](https://github.com/gradido/gradido/pull/3361)
- fix(frontend): style fixes [`#3360`](https://github.com/gradido/gradido/pull/3360)
- fix(frontend): migration feedback fixes [`#3359`](https://github.com/gradido/gradido/pull/3359)
- fix(frontend): scss changes and fixes [`#3358`](https://github.com/gradido/gradido/pull/3358)
- fix(frontend): migration remaining fixes [`#3356`](https://github.com/gradido/gradido/pull/3356)
- fix(admin): fix message update [`#3354`](https://github.com/gradido/gradido/pull/3354)
- fix(admin): fix refetch data in edit creation form [`#3353`](https://github.com/gradido/gradido/pull/3353)
- fix(frontend): fix dropdown in transaction send and link [`#3352`](https://github.com/gradido/gradido/pull/3352)
- fix(frontend): fix newsletter state reactivity [`#3351`](https://github.com/gradido/gradido/pull/3351)
- fix(frontend): fix how community switch is handled [`#3350`](https://github.com/gradido/gradido/pull/3350)
- fix(frontend): fixed after merge [`#3349`](https://github.com/gradido/gradido/pull/3349)
- fix(frontend): fixed logout handler [`#3347`](https://github.com/gradido/gradido/pull/3347)
- chore(frontend): main js cleanup [`#3346`](https://github.com/gradido/gradido/pull/3346)
- feature(frontend): change env config reading [`#3345`](https://github.com/gradido/gradido/pull/3345)
- feature(frontend): bump node in FE .nvmrc [`#3344`](https://github.com/gradido/gradido/pull/3344)
- feat(frontend): migration setup [`#3342`](https://github.com/gradido/gradido/pull/3342)
- fix(admin): Remove "maxAmountPerMonth" from `createContributionLink` gql. [`#3343`](https://github.com/gradido/gradido/pull/3343)
- fix(admin): style fixes [`#3339`](https://github.com/gradido/gradido/pull/3339)
- fix(admin): creation tab disappearing after creating creation [`#3338`](https://github.com/gradido/gradido/pull/3338)
- fix(frontend): show updated gdd amount [`#3337`](https://github.com/gradido/gradido/pull/3337)
- feat(admin): Add remaining fixes [`#3336`](https://github.com/gradido/gradido/pull/3336)
- feat(admin): fix edit creation form [`#3334`](https://github.com/gradido/gradido/pull/3334)
- feat(admin): migration of admin creation components [`#3333`](https://github.com/gradido/gradido/pull/3333)
- feat(admin): automatic contributions updates [`#3332`](https://github.com/gradido/gradido/pull/3332)
- feat(admin): vite config changes [`#3331`](https://github.com/gradido/gradido/pull/3331)
- feat(admin) - fix import in node server [`#3330`](https://github.com/gradido/gradido/pull/3330)
- fix(admin): stylelint fix [`#3329`](https://github.com/gradido/gradido/pull/3329)
- feat(admin): setup migration environment [`#3328`](https://github.com/gradido/gradido/pull/3328)
- fix(admin): fix contribution link [`#3326`](https://github.com/gradido/gradido/pull/3326)
- feat(admin): geo-coordinates for community [`#3323`](https://github.com/gradido/gradido/pull/3323)
- feat(backend): speedup listTransactions [`#3324`](https://github.com/gradido/gradido/pull/3324)
- fix(frontend): link forwarding after using send with url parameters [`#3322`](https://github.com/gradido/gradido/pull/3322)
#### [2.3.1](https://github.com/gradido/gradido/compare/2.3.0...2.3.1)
> 11 June 2024
- chore(release): v2.3.1 beta [`#3321`](https://github.com/gradido/gradido/pull/3321)
- feat(frontend): more compatible humhub auto-login link [`#3319`](https://github.com/gradido/gradido/pull/3319)
- fix(backend): fix test which will only fail at 31. of month, or 30.05 [`#3320`](https://github.com/gradido/gradido/pull/3320)
- feat(frontend): remove automatically logged out message [`#3318`](https://github.com/gradido/gradido/pull/3318)

View File

@ -3,7 +3,7 @@
"description": "Administration Interface for Gradido",
"main": "index.js",
"author": "Moriz Wahl",
"version": "2.3.1",
"version": "2.4.1",
"license": "Apache-2.0",
"private": false,
"scripts": {

View File

@ -1,6 +1,6 @@
{
"name": "gradido-backend",
"version": "2.3.1",
"version": "2.4.1",
"description": "Gradido unified backend providing an API-Service for Gradido Transactions",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/backend",

View File

@ -0,0 +1,5 @@
import { Agent } from 'http'
import { Agent as HttpsAgent } from 'https'
export const httpAgent = new Agent({ keepAlive: true })
export const httpsAgent = new HttpsAgent({ keepAlive: true })

View File

@ -7,10 +7,12 @@ import axios from 'axios'
import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
import { httpAgent, httpsAgent } from './ConnectionAgents'
export const apiPost = async (url: string, payload: unknown): Promise<any> => {
logger.trace('POST', url, payload)
try {
const result = await axios.post(url, payload)
const result = await axios.post(url, payload, { httpAgent, httpsAgent })
logger.trace('POST-Response', result)
if (result.status !== 200) {
throw new LogError('HTTP Status Error', result.status)
@ -27,7 +29,7 @@ export const apiPost = async (url: string, payload: unknown): Promise<any> => {
export const apiGet = async (url: string): Promise<any> => {
logger.trace('GET: url=' + url)
try {
const result = await axios.get(url)
const result = await axios.get(url, { httpAgent, httpsAgent })
logger.trace('GET-Response', result)
if (result.status !== 200) {
throw new LogError('HTTP Status Error', result.status)

View File

@ -4,6 +4,7 @@
/* eslint-disable @typescript-eslint/no-unsafe-argument */
import axios from 'axios'
import { httpAgent, httpsAgent } from '@/apis/ConnectionAgents'
import { CONFIG } from '@/config'
import { LogError } from '@/server/LogError'
import { backendLogger as logger } from '@/server/logger'
@ -126,9 +127,10 @@ export async function createGmsUser(apiKey: string, user: GmsUser): Promise<bool
accept: 'application/json',
language: 'en',
timezone: 'UTC',
connection: 'keep-alive',
authorization: apiKey,
},
httpAgent,
httpsAgent,
}
try {
const result = await axios.post(baseUrl.concat(service), user, config)
@ -160,9 +162,10 @@ export async function updateGmsUser(apiKey: string, user: GmsUser): Promise<bool
accept: 'application/json',
language: 'en',
timezone: 'UTC',
connection: 'keep-alive',
authorization: apiKey,
},
httpAgent,
httpsAgent,
}
try {
const result = await axios.patch(baseUrl.concat(service), user, config)
@ -197,9 +200,10 @@ export async function verifyAuthToken(
accept: 'application/json',
language: 'en',
timezone: 'UTC',
connection: 'keep-alive',
// authorization: apiKey,
},
httpAgent,
httpsAgent,
}
try {
const result = await axios.get(baseUrl.concat(service), config)

View File

@ -20,7 +20,9 @@ export class HumHubClient {
// eslint-disable-next-line no-useless-constructor, @typescript-eslint/no-empty-function
private constructor() {
this.restClient = new RestClient('gradido-backend', CONFIG.HUMHUB_API_URL)
this.restClient = new RestClient('gradido-backend', CONFIG.HUMHUB_API_URL, undefined, {
keepAlive: true,
})
logger.info('create rest client for', CONFIG.HUMHUB_API_URL)
}

View File

@ -0,0 +1,23 @@
import { User } from '@entity/User'
import { PublishNameLogic } from '@/data/PublishName.logic'
import { PublishNameType } from '@/graphql/enum/PublishNameType'
import { Account } from './Account'
import { Profile } from './Profile'
export abstract class AbstractUser {
public constructor(user: User) {
this.account = new Account(user)
this.profile = new Profile(user)
// temp fix for prevent double usernames in humhub, if the username ist created from initials
const publishNameLogic = new PublishNameLogic(user)
if (publishNameLogic.isUsernameFromInitials(user.humhubPublishName as PublishNameType)) {
this.profile.firstname = this.account.username
this.account.username = user.gradidoID
}
}
account: Account
profile: Profile
}

View File

@ -1,19 +1,15 @@
import { User } from '@entity/User'
import { Account } from './Account'
import { Profile } from './Profile'
import { AbstractUser } from './AbstractUser'
export class GetUser {
export class GetUser extends AbstractUser {
public constructor(user: User, id: number) {
super(user)
this.id = id
this.account = new Account(user)
this.profile = new Profile(user)
}
id: number
guid: string
// eslint-disable-next-line camelcase
display_name: string
account: Account
profile: Profile
}

View File

@ -1,16 +1,7 @@
import { User } from '@entity/User'
import { Account } from './Account'
import { AbstractUser } from './AbstractUser'
import { Password } from './Password'
import { Profile } from './Profile'
export class PostUser {
public constructor(user: User) {
this.account = new Account(user)
this.profile = new Profile(user)
}
account: Account
profile: Profile
// only add password as filed, rest the same as AbstractUser
export class PostUser extends AbstractUser {
password: Password
}

View File

@ -67,17 +67,25 @@ export class PublishNameLogic {
* else return user.firstName[0,2] + user.lastName[0,2] for publishNameType = [PUBLISH_NAME_ALIAS_OR_INITALS, PUBLISH_NAME_INITIALS]
*/
public getUsername(publishNameType: PublishNameType): string {
if (
[
PublishNameType.PUBLISH_NAME_ALIAS_OR_INITALS,
PublishNameType.PUBLISH_NAME_INITIALS,
].includes(publishNameType)
) {
return publishNameType === PublishNameType.PUBLISH_NAME_ALIAS_OR_INITALS && this.hasAlias()
? this.filterOutInvalidChar(this.user.alias)
: this.firstUpperCaseSecondLowerCase(this.filterOutInvalidChar(this.user.firstName)) +
this.firstUpperCaseSecondLowerCase(this.filterOutInvalidChar(this.user.lastName))
if (this.isUsernameFromInitials(publishNameType)) {
return this.filterOutInvalidChar(
this.firstUpperCaseSecondLowerCase(this.user.firstName) +
this.firstUpperCaseSecondLowerCase(this.user.lastName),
)
} else if (this.isUsernameFromAlias(publishNameType)) {
return this.filterOutInvalidChar(this.user.alias)
}
return this.hasAlias() ? this.user.alias : this.user.gradidoID
return this.user.gradidoID
}
public isUsernameFromInitials(publishNameType: PublishNameType): boolean {
return (
PublishNameType.PUBLISH_NAME_INITIALS === publishNameType ||
(PublishNameType.PUBLISH_NAME_ALIAS_OR_INITALS === publishNameType && !this.hasAlias())
)
}
public isUsernameFromAlias(publishNameType: PublishNameType): boolean {
return PublishNameType.PUBLISH_NAME_ALIAS_OR_INITALS === publishNameType && this.hasAlias()
}
}

View File

@ -112,6 +112,7 @@ beforeAll(async () => {
mutate = testEnv.mutate
query = testEnv.query
con = testEnv.con
CONFIG.HUMHUB_ACTIVE = false
await cleanDB()
})

View File

@ -34,6 +34,7 @@ import { updateGmsUser } from '@/apis/gms/GmsClient'
import { GmsUser } from '@/apis/gms/model/GmsUser'
import { HumHubClient } from '@/apis/humhub/HumHubClient'
import { GetUser } from '@/apis/humhub/model/GetUser'
import { PostUser } from '@/apis/humhub/model/PostUser'
import { subscribe } from '@/apis/KlicktippController'
import { encode } from '@/auth/JWT'
import { RIGHTS } from '@/auth/RIGHTS'
@ -174,9 +175,9 @@ export class UserResolver {
let humhubUserPromise: Promise<IRestResponse<GetUser>> | undefined
const klicktippStatePromise = getKlicktippState(dbUser.emailContact.email)
if (CONFIG.HUMHUB_ACTIVE && dbUser.humhubAllowed) {
const publishNameLogic = new PublishNameLogic(dbUser)
const getHumhubUser = new PostUser(dbUser)
humhubUserPromise = HumHubClient.getInstance()?.userByUsernameAsync(
publishNameLogic.getUsername(dbUser.humhubPublishName as PublishNameType),
getHumhubUser.account.username,
)
}

View File

@ -1,6 +1,6 @@
{
"name": "gradido-database",
"version": "2.3.1",
"version": "2.4.1",
"description": "Gradido Database Tool to execute database migrations",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/database",

View File

@ -1,6 +1,6 @@
{
"name": "gradido-dht-node",
"version": "2.3.1",
"version": "2.4.1",
"description": "Gradido dht-node module",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/",

View File

@ -1,6 +1,6 @@
{
"name": "gradido-dlt-connector",
"version": "3.0.0",
"version": "2.4.1",
"description": "Gradido DLT-Connector",
"main": "src/index.ts",
"repository": "https://github.com/gradido/gradido/",

View File

@ -80,10 +80,6 @@ services:
## MARIADB ##############################################
#########################################################
mariadb:
image: gradido/mariadb:test
environment:
- MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1
- MARIADB_USER=root
networks:
- internal-net
- external-net

View File

@ -61,11 +61,9 @@ services:
## MARIADB ##############################################
#########################################################
mariadb:
build:
context: ./mariadb
target: mariadb_server
image: mariadb:10.5
environment:
- MARIADB_ALLOW_EMPTY_PASSWORD=1
- MARIADB_ALLOW_EMPTY_ROOT_PASSWORD=1
- MARIADB_USER=root
networks:
- internal-net
@ -92,7 +90,6 @@ services:
- 4000:4000
depends_on:
- mariadb
restart: always
environment:
# Envs used in Dockerfile
# - DOCKER_WORKDIR="/app"
@ -128,7 +125,6 @@ services:
# - 5000:5000
depends_on:
- mariadb
restart: always
environment:
# Envs used in Dockerfile
# - DOCKER_WORKDIR="/app"
@ -162,7 +158,6 @@ services:
- external-net
ports:
- 6010:6010
restart: always
environment:
# Envs used in Dockerfile
# - DOCKER_WORKDIR="/app"
@ -196,7 +191,6 @@ services:
- 5010:5010
depends_on:
- mariadb
restart: always
environment:
# Envs used in Dockerfile
# - DOCKER_WORKDIR="/app"

View File

@ -36,6 +36,7 @@ export default defineConfig({
baseUrl: 'http://localhost:3000',
chromeWebSecurity: false,
defaultCommandTimeout: 100000,
pageLoadTimeout: 120000,
supportFile: 'cypress/support/index.ts',
viewportHeight: 720,
viewportWidth: 1280,

View File

@ -1,6 +1,6 @@
{
"name": "gradido-federation",
"version": "2.3.1",
"version": "2.4.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",

View File

@ -1,6 +1,6 @@
{
"name": "bootstrap-vue-gradido-wallet",
"version": "2.3.1",
"version": "2.4.1",
"private": true,
"scripts": {
"start": "node run/server.js",

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -23,7 +23,7 @@ import { useAuthLinks } from '@/composables/useAuthLinks'
const { login, register } = useAuthLinks()
const backgroundHeader = '/img/template/gradido_background_header.png'
const logo = '/img/brand/gradido-logo.png'
const logo = '/img/brand/gradido-logo_200x59.png'
const sheet = '/img/template/Blaetter.png'
</script>

View File

@ -19,7 +19,7 @@
required
:no-flip="true"
type="date"
@update:model-value="date = $event"
@update:model-value="handleDateChange"
>
<template #nav-prev-year><span></span></template>
<template #nav-next-year><span></span></template>
@ -128,6 +128,11 @@ const [date, dateProps] = defineField('date')
const { meta: dataFieldMeta } = useField('date', 'required')
const handleDateChange = (newDate) => {
date.value = newDate
emit('update:model-value', { ...props.modelValue, date: newDate })
}
const showMessage = computed(() => {
if (props.maxGddThisMonth <= 0 && props.maxGddLastMonth <= 0) return true
if (props.modelValue.date)

View File

@ -122,7 +122,7 @@ describe('GdtTransactionList', () => {
it('emits input event after currentPage changes', async () => {
await wrapper.findComponent({ name: 'BPagination' }).vm.$emit('update:modelValue', 2)
await nextTick()
expect(wrapper.emitted('input')).toEqual([[2]])
expect(wrapper.emitted('update:modelValue')).toEqual([[2]])
})
describe('pagination buttons', () => {

View File

@ -29,7 +29,7 @@
</div>
<BPagination
v-if="transactionGdtCount > pageSize"
:model-value="currentPage"
v-model="currentPage"
class="mt-3"
pills
size="lg"
@ -37,7 +37,6 @@
:total-rows="transactionGdtCount"
align="center"
:hide-ellipsis="true"
@update:model-value="currentPage = $event"
/>
</div>
</template>
@ -61,13 +60,16 @@ export default {
},
data() {
return {
currentPage: this.value,
currentPage: this.modelValue,
link: 'https://gradido.net/' + this.$store.state.language + '/memberships/',
}
},
watch: {
currentPage() {
if (this.modelValue !== this.currentPage) this.$emit('input', this.currentPage)
modelValue(newValue) {
this.currentPage = newValue
},
currentPage(newValue) {
if (this.modelValue !== newValue) this.$emit('update:modelValue', newValue)
},
},
}

View File

@ -345,7 +345,7 @@ describe('Transaction', () => {
})
it('has the description gdt.contribution', () => {
expect(wrapper.findAll('div.row').at(0).text()).toContain('gdt.contribution')
expect(wrapper.findAll('div.row').at(0).text()).toContain('This is a comment')
})
it('renders the amount of euros', () => {

View File

@ -91,7 +91,7 @@ const getLinesByType = computed(() => {
icon: 'heart',
iconclasses: 'gradido-global-color-accent',
iconColor: '4',
description: t('gdt.contribution'),
description: props.comment, // t('gdt.contribution'),
descriptiontext: n(props.amount, 'decimal') + ' €',
credittext: n(props.gdt, 'decimal') + ' GDT',
}

View File

@ -127,7 +127,8 @@ describe('TransactionLink.vue', () => {
expect(wrapper.vm.decay).toBe('100')
})
it('computes validLink correctly when link is valid', () => {
it('computes validLink correctly when link is valid', async () => {
await wrapper.setProps({ validUntil: new Date(new Date().getTime() + 1000000) })
expect(wrapper.vm.validLink).toBe(true)
})

View File

@ -30,7 +30,7 @@
<div class="mb-0">{{ $t('1000thanks') }}</div>
</BCol>
<BCol cols="3" class="text-end d-none d-sm-none d-md-inline">
<BAvatar src="/img/brand/gradido_coin.png" size="6rem" />
<BAvatar src="/img/brand/gradido_coin_128x128.png" size="6rem" />
</BCol>
</BRow>
<BCard ref="pageFontSize" no-body class="border-0 mt-4 gradido-custom-background">
@ -62,7 +62,7 @@
<BRow class="d-inline d-sm-inline d-md-none d-lg-none mb-3">
<BCol class="text-center">
<BAvatar
src="/img/brand/gradido_coin.png"
src="/img/brand/gradido_coin_128x128.png"
size="6rem"
bg-variant="transparent"
></BAvatar>

View File

@ -231,7 +231,6 @@
},
"gdt": {
"calculation": "Berechnung der Gradido Transform",
"contribution": "Beitrag",
"conversion": "Umrechnung",
"conversion-gdt-euro": "Umrechnung Euro / Gradido Transform (GDT)",
"credit": "Gutschrift",

View File

@ -231,7 +231,6 @@
},
"gdt": {
"calculation": "Calculation of Gradido Transform",
"contribution": "Contribution",
"conversion": "Conversion",
"conversion-gdt-euro": "Conversion Euro / Gradido Transform (GDT)",
"credit": "Credit",

View File

@ -11,7 +11,7 @@
<div class="mb-3"></div>
<contribution-form
:key="computedKeyFromForm"
:model-value="form"
v-model="form"
:is-this-month="isThisMonth"
:minimal-date="minimalDate"
:max-gdd-last-month="maxForMonths[0]"

View File

@ -1,4 +0,0 @@
#########################################################################################################
# mariadb server
#########################################################################################################
FROM mariadb:10.5 as mariadb_server

View File

@ -1,6 +1,6 @@
{
"name": "gradido",
"version": "2.3.1",
"version": "2.4.1",
"description": "Gradido",
"main": "index.js",
"repository": "git@github.com:gradido/gradido.git",