From f1f46b2d803fc0c699310039fe829e62a80801a9 Mon Sep 17 00:00:00 2001
From: clauspeterhuebner
Date: Fri, 11 Apr 2025 03:12:05 +0200
Subject: [PATCH] first try of x-cross tx per link
---
backend/src/auth/INALIENABLE_RIGHTS.ts | 1 +
backend/src/auth/RIGHTS.ts | 1 +
backend/src/auth/jwt/JWT.ts | 37 ++++
.../DisbursementJwtPayloadType.ts | 33 ++++
.../auth/jwt/payloadtypes/JwtPayloadType.ts | 19 ++
.../federation/client/1_0/FederationClient.ts | 1 +
.../PublicCommunityInfoLogging.view.ts | 2 +-
backend/src/graphql/arg/RedeemJwtArgs.ts | 37 ++++
backend/src/graphql/model/TransactionLink.ts | 50 +++--
backend/src/graphql/model/User.ts | 62 ++++---
.../resolver/TransactionLinkResolver.ts | 88 +++++++--
.../src/graphql/resolver/util/communities.ts | 13 +-
.../redeemlink_without_community-switch.png | Bin 0 -> 1140253 bytes
frontend/src/components/CommunitySwitch.vue | 11 ++
.../RedeemCommunitySelection.vue | 103 +++++++++++
.../RedeemSelectCommunity.vue | 49 +++++
frontend/src/graphql/mutations.js | 24 +++
frontend/src/graphql/queries.js | 8 +
frontend/src/locales/de.json | 3 +
frontend/src/locales/en.json | 3 +
frontend/src/locales/es.json | 3 +
frontend/src/locales/fr.json | 3 +
frontend/src/locales/nl.json | 3 +
frontend/src/locales/tr.json | 3 +
frontend/src/pages/TransactionLink.vue | 77 ++++++--
.../src/pages/TransactionLinkDisburse.vue | 174 ++++++++++++++++++
26 files changed, 733 insertions(+), 75 deletions(-)
create mode 100644 backend/src/auth/jwt/JWT.ts
create mode 100644 backend/src/auth/jwt/payloadtypes/DisbursementJwtPayloadType.ts
create mode 100644 backend/src/auth/jwt/payloadtypes/JwtPayloadType.ts
create mode 100644 backend/src/graphql/arg/RedeemJwtArgs.ts
create mode 100644 docu/Concepts/TechnicalRequirements/image/redeemlink_without_community-switch.png
create mode 100644 frontend/src/components/LinkInformations/RedeemCommunitySelection.vue
create mode 100644 frontend/src/components/LinkInformations/RedeemSelectCommunity.vue
create mode 100644 frontend/src/pages/TransactionLinkDisburse.vue
diff --git a/backend/src/auth/INALIENABLE_RIGHTS.ts b/backend/src/auth/INALIENABLE_RIGHTS.ts
index c3c96b95e..19865608f 100644
--- a/backend/src/auth/INALIENABLE_RIGHTS.ts
+++ b/backend/src/auth/INALIENABLE_RIGHTS.ts
@@ -7,6 +7,7 @@ export const INALIENABLE_RIGHTS = [
RIGHTS.SEND_RESET_PASSWORD_EMAIL,
RIGHTS.SET_PASSWORD,
RIGHTS.QUERY_TRANSACTION_LINK,
+ RIGHTS.QUERY_REDEEM_JWT,
RIGHTS.QUERY_OPT_IN,
RIGHTS.CHECK_USERNAME,
RIGHTS.PROJECT_BRANDING_BANNER,
diff --git a/backend/src/auth/RIGHTS.ts b/backend/src/auth/RIGHTS.ts
index 0ccb9695f..4775c07e2 100644
--- a/backend/src/auth/RIGHTS.ts
+++ b/backend/src/auth/RIGHTS.ts
@@ -6,6 +6,7 @@ export enum RIGHTS {
SEND_RESET_PASSWORD_EMAIL = 'SEND_RESET_PASSWORD_EMAIL',
SET_PASSWORD = 'SET_PASSWORD',
QUERY_TRANSACTION_LINK = 'QUERY_TRANSACTION_LINK',
+ QUERY_REDEEM_JWT = 'QUERY_REDEEM_JWT',
QUERY_OPT_IN = 'QUERY_OPT_IN',
CHECK_USERNAME = 'CHECK_USERNAME',
PROJECT_BRANDING_BANNER = 'PROJECT_BRANDING_BANNER',
diff --git a/backend/src/auth/jwt/JWT.ts b/backend/src/auth/jwt/JWT.ts
new file mode 100644
index 000000000..f36dd10fc
--- /dev/null
+++ b/backend/src/auth/jwt/JWT.ts
@@ -0,0 +1,37 @@
+import { SignJWT, jwtVerify } from 'jose'
+
+import { LogError } from '@/server/LogError'
+
+import { JwtPayloadType } from './payloadtypes/JwtPayloadType'
+
+export const decode = async (token: string, signkey: Buffer): Promise => {
+ if (!token) throw new LogError('401 Unauthorized')
+
+ try {
+ const secret = new TextEncoder().encode(signkey.toString())
+ const { payload } = await jwtVerify(token, secret, {
+ issuer: 'urn:gradido:issuer',
+ audience: 'urn:gradido:audience',
+ })
+ return payload as unknown as JwtPayloadType
+ } catch (err) {
+ return null
+ }
+}
+
+export const encode = async (payload: JwtPayloadType, signkey: Buffer): Promise => {
+ const secret = new TextEncoder().encode(signkey.toString())
+ const token = await new SignJWT({ payload, 'urn:gradido:claim': true })
+ .setProtectedHeader({ alg: 'HS256' })
+ .setIssuedAt()
+ .setIssuer('urn:gradido:issuer')
+ .setAudience('urn:gradido:audience')
+ .setExpirationTime(payload.expiration)
+ .sign(secret)
+ return token
+}
+
+export const decodeJwtType = async (token: string, signkey: Buffer): Promise => {
+ const payload = await decode(token, signkey)
+ return payload ? payload.tokentype : 'unknown token type'
+}
diff --git a/backend/src/auth/jwt/payloadtypes/DisbursementJwtPayloadType.ts b/backend/src/auth/jwt/payloadtypes/DisbursementJwtPayloadType.ts
new file mode 100644
index 000000000..f8e0094b9
--- /dev/null
+++ b/backend/src/auth/jwt/payloadtypes/DisbursementJwtPayloadType.ts
@@ -0,0 +1,33 @@
+// import { JWTPayload } from 'jose'
+import { JwtPayloadType } from './JwtPayloadType'
+
+export class DisbursementJwtPayloadType extends JwtPayloadType {
+ static REDEEM_ACTIVATION_TYPE = 'redeem-activation'
+
+ sendercommunityuuid: string
+ sendergradidoid: string
+ sendername: string // alias or firstname
+ redeemcode: string
+ amount: string
+ memo: string
+
+ constructor(
+ senderCom: string,
+ senderUser: string,
+ sendername: string,
+ code: string,
+ amount: string,
+ memo: string,
+ ) {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call
+ super()
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
+ this.tokentype = DisbursementJwtPayloadType.REDEEM_ACTIVATION_TYPE
+ this.sendercommunityuuid = senderCom
+ this.sendergradidoid = senderUser
+ this.sendername = sendername
+ this.redeemcode = code
+ this.amount = amount
+ this.memo = memo
+ }
+}
diff --git a/backend/src/auth/jwt/payloadtypes/JwtPayloadType.ts b/backend/src/auth/jwt/payloadtypes/JwtPayloadType.ts
new file mode 100644
index 000000000..23b6c3fe8
--- /dev/null
+++ b/backend/src/auth/jwt/payloadtypes/JwtPayloadType.ts
@@ -0,0 +1,19 @@
+import { JWTPayload } from 'jose'
+
+export class JwtPayloadType implements JWTPayload {
+ iat?: number | undefined
+ exp?: number | undefined
+ nbf?: number | undefined
+ jti?: string | undefined
+ aud?: string | string[] | undefined
+ sub?: string | undefined
+ iss?: string | undefined;
+ [propName: string]: unknown
+
+ tokentype: string
+ expiration: string // in minutes (format: 10m for ten minutes)
+ constructor() {
+ this.tokentype = 'unknown jwt type'
+ this.expiration = '10m'
+ }
+}
diff --git a/backend/src/federation/client/1_0/FederationClient.ts b/backend/src/federation/client/1_0/FederationClient.ts
index 0c2b4101b..1b95cb1a3 100644
--- a/backend/src/federation/client/1_0/FederationClient.ts
+++ b/backend/src/federation/client/1_0/FederationClient.ts
@@ -78,6 +78,7 @@ export class FederationClient {
)
return data.getPublicCommunityInfo
} catch (err) {
+ logger.warn(' err', err)
const errorString = JSON.stringify(err)
logger.warn('Federation: getPublicCommunityInfo failed for endpoint', {
endpoint: this.endpoint,
diff --git a/backend/src/federation/client/1_0/logging/PublicCommunityInfoLogging.view.ts b/backend/src/federation/client/1_0/logging/PublicCommunityInfoLogging.view.ts
index 3151bbb31..1cb9270f5 100644
--- a/backend/src/federation/client/1_0/logging/PublicCommunityInfoLogging.view.ts
+++ b/backend/src/federation/client/1_0/logging/PublicCommunityInfoLogging.view.ts
@@ -12,7 +12,7 @@ export class PublicCommunityInfoLoggingView extends AbstractLoggingView {
return {
name: this.self.name,
description: this.self.description,
- creationDate: this.dateToString(this.self.creationDate),
+ creationDate: this.self.creationDate,
publicKey: this.self.publicKey,
}
}
diff --git a/backend/src/graphql/arg/RedeemJwtArgs.ts b/backend/src/graphql/arg/RedeemJwtArgs.ts
new file mode 100644
index 000000000..bd3feb1d6
--- /dev/null
+++ b/backend/src/graphql/arg/RedeemJwtArgs.ts
@@ -0,0 +1,37 @@
+import { MaxLength, MinLength } from 'class-validator'
+import { Decimal } from 'decimal.js-light'
+import { Field, ArgsType, InputType } from 'type-graphql'
+
+import { MEMO_MAX_CHARS, MEMO_MIN_CHARS } from '@/graphql/resolver/const/const'
+import { IsPositiveDecimal } from '@/graphql/validator/Decimal'
+
+@InputType()
+@ArgsType()
+export class RedeemJwtArgs {
+ @Field(() => String, { nullable: false })
+ gradidoID: string
+
+ @Field(() => String, { nullable: true })
+ alias?: string | null
+
+ @Field(() => String, { nullable: true })
+ firstName?: string | null
+
+ @Field(() => String, { nullable: false })
+ communityUuid: string
+
+ @Field(() => String, { nullable: false })
+ communityName: string
+
+ @Field(() => String, { nullable: false })
+ code: string
+
+ @Field(() => Decimal, { nullable: false })
+ @IsPositiveDecimal()
+ amount: Decimal
+
+ @Field(() => String, { nullable: false })
+ @MaxLength(MEMO_MAX_CHARS)
+ @MinLength(MEMO_MIN_CHARS)
+ memo: string
+}
diff --git a/backend/src/graphql/model/TransactionLink.ts b/backend/src/graphql/model/TransactionLink.ts
index 995fe5d50..210420bb9 100644
--- a/backend/src/graphql/model/TransactionLink.ts
+++ b/backend/src/graphql/model/TransactionLink.ts
@@ -1,26 +1,42 @@
-import { TransactionLink as dbTransactionLink } from '@entity/TransactionLink'
+import { Community as DbCommunity } from '@entity/Community'
+import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
import { Decimal } from 'decimal.js-light'
import { ObjectType, Field, Int } from 'type-graphql'
import { CONFIG } from '@/config'
+import { Community } from './Community'
import { User } from './User'
@ObjectType()
export class TransactionLink {
- constructor(transactionLink: dbTransactionLink, user: User, redeemedBy: User | null = null) {
- this.id = transactionLink.id
- this.user = user
- this.amount = transactionLink.amount
- this.holdAvailableAmount = transactionLink.holdAvailableAmount
- this.memo = transactionLink.memo
- this.code = transactionLink.code
- this.createdAt = transactionLink.createdAt
- this.validUntil = transactionLink.validUntil
- this.deletedAt = transactionLink.deletedAt
- this.redeemedAt = transactionLink.redeemedAt
- this.redeemedBy = redeemedBy
- this.link = CONFIG.COMMUNITY_REDEEM_URL + this.code
+ constructor(
+ dbTransactionLink?: DbTransactionLink,
+ user?: User,
+ redeemedBy?: User,
+ dbCommunities?: DbCommunity[],
+ ) {
+ if (dbTransactionLink !== undefined) {
+ this.id = dbTransactionLink.id
+ this.amount = dbTransactionLink.amount
+ this.holdAvailableAmount = dbTransactionLink.holdAvailableAmount
+ this.memo = dbTransactionLink.memo
+ this.code = dbTransactionLink.code
+ this.link = CONFIG.COMMUNITY_REDEEM_URL + this.code
+ this.createdAt = dbTransactionLink.createdAt
+ this.validUntil = dbTransactionLink.validUntil
+ this.deletedAt = dbTransactionLink.deletedAt
+ this.redeemedAt = dbTransactionLink.redeemedAt
+ }
+ if (user !== undefined) {
+ this.user = user
+ }
+ if (redeemedBy !== undefined) {
+ this.redeemedBy = redeemedBy
+ }
+ if (dbCommunities !== undefined) {
+ this.communities = dbCommunities.map((dbCom: DbCommunity) => new Community(dbCom))
+ }
}
@Field(() => Int)
@@ -58,6 +74,12 @@ export class TransactionLink {
@Field(() => String)
link: string
+
+ @Field(() => String)
+ communityName: string
+
+ @Field(() => [Community])
+ communities: Community[]
}
@ObjectType()
diff --git a/backend/src/graphql/model/User.ts b/backend/src/graphql/model/User.ts
index b665bde98..73c6c3b61 100644
--- a/backend/src/graphql/model/User.ts
+++ b/backend/src/graphql/model/User.ts
@@ -1,5 +1,5 @@
import { Point } from '@dbTools/typeorm'
-import { User as dbUser } from '@entity/User'
+import { User as DbUser } from '@entity/User'
import { ObjectType, Field, Int } from 'type-graphql'
import { GmsPublishLocationType } from '@enum/GmsPublishLocationType'
@@ -14,41 +14,43 @@ import { UserContact } from './UserContact'
@ObjectType()
export class User {
- constructor(user: dbUser | null) {
- if (user) {
- this.id = user.id
- this.foreign = user.foreign
- this.communityUuid = user.communityUuid
- if (user.community) {
- this.communityName = user.community.name
+ constructor(dbUser: DbUser | null) {
+ if (dbUser) {
+ this.id = dbUser.id
+ this.foreign = dbUser.foreign
+ this.communityUuid = dbUser.communityUuid
+ if (dbUser.community) {
+ this.communityName = dbUser.community.name
}
- this.gradidoID = user.gradidoID
- this.alias = user.alias
+ this.gradidoID = dbUser.gradidoID
+ this.alias = dbUser.alias
- const publishNameLogic = new PublishNameLogic(user)
- this.humhubUsername = publishNameLogic.getUsername(user.humhubPublishName as PublishNameType)
+ const publishNameLogic = new PublishNameLogic(dbUser)
+ this.humhubUsername = publishNameLogic.getUsername(
+ dbUser.humhubPublishName as PublishNameType,
+ )
- if (user.emailContact) {
- this.emailChecked = user.emailContact.emailChecked
- this.emailContact = new UserContact(user.emailContact)
+ if (dbUser.emailContact) {
+ this.emailChecked = dbUser.emailContact.emailChecked
+ this.emailContact = new UserContact(dbUser.emailContact)
}
- this.firstName = user.firstName
- this.lastName = user.lastName
- this.deletedAt = user.deletedAt
- this.createdAt = user.createdAt
- this.language = user.language
- this.publisherId = user.publisherId
- this.roles = user.userRoles?.map((userRole) => userRole.role) ?? []
+ this.firstName = dbUser.firstName
+ this.lastName = dbUser.lastName
+ this.deletedAt = dbUser.deletedAt
+ this.createdAt = dbUser.createdAt
+ this.language = dbUser.language
+ this.publisherId = dbUser.publisherId
+ this.roles = dbUser.userRoles?.map((userRole) => userRole.role) ?? []
this.klickTipp = null
this.hasElopage = null
- this.hideAmountGDD = user.hideAmountGDD
- this.hideAmountGDT = user.hideAmountGDT
- this.humhubAllowed = user.humhubAllowed
- this.gmsAllowed = user.gmsAllowed
- this.gmsPublishName = user.gmsPublishName
- this.humhubPublishName = user.humhubPublishName
- this.gmsPublishLocation = user.gmsPublishLocation
- this.userLocation = user.location ? Point2Location(user.location as Point) : null
+ this.hideAmountGDD = dbUser.hideAmountGDD
+ this.hideAmountGDT = dbUser.hideAmountGDT
+ this.humhubAllowed = dbUser.humhubAllowed
+ this.gmsAllowed = dbUser.gmsAllowed
+ this.gmsPublishName = dbUser.gmsPublishName
+ this.humhubPublishName = dbUser.humhubPublishName
+ this.gmsPublishLocation = dbUser.gmsPublishLocation
+ this.userLocation = dbUser.location ? Point2Location(dbUser.location as Point) : null
}
}
diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts
index 63134a9a8..f5ccb03f0 100644
--- a/backend/src/graphql/resolver/TransactionLinkResolver.ts
+++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts
@@ -1,6 +1,7 @@
import { randomBytes } from 'crypto'
import { getConnection } from '@dbTools/typeorm'
+import { Community as DbCommunity } from '@entity/Community'
import { Contribution as DbContribution } from '@entity/Contribution'
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
import { Transaction as DbTransaction } from '@entity/Transaction'
@@ -10,6 +11,7 @@ import { Decimal } from 'decimal.js-light'
import { Resolver, Args, Arg, Authorized, Ctx, Mutation, Query, Int } from 'type-graphql'
import { Paginated } from '@arg/Paginated'
+import { RedeemJwtArgs } from '@arg/RedeemJwtArgs'
import { TransactionLinkArgs } from '@arg/TransactionLinkArgs'
import { TransactionLinkFilters } from '@arg/TransactionLinkFilters'
import { ContributionCycleType } from '@enum/ContributionCycleType'
@@ -22,6 +24,8 @@ import { TransactionLink, TransactionLinkResult } from '@model/TransactionLink'
import { User } from '@model/User'
import { QueryLinkResult } from '@union/QueryLinkResult'
+import { decode, encode } from '@/auth/jwt/JWT'
+import { DisbursementJwtPayloadType } from '@/auth/jwt/payloadtypes/DisbursementJwtPayloadType'
import { RIGHTS } from '@/auth/RIGHTS'
import {
EVENT_CONTRIBUTION_LINK_REDEEM,
@@ -39,6 +43,7 @@ import { fullName } from '@/util/utilities'
import { calculateBalance } from '@/util/validate'
import { executeTransaction } from './TransactionResolver'
+import { getAuthenticatedCommunities, getHomeCommunity } from './util/communities'
import { getUserCreation, validateContribution } from './util/creations'
import { getLastTransaction } from './util/getLastTransaction'
import { sendTransactionsToDltConnector } from './util/sendTransactionsToDltConnector'
@@ -136,6 +141,8 @@ export class TransactionLinkResolver {
@Authorized([RIGHTS.QUERY_TRANSACTION_LINK])
@Query(() => QueryLinkResult)
async queryTransactionLink(@Arg('code') code: string): Promise {
+ logger.debug('TransactionLinkResolver.queryTransactionLink... code=', code)
+ const transactionLink = new TransactionLink()
if (code.match(/^CL-/)) {
const contributionLink = await DbContributionLink.findOneOrFail({
where: { code: code.replace('CL-', '') },
@@ -143,19 +150,48 @@ export class TransactionLinkResolver {
})
return new ContributionLink(contributionLink)
} else {
- const transactionLink = await DbTransactionLink.findOneOrFail({
- where: { code },
- withDeleted: true,
- })
- const user = await DbUser.findOneOrFail({ where: { id: transactionLink.userId } })
- let redeemedBy: User | null = null
- if (transactionLink?.redeemedBy) {
- redeemedBy = new User(
- await DbUser.findOneOrFail({ where: { id: transactionLink.redeemedBy } }),
- )
+ let txLinkFound = false
+ let dbTransactionLink!: DbTransactionLink
+ try {
+ dbTransactionLink = await DbTransactionLink.findOneOrFail({
+ where: { code },
+ withDeleted: true,
+ })
+ txLinkFound = true
+ } catch (err) {
+ txLinkFound = false
+ }
+ // normal redeem code
+ if (txLinkFound) {
+ const user = await DbUser.findOneOrFail({ where: { id: dbTransactionLink.userId } })
+ let redeemedBy
+ if (dbTransactionLink.redeemedBy) {
+ redeemedBy = new User(
+ await DbUser.findOneOrFail({ where: { id: dbTransactionLink.redeemedBy } }),
+ )
+ }
+ const communities = await getAuthenticatedCommunities()
+ return new TransactionLink(dbTransactionLink, new User(user), redeemedBy, communities)
+ } else {
+ // disbursement jwt-token
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment
+ const homeCom = await getHomeCommunity()
+ const jwtPayload = decode(code, homeCom.publicKey)
+ if (jwtPayload !== null && jwtPayload instanceof DisbursementJwtPayloadType) {
+ const disburseJwtPayload: DisbursementJwtPayloadType = jwtPayload
+ transactionLink.communityName = homeCom.name !== null ? homeCom.name : 'unknown'
+ // transactionLink.user = new User()
+ transactionLink.user.alias = disburseJwtPayload.sendername
+ transactionLink.amount = new Decimal(disburseJwtPayload.amount)
+ transactionLink.memo = disburseJwtPayload.memo
+ transactionLink.code = disburseJwtPayload.redeemcode
+ return transactionLink
+ } else {
+ throw new LogError('Redeem with wrong type of JWT-Token! jwtType=', jwtPayload)
+ }
}
- return new TransactionLink(transactionLink, new User(user), redeemedBy)
}
+ return transactionLink
}
@Authorized([RIGHTS.REDEEM_TRANSACTION_LINK])
@@ -364,6 +400,36 @@ export class TransactionLinkResolver {
}
}
+ @Authorized([RIGHTS.QUERY_REDEEM_JWT])
+ @Mutation(() => String)
+ async createRedeemJwt(@Args() redeemJwtArgs: RedeemJwtArgs): Promise {
+ logger.debug('TransactionLinkResolver.queryRedeemJwt... args=', {
+ gradidoID: redeemJwtArgs.gradidoID,
+ alias: redeemJwtArgs.alias,
+ firstName: redeemJwtArgs.firstName,
+ communityUuid: redeemJwtArgs.communityUuid,
+ communityName: redeemJwtArgs.communityName,
+ code: redeemJwtArgs.code,
+ amount: redeemJwtArgs.amount,
+ memo: redeemJwtArgs.memo,
+ })
+
+ const disbursementJwtPayloadType = new DisbursementJwtPayloadType(
+ redeemJwtArgs.communityUuid,
+ redeemJwtArgs.gradidoID,
+ redeemJwtArgs.alias ?? redeemJwtArgs.firstName ?? '',
+ redeemJwtArgs.code,
+ redeemJwtArgs.amount.toString(),
+ redeemJwtArgs.memo,
+ )
+ const homeCom = await getHomeCommunity()
+ if (!homeCom.privateKey) {
+ throw new LogError('Home community private key is not set')
+ }
+ const redeemJwt = await encode(disbursementJwtPayloadType, homeCom.privateKey)
+ return redeemJwt
+ }
+
@Authorized([RIGHTS.LIST_TRANSACTION_LINKS])
@Query(() => TransactionLinkResult)
async listTransactionLinks(
diff --git a/backend/src/graphql/resolver/util/communities.ts b/backend/src/graphql/resolver/util/communities.ts
index 87cf31610..90087bd10 100644
--- a/backend/src/graphql/resolver/util/communities.ts
+++ b/backend/src/graphql/resolver/util/communities.ts
@@ -1,4 +1,4 @@
-import { FindOneOptions } from '@dbTools/typeorm'
+import { FindOneOptions, IsNull, Not } from '@dbTools/typeorm'
import { Community as DbCommunity } from '@entity/Community'
import { FederatedCommunity as DbFederatedCommunity } from '@entity/FederatedCommunity'
@@ -87,6 +87,17 @@ export async function getCommunityByUuid(communityUuid: string): Promise {
+ const dbCommunities: DbCommunity[] = await DbCommunity.find({
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
+ where: { communityUuid: Not(IsNull()) }, //, authenticatedAt: Not(IsNull()) },
+ order: {
+ name: 'ASC',
+ },
+ })
+ return dbCommunities
+}
+
export async function getCommunityByIdentifier(
communityIdentifier: string,
): Promise {
diff --git a/docu/Concepts/TechnicalRequirements/image/redeemlink_without_community-switch.png b/docu/Concepts/TechnicalRequirements/image/redeemlink_without_community-switch.png
new file mode 100644
index 0000000000000000000000000000000000000000..a929d5ff73e01f1d77348967b7e1c3c247353d26
GIT binary patch
literal 1140253
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