Merge branch 'master' into 1389-TransactionsTabs-are-not-well-designed

This commit is contained in:
Alexander Friedland 2022-02-08 07:59:43 +01:00 committed by GitHub
commit 6526f86e63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 53 additions and 50 deletions

3
admin/.gitignore vendored
View File

@ -2,7 +2,8 @@ node_modules/
dist/ dist/
.cache/ .cache/
.env /.env
/.env.bak
# coverage folder # coverage folder
coverage/ coverage/

1
backend/.gitignore vendored
View File

@ -1,5 +1,6 @@
/node_modules/ /node_modules/
/.env /.env
/.env.bak
/build/ /build/
package-json.lock package-json.lock
coverage coverage

View File

@ -5,10 +5,10 @@ import { AuthChecker } from 'type-graphql'
import { decode, encode } from '../../auth/JWT' import { decode, encode } from '../../auth/JWT'
import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '../../auth/ROLES' import { ROLE_UNAUTHORIZED, ROLE_USER, ROLE_ADMIN } from '../../auth/ROLES'
import { RIGHTS } from '../../auth/RIGHTS' import { RIGHTS } from '../../auth/RIGHTS'
import { ServerUserRepository } from '../../typeorm/repository/ServerUser'
import { getCustomRepository } from '@dbTools/typeorm' import { getCustomRepository } from '@dbTools/typeorm'
import { UserRepository } from '../../typeorm/repository/User' import { UserRepository } from '../../typeorm/repository/User'
import { INALIENABLE_RIGHTS } from '../../auth/INALIENABLE_RIGHTS' import { INALIENABLE_RIGHTS } from '../../auth/INALIENABLE_RIGHTS'
import { ServerUser } from '@entity/ServerUser'
const isAuthorized: AuthChecker<any> = async ({ context }, rights) => { const isAuthorized: AuthChecker<any> = async ({ context }, rights) => {
context.role = ROLE_UNAUTHORIZED // unauthorized user context.role = ROLE_UNAUTHORIZED // unauthorized user
@ -38,8 +38,7 @@ const isAuthorized: AuthChecker<any> = async ({ context }, rights) => {
// TODO this implementation is bullshit - two database queries cause our user identifiers are not aligned and vary between email, id and pubKey // TODO this implementation is bullshit - two database queries cause our user identifiers are not aligned and vary between email, id and pubKey
const userRepository = await getCustomRepository(UserRepository) const userRepository = await getCustomRepository(UserRepository)
const user = await userRepository.findByPubkeyHex(context.pubKey) const user = await userRepository.findByPubkeyHex(context.pubKey)
const serverUserRepository = await getCustomRepository(ServerUserRepository) const countServerUsers = await ServerUser.count({ email: user.email })
const countServerUsers = await serverUserRepository.count({ email: user.email })
context.role = countServerUsers > 0 ? ROLE_ADMIN : ROLE_USER context.role = countServerUsers > 0 ? ROLE_ADMIN : ROLE_USER
context.setHeaders.push({ key: 'token', value: encode(decoded.pubKey) }) context.setHeaders.push({ key: 'token', value: encode(decoded.pubKey) })

View File

@ -9,7 +9,6 @@ import { CreatePendingCreations } from '../model/CreatePendingCreations'
import { UpdatePendingCreation } from '../model/UpdatePendingCreation' import { UpdatePendingCreation } from '../model/UpdatePendingCreation'
import { RIGHTS } from '../../auth/RIGHTS' import { RIGHTS } from '../../auth/RIGHTS'
import { TransactionRepository } from '../../typeorm/repository/Transaction' import { TransactionRepository } from '../../typeorm/repository/Transaction'
import { TransactionCreationRepository } from '../../typeorm/repository/TransactionCreation'
import { UserRepository } from '../../typeorm/repository/User' import { UserRepository } from '../../typeorm/repository/User'
import CreatePendingCreationArgs from '../arg/CreatePendingCreationArgs' import CreatePendingCreationArgs from '../arg/CreatePendingCreationArgs'
import UpdatePendingCreationArgs from '../arg/UpdatePendingCreationArgs' import UpdatePendingCreationArgs from '../arg/UpdatePendingCreationArgs'
@ -198,13 +197,12 @@ export class AdminResolver {
transaction = await transactionRepository.save(transaction) transaction = await transactionRepository.save(transaction)
if (!transaction) throw new Error('Could not create transaction') if (!transaction) throw new Error('Could not create transaction')
const transactionCreationRepository = getCustomRepository(TransactionCreationRepository)
let transactionCreation = new TransactionCreation() let transactionCreation = new TransactionCreation()
transactionCreation.transactionId = transaction.id transactionCreation.transactionId = transaction.id
transactionCreation.userId = pendingCreation.userId transactionCreation.userId = pendingCreation.userId
transactionCreation.amount = parseInt(pendingCreation.amount.toString()) transactionCreation.amount = parseInt(pendingCreation.amount.toString())
transactionCreation.targetDate = pendingCreation.date transactionCreation.targetDate = pendingCreation.date
transactionCreation = await transactionCreationRepository.save(transactionCreation) transactionCreation = await TransactionCreation.save(transactionCreation)
if (!transactionCreation) throw new Error('Could not create transactionCreation') if (!transactionCreation) throw new Error('Could not create transactionCreation')
const userTransactionRepository = getCustomRepository(UserTransactionRepository) const userTransactionRepository = getCustomRepository(UserTransactionRepository)
@ -256,9 +254,7 @@ async function getUserCreations(id: number): Promise<number[]> {
const lastMonthNumber = moment().subtract(1, 'month').format('M') const lastMonthNumber = moment().subtract(1, 'month').format('M')
const currentMonthNumber = moment().format('M') const currentMonthNumber = moment().format('M')
const transactionCreationRepository = getCustomRepository(TransactionCreationRepository) const createdAmountsQuery = await TransactionCreation.createQueryBuilder('transaction_creations')
const createdAmountsQuery = await transactionCreationRepository
.createQueryBuilder('transaction_creations')
.select('MONTH(transaction_creations.target_date)', 'target_month') .select('MONTH(transaction_creations.target_date)', 'target_month')
.addSelect('SUM(transaction_creations.amount)', 'sum') .addSelect('SUM(transaction_creations.amount)', 'sum')
.where('transaction_creations.state_user_id = :id', { id }) .where('transaction_creations.state_user_id = :id', { id })

View File

@ -18,11 +18,11 @@ import { UserRepository } from '../../typeorm/repository/User'
import { LoginEmailOptIn } from '@entity/LoginEmailOptIn' import { LoginEmailOptIn } from '@entity/LoginEmailOptIn'
import { sendResetPasswordEmail } from '../../mailer/sendResetPasswordEmail' import { sendResetPasswordEmail } from '../../mailer/sendResetPasswordEmail'
import { sendAccountActivationEmail } from '../../mailer/sendAccountActivationEmail' import { sendAccountActivationEmail } from '../../mailer/sendAccountActivationEmail'
import { LoginElopageBuysRepository } from '../../typeorm/repository/LoginElopageBuys'
import { klicktippSignIn } from '../../apis/KlicktippController' import { klicktippSignIn } from '../../apis/KlicktippController'
import { RIGHTS } from '../../auth/RIGHTS' import { RIGHTS } from '../../auth/RIGHTS'
import { ServerUserRepository } from '../../typeorm/repository/ServerUser'
import { ROLE_ADMIN } from '../../auth/ROLES' import { ROLE_ADMIN } from '../../auth/ROLES'
import { LoginElopageBuys } from '@entity/LoginElopageBuys'
import { ServerUser } from '@entity/ServerUser'
const EMAIL_OPT_IN_RESET_PASSWORD = 2 const EMAIL_OPT_IN_RESET_PASSWORD = 2
const EMAIL_OPT_IN_REGISTER = 1 const EMAIL_OPT_IN_REGISTER = 1
@ -298,8 +298,7 @@ export class UserResolver {
user.coinanimation = coinanimation user.coinanimation = coinanimation
// context.role is not set to the actual role yet on login // context.role is not set to the actual role yet on login
const serverUserRepository = await getCustomRepository(ServerUserRepository) const countServerUsers = await ServerUser.count({ email: user.email })
const countServerUsers = await serverUserRepository.count({ email: user.email })
user.isAdmin = countServerUsers > 0 user.isAdmin = countServerUsers > 0
context.setHeaders.push({ context.setHeaders.push({
@ -662,8 +661,7 @@ export class UserResolver {
return false return false
} }
const loginElopageBuysRepository = getCustomRepository(LoginElopageBuysRepository) const elopageBuyCount = await LoginElopageBuys.count({ payerEmail: userEntity.email })
const elopageBuyCount = await loginElopageBuysRepository.count({ payerEmail: userEntity.email })
return elopageBuyCount > 0 return elopageBuyCount > 0
} }
} }

View File

@ -1,5 +0,0 @@
import { EntityRepository, Repository } from '@dbTools/typeorm'
import { LoginElopageBuys } from '@entity/LoginElopageBuys'
@EntityRepository(LoginElopageBuys)
export class LoginElopageBuysRepository extends Repository<LoginElopageBuys> {}

View File

@ -1,5 +0,0 @@
import { EntityRepository, Repository } from '@dbTools/typeorm'
import { LoginEmailOptIn } from '@entity/LoginEmailOptIn'
@EntityRepository(LoginEmailOptIn)
export class LoginEmailOptInRepository extends Repository<LoginEmailOptIn> {}

View File

@ -1,5 +0,0 @@
import { EntityRepository, Repository } from '@dbTools/typeorm'
import { ServerUser } from '@entity/ServerUser'
@EntityRepository(ServerUser)
export class ServerUserRepository extends Repository<ServerUser> {}

View File

@ -1,5 +0,0 @@
import { EntityRepository, Repository } from '@dbTools/typeorm'
import { TransactionCreation } from '@entity/TransactionCreation'
@EntityRepository(TransactionCreation)
export class TransactionCreationRepository extends Repository<TransactionCreation> {}

View File

@ -28,16 +28,13 @@
*/ */
import { LoginElopageBuys } from '@entity/LoginElopageBuys' import { LoginElopageBuys } from '@entity/LoginElopageBuys'
import { getCustomRepository } from '@dbTools/typeorm'
import { UserResolver } from '../graphql/resolver/UserResolver' import { UserResolver } from '../graphql/resolver/UserResolver'
import { LoginElopageBuysRepository } from '../typeorm/repository/LoginElopageBuys'
import { User as dbUser } from '@entity/User' import { User as dbUser } from '@entity/User'
export const elopageWebhook = async (req: any, res: any): Promise<void> => { export const elopageWebhook = async (req: any, res: any): Promise<void> => {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log('Elopage Hook received', req.body) console.log('Elopage Hook received', req.body)
res.status(200).end() // Responding is important res.status(200).end() // Responding is important
const loginElopageBuyRepository = await getCustomRepository(LoginElopageBuysRepository)
const loginElopageBuy = new LoginElopageBuys() const loginElopageBuy = new LoginElopageBuys()
const { const {
@ -82,7 +79,7 @@ export const elopageWebhook = async (req: any, res: any): Promise<void> => {
} }
// Save the hook data // Save the hook data
await loginElopageBuyRepository.save(loginElopageBuy) await LoginElopageBuys.save(loginElopageBuy)
// create user for certain products // create user for certain products
/* /*

3
database/.gitignore vendored
View File

@ -8,7 +8,8 @@ yarn-error.log*
test/unit/coverage test/unit/coverage
package-lock.json package-lock.json
.env /.env
/.env.bak
.env.development.local .env.development.local
.env.production.local .env.production.local

View File

@ -32,10 +32,10 @@ WEBHOOK_ELOPAGE_SECRET=secret
GDT_API_URL=https://gdt.gradido.net GDT_API_URL=https://gdt.gradido.net
COMMUNITY_NAME=Gradido Development Stage1 COMMUNITY_NAME="Gradido Development Stage1"
COMMUNITY_URL=https://stage1.gradido.net/ COMMUNITY_URL=https://stage1.gradido.net/
COMMUNITY_REGISTER_URL=https://stage1.gradido.net/register COMMUNITY_REGISTER_URL=https://stage1.gradido.net/register
COMMUNITY_DESCRIPTION=Gradido Development Stage1 Test Community COMMUNITY_DESCRIPTION="Gradido Development Stage1 Test Community"
KLICKTIPP=false KLICKTIPP=false
KLICKTIPP_USER= KLICKTIPP_USER=

View File

@ -14,9 +14,13 @@ set +o allexport
# NOTE: all config values will be in process.env when starting # NOTE: all config values will be in process.env when starting
# the services and will therefore take precedence over the .env # the services and will therefore take precedence over the .env
if [ -f "$SCRIPT_DIR/.env" ]; then if [ -f "$SCRIPT_DIR/.env" ]; then
export $(cat $SCRIPT_DIR/.env | sed 's/#.*//g' | xargs) set -o allexport
source $SCRIPT_DIR/.env
set +o allexport
else else
export $(cat $SCRIPT_DIR/.env.dist | sed 's/#.*//g' | xargs) set -o allexport
source $SCRIPT_DIR/.env.dist
set +o allexport
fi fi
# Configure git # Configure git
@ -110,7 +114,6 @@ sudo mysql <<EOFMYSQL
EOFMYSQL EOFMYSQL
# Configure database # Configure database
# TODO - do this in the start.sh to regenerate configs on each deploy
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/database/.env.template > $PROJECT_ROOT/database/.env envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/database/.env.template > $PROJECT_ROOT/database/.env
# Configure backend # Configure backend

View File

@ -10,13 +10,29 @@ PROJECT_ROOT=$SCRIPT_DIR/../..
NGINX_CONFIG_DIR=$SCRIPT_DIR/nginx/sites-available NGINX_CONFIG_DIR=$SCRIPT_DIR/nginx/sites-available
set +o allexport set +o allexport
# Load .env or .env.dist if not present
# NOTE: all config values will be in process.env when starting # NOTE: all config values will be in process.env when starting
# the services and will therefore take precedence over the .env # the services and will therefore take precedence over the .env
# We have to load the backend .env to get DB_USERNAME, DB_PASSWORD AND JWT_SECRET
export_var(){
export $1=$(grep -v '^#' $PROJECT_ROOT/backend/.env | grep -e "$1" | sed -e 's/.*=//')
}
if [ -f "$PROJECT_ROOT/backend/.env" ]; then
export_var 'DB_USER'
export_var 'DB_PASSWORD'
export_var 'JWT_SECRET'
fi
# Load .env or .env.dist if not present
if [ -f "$SCRIPT_DIR/.env" ]; then if [ -f "$SCRIPT_DIR/.env" ]; then
export $(cat $SCRIPT_DIR/.env | sed 's/#.*//g' | xargs) set -o allexport
source $SCRIPT_DIR/.env
set +o allexport
else else
export $(cat $SCRIPT_DIR/.env.dist | sed 's/#.*//g' | xargs) set -o allexport
source $SCRIPT_DIR/.env.dist
set +o allexport
fi fi
# lock start # lock start
@ -64,6 +80,16 @@ case "$NGINX_SSL" in
esac esac
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $NGINX_CONFIG_DIR/$TEMPLATE_FILE > $NGINX_CONFIG_DIR/update-page.conf envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $NGINX_CONFIG_DIR/$TEMPLATE_FILE > $NGINX_CONFIG_DIR/update-page.conf
# Regenerate .env files
cp -f $PROJECT_ROOT/database/.env $PROJECT_ROOT/database/.env.bak
cp -f $PROJECT_ROOT/backend/.env $PROJECT_ROOT/backend/.env.bak
cp -f $PROJECT_ROOT/frontend/.env $PROJECT_ROOT/frontend/.env.bak
cp -f $PROJECT_ROOT/admin/.env $PROJECT_ROOT/admin/.env.bak
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/database/.env.template > $PROJECT_ROOT/database/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/backend/.env.template > $PROJECT_ROOT/backend/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/frontend/.env.template > $PROJECT_ROOT/frontend/.env
envsubst "$(env | sed -e 's/=.*//' -e 's/^/\$/g')" < $PROJECT_ROOT/admin/.env.template > $PROJECT_ROOT/admin/.env
# Install & build database # Install & build database
echo 'Updating database<br>' >> $UPDATE_HTML echo 'Updating database<br>' >> $UPDATE_HTML
cd $PROJECT_ROOT/database cd $PROJECT_ROOT/database

3
frontend/.gitignore vendored
View File

@ -8,7 +8,8 @@ yarn-error.log*
test/unit/coverage test/unit/coverage
package-lock.json package-lock.json
.env /.env
/.env.bak
.env.development.local .env.development.local
.env.production.local .env.production.local