mirror of
https://github.com/IT4Change/gradido.git
synced 2025-12-13 07:45:54 +00:00
Merge branch 'master' into cleanup-database
This commit is contained in:
commit
f2d53dfea6
46
.github/file-filters.yml
vendored
Normal file
46
.github/file-filters.yml
vendored
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# These file filter patterns are used by the action https://github.com/dorny/paths-filter
|
||||||
|
|
||||||
|
# more differentiated filters for admin interface, which might be used later
|
||||||
|
# admin_locales: &admin_locales
|
||||||
|
# - 'admin/src/locales/**'
|
||||||
|
# - 'admin/scripts/sort*'
|
||||||
|
|
||||||
|
# admin_stylelinting: &admin_stylelinting
|
||||||
|
# - 'admin/{components,layouts,pages}/**/*.{scss,vue}'
|
||||||
|
# - 'admin/.stylelintrc.js'
|
||||||
|
|
||||||
|
# admin_linting: &admin_linting
|
||||||
|
# - 'admin/.eslint*'
|
||||||
|
# - 'admin/babel.config.js'
|
||||||
|
# - 'admin/package.json'
|
||||||
|
# - 'admin/**/*.{js,vue}'
|
||||||
|
# - *admin_locales
|
||||||
|
|
||||||
|
# admin_unit_testing: &admin_unit_testing
|
||||||
|
# - 'admin/package.json'
|
||||||
|
# - 'admin/{jest,vue}.config.js'
|
||||||
|
# - 'admin/{public,run,test}/**/*'
|
||||||
|
# - 'admin/src/!(locales)/**/*'
|
||||||
|
|
||||||
|
# admin_docker_building: &admin_docker_building
|
||||||
|
# - 'admin/.dockerignore'
|
||||||
|
# - 'admin/Dockerfile'
|
||||||
|
# - *admin_unit_testing
|
||||||
|
|
||||||
|
admin: &admin
|
||||||
|
- 'admin/**/*'
|
||||||
|
|
||||||
|
dht_node: &dht_node
|
||||||
|
- 'dht-node/**/*'
|
||||||
|
|
||||||
|
docker: &docker
|
||||||
|
- 'docker-compose.*'
|
||||||
|
|
||||||
|
federation: &federation
|
||||||
|
- 'federation/**/*'
|
||||||
|
|
||||||
|
frontend: &frontend
|
||||||
|
- 'frontend/**/*'
|
||||||
|
|
||||||
|
nginx: &nginx
|
||||||
|
- 'nginx/**/*'
|
||||||
58
.github/workflows/e2e-test.yml
vendored
Normal file
58
.github/workflows/e2e-test.yml
vendored
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
name: Gradido End-to-End Test CI
|
||||||
|
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
end-to-end-tests:
|
||||||
|
name: End-to-End Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Boot up test system | docker-compose mariadb
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach mariadb
|
||||||
|
|
||||||
|
- name: Boot up test system | docker-compose database
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database
|
||||||
|
|
||||||
|
- name: Boot up test system | docker-compose backend
|
||||||
|
run: |
|
||||||
|
cd backend
|
||||||
|
cp .env.test_e2e .env
|
||||||
|
cd ..
|
||||||
|
docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps backend
|
||||||
|
|
||||||
|
- name: Sleep for 10 seconds
|
||||||
|
run: sleep 10s
|
||||||
|
|
||||||
|
- name: Boot up test system | seed backend
|
||||||
|
run: |
|
||||||
|
sudo chown runner:docker -R *
|
||||||
|
cd database
|
||||||
|
yarn && yarn dev_reset
|
||||||
|
cd ../backend
|
||||||
|
yarn && yarn seed
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
- name: Boot up test system | docker-compose frontends
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps frontend admin nginx
|
||||||
|
|
||||||
|
- name: Boot up test system | docker-compose mailserver
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mailserver
|
||||||
|
|
||||||
|
- name: Sleep for 15 seconds
|
||||||
|
run: sleep 15s
|
||||||
|
|
||||||
|
- name: End-to-end tests | run tests
|
||||||
|
id: e2e-tests
|
||||||
|
run: |
|
||||||
|
cd e2e-tests/
|
||||||
|
yarn
|
||||||
|
yarn run cypress run
|
||||||
|
- name: End-to-end tests | if tests failed, upload screenshots
|
||||||
|
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: cypress-screenshots
|
||||||
|
path: /home/runner/work/gradido/gradido/e2e-tests/cypress/screenshots/
|
||||||
84
.github/workflows/test-admin-interface.yml
vendored
Normal file
84
.github/workflows/test-admin-interface.yml
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
name: Gradido Admin Interface Test CI
|
||||||
|
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# only (but most important) job from this workflow required for pull requests
|
||||||
|
# check results serve as run conditions for all other jobs here
|
||||||
|
files-changed:
|
||||||
|
name: Detect File Changes - Admin Interface
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
admin: ${{ steps.changes.outputs.admin }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3.3.0
|
||||||
|
|
||||||
|
- name: Check for admin interface 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.admin == 'true'
|
||||||
|
name: Docker Build Test - Admin Interface
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Admin Interface | Build 'test' image
|
||||||
|
run: docker build --target test -t "gradido/admin:test" admin/ --build-arg NODE_ENV="test"
|
||||||
|
|
||||||
|
unit_test:
|
||||||
|
if: needs.files-changed.outputs.admin == 'true'
|
||||||
|
name: Unit Tests - Admin Interface
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Admin Interface | Unit tests
|
||||||
|
run: cd admin && yarn && yarn run test
|
||||||
|
|
||||||
|
lint:
|
||||||
|
if: needs.files-changed.outputs.admin == 'true'
|
||||||
|
name: Lint - Admin Interface
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Admin Interface | Lint
|
||||||
|
run: cd admin && yarn && yarn run lint
|
||||||
|
|
||||||
|
stylelint:
|
||||||
|
if: needs.files-changed.outputs.admin == 'true'
|
||||||
|
name: Stylelint - Admin Interface
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Admin Interface | Stylelint
|
||||||
|
run: cd admin && yarn && yarn run stylelint
|
||||||
|
|
||||||
|
locales:
|
||||||
|
if: needs.files-changed.outputs.admin == 'true'
|
||||||
|
name: Locales - Admin Interface
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Admin Interface | Locales
|
||||||
|
run: cd admin && yarn && yarn run locales
|
||||||
32
.github/workflows/test-nginx.yml
vendored
Normal file
32
.github/workflows/test-nginx.yml
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
name: Gradido Nginx Test CI
|
||||||
|
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
files-changed:
|
||||||
|
name: Detect File Changes - Nginx
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
nginx: ${{ steps.changes.outputs.nginx }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3.3.0
|
||||||
|
|
||||||
|
- name: Check for nginx 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_nginx:
|
||||||
|
name: Docker Build Test - Nginx
|
||||||
|
if: needs.files-changed.outputs.nginx == 'true'
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: nginx | Build 'test' image
|
||||||
|
run: docker build -t "gradido/nginx:test" nginx/
|
||||||
368
.github/workflows/test.yml
vendored
368
.github/workflows/test.yml
vendored
@ -3,57 +3,6 @@ name: gradido test CI
|
|||||||
on: push
|
on: push
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
##############################################################################
|
|
||||||
# JOB: DOCKER BUILD TEST FRONTEND ############################################
|
|
||||||
##############################################################################
|
|
||||||
build_test_frontend:
|
|
||||||
name: Docker Build Test - Frontend
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
#needs: [nothing]
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# FRONTEND ###############################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Frontend | Build `test` image
|
|
||||||
run: |
|
|
||||||
docker build --target test -t "gradido/frontend:test" frontend/
|
|
||||||
docker save "gradido/frontend:test" > /tmp/frontend.tar
|
|
||||||
- name: Upload Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-frontend-test
|
|
||||||
path: /tmp/frontend.tar
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: DOCKER BUILD TEST ADMIN INTERFACE #####################################
|
|
||||||
##############################################################################
|
|
||||||
build_test_admin:
|
|
||||||
name: Docker Build Test - Admin Interface
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# ADMIN INTERFACE ########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Admin | Build `test` image
|
|
||||||
run: |
|
|
||||||
docker build --target test -t "gradido/admin:test" admin/ --build-arg NODE_ENV="test"
|
|
||||||
docker save "gradido/admin:test" > /tmp/admin.tar
|
|
||||||
- name: Upload Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-admin-test
|
|
||||||
path: /tmp/admin.tar
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: DOCKER BUILD TEST BACKEND #############################################
|
# JOB: DOCKER BUILD TEST BACKEND #############################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -132,139 +81,6 @@ jobs:
|
|||||||
name: docker-mariadb-test
|
name: docker-mariadb-test
|
||||||
path: /tmp/mariadb.tar
|
path: /tmp/mariadb.tar
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: DOCKER BUILD TEST NGINX ###############################################
|
|
||||||
##############################################################################
|
|
||||||
build_test_nginx:
|
|
||||||
name: Docker Build Test - Nginx
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# BUILD NGINX DOCKER IMAGE ###############################################
|
|
||||||
##########################################################################
|
|
||||||
- name: nginx | Build `test` image
|
|
||||||
run: |
|
|
||||||
docker build -t "gradido/nginx:test" nginx/
|
|
||||||
docker save "gradido/nginx:test" > /tmp/nginx.tar
|
|
||||||
- name: Upload Artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-nginx-test
|
|
||||||
path: /tmp/nginx.tar
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: LOCALES FRONTEND ######################################################
|
|
||||||
##############################################################################
|
|
||||||
locales_frontend:
|
|
||||||
name: Locales - Frontend
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# LOCALES FRONTEND #######################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Frontend | Locales
|
|
||||||
run: cd frontend && yarn && yarn run locales
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: LINT FRONTEND #########################################################
|
|
||||||
##############################################################################
|
|
||||||
lint_frontend:
|
|
||||||
name: Lint - Frontend
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# LINT FRONTEND ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Frontend | Lint
|
|
||||||
run: cd frontend && yarn && yarn run lint
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: STYLELINT FRONTEND ####################################################
|
|
||||||
##############################################################################
|
|
||||||
stylelint_frontend:
|
|
||||||
name: Stylelint - Frontend
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# STYLELINT FRONTEND #####################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Frontend | Stylelint
|
|
||||||
run: cd frontend && yarn && yarn run stylelint
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: LINT ADMIN INTERFACE ##################################################
|
|
||||||
##############################################################################
|
|
||||||
lint_admin:
|
|
||||||
name: Lint - Admin Interface
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# LINT ADMIN INTERFACE ###################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Admin Interface | Lint
|
|
||||||
run: cd admin && yarn && yarn run lint
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: STYLELINT ADMIN INTERFACE #############################################
|
|
||||||
##############################################################################
|
|
||||||
stylelint_admin:
|
|
||||||
name: Stylelint - Admin Interface
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# STYLELINT ADMIN INTERFACE ##############################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Admin Interface | Stylelint
|
|
||||||
run: cd admin && yarn && yarn run stylelint
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: LOCALES ADMIN #########################################################
|
|
||||||
##############################################################################
|
|
||||||
locales_admin:
|
|
||||||
name: Locales - Admin Interface
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# LOCALES FRONTEND #######################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Admin | Locales
|
|
||||||
run: cd admin && yarn && yarn run locales
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: LINT BACKEND ##########################################################
|
# JOB: LINT BACKEND ##########################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -281,7 +97,7 @@ jobs:
|
|||||||
# LINT BACKEND ###########################################################
|
# LINT BACKEND ###########################################################
|
||||||
##########################################################################
|
##########################################################################
|
||||||
- name: backend | Lint
|
- name: backend | Lint
|
||||||
run: cd backend && yarn && yarn run lint
|
run: cd database && yarn && cd ../backend && yarn && yarn run lint
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: LOCALES BACKEND #######################################################
|
# JOB: LOCALES BACKEND #######################################################
|
||||||
@ -319,68 +135,6 @@ jobs:
|
|||||||
- name: Database | Lint
|
- name: Database | Lint
|
||||||
run: cd database && yarn && yarn run lint
|
run: cd database && yarn && yarn run lint
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: UNIT TEST FRONTEND ###################################################
|
|
||||||
##############################################################################
|
|
||||||
unit_test_frontend:
|
|
||||||
name: Unit tests - Frontend
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# UNIT TESTS FRONTEND ####################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Frontend | Unit tests
|
|
||||||
run: |
|
|
||||||
cd frontend && yarn && yarn run test
|
|
||||||
cp -r ./coverage ../
|
|
||||||
##########################################################################
|
|
||||||
# COVERAGE CHECK FRONTEND ################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: frontend | Coverage check
|
|
||||||
uses: webcraftmedia/coverage-check-action@master
|
|
||||||
with:
|
|
||||||
report_name: Coverage Frontend
|
|
||||||
type: lcov
|
|
||||||
result_path: ./frontend/coverage/lcov.info
|
|
||||||
min_coverage: 95
|
|
||||||
token: ${{ github.token }}
|
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: UNIT TEST ADMIN INTERFACE #############################################
|
|
||||||
##############################################################################
|
|
||||||
unit_test_admin:
|
|
||||||
name: Unit tests - Admin Interface
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# UNIT TESTS ADMIN INTERFACE #############################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Admin Interface | Unit tests
|
|
||||||
run: |
|
|
||||||
cd admin && yarn && yarn run test
|
|
||||||
cp -r ./coverage ../
|
|
||||||
##########################################################################
|
|
||||||
# COVERAGE CHECK ADMIN INTERFACE #########################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Admin Interface | Coverage check
|
|
||||||
uses: webcraftmedia/coverage-check-action@master
|
|
||||||
with:
|
|
||||||
report_name: Coverage Admin Interface
|
|
||||||
type: lcov
|
|
||||||
result_path: ./admin/coverage/lcov.info
|
|
||||||
min_coverage: 97
|
|
||||||
token: ${{ github.token }}
|
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: UNIT TEST BACKEND ####################################################
|
# JOB: UNIT TEST BACKEND ####################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
@ -415,20 +169,7 @@ jobs:
|
|||||||
- name: backend | docker-compose database
|
- name: backend | docker-compose database
|
||||||
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database
|
||||||
- name: backend Unit tests | test
|
- name: backend Unit tests | test
|
||||||
run: |
|
run: cd database && yarn && yarn build && cd ../backend && yarn && yarn test
|
||||||
cd database && yarn && yarn build && cd ../backend && yarn && yarn test
|
|
||||||
cp -r ./coverage ../
|
|
||||||
##########################################################################
|
|
||||||
# COVERAGE CHECK BACKEND #################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: backend | Coverage check
|
|
||||||
uses: webcraftmedia/coverage-check-action@master
|
|
||||||
with:
|
|
||||||
report_name: Coverage Backend
|
|
||||||
type: lcov
|
|
||||||
result_path: ./backend/coverage/lcov.info
|
|
||||||
min_coverage: 80
|
|
||||||
token: ${{ github.token }}
|
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# DATABASE MIGRATION TEST UP + RESET #####################################
|
# DATABASE MIGRATION TEST UP + RESET #####################################
|
||||||
@ -452,108 +193,3 @@ jobs:
|
|||||||
run: docker-compose -f docker-compose.yml run -T database yarn up
|
run: docker-compose -f docker-compose.yml run -T database yarn up
|
||||||
- name: database | reset
|
- name: database | reset
|
||||||
run: docker-compose -f docker-compose.yml run -T database yarn reset
|
run: docker-compose -f docker-compose.yml run -T database yarn reset
|
||||||
|
|
||||||
##############################################################################
|
|
||||||
# JOB: END-TO-END TESTS #####################################################
|
|
||||||
##############################################################################
|
|
||||||
end-to-end-tests:
|
|
||||||
name: End-to-End Tests
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [build_test_mariadb, build_test_database_up, build_test_admin, build_test_frontend, build_test_nginx]
|
|
||||||
steps:
|
|
||||||
##########################################################################
|
|
||||||
# CHECKOUT CODE ##########################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
##########################################################################
|
|
||||||
# DOWNLOAD DOCKER IMAGES #################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Download Docker Image (Mariadb)
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-mariadb-test
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image (Mariadb)
|
|
||||||
run: docker load < /tmp/mariadb.tar
|
|
||||||
- name: Download Docker Image (Database Up)
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-database-test_up
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image (Database Up)
|
|
||||||
run: docker load < /tmp/database_up.tar
|
|
||||||
- name: Download Docker Image (Frontend)
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-frontend-test
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image (Frontend)
|
|
||||||
run: docker load < /tmp/frontend.tar
|
|
||||||
- name: Download Docker Image (Admin Interface)
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-admin-test
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image (Admin Interface)
|
|
||||||
run: docker load < /tmp/admin.tar
|
|
||||||
- name: Download Docker Image (Nginx)
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-nginx-test
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image (Nginx)
|
|
||||||
run: docker load < /tmp/nginx.tar
|
|
||||||
|
|
||||||
##########################################################################
|
|
||||||
# BOOT UP THE TEST SYSTEM ################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: Boot up test system | docker-compose mariadb
|
|
||||||
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach mariadb
|
|
||||||
|
|
||||||
- name: Boot up test system | docker-compose database
|
|
||||||
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps database
|
|
||||||
|
|
||||||
- name: Boot up test system | docker-compose backend
|
|
||||||
run: |
|
|
||||||
cd backend
|
|
||||||
cp .env.test_e2e .env
|
|
||||||
cd ..
|
|
||||||
docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps backend
|
|
||||||
|
|
||||||
- name: Sleep for 10 seconds
|
|
||||||
run: sleep 10s
|
|
||||||
|
|
||||||
- name: Boot up test system | seed backend
|
|
||||||
run: |
|
|
||||||
sudo chown runner:docker -R *
|
|
||||||
cd database
|
|
||||||
yarn && yarn dev_reset
|
|
||||||
cd ../backend
|
|
||||||
yarn && yarn seed
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
- name: Boot up test system | docker-compose frontends
|
|
||||||
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps frontend admin nginx
|
|
||||||
|
|
||||||
- name: Boot up test system | docker-compose mailserver
|
|
||||||
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps mailserver
|
|
||||||
|
|
||||||
- name: Sleep for 15 seconds
|
|
||||||
run: sleep 15s
|
|
||||||
|
|
||||||
##########################################################################
|
|
||||||
# END-TO-END TESTS #######################################################
|
|
||||||
##########################################################################
|
|
||||||
- name: End-to-end tests | run tests
|
|
||||||
id: e2e-tests
|
|
||||||
run: |
|
|
||||||
cd e2e-tests/
|
|
||||||
yarn
|
|
||||||
yarn run cypress run --spec cypress/e2e/User.Authentication.feature,cypress/e2e/User.Authentication.ResetPassword.feature,cypress/e2e/User.Registration.feature
|
|
||||||
- name: End-to-end tests | if tests failed, upload screenshots
|
|
||||||
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: cypress-screenshots
|
|
||||||
path: /home/runner/work/gradido/gradido/e2e-tests/cypress/screenshots/
|
|
||||||
|
|||||||
53
.github/workflows/test_dht-node.yml
vendored
53
.github/workflows/test_dht-node.yml
vendored
@ -3,17 +3,38 @@ name: Gradido DHT Node Test CI
|
|||||||
on: push
|
on: push
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
# only (but most important) job from this workflow required for pull requests
|
||||||
|
# check results serve as run conditions for all other jobs here
|
||||||
|
files-changed:
|
||||||
|
name: Detect File Changes - DHT Node
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
dht_node: ${{ steps.changes.outputs.dht_node }}
|
||||||
|
docker: ${{ steps.changes.outputs.docker }}
|
||||||
|
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
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: DOCKER BUILD TEST #####################################################
|
# JOB: DOCKER BUILD TEST #####################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
build:
|
build:
|
||||||
name: Docker Build Test - DHT Node
|
name: Docker Build Test - DHT Node
|
||||||
|
if: needs.files-changed.outputs.dht_node == 'true' || needs.files-changed.outputs.docker == 'true'
|
||||||
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Build `test` image
|
- name: Build 'test' image
|
||||||
run: |
|
run: |
|
||||||
docker build --target test -t "gradido/dht-node:test" -f dht-node/Dockerfile .
|
docker build --target test -t "gradido/dht-node:test" -f dht-node/Dockerfile .
|
||||||
docker save "gradido/dht-node:test" > /tmp/dht-node.tar
|
docker save "gradido/dht-node:test" > /tmp/dht-node.tar
|
||||||
@ -29,30 +50,24 @@ jobs:
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
lint:
|
lint:
|
||||||
name: Lint - DHT Node
|
name: Lint - DHT Node
|
||||||
|
if: needs.files-changed.outputs.dht_node == 'true'
|
||||||
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Download Docker Image
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-dht-node-test
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image
|
|
||||||
run: docker load < /tmp/dht-node.tar
|
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: docker run --rm gradido/dht-node:test yarn run lint
|
run: cd dht-node && yarn && yarn run lint
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: UNIT TEST #############################################################
|
# JOB: UNIT TEST #############################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
unit_test:
|
unit_test:
|
||||||
name: Unit Tests - DHT Node
|
name: Unit Tests - DHT Node
|
||||||
|
if: needs.files-changed.outputs.dht_node == 'true' || needs.files-changed.outputs.docker == 'true'
|
||||||
|
needs: [files-changed, build]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@ -83,16 +98,4 @@ jobs:
|
|||||||
#- name: Unit tests
|
#- name: Unit tests
|
||||||
# run: cd database && yarn && yarn build && cd ../dht-node && yarn && yarn test
|
# run: cd database && yarn && yarn build && cd ../dht-node && yarn && yarn test
|
||||||
- name: Unit tests
|
- name: Unit tests
|
||||||
run: |
|
run: docker run --env NODE_ENV=test --env DB_HOST=mariadb --network gradido_internal-net --rm gradido/dht-node:test yarn run test
|
||||||
docker run --env NODE_ENV=test --env DB_HOST=mariadb --network gradido_internal-net -v ~/coverage:/app/coverage --rm gradido/dht-node:test yarn run test
|
|
||||||
cp -r ~/coverage ./coverage
|
|
||||||
|
|
||||||
- name: Coverage check
|
|
||||||
uses: webcraftmedia/coverage-check-action@master
|
|
||||||
with:
|
|
||||||
report_name: Coverage DHT Node
|
|
||||||
type: lcov
|
|
||||||
#result_path: ./dht-node/coverage/lcov.info
|
|
||||||
result_path: ./coverage/lcov.info
|
|
||||||
min_coverage: 79
|
|
||||||
token: ${{ github.token }}
|
|
||||||
|
|||||||
50
.github/workflows/test_federation.yml
vendored
50
.github/workflows/test_federation.yml
vendored
@ -3,11 +3,32 @@ name: Gradido Federation Test CI
|
|||||||
on: push
|
on: push
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
# only (but most important) job from this workflow required for pull requests
|
||||||
|
# check results serve as run conditions for all other jobs here
|
||||||
|
files-changed:
|
||||||
|
name: Detect File Changes - Federation
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
docker: ${{ steps.changes.outputs.docker }}
|
||||||
|
federation: ${{ steps.changes.outputs.federation }}
|
||||||
|
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
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: DOCKER BUILD TEST #####################################################
|
# JOB: DOCKER BUILD TEST #####################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
build:
|
build:
|
||||||
name: Docker Build Test - Federation
|
name: Docker Build Test - Federation
|
||||||
|
if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.federation == 'true'
|
||||||
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
@ -29,30 +50,24 @@ jobs:
|
|||||||
##############################################################################
|
##############################################################################
|
||||||
lint:
|
lint:
|
||||||
name: Lint - Federation
|
name: Lint - Federation
|
||||||
|
if: needs.files-changed.outputs.federation == 'true'
|
||||||
|
needs: files-changed
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Download Docker Image
|
|
||||||
uses: actions/download-artifact@v3
|
|
||||||
with:
|
|
||||||
name: docker-federation-test
|
|
||||||
path: /tmp
|
|
||||||
- name: Load Docker Image
|
|
||||||
run: docker load < /tmp/federation.tar
|
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: docker run --rm gradido/federation:test yarn run lint
|
run: cd federation && yarn && yarn run lint
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: UNIT TEST #############################################################
|
# JOB: UNIT TEST #############################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
unit_test:
|
unit_test:
|
||||||
name: Unit Tests - Federation
|
name: Unit Tests - Federation
|
||||||
|
if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.federation == 'true'
|
||||||
|
needs: [files-changed, build]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [build]
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
@ -84,15 +99,4 @@ jobs:
|
|||||||
# run: cd database && yarn && yarn build && cd ../dht-node && yarn && yarn test
|
# run: cd database && yarn && yarn build && cd ../dht-node && yarn && yarn test
|
||||||
- name: Unit tests
|
- name: Unit tests
|
||||||
run: |
|
run: |
|
||||||
docker run --env NODE_ENV=test --env DB_HOST=mariadb --network gradido_internal-net -v ~/coverage:/app/coverage --rm gradido/federation:test yarn run test
|
docker run --env NODE_ENV=test --env DB_HOST=mariadb --network gradido_internal-net --rm gradido/federation:test yarn run test
|
||||||
cp -r ~/coverage ./coverage
|
|
||||||
|
|
||||||
- name: Coverage check
|
|
||||||
uses: webcraftmedia/coverage-check-action@master
|
|
||||||
with:
|
|
||||||
report_name: Coverage Federation
|
|
||||||
type: lcov
|
|
||||||
#result_path: ./federation/coverage/lcov.info
|
|
||||||
result_path: ./coverage/lcov.info
|
|
||||||
min_coverage: 72
|
|
||||||
token: ${{ github.token }}
|
|
||||||
|
|||||||
84
.github/workflows/test_frontend.yml
vendored
Normal file
84
.github/workflows/test_frontend.yml
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
name: Gradido Frontend Test CI
|
||||||
|
|
||||||
|
on: push
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# only (but most important) job from this workflow required for pull requests
|
||||||
|
# check results serve as run conditions for all other jobs here
|
||||||
|
files-changed:
|
||||||
|
name: Detect File Changes - Frontend
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
frontend: ${{ steps.changes.outputs.frontend }}
|
||||||
|
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.frontend == 'true'
|
||||||
|
name: Docker Build Test - Frontend
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Frontend | Build 'test' image
|
||||||
|
run: docker build --target test -t "gradido/frontend:test" frontend/ --build-arg NODE_ENV="test"
|
||||||
|
|
||||||
|
unit_test:
|
||||||
|
if: needs.files-changed.outputs.frontend == 'true'
|
||||||
|
name: Unit Tests - Frontend
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Frontend | Unit tests
|
||||||
|
run: cd frontend && yarn && yarn run test
|
||||||
|
|
||||||
|
lint:
|
||||||
|
if: needs.files-changed.outputs.frontend == 'true'
|
||||||
|
name: Lint - Frontend
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Frontend | Lint
|
||||||
|
run: cd frontend && yarn && yarn run lint
|
||||||
|
|
||||||
|
stylelint:
|
||||||
|
if: needs.files-changed.outputs.frontend == 'true'
|
||||||
|
name: Stylelint - Frontend
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Frontend | Stylelint
|
||||||
|
run: cd frontend && yarn && yarn run stylelint
|
||||||
|
|
||||||
|
locales:
|
||||||
|
if: needs.files-changed.outputs.frontend == 'true'
|
||||||
|
name: Locales - Frontend
|
||||||
|
needs: files-changed
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Frontend | Locales
|
||||||
|
run: cd frontend && yarn && yarn run locales
|
||||||
20
CHANGELOG.md
20
CHANGELOG.md
@ -4,8 +4,28 @@ 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).
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||||
|
|
||||||
|
#### [1.19.1](https://github.com/gradido/gradido/compare/1.19.0...1.19.1)
|
||||||
|
|
||||||
|
- fix(frontend): admin question clickable [`#2810`](https://github.com/gradido/gradido/pull/2810)
|
||||||
|
- refactor(frontend): change b-img to b-icon send [`#2809`](https://github.com/gradido/gradido/pull/2809)
|
||||||
|
- fix(admin): update openCreation in case of tab open. [`#2806`](https://github.com/gradido/gradido/pull/2806)
|
||||||
|
- fix(admin): english language for contributions in admin [`#2804`](https://github.com/gradido/gradido/pull/2804)
|
||||||
|
- refactor(admin): event buttons for myself turned off in open contributions [`#2760`](https://github.com/gradido/gradido/pull/2760)
|
||||||
|
- fix(admin): contribution page [`#2794`](https://github.com/gradido/gradido/pull/2794)
|
||||||
|
- fix(frontend): info.svg [`#2798`](https://github.com/gradido/gradido/pull/2798)
|
||||||
|
- fix(backend): add relation messages to database query [`#2795`](https://github.com/gradido/gradido/pull/2795)
|
||||||
|
- fix(admin): header and menu [`#2793`](https://github.com/gradido/gradido/pull/2793)
|
||||||
|
- fix(frontend): send gdd - change first submit button text to 'Check Now' [`#2774`](https://github.com/gradido/gradido/pull/2774)
|
||||||
|
- refactor(frontend): creations generated by link NL [`#2771`](https://github.com/gradido/gradido/pull/2771)
|
||||||
|
- refactor(frontend): creations generated by link (FR) + (NL) [`#2770`](https://github.com/gradido/gradido/pull/2770)
|
||||||
|
- refactor(frontend): update German locales [`#2765`](https://github.com/gradido/gradido/pull/2765)
|
||||||
|
- refactor(backend): use find contributions helper for list contributions [`#2762`](https://github.com/gradido/gradido/pull/2762)
|
||||||
|
|
||||||
#### [1.19.0](https://github.com/gradido/gradido/compare/1.18.2...1.19.0)
|
#### [1.19.0](https://github.com/gradido/gradido/compare/1.18.2...1.19.0)
|
||||||
|
|
||||||
|
> 7 March 2023
|
||||||
|
|
||||||
|
- chore(release): version 1.19.0 [`#2786`](https://github.com/gradido/gradido/pull/2786)
|
||||||
- fix(frontend): change contribution design [`#2731`](https://github.com/gradido/gradido/pull/2731)
|
- fix(frontend): change contribution design [`#2731`](https://github.com/gradido/gradido/pull/2731)
|
||||||
- refactor(frontend): commnity navbar- & unauthenticated b-gradido styles [`#2732`](https://github.com/gradido/gradido/pull/2732)
|
- refactor(frontend): commnity navbar- & unauthenticated b-gradido styles [`#2732`](https://github.com/gradido/gradido/pull/2732)
|
||||||
- fix(database): change downwards migration to delete entries with last_announced_at IS NULL [`#2767`](https://github.com/gradido/gradido/pull/2767)
|
- fix(database): change downwards migration to delete entries with last_announced_at IS NULL [`#2767`](https://github.com/gradido/gradido/pull/2767)
|
||||||
|
|||||||
@ -76,7 +76,11 @@ git clone git@github.com:gradido/gradido.git
|
|||||||
git submodule update --recursive --init
|
git submodule update --recursive --init
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Run docker-compose
|
### 2. Install modules
|
||||||
|
|
||||||
|
You can go in each under folder (admin, frontend, database, backend, ...) and call ``yarn`` in each folder or you can call ``yarn installAll``.
|
||||||
|
|
||||||
|
### 3. Run docker-compose
|
||||||
|
|
||||||
Run docker-compose to bring up the development environment
|
Run docker-compose to bring up the development environment
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,17 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
verbose: true,
|
verbose: true,
|
||||||
|
collectCoverage: true,
|
||||||
collectCoverageFrom: [
|
collectCoverageFrom: [
|
||||||
'src/**/*.{js,vue}',
|
'src/**/*.{js,vue}',
|
||||||
'!**/node_modules/**',
|
'!**/node_modules/**',
|
||||||
'!src/assets/**',
|
'!src/assets/**',
|
||||||
'!**/?(*.)+(spec|test).js?(x)',
|
'!**/?(*.)+(spec|test).js?(x)',
|
||||||
],
|
],
|
||||||
|
coverageThreshold: {
|
||||||
|
global: {
|
||||||
|
lines: 97,
|
||||||
|
},
|
||||||
|
},
|
||||||
moduleFileExtensions: [
|
moduleFileExtensions: [
|
||||||
'js',
|
'js',
|
||||||
// 'jsx',
|
// 'jsx',
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
"description": "Administraion Interface for Gradido",
|
"description": "Administraion Interface for Gradido",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"author": "Moriz Wahl",
|
"author": "Moriz Wahl",
|
||||||
"version": "1.19.0",
|
"version": "1.19.1",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"private": false,
|
"private": false,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -14,7 +14,7 @@
|
|||||||
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
|
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
|
||||||
"lint": "eslint --max-warnings=0 --ext .js,.vue,.json .",
|
"lint": "eslint --max-warnings=0 --ext .js,.vue,.json .",
|
||||||
"stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'",
|
"stylelint": "stylelint --max-warnings=0 '**/*.{scss,vue}'",
|
||||||
"test": "cross-env TZ=UTC jest --coverage",
|
"test": "cross-env TZ=UTC jest",
|
||||||
"locales": "scripts/sort.sh"
|
"locales": "scripts/sort.sh"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@ -1,43 +1,75 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import CreationTransactionList from './CreationTransactionList'
|
import CreationTransactionList from './CreationTransactionList'
|
||||||
import { toastErrorSpy } from '../../test/testSetup'
|
import { toastErrorSpy } from '../../test/testSetup'
|
||||||
|
import VueApollo from 'vue-apollo'
|
||||||
|
import { createMockClient } from 'mock-apollo-client'
|
||||||
|
import { adminListContributions } from '../graphql/adminListContributions'
|
||||||
|
|
||||||
|
const mockClient = createMockClient()
|
||||||
|
const apolloProvider = new VueApollo({
|
||||||
|
defaultClient: mockClient,
|
||||||
|
})
|
||||||
|
|
||||||
const localVue = global.localVue
|
const localVue = global.localVue
|
||||||
|
localVue.use(VueApollo)
|
||||||
|
|
||||||
const apolloQueryMock = jest.fn().mockResolvedValue({
|
const defaultData = () => {
|
||||||
data: {
|
return {
|
||||||
creationTransactionList: {
|
adminListContributions: {
|
||||||
contributionCount: 2,
|
contributionCount: 2,
|
||||||
contributionList: [
|
contributionList: [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
amount: 5.8,
|
firstName: 'Bibi',
|
||||||
createdAt: '2022-09-21T11:09:51.000Z',
|
lastName: 'Bloxberg',
|
||||||
confirmedAt: null,
|
userId: 99,
|
||||||
contributionDate: '2022-08-01T00:00:00.000Z',
|
email: 'bibi@bloxberg.de',
|
||||||
memo: 'für deine Hilfe, Fräulein Rottenmeier',
|
amount: 500,
|
||||||
|
memo: 'Danke für alles',
|
||||||
|
date: new Date(),
|
||||||
|
moderator: 1,
|
||||||
state: 'PENDING',
|
state: 'PENDING',
|
||||||
|
creation: [500, 500, 500],
|
||||||
|
messagesCount: 0,
|
||||||
|
deniedBy: null,
|
||||||
|
deniedAt: null,
|
||||||
|
confirmedBy: null,
|
||||||
|
confirmedAt: null,
|
||||||
|
contributionDate: new Date(),
|
||||||
|
deletedBy: null,
|
||||||
|
deletedAt: null,
|
||||||
|
createdAt: new Date(),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 2,
|
id: 2,
|
||||||
amount: '47',
|
firstName: 'Räuber',
|
||||||
createdAt: '2022-09-21T11:09:28.000Z',
|
lastName: 'Hotzenplotz',
|
||||||
confirmedAt: '2022-09-21T11:09:28.000Z',
|
userId: 100,
|
||||||
contributionDate: '2022-08-01T00:00:00.000Z',
|
email: 'raeuber@hotzenplotz.de',
|
||||||
memo: 'für deine Hilfe, Frau Holle',
|
amount: 1000000,
|
||||||
state: 'CONFIRMED',
|
memo: 'Gut Ergattert',
|
||||||
|
date: new Date(),
|
||||||
|
moderator: 1,
|
||||||
|
state: 'PENDING',
|
||||||
|
creation: [500, 500, 500],
|
||||||
|
messagesCount: 0,
|
||||||
|
deniedBy: null,
|
||||||
|
deniedAt: null,
|
||||||
|
confirmedBy: null,
|
||||||
|
confirmedAt: new Date(),
|
||||||
|
contributionDate: new Date(),
|
||||||
|
deletedBy: null,
|
||||||
|
deletedAt: null,
|
||||||
|
createdAt: new Date(),
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
const mocks = {
|
const mocks = {
|
||||||
$d: jest.fn((t) => t),
|
$d: jest.fn((t) => t),
|
||||||
$t: jest.fn((t) => t),
|
$t: jest.fn((t) => t),
|
||||||
$apollo: {
|
|
||||||
query: apolloQueryMock,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const propsData = {
|
const propsData = {
|
||||||
@ -48,55 +80,53 @@ const propsData = {
|
|||||||
describe('CreationTransactionList', () => {
|
describe('CreationTransactionList', () => {
|
||||||
let wrapper
|
let wrapper
|
||||||
|
|
||||||
|
const adminListContributionsMock = jest.fn()
|
||||||
|
mockClient.setRequestHandler(
|
||||||
|
adminListContributions,
|
||||||
|
adminListContributionsMock
|
||||||
|
.mockRejectedValueOnce({ message: 'Ouch!' })
|
||||||
|
.mockResolvedValue({ data: defaultData() }),
|
||||||
|
)
|
||||||
|
|
||||||
const Wrapper = () => {
|
const Wrapper = () => {
|
||||||
return mount(CreationTransactionList, { localVue, mocks, propsData })
|
return mount(CreationTransactionList, { localVue, mocks, propsData, apolloProvider })
|
||||||
}
|
}
|
||||||
|
|
||||||
describe('mount', () => {
|
describe('mount', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
jest.clearAllMocks()
|
||||||
wrapper = Wrapper()
|
wrapper = Wrapper()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sends query to Apollo when created', () => {
|
describe('server error', () => {
|
||||||
expect(apolloQueryMock).toBeCalledWith(
|
|
||||||
expect.objectContaining({
|
|
||||||
variables: {
|
|
||||||
currentPage: 1,
|
|
||||||
pageSize: 10,
|
|
||||||
order: 'DESC',
|
|
||||||
userId: 1,
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('has two values for the transaction', () => {
|
|
||||||
expect(wrapper.find('tbody').findAll('tr').length).toBe(2)
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('query transaction with error', () => {
|
|
||||||
beforeEach(() => {
|
|
||||||
apolloQueryMock.mockRejectedValue({ message: 'OUCH!' })
|
|
||||||
wrapper = Wrapper()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('calls the API', () => {
|
|
||||||
expect(apolloQueryMock).toBeCalled()
|
|
||||||
})
|
|
||||||
|
|
||||||
it('toast error', () => {
|
it('toast error', () => {
|
||||||
expect(toastErrorSpy).toBeCalledWith('OUCH!')
|
expect(toastErrorSpy).toBeCalledWith('Ouch!')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('watch currentPage', () => {
|
describe('sever success', () => {
|
||||||
beforeEach(async () => {
|
it('sends query to Apollo when created', () => {
|
||||||
jest.clearAllMocks()
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
await wrapper.setData({ currentPage: 2 })
|
currentPage: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
order: 'DESC',
|
||||||
|
userId: 1,
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns the string in normal order if reversed property is not true', () => {
|
it('has two values for the transaction', () => {
|
||||||
expect(wrapper.vm.currentPage).toBe(2)
|
expect(wrapper.find('tbody').findAll('tr').length).toBe(2)
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('watch currentPage', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
jest.clearAllMocks()
|
||||||
|
await wrapper.setData({ currentPage: 2 })
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns the string in normal order if reversed property is not true', () => {
|
||||||
|
expect(wrapper.vm.currentPage).toBe(2)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -42,7 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { creationTransactionList } from '../graphql/creationTransactionList'
|
import { adminListContributions } from '../graphql/adminListContributions'
|
||||||
export default {
|
export default {
|
||||||
name: 'CreationTransactionList',
|
name: 'CreationTransactionList',
|
||||||
props: {
|
props: {
|
||||||
@ -92,33 +92,26 @@ export default {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
apollo: {
|
||||||
getTransactions() {
|
AdminListContributions: {
|
||||||
this.$apollo
|
query() {
|
||||||
.query({
|
return adminListContributions
|
||||||
query: creationTransactionList,
|
},
|
||||||
variables: {
|
variables() {
|
||||||
currentPage: this.currentPage,
|
return {
|
||||||
pageSize: this.perPage,
|
currentPage: this.currentPage,
|
||||||
order: 'DESC',
|
pageSize: this.perPage,
|
||||||
userId: parseInt(this.userId),
|
order: 'DESC',
|
||||||
},
|
userId: parseInt(this.userId),
|
||||||
})
|
}
|
||||||
.then((result) => {
|
},
|
||||||
this.rows = result.data.creationTransactionList.contributionCount
|
update({ adminListContributions }) {
|
||||||
this.items = result.data.creationTransactionList.contributionList
|
this.rows = adminListContributions.contributionCount
|
||||||
})
|
this.items = adminListContributions.contributionList
|
||||||
.catch((error) => {
|
},
|
||||||
this.toastError(error.message)
|
error({ message }) {
|
||||||
})
|
this.toastError(message)
|
||||||
},
|
},
|
||||||
},
|
|
||||||
created() {
|
|
||||||
this.getTransactions()
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
currentPage() {
|
|
||||||
this.getTransactions()
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import gql from 'graphql-tag'
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
export const adminCreateContributionMessage = gql`
|
export const adminCreateContributionMessage = gql`
|
||||||
mutation ($contributionId: Float!, $message: String!) {
|
mutation ($contributionId: Int!, $message: String!) {
|
||||||
adminCreateContributionMessage(contributionId: $contributionId, message: $message) {
|
adminCreateContributionMessage(contributionId: $contributionId, message: $message) {
|
||||||
id
|
id
|
||||||
message
|
message
|
||||||
|
|||||||
@ -1,17 +1,19 @@
|
|||||||
import gql from 'graphql-tag'
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
export const adminListAllContributions = gql`
|
export const adminListContributions = gql`
|
||||||
query (
|
query (
|
||||||
$currentPage: Int = 1
|
$currentPage: Int = 1
|
||||||
$pageSize: Int = 25
|
$pageSize: Int = 25
|
||||||
$order: Order = DESC
|
$order: Order = DESC
|
||||||
$statusFilter: [ContributionStatus!]
|
$statusFilter: [ContributionStatus!]
|
||||||
|
$userId: Int
|
||||||
) {
|
) {
|
||||||
adminListAllContributions(
|
adminListContributions(
|
||||||
currentPage: $currentPage
|
currentPage: $currentPage
|
||||||
pageSize: $pageSize
|
pageSize: $pageSize
|
||||||
order: $order
|
order: $order
|
||||||
statusFilter: $statusFilter
|
statusFilter: $statusFilter
|
||||||
|
userId: $userId
|
||||||
) {
|
) {
|
||||||
contributionCount
|
contributionCount
|
||||||
contributionList {
|
contributionList {
|
||||||
@ -1,23 +0,0 @@
|
|||||||
import gql from 'graphql-tag'
|
|
||||||
|
|
||||||
export const creationTransactionList = gql`
|
|
||||||
query ($currentPage: Int = 1, $pageSize: Int = 25, $order: Order = DESC, $userId: Int!) {
|
|
||||||
creationTransactionList(
|
|
||||||
currentPage: $currentPage
|
|
||||||
pageSize: $pageSize
|
|
||||||
order: $order
|
|
||||||
userId: $userId
|
|
||||||
) {
|
|
||||||
contributionCount
|
|
||||||
contributionList {
|
|
||||||
id
|
|
||||||
amount
|
|
||||||
createdAt
|
|
||||||
confirmedAt
|
|
||||||
contributionDate
|
|
||||||
memo
|
|
||||||
state
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
import gql from 'graphql-tag'
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
export const listContributionMessages = gql`
|
export const listContributionMessages = gql`
|
||||||
query ($contributionId: Float!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) {
|
query ($contributionId: Int!, $pageSize: Int = 25, $currentPage: Int = 1, $order: Order = ASC) {
|
||||||
listContributionMessages(
|
listContributionMessages(
|
||||||
contributionId: $contributionId
|
contributionId: $contributionId
|
||||||
pageSize: $pageSize
|
pageSize: $pageSize
|
||||||
|
|||||||
@ -39,7 +39,7 @@
|
|||||||
},
|
},
|
||||||
"created": "Created for",
|
"created": "Created for",
|
||||||
"createdAt": "Created at",
|
"createdAt": "Created at",
|
||||||
"creation": "Amount",
|
"creation": "Creation",
|
||||||
"creationList": "Creation list",
|
"creationList": "Creation list",
|
||||||
"creation_form": {
|
"creation_form": {
|
||||||
"creation_for": "Active Basic Income for",
|
"creation_for": "Active Basic Income for",
|
||||||
|
|||||||
@ -2,7 +2,7 @@ import { mount } from '@vue/test-utils'
|
|||||||
import CreationConfirm from './CreationConfirm'
|
import CreationConfirm from './CreationConfirm'
|
||||||
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
||||||
import { denyContribution } from '../graphql/denyContribution'
|
import { denyContribution } from '../graphql/denyContribution'
|
||||||
import { adminListAllContributions } from '../graphql/adminListAllContributions'
|
import { adminListContributions } from '../graphql/adminListContributions'
|
||||||
import { confirmContribution } from '../graphql/confirmContribution'
|
import { confirmContribution } from '../graphql/confirmContribution'
|
||||||
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
|
import { toastErrorSpy, toastSuccessSpy } from '../../test/testSetup'
|
||||||
import VueApollo from 'vue-apollo'
|
import VueApollo from 'vue-apollo'
|
||||||
@ -38,7 +38,7 @@ const mocks = {
|
|||||||
|
|
||||||
const defaultData = () => {
|
const defaultData = () => {
|
||||||
return {
|
return {
|
||||||
adminListAllContributions: {
|
adminListContributions: {
|
||||||
contributionCount: 2,
|
contributionCount: 2,
|
||||||
contributionList: [
|
contributionList: [
|
||||||
{
|
{
|
||||||
@ -92,14 +92,14 @@ const defaultData = () => {
|
|||||||
|
|
||||||
describe('CreationConfirm', () => {
|
describe('CreationConfirm', () => {
|
||||||
let wrapper
|
let wrapper
|
||||||
const adminListAllContributionsMock = jest.fn()
|
const adminListContributionsMock = jest.fn()
|
||||||
const adminDeleteContributionMock = jest.fn()
|
const adminDeleteContributionMock = jest.fn()
|
||||||
const adminDenyContributionMock = jest.fn()
|
const adminDenyContributionMock = jest.fn()
|
||||||
const confirmContributionMock = jest.fn()
|
const confirmContributionMock = jest.fn()
|
||||||
|
|
||||||
mockClient.setRequestHandler(
|
mockClient.setRequestHandler(
|
||||||
adminListAllContributions,
|
adminListContributions,
|
||||||
adminListAllContributionsMock
|
adminListContributionsMock
|
||||||
.mockRejectedValueOnce({ message: 'Ouch!' })
|
.mockRejectedValueOnce({ message: 'Ouch!' })
|
||||||
.mockResolvedValue({ data: defaultData() }),
|
.mockResolvedValue({ data: defaultData() }),
|
||||||
)
|
)
|
||||||
@ -337,7 +337,7 @@ describe('CreationConfirm', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('refetches contributions with proper filter', () => {
|
it('refetches contributions with proper filter', () => {
|
||||||
expect(adminListAllContributionsMock).toBeCalledWith({
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
order: 'DESC',
|
order: 'DESC',
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
@ -352,7 +352,7 @@ describe('CreationConfirm', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('refetches contributions with proper filter', () => {
|
it('refetches contributions with proper filter', () => {
|
||||||
expect(adminListAllContributionsMock).toBeCalledWith({
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
order: 'DESC',
|
order: 'DESC',
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
@ -368,7 +368,7 @@ describe('CreationConfirm', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('refetches contributions with proper filter', () => {
|
it('refetches contributions with proper filter', () => {
|
||||||
expect(adminListAllContributionsMock).toBeCalledWith({
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
order: 'DESC',
|
order: 'DESC',
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
@ -384,7 +384,7 @@ describe('CreationConfirm', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('refetches contributions with proper filter', () => {
|
it('refetches contributions with proper filter', () => {
|
||||||
expect(adminListAllContributionsMock).toBeCalledWith({
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
order: 'DESC',
|
order: 'DESC',
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
@ -400,7 +400,7 @@ describe('CreationConfirm', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('refetches contributions with proper filter', () => {
|
it('refetches contributions with proper filter', () => {
|
||||||
expect(adminListAllContributionsMock).toBeCalledWith({
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
order: 'DESC',
|
order: 'DESC',
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
|
|||||||
@ -85,7 +85,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import Overlay from '../components/Overlay'
|
import Overlay from '../components/Overlay'
|
||||||
import OpenCreationsTable from '../components/Tables/OpenCreationsTable'
|
import OpenCreationsTable from '../components/Tables/OpenCreationsTable'
|
||||||
import { adminListAllContributions } from '../graphql/adminListAllContributions'
|
import { adminListContributions } from '../graphql/adminListContributions'
|
||||||
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
import { adminDeleteContribution } from '../graphql/adminDeleteContribution'
|
||||||
import { confirmContribution } from '../graphql/confirmContribution'
|
import { confirmContribution } from '../graphql/confirmContribution'
|
||||||
import { denyContribution } from '../graphql/denyContribution'
|
import { denyContribution } from '../graphql/denyContribution'
|
||||||
@ -397,7 +397,7 @@ export default {
|
|||||||
apollo: {
|
apollo: {
|
||||||
ListAllContributions: {
|
ListAllContributions: {
|
||||||
query() {
|
query() {
|
||||||
return adminListAllContributions
|
return adminListContributions
|
||||||
},
|
},
|
||||||
variables() {
|
variables() {
|
||||||
return {
|
return {
|
||||||
@ -407,9 +407,12 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchPolicy: 'no-cache',
|
fetchPolicy: 'no-cache',
|
||||||
update({ adminListAllContributions }) {
|
update({ adminListContributions }) {
|
||||||
this.rows = adminListAllContributions.contributionCount
|
this.rows = adminListContributions.contributionCount
|
||||||
this.items = adminListAllContributions.contributionList
|
this.items = adminListContributions.contributionList
|
||||||
|
if (this.statusFilter === FILTER_TAB_MAP[0]) {
|
||||||
|
this.$store.commit('setOpenCreations', adminListContributions.contributionCount)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
error({ message }) {
|
error({ message }) {
|
||||||
this.toastError(message)
|
this.toastError(message)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import { mount } from '@vue/test-utils'
|
import { mount } from '@vue/test-utils'
|
||||||
import Overview from './Overview'
|
import Overview from './Overview'
|
||||||
import { adminListAllContributions } from '../graphql/adminListAllContributions'
|
import { adminListContributions } from '../graphql/adminListContributions'
|
||||||
import VueApollo from 'vue-apollo'
|
import VueApollo from 'vue-apollo'
|
||||||
import { createMockClient } from 'mock-apollo-client'
|
import { createMockClient } from 'mock-apollo-client'
|
||||||
import { toastErrorSpy } from '../../test/testSetup'
|
import { toastErrorSpy } from '../../test/testSetup'
|
||||||
@ -30,7 +30,7 @@ const mocks = {
|
|||||||
|
|
||||||
const defaultData = () => {
|
const defaultData = () => {
|
||||||
return {
|
return {
|
||||||
adminListAllContributions: {
|
adminListContributions: {
|
||||||
contributionCount: 2,
|
contributionCount: 2,
|
||||||
contributionList: [
|
contributionList: [
|
||||||
{
|
{
|
||||||
@ -84,11 +84,11 @@ const defaultData = () => {
|
|||||||
|
|
||||||
describe('Overview', () => {
|
describe('Overview', () => {
|
||||||
let wrapper
|
let wrapper
|
||||||
const adminListAllContributionsMock = jest.fn()
|
const adminListContributionsMock = jest.fn()
|
||||||
|
|
||||||
mockClient.setRequestHandler(
|
mockClient.setRequestHandler(
|
||||||
adminListAllContributions,
|
adminListContributions,
|
||||||
adminListAllContributionsMock
|
adminListContributionsMock
|
||||||
.mockRejectedValueOnce({ message: 'Ouch!' })
|
.mockRejectedValueOnce({ message: 'Ouch!' })
|
||||||
.mockResolvedValue({ data: defaultData() }),
|
.mockResolvedValue({ data: defaultData() }),
|
||||||
)
|
)
|
||||||
@ -109,8 +109,8 @@ describe('Overview', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
it('calls the adminListAllContributions query', () => {
|
it('calls the adminListContributions query', () => {
|
||||||
expect(adminListAllContributionsMock).toBeCalledWith({
|
expect(adminListContributionsMock).toBeCalledWith({
|
||||||
currentPage: 1,
|
currentPage: 1,
|
||||||
order: 'DESC',
|
order: 'DESC',
|
||||||
pageSize: 25,
|
pageSize: 25,
|
||||||
|
|||||||
@ -31,7 +31,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { adminListAllContributions } from '../graphql/adminListAllContributions'
|
import { adminListContributions } from '../graphql/adminListContributions'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'overview',
|
name: 'overview',
|
||||||
@ -43,7 +43,7 @@ export default {
|
|||||||
apollo: {
|
apollo: {
|
||||||
AllContributions: {
|
AllContributions: {
|
||||||
query() {
|
query() {
|
||||||
return adminListAllContributions
|
return adminListContributions
|
||||||
},
|
},
|
||||||
variables() {
|
variables() {
|
||||||
// may be at some point we need a pagination here
|
// may be at some point we need a pagination here
|
||||||
@ -51,8 +51,8 @@ export default {
|
|||||||
statusFilter: this.statusFilter,
|
statusFilter: this.statusFilter,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
update({ adminListAllContributions }) {
|
update({ adminListContributions }) {
|
||||||
this.$store.commit('setOpenCreations', adminListAllContributions.contributionCount)
|
this.$store.commit('setOpenCreations', adminListContributions.contributionCount)
|
||||||
},
|
},
|
||||||
error({ message }) {
|
error({ message }) {
|
||||||
this.toastError(message)
|
this.toastError(message)
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
# Server
|
# Server
|
||||||
JWT_EXPIRES_IN=1m
|
JWT_EXPIRES_IN=2m
|
||||||
|
|
||||||
# Email
|
# Email
|
||||||
EMAIL=true
|
EMAIL=true
|
||||||
|
|||||||
@ -2,16 +2,10 @@ module.exports = {
|
|||||||
root: true,
|
root: true,
|
||||||
env: {
|
env: {
|
||||||
node: true,
|
node: true,
|
||||||
// jest: true,
|
|
||||||
},
|
},
|
||||||
parser: '@typescript-eslint/parser',
|
parser: '@typescript-eslint/parser',
|
||||||
plugins: ['prettier', '@typescript-eslint' /*, 'jest' */],
|
plugins: ['prettier', '@typescript-eslint', 'type-graphql', 'jest'],
|
||||||
extends: [
|
extends: ['standard', 'eslint:recommended', 'plugin:prettier/recommended'],
|
||||||
'standard',
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:prettier/recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
],
|
|
||||||
// add your custom rules here
|
// add your custom rules here
|
||||||
rules: {
|
rules: {
|
||||||
'no-console': ['error'],
|
'no-console': ['error'],
|
||||||
@ -22,5 +16,35 @@ module.exports = {
|
|||||||
htmlWhitespaceSensitivity: 'ignore',
|
htmlWhitespaceSensitivity: 'ignore',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
// jest
|
||||||
|
'jest/no-disabled-tests': 'error',
|
||||||
|
'jest/no-focused-tests': 'error',
|
||||||
|
'jest/no-identical-title': 'error',
|
||||||
|
'jest/prefer-to-have-length': 'error',
|
||||||
|
'jest/valid-expect': 'error',
|
||||||
},
|
},
|
||||||
|
overrides: [
|
||||||
|
// only for ts files
|
||||||
|
{
|
||||||
|
files: ['*.ts', '*.tsx'],
|
||||||
|
extends: [
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended-requiring-type-checking',
|
||||||
|
'plugin:type-graphql/recommended',
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
// allow explicitly defined dangling promises
|
||||||
|
'@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }],
|
||||||
|
'no-void': ['error', { allowAsStatement: true }],
|
||||||
|
// ignore prefer-regexp-exec rule to allow string.match(regex)
|
||||||
|
'@typescript-eslint/prefer-regexp-exec': 'off',
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
tsconfigRootDir: __dirname,
|
||||||
|
project: ['./tsconfig.json'],
|
||||||
|
// this is to properly reference the referenced project database without requirement of compiling it
|
||||||
|
EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|||||||
1
backend/@types/klicktipp-api/index.d.ts
vendored
Normal file
1
backend/@types/klicktipp-api/index.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
declare module 'klicktipp-api'
|
||||||
@ -4,6 +4,11 @@ module.exports = {
|
|||||||
preset: 'ts-jest',
|
preset: 'ts-jest',
|
||||||
collectCoverage: true,
|
collectCoverage: true,
|
||||||
collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'],
|
collectCoverageFrom: ['src/**/*.ts', '!**/node_modules/**', '!src/seeds/**', '!build/**'],
|
||||||
|
coverageThreshold: {
|
||||||
|
global: {
|
||||||
|
lines: 85,
|
||||||
|
},
|
||||||
|
},
|
||||||
setupFiles: ['<rootDir>/test/testSetup.ts'],
|
setupFiles: ['<rootDir>/test/testSetup.ts'],
|
||||||
setupFilesAfterEnv: ['<rootDir>/test/extensions.ts'],
|
setupFilesAfterEnv: ['<rootDir>/test/extensions.ts'],
|
||||||
modulePathIgnorePatterns: ['<rootDir>/build/'],
|
modulePathIgnorePatterns: ['<rootDir>/build/'],
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "gradido-backend",
|
"name": "gradido-backend",
|
||||||
"version": "1.19.0",
|
"version": "1.19.1",
|
||||||
"description": "Gradido unified backend providing an API-Service for Gradido Transactions",
|
"description": "Gradido unified backend providing an API-Service for Gradido Transactions",
|
||||||
"main": "src/index.ts",
|
"main": "src/index.ts",
|
||||||
"repository": "https://github.com/gradido/gradido/backend",
|
"repository": "https://github.com/gradido/gradido/backend",
|
||||||
@ -13,7 +13,7 @@
|
|||||||
"start": "cross-env TZ=UTC TS_NODE_BASEURL=./build node -r tsconfig-paths/register build/src/index.js",
|
"start": "cross-env TZ=UTC TS_NODE_BASEURL=./build node -r tsconfig-paths/register build/src/index.js",
|
||||||
"dev": "cross-env TZ=UTC nodemon -w src --ext ts --exec ts-node -r tsconfig-paths/register src/index.ts",
|
"dev": "cross-env TZ=UTC nodemon -w src --ext ts --exec ts-node -r tsconfig-paths/register src/index.ts",
|
||||||
"lint": "eslint --max-warnings=0 --ext .js,.ts .",
|
"lint": "eslint --max-warnings=0 --ext .js,.ts .",
|
||||||
"test": "cross-env TZ=UTC NODE_ENV=development jest --runInBand --coverage --forceExit --detectOpenHandles",
|
"test": "cross-env TZ=UTC NODE_ENV=development jest --runInBand --forceExit --detectOpenHandles",
|
||||||
"seed": "cross-env TZ=UTC NODE_ENV=development ts-node -r tsconfig-paths/register src/seeds/index.ts",
|
"seed": "cross-env TZ=UTC NODE_ENV=development ts-node -r tsconfig-paths/register src/seeds/index.ts",
|
||||||
"klicktipp": "cross-env TZ=UTC NODE_ENV=development ts-node -r tsconfig-paths/register src/util/klicktipp.ts",
|
"klicktipp": "cross-env TZ=UTC NODE_ENV=development ts-node -r tsconfig-paths/register src/util/klicktipp.ts",
|
||||||
"locales": "scripts/sort.sh"
|
"locales": "scripts/sort.sh"
|
||||||
@ -62,11 +62,14 @@
|
|||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-config-standard": "^16.0.3",
|
"eslint-config-standard": "^16.0.3",
|
||||||
"eslint-plugin-import": "^2.23.4",
|
"eslint-plugin-import": "^2.23.4",
|
||||||
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"eslint-plugin-node": "^11.1.0",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"eslint-plugin-prettier": "^3.4.0",
|
"eslint-plugin-prettier": "^3.4.0",
|
||||||
"eslint-plugin-promise": "^5.1.0",
|
"eslint-plugin-promise": "^5.1.0",
|
||||||
|
"eslint-plugin-type-graphql": "^1.0.0",
|
||||||
"faker": "^5.5.3",
|
"faker": "^5.5.3",
|
||||||
"jest": "^27.2.4",
|
"jest": "^27.2.4",
|
||||||
|
"klicktipp-api": "^1.0.2",
|
||||||
"nodemon": "^2.0.7",
|
"nodemon": "^2.0.7",
|
||||||
"prettier": "^2.3.1",
|
"prettier": "^2.3.1",
|
||||||
"ts-jest": "^27.0.5",
|
"ts-jest": "^27.0.5",
|
||||||
|
|||||||
@ -1,16 +1,19 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
import axios from 'axios'
|
import axios from 'axios'
|
||||||
|
|
||||||
import { backendLogger as logger } from '@/server/logger'
|
import { backendLogger as logger } from '@/server/logger'
|
||||||
|
import LogError from '@/server/LogError'
|
||||||
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
export const apiPost = async (url: string, payload: unknown): Promise<any> => {
|
export const apiPost = async (url: string, payload: unknown): Promise<any> => {
|
||||||
logger.trace('POST: url=' + url + ' payload=' + payload)
|
logger.trace('POST', url, payload)
|
||||||
return axios
|
return axios
|
||||||
.post(url, payload)
|
.post(url, payload)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
logger.trace('POST-Response: result=' + result)
|
logger.trace('POST-Response', result)
|
||||||
if (result.status !== 200) {
|
if (result.status !== 200) {
|
||||||
throw new Error('HTTP Status Error ' + result.status)
|
throw new LogError('HTTP Status Error', result.status)
|
||||||
}
|
}
|
||||||
if (result.data.state !== 'success') {
|
if (result.data.state !== 'success') {
|
||||||
throw new Error(result.data.msg)
|
throw new Error(result.data.msg)
|
||||||
@ -28,9 +31,9 @@ export const apiGet = async (url: string): Promise<any> => {
|
|||||||
return axios
|
return axios
|
||||||
.get(url)
|
.get(url)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
logger.trace('GET-Response: result=' + result)
|
logger.trace('GET-Response', result)
|
||||||
if (result.status !== 200) {
|
if (result.status !== 200) {
|
||||||
throw new Error('HTTP Status Error ' + result.status)
|
throw new LogError('HTTP Status Error', result.status)
|
||||||
}
|
}
|
||||||
if (!['success', 'warning'].includes(result.data.state)) {
|
if (!['success', 'warning'].includes(result.data.state)) {
|
||||||
throw new Error(result.data.msg)
|
throw new Error(result.data.msg)
|
||||||
|
|||||||
@ -1,6 +1,10 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
import { KlicktippConnector } from './klicktippConnector'
|
import KlicktippConnector from 'klicktipp-api'
|
||||||
import CONFIG from '@/config'
|
import CONFIG from '@/config'
|
||||||
|
|
||||||
const klicktippConnector = new KlicktippConnector()
|
const klicktippConnector = new KlicktippConnector()
|
||||||
|
|||||||
@ -1,620 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
|
||||||
import axios, { AxiosRequestConfig, Method } from 'axios'
|
|
||||||
|
|
||||||
export class KlicktippConnector {
|
|
||||||
private baseURL: string
|
|
||||||
private sessionName: string
|
|
||||||
private sessionId: string
|
|
||||||
private error: string
|
|
||||||
|
|
||||||
constructor(service?: string) {
|
|
||||||
this.baseURL = service !== undefined ? service : 'https://api.klicktipp.com'
|
|
||||||
this.sessionName = ''
|
|
||||||
this.sessionId = ''
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get last error
|
|
||||||
*
|
|
||||||
* @return string an error description of the last error
|
|
||||||
*/
|
|
||||||
getLastError(): string {
|
|
||||||
const result = this.error
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* login
|
|
||||||
*
|
|
||||||
* @param username The login name of the user to login.
|
|
||||||
* @param password The password of the user.
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async login(username: string, password: string): Promise<boolean> {
|
|
||||||
if (!(username.length > 0 && password.length > 0)) {
|
|
||||||
throw new Error('Klicktipp Login failed: Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/account/login', 'POST', { username, password }, false)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
this.sessionId = res.data.sessid
|
|
||||||
this.sessionName = res.data.session_name
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Login failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Logs out the user currently logged in.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async logout(): Promise<boolean> {
|
|
||||||
const res = await this.httpRequest('/account/logout', 'POST')
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
this.sessionId = ''
|
|
||||||
this.sessionName = ''
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Logout failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all subscription processes (lists) of the logged in user. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @return A associative obeject <list id> => <list name>
|
|
||||||
*/
|
|
||||||
async subscriptionProcessIndex(): Promise<any> {
|
|
||||||
const res = await this.httpRequest('/list', 'GET', {}, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Subscription process index failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get subscription process (list) definition. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param listid The id of the subscription process
|
|
||||||
*
|
|
||||||
* @return An object representing the Klicktipp subscription process.
|
|
||||||
*/
|
|
||||||
async subscriptionProcessGet(listid: string): Promise<any> {
|
|
||||||
if (!listid || listid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// retrieve
|
|
||||||
const res = await this.httpRequest(`/subscriber/${listid}`, 'GET', {}, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Subscription process get failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get subscription process (list) redirection url for given subscription.
|
|
||||||
*
|
|
||||||
* @param listid The id of the subscription process.
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
*
|
|
||||||
* @return A redirection url as defined in the subscription process.
|
|
||||||
*/
|
|
||||||
async subscriptionProcessRedirect(listid: string, email: string): Promise<any> {
|
|
||||||
if (!listid || listid === '' || !email || email === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// update
|
|
||||||
const data = { listid, email }
|
|
||||||
const res = await this.httpRequest('/list/redirect', 'POST', data)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
`Klicktipp Subscription process get redirection url failed: ${res.response.statusText}`,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all manual tags of the logged in user. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @return A associative object <tag id> => <tag name>
|
|
||||||
*/
|
|
||||||
async tagIndex(): Promise<any> {
|
|
||||||
const res = await this.httpRequest('/tag', 'GET', {}, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Tag index failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a tag definition. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param tagid The tag id.
|
|
||||||
*
|
|
||||||
* @return An object representing the Klicktipp tag object.
|
|
||||||
*/
|
|
||||||
async tagGet(tagid: string): Promise<any> {
|
|
||||||
if (!tagid || tagid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
const res = await this.httpRequest(`/tag/${tagid}`, 'GET', {}, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Tag get failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new manual tag. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param name The name of the tag.
|
|
||||||
* @param text (optional) An additional description of the tag.
|
|
||||||
*
|
|
||||||
* @return The id of the newly created tag or false if failed.
|
|
||||||
*/
|
|
||||||
async tagCreate(name: string, text?: string): Promise<boolean> {
|
|
||||||
if (!name || name === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
const data = {
|
|
||||||
name,
|
|
||||||
text: text !== undefined ? text : '',
|
|
||||||
}
|
|
||||||
const res = await this.httpRequest('/tag', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Tag creation failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates a tag. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param tagid The tag id used to identify which tag to modify.
|
|
||||||
* @param name (optional) The new tag name. Set empty to leave it unchanged.
|
|
||||||
* @param text (optional) The new tag description. Set empty to leave it unchanged.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async tagUpdate(tagid: string, name?: string, text?: string): Promise<boolean> {
|
|
||||||
if (!tagid || tagid === '' || (name === '' && text === '')) {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
const data = {
|
|
||||||
name: name !== undefined ? name : '',
|
|
||||||
text: text !== undefined ? text : '',
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest(`/tag/${tagid}`, 'PUT', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Tag update failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes a tag. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param tagid The user id of the user to delete.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async tagDelete(tagid: string): Promise<boolean> {
|
|
||||||
if (!tagid || tagid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest(`/tag/${tagid}`, 'DELETE')
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Tag deletion failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all contact fields of the logged in user. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @return A associative object <field id> => <field name>
|
|
||||||
*/
|
|
||||||
async fieldIndex(): Promise<any> {
|
|
||||||
const res = await this.httpRequest('/field', 'GET', {}, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`Klicktipp Field index failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Subscribe an email. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
* @param listid (optional) The id subscription process.
|
|
||||||
* @param tagid (optional) The id of the manual tag the subscriber will be tagged with.
|
|
||||||
* @param fields (optional) Additional fields of the subscriber.
|
|
||||||
*
|
|
||||||
* @return An object representing the Klicktipp subscriber object.
|
|
||||||
*/
|
|
||||||
async subscribe(
|
|
||||||
email: string,
|
|
||||||
listid?: number,
|
|
||||||
tagid?: number,
|
|
||||||
fields?: any,
|
|
||||||
smsnumber?: string,
|
|
||||||
): Promise<any> {
|
|
||||||
if ((!email || email === '') && smsnumber === '') {
|
|
||||||
throw new Error('Illegal Arguments')
|
|
||||||
}
|
|
||||||
// subscribe
|
|
||||||
const data = {
|
|
||||||
email,
|
|
||||||
fields: fields !== undefined ? fields : {},
|
|
||||||
smsnumber: smsnumber !== undefined ? smsnumber : '',
|
|
||||||
listid: listid !== undefined ? listid : 0,
|
|
||||||
tagid: tagid !== undefined ? tagid : 0,
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/subscriber', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscription failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unsubscribe an email. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async unsubscribe(email: string): Promise<boolean> {
|
|
||||||
if (!email || email === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// unsubscribe
|
|
||||||
const data = { email }
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/subscriber/unsubscribe', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Unsubscription failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tag an email. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
* @param tagids an array of the manual tag(s) the subscriber will be tagged with.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async tag(email: string, tagids: string): Promise<boolean> {
|
|
||||||
if (!email || email === '' || !tagids || tagids === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// tag
|
|
||||||
const data = {
|
|
||||||
email,
|
|
||||||
tagids,
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/subscriber/tag', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Tagging failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Untag an email. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param mixed $email The email address of the subscriber.
|
|
||||||
* @param mixed $tagid The id of the manual tag that will be removed from the subscriber.
|
|
||||||
*
|
|
||||||
* @return TRUE on success.
|
|
||||||
*/
|
|
||||||
async untag(email: string, tagid: string): Promise<boolean> {
|
|
||||||
if (!email || email === '' || !tagid || tagid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// subscribe
|
|
||||||
const data = {
|
|
||||||
email,
|
|
||||||
tagid,
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/subscriber/untag', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Untagging failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Resend an autoresponder for an email address. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param email A valid email address
|
|
||||||
* @param autoresponder An id of the autoresponder
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async resend(email: string, autoresponder: string): Promise<boolean> {
|
|
||||||
if (!email || email === '' || !autoresponder || autoresponder === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// resend/reset autoresponder
|
|
||||||
const data = { email, autoresponder }
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/subscriber/resend', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Resend failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all active subscribers. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @return An array of subscriber ids.
|
|
||||||
*/
|
|
||||||
async subscriberIndex(): Promise<[string]> {
|
|
||||||
const res = await this.httpRequest('/subscriber', 'GET', undefined, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscriber index failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get subscriber information. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param subscriberid The subscriber id.
|
|
||||||
*
|
|
||||||
* @return An object representing the Klicktipp subscriber.
|
|
||||||
*/
|
|
||||||
async subscriberGet(subscriberid: string): Promise<any> {
|
|
||||||
if (!subscriberid || subscriberid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// retrieve
|
|
||||||
const res = await this.httpRequest(`/subscriber/${subscriberid}`, 'GET', {}, true)
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscriber get failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a subscriber id by email. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
*
|
|
||||||
* @return The id of the subscriber. Use subscriber_get to get subscriber details.
|
|
||||||
*/
|
|
||||||
async subscriberSearch(email: string): Promise<any> {
|
|
||||||
if (!email || email === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
// search
|
|
||||||
const data = { email }
|
|
||||||
const res = await this.httpRequest('/subscriber/search', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscriber search failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all active subscribers tagged with the given tag id. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param tagid The id of the tag.
|
|
||||||
*
|
|
||||||
* @return An array with id -> subscription date of the tagged subscribers. Use subscriber_get to get subscriber details.
|
|
||||||
*/
|
|
||||||
async subscriberTagged(tagid: string): Promise<any> {
|
|
||||||
if (!tagid || tagid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// search
|
|
||||||
const data = { tagid }
|
|
||||||
const res = await this.httpRequest('/subscriber/tagged', 'POST', data, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return res.data
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp subscriber tagged failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates a subscriber. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param subscriberid The id of the subscriber to update.
|
|
||||||
* @param fields (optional) The fields of the subscriber to update
|
|
||||||
* @param newemail (optional) The new email of the subscriber to update
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async subscriberUpdate(
|
|
||||||
subscriberid: string,
|
|
||||||
fields?: any,
|
|
||||||
newemail?: string,
|
|
||||||
newsmsnumber?: string,
|
|
||||||
): Promise<boolean> {
|
|
||||||
if (!subscriberid || subscriberid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// update
|
|
||||||
const data = {
|
|
||||||
fields: fields !== undefined ? fields : {},
|
|
||||||
newemail: newemail !== undefined ? newemail : '',
|
|
||||||
newsmsnumber: newsmsnumber !== undefined ? newsmsnumber : '',
|
|
||||||
}
|
|
||||||
const res = await this.httpRequest(`/subscriber/${subscriberid}`, 'PUT', data, true)
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscriber update failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Delete a subscribe. Requires to be logged in.
|
|
||||||
*
|
|
||||||
* @param subscriberid The id of the subscriber to update.
|
|
||||||
*
|
|
||||||
* @return TRUE on success.
|
|
||||||
*/
|
|
||||||
async subscriberDelete(subscriberid: string): Promise<boolean> {
|
|
||||||
if (!subscriberid || subscriberid === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete
|
|
||||||
const res = await this.httpRequest(`/subscriber/${subscriberid}`, 'DELETE', {}, true)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscriber deletion failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Subscribe an email. Requires an api key.
|
|
||||||
*
|
|
||||||
* @param apikey The api key (listbuildng configuration).
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
* @param fields (optional) Additional fields of the subscriber.
|
|
||||||
*
|
|
||||||
* @return A redirection url as defined in the subscription process.
|
|
||||||
*/
|
|
||||||
async signin(apikey: string, email: string, fields?: any, smsnumber?: string): Promise<boolean> {
|
|
||||||
if (!apikey || apikey === '' || ((!email || email === '') && smsnumber === '')) {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// subscribe
|
|
||||||
const data = {
|
|
||||||
apikey,
|
|
||||||
email,
|
|
||||||
fields: fields !== undefined ? fields : {},
|
|
||||||
smsnumber: smsnumber !== undefined ? smsnumber : '',
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await this.httpRequest('/subscriber/signin', 'POST', data)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Subscription failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Untag an email. Requires an api key.
|
|
||||||
*
|
|
||||||
* @param apikey The api key (listbuildng configuration).
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async signout(apikey: string, email: string): Promise<boolean> {
|
|
||||||
if (!apikey || apikey === '' || !email || email === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// untag
|
|
||||||
const data = { apikey, email }
|
|
||||||
const res = await this.httpRequest('/subscriber/signout', 'POST', data)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Untagging failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unsubscribe an email. Requires an api key.
|
|
||||||
*
|
|
||||||
* @param apikey The api key (listbuildng configuration).
|
|
||||||
* @param email The email address of the subscriber.
|
|
||||||
*
|
|
||||||
* @return TRUE on success
|
|
||||||
*/
|
|
||||||
async signoff(apikey: string, email: string): Promise<boolean> {
|
|
||||||
if (!apikey || apikey === '' || !email || email === '') {
|
|
||||||
throw new Error('Klicktipp Illegal Arguments')
|
|
||||||
}
|
|
||||||
|
|
||||||
// unsubscribe
|
|
||||||
const data = { apikey, email }
|
|
||||||
const res = await this.httpRequest('/subscriber/signoff', 'POST', data)
|
|
||||||
|
|
||||||
if (!res.isAxiosError) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
throw new Error(`Klicktipp Unsubscription failed: ${res.response.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
async httpRequest(path: string, method?: Method, data?: any, usesession?: boolean): Promise<any> {
|
|
||||||
if (method === undefined) {
|
|
||||||
method = 'GET'
|
|
||||||
}
|
|
||||||
const options: AxiosRequestConfig = {
|
|
||||||
baseURL: this.baseURL,
|
|
||||||
method,
|
|
||||||
url: path,
|
|
||||||
data,
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
Content: 'application/json',
|
|
||||||
Cookie:
|
|
||||||
usesession && this.sessionName !== '' ? `${this.sessionName}=${this.sessionId}` : '',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return axios(options)
|
|
||||||
.then((res) => res)
|
|
||||||
.catch((error) => error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -2,7 +2,6 @@ import { RIGHTS } from './RIGHTS'
|
|||||||
|
|
||||||
export const INALIENABLE_RIGHTS = [
|
export const INALIENABLE_RIGHTS = [
|
||||||
RIGHTS.LOGIN,
|
RIGHTS.LOGIN,
|
||||||
RIGHTS.GET_COMMUNITY_INFO,
|
|
||||||
RIGHTS.COMMUNITIES,
|
RIGHTS.COMMUNITIES,
|
||||||
RIGHTS.CREATE_USER,
|
RIGHTS.CREATE_USER,
|
||||||
RIGHTS.SEND_RESET_PASSWORD_EMAIL,
|
RIGHTS.SEND_RESET_PASSWORD_EMAIL,
|
||||||
|
|||||||
@ -2,7 +2,6 @@ export enum RIGHTS {
|
|||||||
LOGIN = 'LOGIN',
|
LOGIN = 'LOGIN',
|
||||||
VERIFY_LOGIN = 'VERIFY_LOGIN',
|
VERIFY_LOGIN = 'VERIFY_LOGIN',
|
||||||
BALANCE = 'BALANCE',
|
BALANCE = 'BALANCE',
|
||||||
GET_COMMUNITY_INFO = 'GET_COMMUNITY_INFO',
|
|
||||||
COMMUNITIES = 'COMMUNITIES',
|
COMMUNITIES = 'COMMUNITIES',
|
||||||
LIST_GDT_ENTRIES = 'LIST_GDT_ENTRIES',
|
LIST_GDT_ENTRIES = 'LIST_GDT_ENTRIES',
|
||||||
EXIST_PID = 'EXIST_PID',
|
EXIST_PID = 'EXIST_PID',
|
||||||
@ -44,14 +43,14 @@ export enum RIGHTS {
|
|||||||
ADMIN_CREATE_CONTRIBUTION = 'ADMIN_CREATE_CONTRIBUTION',
|
ADMIN_CREATE_CONTRIBUTION = 'ADMIN_CREATE_CONTRIBUTION',
|
||||||
ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION',
|
ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION',
|
||||||
ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION',
|
ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION',
|
||||||
LIST_UNCONFIRMED_CONTRIBUTIONS = 'LIST_UNCONFIRMED_CONTRIBUTIONS',
|
ADMIN_LIST_CONTRIBUTIONS = 'ADMIN_LIST_CONTRIBUTIONS',
|
||||||
CONFIRM_CONTRIBUTION = 'CONFIRM_CONTRIBUTION',
|
CONFIRM_CONTRIBUTION = 'CONFIRM_CONTRIBUTION',
|
||||||
SEND_ACTIVATION_EMAIL = 'SEND_ACTIVATION_EMAIL',
|
SEND_ACTIVATION_EMAIL = 'SEND_ACTIVATION_EMAIL',
|
||||||
CREATION_TRANSACTION_LIST = 'CREATION_TRANSACTION_LIST',
|
|
||||||
LIST_TRANSACTION_LINKS_ADMIN = 'LIST_TRANSACTION_LINKS_ADMIN',
|
LIST_TRANSACTION_LINKS_ADMIN = 'LIST_TRANSACTION_LINKS_ADMIN',
|
||||||
CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK',
|
CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK',
|
||||||
DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK',
|
DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK',
|
||||||
UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK',
|
UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK',
|
||||||
ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE',
|
ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE',
|
||||||
DENY_CONTRIBUTION = 'DENY_CONTRIBUTION',
|
DENY_CONTRIBUTION = 'DENY_CONTRIBUTION',
|
||||||
|
ADMIN_OPEN_CREATIONS = 'ADMIN_OPEN_CREATIONS',
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,7 +10,7 @@ Decimal.set({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const constants = {
|
const constants = {
|
||||||
DB_VERSION: '0060-update_communities_table',
|
DB_VERSION: '0064-event_rename',
|
||||||
DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0
|
DECAY_START_TIME: new Date('2021-05-13 17:46:31-0000'), // GMT+0
|
||||||
LOG4JS_CONFIG: 'log4js-config.json',
|
LOG4JS_CONFIG: 'log4js-config.json',
|
||||||
// default log level on production should be info
|
// default log level on production should be info
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/unbound-method */
|
||||||
import { createTransport } from 'nodemailer'
|
import { createTransport } from 'nodemailer'
|
||||||
import { logger, i18n } from '@test/testSetup'
|
import { logger, i18n } from '@test/testSetup'
|
||||||
import CONFIG from '@/config'
|
import CONFIG from '@/config'
|
||||||
@ -100,10 +102,12 @@ describe('sendEmailTranslated', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
it.skip('calls "i18n.setLocale" with "en"', () => {
|
it.skip('calls "i18n.setLocale" with "en"', () => {
|
||||||
expect(i18n.setLocale).toBeCalledWith('en')
|
expect(i18n.setLocale).toBeCalledWith('en')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// eslint-disable-next-line jest/no-disabled-tests
|
||||||
it.skip('calls "i18n.__" for translation', () => {
|
it.skip('calls "i18n.__" for translation', () => {
|
||||||
expect(i18n.__).toBeCalled()
|
expect(i18n.__).toBeCalled()
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
||||||
import CONFIG from '@/config'
|
import CONFIG from '@/config'
|
||||||
import { backendLogger as logger } from '@/server/logger'
|
import { backendLogger as logger } from '@/server/logger'
|
||||||
import path from 'path'
|
import path from 'path'
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
import Decimal from 'decimal.js-light'
|
import Decimal from 'decimal.js-light'
|
||||||
import { testEnvironment } from '@test/helpers'
|
import { testEnvironment } from '@test/helpers'
|
||||||
import { logger, i18n as localization } from '@test/testSetup'
|
import { logger, i18n as localization } from '@test/testSetup'
|
||||||
|
|||||||
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_CONFIRM.ts
Normal file
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_CONFIRM.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_CONFIRM = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_CONFIRM,
|
||||||
|
user,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_CREATE.ts
Normal file
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_CREATE.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_CREATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_CREATE,
|
||||||
|
user,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_DELETE.ts
Normal file
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_DELETE.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_DELETE = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_DELETE,
|
||||||
|
user,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_DENY.ts
Normal file
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_DENY.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_DENY = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_DENY,
|
||||||
|
user,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
23
backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_CREATE.ts
Normal file
23
backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_CREATE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_LINK_CREATE = async (
|
||||||
|
moderator: DbUser,
|
||||||
|
contributionLink: DbContributionLink,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_LINK_CREATE,
|
||||||
|
{ id: 0 } as DbUser,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contributionLink,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
20
backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_DELETE.ts
Normal file
20
backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_DELETE.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_LINK_DELETE = async (
|
||||||
|
moderator: DbUser,
|
||||||
|
contributionLink: DbContributionLink,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_LINK_DELETE,
|
||||||
|
{ id: 0 } as DbUser,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contributionLink,
|
||||||
|
).save()
|
||||||
23
backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE.ts
Normal file
23
backend/src/event/EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE = async (
|
||||||
|
moderator: DbUser,
|
||||||
|
contributionLink: DbContributionLink,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_LINK_UPDATE,
|
||||||
|
{ id: 0 } as DbUser,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contributionLink,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
23
backend/src/event/EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE.ts
Normal file
23
backend/src/event/EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
contributionMessage: DbContributionMessage,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_MESSAGE_CREATE,
|
||||||
|
user,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
contributionMessage,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_UPDATE.ts
Normal file
24
backend/src/event/EVENT_ADMIN_CONTRIBUTION_UPDATE.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.ADMIN_CONTRIBUTION_UPDATE,
|
||||||
|
user,
|
||||||
|
moderator,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
6
backend/src/event/EVENT_ADMIN_USER_DELETE.ts
Normal file
6
backend/src/event/EVENT_ADMIN_USER_DELETE.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_USER_DELETE = async (user: DbUser, moderator: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.ADMIN_USER_DELETE, user, moderator).save()
|
||||||
8
backend/src/event/EVENT_ADMIN_USER_ROLE_SET.ts
Normal file
8
backend/src/event/EVENT_ADMIN_USER_ROLE_SET.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_USER_ROLE_SET = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
): Promise<DbEvent> => Event(EventType.ADMIN_USER_ROLE_SET, user, moderator).save()
|
||||||
8
backend/src/event/EVENT_ADMIN_USER_UNDELETE.ts
Normal file
8
backend/src/event/EVENT_ADMIN_USER_UNDELETE.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_ADMIN_USER_UNDELETE = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
): Promise<DbEvent> => Event(EventType.ADMIN_USER_UNDELETE, user, moderator).save()
|
||||||
23
backend/src/event/EVENT_CONTRIBUTION_CREATE.ts
Normal file
23
backend/src/event/EVENT_CONTRIBUTION_CREATE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_CONTRIBUTION_CREATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.CONTRIBUTION_CREATE,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
23
backend/src/event/EVENT_CONTRIBUTION_DELETE.ts
Normal file
23
backend/src/event/EVENT_CONTRIBUTION_DELETE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_CONTRIBUTION_DELETE = async (
|
||||||
|
user: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.CONTRIBUTION_DELETE,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
27
backend/src/event/EVENT_CONTRIBUTION_LINK_REDEEM.ts
Normal file
27
backend/src/event/EVENT_CONTRIBUTION_LINK_REDEEM.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_CONTRIBUTION_LINK_REDEEM = async (
|
||||||
|
user: DbUser,
|
||||||
|
transaction: DbTransaction,
|
||||||
|
contribution: DbContribution,
|
||||||
|
contributionLink: DbContributionLink,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.CONTRIBUTION_LINK_REDEEM,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
transaction,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contributionLink,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
22
backend/src/event/EVENT_CONTRIBUTION_MESSAGE_CREATE.ts
Normal file
22
backend/src/event/EVENT_CONTRIBUTION_MESSAGE_CREATE.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_CONTRIBUTION_MESSAGE_CREATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
contributionMessage: DbContributionMessage,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.CONTRIBUTION_MESSAGE_CREATE,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
contributionMessage,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
).save()
|
||||||
23
backend/src/event/EVENT_CONTRIBUTION_UPDATE.ts
Normal file
23
backend/src/event/EVENT_CONTRIBUTION_UPDATE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_CONTRIBUTION_UPDATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
contribution: DbContribution,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.CONTRIBUTION_UPDATE,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
contribution,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.EMAIL_ACCOUNT_MULTIREGISTRATION, user, { id: 0 } as DbUser).save()
|
||||||
8
backend/src/event/EVENT_EMAIL_ADMIN_CONFIRMATION.ts
Normal file
8
backend/src/event/EVENT_EMAIL_ADMIN_CONFIRMATION.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_EMAIL_ADMIN_CONFIRMATION = async (
|
||||||
|
user: DbUser,
|
||||||
|
moderator: DbUser,
|
||||||
|
): Promise<DbEvent> => Event(EventType.EMAIL_ADMIN_CONFIRMATION, user, moderator).save()
|
||||||
6
backend/src/event/EVENT_EMAIL_CONFIRMATION.ts
Normal file
6
backend/src/event/EVENT_EMAIL_CONFIRMATION.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_EMAIL_CONFIRMATION = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.EMAIL_CONFIRMATION, user, user).save()
|
||||||
6
backend/src/event/EVENT_EMAIL_FORGOT_PASSWORD.ts
Normal file
6
backend/src/event/EVENT_EMAIL_FORGOT_PASSWORD.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_EMAIL_FORGOT_PASSWORD = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.EMAIL_FORGOT_PASSWORD, user, { id: 0 } as DbUser).save()
|
||||||
23
backend/src/event/EVENT_TRANSACTION_LINK_CREATE.ts
Normal file
23
backend/src/event/EVENT_TRANSACTION_LINK_CREATE.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_TRANSACTION_LINK_CREATE = async (
|
||||||
|
user: DbUser,
|
||||||
|
transactionLink: DbTransactionLink,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.TRANSACTION_LINK_CREATE,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
transactionLink,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
19
backend/src/event/EVENT_TRANSACTION_LINK_DELETE.ts
Normal file
19
backend/src/event/EVENT_TRANSACTION_LINK_DELETE.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_TRANSACTION_LINK_DELETE = async (
|
||||||
|
user: DbUser,
|
||||||
|
transactionLink: DbTransactionLink,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.TRANSACTION_LINK_DELETE,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
transactionLink,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_TRANSACTION_LINK_REDEEM.ts
Normal file
24
backend/src/event/EVENT_TRANSACTION_LINK_REDEEM.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_TRANSACTION_LINK_REDEEM = async (
|
||||||
|
user: DbUser,
|
||||||
|
senderUser: DbUser,
|
||||||
|
transactionLink: DbTransactionLink,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.TRANSACTION_LINK_REDEEM,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
senderUser,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
transactionLink,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_TRANSACTION_RECEIVE.ts
Normal file
24
backend/src/event/EVENT_TRANSACTION_RECEIVE.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_TRANSACTION_RECEIVE = async (
|
||||||
|
user: DbUser,
|
||||||
|
involvedUser: DbUser,
|
||||||
|
transaction: DbTransaction,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.TRANSACTION_RECEIVE,
|
||||||
|
user,
|
||||||
|
involvedUser,
|
||||||
|
involvedUser,
|
||||||
|
transaction,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
24
backend/src/event/EVENT_TRANSACTION_SEND.ts
Normal file
24
backend/src/event/EVENT_TRANSACTION_SEND.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
import Decimal from 'decimal.js-light'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_TRANSACTION_SEND = async (
|
||||||
|
user: DbUser,
|
||||||
|
involvedUser: DbUser,
|
||||||
|
transaction: DbTransaction,
|
||||||
|
amount: Decimal,
|
||||||
|
): Promise<DbEvent> =>
|
||||||
|
Event(
|
||||||
|
EventType.TRANSACTION_SEND,
|
||||||
|
user,
|
||||||
|
user,
|
||||||
|
involvedUser,
|
||||||
|
transaction,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
amount,
|
||||||
|
).save()
|
||||||
6
backend/src/event/EVENT_USER_ACTIVATE_ACCOUNT.ts
Normal file
6
backend/src/event/EVENT_USER_ACTIVATE_ACCOUNT.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_USER_ACTIVATE_ACCOUNT = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.USER_ACTIVATE_ACCOUNT, user, user).save()
|
||||||
6
backend/src/event/EVENT_USER_INFO_UPDATE.ts
Normal file
6
backend/src/event/EVENT_USER_INFO_UPDATE.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_USER_INFO_UPDATE = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.USER_INFO_UPDATE, user, user).save()
|
||||||
6
backend/src/event/EVENT_USER_LOGIN.ts
Normal file
6
backend/src/event/EVENT_USER_LOGIN.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_USER_LOGIN = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.USER_LOGIN, user, user).save()
|
||||||
6
backend/src/event/EVENT_USER_LOGOUT.ts
Normal file
6
backend/src/event/EVENT_USER_LOGOUT.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_USER_LOGOUT = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.USER_LOGOUT, user, user).save()
|
||||||
6
backend/src/event/EVENT_USER_REGISTER.ts
Normal file
6
backend/src/event/EVENT_USER_REGISTER.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { Event, EventType } from './Event'
|
||||||
|
|
||||||
|
export const EVENT_USER_REGISTER = async (user: DbUser): Promise<DbEvent> =>
|
||||||
|
Event(EventType.USER_REGISTER, user, user).save()
|
||||||
@ -1,212 +1,69 @@
|
|||||||
import { EventProtocol as DbEvent } from '@entity/EventProtocol'
|
import { Event as DbEvent } from '@entity/Event'
|
||||||
|
import { User as DbUser } from '@entity/User'
|
||||||
|
import { Transaction as DbTransaction } from '@entity/Transaction'
|
||||||
|
import { TransactionLink as DbTransactionLink } from '@entity/TransactionLink'
|
||||||
|
import { Contribution as DbContribution } from '@entity/Contribution'
|
||||||
|
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
|
||||||
|
import { ContributionLink as DbContributionLink } from '@entity/ContributionLink'
|
||||||
import Decimal from 'decimal.js-light'
|
import Decimal from 'decimal.js-light'
|
||||||
import { EventProtocolType } from './EventProtocolType'
|
import { EventType } from './Event'
|
||||||
|
|
||||||
export const Event = (
|
export const Event = (
|
||||||
type: EventProtocolType,
|
type: EventType,
|
||||||
userId: number,
|
affectedUser: DbUser,
|
||||||
xUserId: number | null = null,
|
actingUser: DbUser,
|
||||||
xCommunityId: number | null = null,
|
involvedUser: DbUser | null = null,
|
||||||
transactionId: number | null = null,
|
involvedTransaction: DbTransaction | null = null,
|
||||||
contributionId: number | null = null,
|
involvedContribution: DbContribution | null = null,
|
||||||
|
involvedContributionMessage: DbContributionMessage | null = null,
|
||||||
|
involvedTransactionLink: DbTransactionLink | null = null,
|
||||||
|
involvedContributionLink: DbContributionLink | null = null,
|
||||||
amount: Decimal | null = null,
|
amount: Decimal | null = null,
|
||||||
messageId: number | null = null,
|
|
||||||
): DbEvent => {
|
): DbEvent => {
|
||||||
const event = new DbEvent()
|
const event = new DbEvent()
|
||||||
event.type = type
|
event.type = type
|
||||||
event.userId = userId
|
event.affectedUser = affectedUser
|
||||||
event.xUserId = xUserId
|
event.actingUser = actingUser
|
||||||
event.xCommunityId = xCommunityId
|
event.involvedUser = involvedUser
|
||||||
event.transactionId = transactionId
|
event.involvedTransaction = involvedTransaction
|
||||||
event.contributionId = contributionId
|
event.involvedContribution = involvedContribution
|
||||||
|
event.involvedContributionMessage = involvedContributionMessage
|
||||||
|
event.involvedTransactionLink = involvedTransactionLink
|
||||||
|
event.involvedContributionLink = involvedContributionLink
|
||||||
event.amount = amount
|
event.amount = amount
|
||||||
event.messageId = messageId
|
|
||||||
return event
|
return event
|
||||||
}
|
}
|
||||||
|
|
||||||
export const EVENT_CONTRIBUTION_CREATE = async (
|
export { EventType } from './EventType'
|
||||||
userId: number,
|
|
||||||
contributionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.CONTRIBUTION_CREATE,
|
|
||||||
userId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
contributionId,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_CONTRIBUTION_DELETE = async (
|
export { EVENT_ADMIN_CONTRIBUTION_CONFIRM } from './EVENT_ADMIN_CONTRIBUTION_CONFIRM'
|
||||||
userId: number,
|
export { EVENT_ADMIN_CONTRIBUTION_CREATE } from './EVENT_ADMIN_CONTRIBUTION_CREATE'
|
||||||
contributionId: number,
|
export { EVENT_ADMIN_CONTRIBUTION_DELETE } from './EVENT_ADMIN_CONTRIBUTION_DELETE'
|
||||||
amount: Decimal,
|
export { EVENT_ADMIN_CONTRIBUTION_DENY } from './EVENT_ADMIN_CONTRIBUTION_DENY'
|
||||||
): Promise<DbEvent> =>
|
export { EVENT_ADMIN_CONTRIBUTION_UPDATE } from './EVENT_ADMIN_CONTRIBUTION_UPDATE'
|
||||||
Event(
|
export { EVENT_ADMIN_CONTRIBUTION_LINK_CREATE } from './EVENT_ADMIN_CONTRIBUTION_LINK_CREATE'
|
||||||
EventProtocolType.CONTRIBUTION_DELETE,
|
export { EVENT_ADMIN_CONTRIBUTION_LINK_DELETE } from './EVENT_ADMIN_CONTRIBUTION_LINK_DELETE'
|
||||||
userId,
|
export { EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE } from './EVENT_ADMIN_CONTRIBUTION_LINK_UPDATE'
|
||||||
null,
|
export { EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE } from './EVENT_ADMIN_CONTRIBUTION_MESSAGE_CREATE'
|
||||||
null,
|
export { EVENT_ADMIN_USER_DELETE } from './EVENT_ADMIN_USER_DELETE'
|
||||||
null,
|
export { EVENT_ADMIN_USER_UNDELETE } from './EVENT_ADMIN_USER_UNDELETE'
|
||||||
contributionId,
|
export { EVENT_ADMIN_USER_ROLE_SET } from './EVENT_ADMIN_USER_ROLE_SET'
|
||||||
amount,
|
export { EVENT_CONTRIBUTION_CREATE } from './EVENT_CONTRIBUTION_CREATE'
|
||||||
).save()
|
export { EVENT_CONTRIBUTION_DELETE } from './EVENT_CONTRIBUTION_DELETE'
|
||||||
|
export { EVENT_CONTRIBUTION_UPDATE } from './EVENT_CONTRIBUTION_UPDATE'
|
||||||
export const EVENT_CONTRIBUTION_UPDATE = async (
|
export { EVENT_CONTRIBUTION_MESSAGE_CREATE } from './EVENT_CONTRIBUTION_MESSAGE_CREATE'
|
||||||
userId: number,
|
export { EVENT_CONTRIBUTION_LINK_REDEEM } from './EVENT_CONTRIBUTION_LINK_REDEEM'
|
||||||
contributionId: number,
|
export { EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION } from './EVENT_EMAIL_ACCOUNT_MULTIREGISTRATION'
|
||||||
amount: Decimal,
|
export { EVENT_EMAIL_ADMIN_CONFIRMATION } from './EVENT_EMAIL_ADMIN_CONFIRMATION'
|
||||||
): Promise<DbEvent> =>
|
export { EVENT_EMAIL_CONFIRMATION } from './EVENT_EMAIL_CONFIRMATION'
|
||||||
Event(
|
export { EVENT_EMAIL_FORGOT_PASSWORD } from './EVENT_EMAIL_FORGOT_PASSWORD'
|
||||||
EventProtocolType.CONTRIBUTION_UPDATE,
|
export { EVENT_TRANSACTION_SEND } from './EVENT_TRANSACTION_SEND'
|
||||||
userId,
|
export { EVENT_TRANSACTION_RECEIVE } from './EVENT_TRANSACTION_RECEIVE'
|
||||||
null,
|
export { EVENT_TRANSACTION_LINK_CREATE } from './EVENT_TRANSACTION_LINK_CREATE'
|
||||||
null,
|
export { EVENT_TRANSACTION_LINK_DELETE } from './EVENT_TRANSACTION_LINK_DELETE'
|
||||||
null,
|
export { EVENT_TRANSACTION_LINK_REDEEM } from './EVENT_TRANSACTION_LINK_REDEEM'
|
||||||
contributionId,
|
export { EVENT_USER_ACTIVATE_ACCOUNT } from './EVENT_USER_ACTIVATE_ACCOUNT'
|
||||||
amount,
|
export { EVENT_USER_INFO_UPDATE } from './EVENT_USER_INFO_UPDATE'
|
||||||
).save()
|
export { EVENT_USER_LOGIN } from './EVENT_USER_LOGIN'
|
||||||
|
export { EVENT_USER_LOGOUT } from './EVENT_USER_LOGOUT'
|
||||||
export const EVENT_ADMIN_CONTRIBUTION_CREATE = async (
|
export { EVENT_USER_REGISTER } from './EVENT_USER_REGISTER'
|
||||||
userId: number,
|
|
||||||
contributionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.ADMIN_CONTRIBUTION_CREATE,
|
|
||||||
userId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
contributionId,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_ADMIN_CONTRIBUTION_UPDATE = async (
|
|
||||||
userId: number,
|
|
||||||
contributionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.ADMIN_CONTRIBUTION_UPDATE,
|
|
||||||
userId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
contributionId,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_ADMIN_CONTRIBUTION_DELETE = async (
|
|
||||||
userId: number,
|
|
||||||
contributionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.ADMIN_CONTRIBUTION_DELETE,
|
|
||||||
userId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
contributionId,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_CONTRIBUTION_CONFIRM = async (
|
|
||||||
userId: number,
|
|
||||||
contributionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.CONTRIBUTION_CONFIRM,
|
|
||||||
userId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
contributionId,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_ADMIN_CONTRIBUTION_DENY = async (
|
|
||||||
userId: number,
|
|
||||||
xUserId: number,
|
|
||||||
contributionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.ADMIN_CONTRIBUTION_DENY,
|
|
||||||
userId,
|
|
||||||
xUserId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
contributionId,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_TRANSACTION_SEND = async (
|
|
||||||
userId: number,
|
|
||||||
xUserId: number,
|
|
||||||
transactionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.TRANSACTION_SEND,
|
|
||||||
userId,
|
|
||||||
xUserId,
|
|
||||||
null,
|
|
||||||
transactionId,
|
|
||||||
null,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_TRANSACTION_RECEIVE = async (
|
|
||||||
userId: number,
|
|
||||||
xUserId: number,
|
|
||||||
transactionId: number,
|
|
||||||
amount: Decimal,
|
|
||||||
): Promise<DbEvent> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.TRANSACTION_RECEIVE,
|
|
||||||
userId,
|
|
||||||
xUserId,
|
|
||||||
null,
|
|
||||||
transactionId,
|
|
||||||
null,
|
|
||||||
amount,
|
|
||||||
).save()
|
|
||||||
|
|
||||||
export const EVENT_LOGIN = async (userId: number): Promise<DbEvent> =>
|
|
||||||
Event(EventProtocolType.LOGIN, userId, null, null, null, null, null, null).save()
|
|
||||||
|
|
||||||
export const EVENT_SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = async (
|
|
||||||
userId: number,
|
|
||||||
): Promise<DbEvent> => Event(EventProtocolType.SEND_ACCOUNT_MULTIREGISTRATION_EMAIL, userId).save()
|
|
||||||
|
|
||||||
export const EVENT_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise<DbEvent> =>
|
|
||||||
Event(EventProtocolType.SEND_CONFIRMATION_EMAIL, userId).save()
|
|
||||||
|
|
||||||
export const EVENT_ADMIN_SEND_CONFIRMATION_EMAIL = async (userId: number): Promise<DbEvent> =>
|
|
||||||
Event(EventProtocolType.ADMIN_SEND_CONFIRMATION_EMAIL, userId).save()
|
|
||||||
|
|
||||||
/* export const EVENT_REDEEM_REGISTER = async (
|
|
||||||
userId: number,
|
|
||||||
transactionId: number | null = null,
|
|
||||||
contributionId: number | null = null,
|
|
||||||
): Promise<Event> =>
|
|
||||||
Event(
|
|
||||||
EventProtocolType.REDEEM_REGISTER,
|
|
||||||
userId,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
transactionId,
|
|
||||||
contributionId,
|
|
||||||
).save()
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const EVENT_REGISTER = async (userId: number): Promise<DbEvent> =>
|
|
||||||
Event(EventProtocolType.REGISTER, userId).save()
|
|
||||||
|
|
||||||
export const EVENT_ACTIVATE_ACCOUNT = async (userId: number): Promise<DbEvent> =>
|
|
||||||
Event(EventProtocolType.ACTIVATE_ACCOUNT, userId).save()
|
|
||||||
|
|||||||
@ -1,50 +1,58 @@
|
|||||||
export enum EventProtocolType {
|
export enum EventType {
|
||||||
// VISIT_GRADIDO = 'VISIT_GRADIDO',
|
// TODO CONTRIBUTION_CONFIRM = 'CONTRIBUTION_CONFIRM',
|
||||||
REGISTER = 'REGISTER',
|
ADMIN_CONTRIBUTION_CONFIRM = 'ADMIN_CONTRIBUTION_CONFIRM',
|
||||||
REDEEM_REGISTER = 'REDEEM_REGISTER',
|
|
||||||
// VERIFY_REDEEM = 'VERIFY_REDEEM',
|
|
||||||
// INACTIVE_ACCOUNT = 'INACTIVE_ACCOUNT',
|
|
||||||
SEND_CONFIRMATION_EMAIL = 'SEND_CONFIRMATION_EMAIL',
|
|
||||||
ADMIN_SEND_CONFIRMATION_EMAIL = 'ADMIN_SEND_CONFIRMATION_EMAIL',
|
|
||||||
SEND_ACCOUNT_MULTIREGISTRATION_EMAIL = 'SEND_ACCOUNT_MULTIREGISTRATION_EMAIL',
|
|
||||||
// CONFIRM_EMAIL = 'CONFIRM_EMAIL',
|
|
||||||
// REGISTER_EMAIL_KLICKTIPP = 'REGISTER_EMAIL_KLICKTIPP',
|
|
||||||
LOGIN = 'LOGIN',
|
|
||||||
// LOGOUT = 'LOGOUT',
|
|
||||||
// REDEEM_LOGIN = 'REDEEM_LOGIN',
|
|
||||||
ACTIVATE_ACCOUNT = 'ACTIVATE_ACCOUNT',
|
|
||||||
// SEND_FORGOT_PASSWORD_EMAIL = 'SEND_FORGOT_PASSWORD_EMAIL',
|
|
||||||
// PASSWORD_CHANGE = 'PASSWORD_CHANGE',
|
|
||||||
// SEND_TRANSACTION_SEND_EMAIL = 'SEND_TRANSACTION_SEND_EMAIL',
|
|
||||||
// SEND_TRANSACTION_RECEIVE_EMAIL = 'SEND_TRANSACTION_RECEIVE_EMAIL',
|
|
||||||
TRANSACTION_SEND = 'TRANSACTION_SEND',
|
|
||||||
// TRANSACTION_SEND_REDEEM = 'TRANSACTION_SEND_REDEEM',
|
|
||||||
// TRANSACTION_REPEATE_REDEEM = 'TRANSACTION_REPEATE_REDEEM',
|
|
||||||
// TRANSACTION_CREATION = 'TRANSACTION_CREATION',
|
|
||||||
TRANSACTION_RECEIVE = 'TRANSACTION_RECEIVE',
|
|
||||||
// TRANSACTION_RECEIVE_REDEEM = 'TRANSACTION_RECEIVE_REDEEM',
|
|
||||||
// SEND_TRANSACTION_LINK_REDEEM_EMAIL = 'SEND_TRANSACTION_LINK_REDEEM_EMAIL',
|
|
||||||
// SEND_ADDED_CONTRIBUTION_EMAIL = 'SEND_ADDED_CONTRIBUTION_EMAIL',
|
|
||||||
// SEND_CONTRIBUTION_CONFIRM_EMAIL = 'SEND_CONTRIBUTION_CONFIRM_EMAIL',
|
|
||||||
CONTRIBUTION_CREATE = 'CONTRIBUTION_CREATE',
|
|
||||||
CONTRIBUTION_CONFIRM = 'CONTRIBUTION_CONFIRM',
|
|
||||||
// CONTRIBUTION_DENY = 'CONTRIBUTION_DENY',
|
|
||||||
// CONTRIBUTION_LINK_DEFINE = 'CONTRIBUTION_LINK_DEFINE',
|
|
||||||
// CONTRIBUTION_LINK_ACTIVATE_REDEEM = 'CONTRIBUTION_LINK_ACTIVATE_REDEEM',
|
|
||||||
CONTRIBUTION_DELETE = 'CONTRIBUTION_DELETE',
|
|
||||||
CONTRIBUTION_UPDATE = 'CONTRIBUTION_UPDATE',
|
|
||||||
ADMIN_CONTRIBUTION_CREATE = 'ADMIN_CONTRIBUTION_CREATE',
|
ADMIN_CONTRIBUTION_CREATE = 'ADMIN_CONTRIBUTION_CREATE',
|
||||||
ADMIN_CONTRIBUTION_DELETE = 'ADMIN_CONTRIBUTION_DELETE',
|
ADMIN_CONTRIBUTION_DELETE = 'ADMIN_CONTRIBUTION_DELETE',
|
||||||
ADMIN_CONTRIBUTION_DENY = 'ADMIN_CONTRIBUTION_DENY',
|
ADMIN_CONTRIBUTION_DENY = 'ADMIN_CONTRIBUTION_DENY',
|
||||||
ADMIN_CONTRIBUTION_UPDATE = 'ADMIN_CONTRIBUTION_UPDATE',
|
ADMIN_CONTRIBUTION_UPDATE = 'ADMIN_CONTRIBUTION_UPDATE',
|
||||||
|
ADMIN_CONTRIBUTION_LINK_CREATE = 'ADMIN_CONTRIBUTION_LINK_CREATE',
|
||||||
|
ADMIN_CONTRIBUTION_LINK_DELETE = 'ADMIN_CONTRIBUTION_LINK_DELETE',
|
||||||
|
ADMIN_CONTRIBUTION_LINK_UPDATE = 'ADMIN_CONTRIBUTION_LINK_UPDATE',
|
||||||
|
ADMIN_CONTRIBUTION_MESSAGE_CREATE = 'ADMIN_CONTRIBUTION_MESSAGE_CREATE',
|
||||||
|
ADMIN_USER_DELETE = 'ADMIN_USER_DELETE',
|
||||||
|
ADMIN_USER_UNDELETE = 'ADMIN_USER_UNDELETE',
|
||||||
|
ADMIN_USER_ROLE_SET = 'ADMIN_USER_ROLE_SET',
|
||||||
|
CONTRIBUTION_CREATE = 'CONTRIBUTION_CREATE',
|
||||||
|
CONTRIBUTION_DELETE = 'CONTRIBUTION_DELETE',
|
||||||
|
CONTRIBUTION_UPDATE = 'CONTRIBUTION_UPDATE',
|
||||||
|
CONTRIBUTION_MESSAGE_CREATE = 'CONTRIBUTION_MESSAGE_CREATE',
|
||||||
|
CONTRIBUTION_LINK_REDEEM = 'CONTRIBUTION_LINK_REDEEM',
|
||||||
|
EMAIL_ACCOUNT_MULTIREGISTRATION = 'EMAIL_ACCOUNT_MULTIREGISTRATION',
|
||||||
|
EMAIL_ADMIN_CONFIRMATION = 'EMAIL_ADMIN_CONFIRMATION',
|
||||||
|
EMAIL_CONFIRMATION = 'EMAIL_CONFIRMATION',
|
||||||
|
EMAIL_FORGOT_PASSWORD = 'EMAIL_FORGOT_PASSWORD',
|
||||||
|
TRANSACTION_SEND = 'TRANSACTION_SEND',
|
||||||
|
TRANSACTION_RECEIVE = 'TRANSACTION_RECEIVE',
|
||||||
|
TRANSACTION_LINK_CREATE = 'TRANSACTION_LINK_CREATE',
|
||||||
|
TRANSACTION_LINK_DELETE = 'TRANSACTION_LINK_DELETE',
|
||||||
|
TRANSACTION_LINK_REDEEM = 'TRANSACTION_LINK_REDEEM',
|
||||||
|
USER_ACTIVATE_ACCOUNT = 'ACTIVATE_ACCOUNT',
|
||||||
|
USER_INFO_UPDATE = 'USER_INFO_UPDATE',
|
||||||
|
USER_LOGIN = 'USER_LOGIN',
|
||||||
|
USER_LOGOUT = 'USER_LOGOUT',
|
||||||
|
USER_REGISTER = 'USER_REGISTER',
|
||||||
|
USER_REGISTER_REDEEM = 'USER_REGISTER_REDEEM',
|
||||||
|
// VISIT_GRADIDO = 'VISIT_GRADIDO',
|
||||||
|
// VERIFY_REDEEM = 'VERIFY_REDEEM',
|
||||||
|
// INACTIVE_ACCOUNT = 'INACTIVE_ACCOUNT',
|
||||||
|
// CONFIRM_EMAIL = 'CONFIRM_EMAIL',
|
||||||
|
// REGISTER_EMAIL_KLICKTIPP = 'REGISTER_EMAIL_KLICKTIPP',
|
||||||
|
// REDEEM_LOGIN = 'REDEEM_LOGIN',
|
||||||
|
// SEND_FORGOT_PASSWORD_EMAIL = 'SEND_FORGOT_PASSWORD_EMAIL',
|
||||||
|
// PASSWORD_CHANGE = 'PASSWORD_CHANGE',
|
||||||
|
// SEND_TRANSACTION_SEND_EMAIL = 'SEND_TRANSACTION_SEND_EMAIL',
|
||||||
|
// SEND_TRANSACTION_RECEIVE_EMAIL = 'SEND_TRANSACTION_RECEIVE_EMAIL',
|
||||||
|
// TRANSACTION_SEND_REDEEM = 'TRANSACTION_SEND_REDEEM',
|
||||||
|
// TRANSACTION_REPEATE_REDEEM = 'TRANSACTION_REPEATE_REDEEM',
|
||||||
|
// TRANSACTION_CREATION = 'TRANSACTION_CREATION',
|
||||||
|
// TRANSACTION_RECEIVE_REDEEM = 'TRANSACTION_RECEIVE_REDEEM',
|
||||||
|
// SEND_TRANSACTION_LINK_REDEEM_EMAIL = 'SEND_TRANSACTION_LINK_REDEEM_EMAIL',
|
||||||
|
// SEND_ADDED_CONTRIBUTION_EMAIL = 'SEND_ADDED_CONTRIBUTION_EMAIL',
|
||||||
|
// SEND_CONTRIBUTION_CONFIRM_EMAIL = 'SEND_CONTRIBUTION_CONFIRM_EMAIL',
|
||||||
|
// CONTRIBUTION_LINK_ACTIVATE_REDEEM = 'CONTRIBUTION_LINK_ACTIVATE_REDEEM',
|
||||||
// USER_CREATE_CONTRIBUTION_MESSAGE = 'USER_CREATE_CONTRIBUTION_MESSAGE',
|
// USER_CREATE_CONTRIBUTION_MESSAGE = 'USER_CREATE_CONTRIBUTION_MESSAGE',
|
||||||
// ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE',
|
// ADMIN_CREATE_CONTRIBUTION_MESSAGE = 'ADMIN_CREATE_CONTRIBUTION_MESSAGE',
|
||||||
// DELETE_USER = 'DELETE_USER',
|
// DELETE_USER = 'DELETE_USER',
|
||||||
// UNDELETE_USER = 'UNDELETE_USER',
|
// UNDELETE_USER = 'UNDELETE_USER',
|
||||||
// CHANGE_USER_ROLE = 'CHANGE_USER_ROLE',
|
// CHANGE_USER_ROLE = 'CHANGE_USER_ROLE',
|
||||||
// ADMIN_UPDATE_CONTRIBUTION = 'ADMIN_UPDATE_CONTRIBUTION',
|
|
||||||
// ADMIN_DELETE_CONTRIBUTION = 'ADMIN_DELETE_CONTRIBUTION',
|
|
||||||
// CREATE_CONTRIBUTION_LINK = 'CREATE_CONTRIBUTION_LINK',
|
|
||||||
// DELETE_CONTRIBUTION_LINK = 'DELETE_CONTRIBUTION_LINK',
|
|
||||||
// UPDATE_CONTRIBUTION_LINK = 'UPDATE_CONTRIBUTION_LINK',
|
|
||||||
}
|
}
|
||||||
@ -1,3 +1,6 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
import { gql } from 'graphql-request'
|
import { gql } from 'graphql-request'
|
||||||
import { backendLogger as logger } from '@/server/logger'
|
import { backendLogger as logger } from '@/server/logger'
|
||||||
import { Community as DbCommunity } from '@entity/Community'
|
import { Community as DbCommunity } from '@entity/Community'
|
||||||
@ -18,9 +21,13 @@ export async function requestGetPublicKey(dbCom: DbCommunity): Promise<string |
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
const variables = {}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest(query)
|
const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest(
|
||||||
|
query,
|
||||||
|
variables,
|
||||||
|
)
|
||||||
logger.debug(`Response-Data:`, data, errors, extensions, headers, status)
|
logger.debug(`Response-Data:`, data, errors, extensions, headers, status)
|
||||||
if (data) {
|
if (data) {
|
||||||
logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey)
|
logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey)
|
||||||
|
|||||||
@ -1,3 +1,6 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-return */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
import { gql } from 'graphql-request'
|
import { gql } from 'graphql-request'
|
||||||
import { backendLogger as logger } from '@/server/logger'
|
import { backendLogger as logger } from '@/server/logger'
|
||||||
import { Community as DbCommunity } from '@entity/Community'
|
import { Community as DbCommunity } from '@entity/Community'
|
||||||
@ -18,9 +21,13 @@ export async function requestGetPublicKey(dbCom: DbCommunity): Promise<string |
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
const variables = {}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest(query)
|
const { data, errors, extensions, headers, status } = await graphQLClient.rawRequest(
|
||||||
|
query,
|
||||||
|
variables,
|
||||||
|
)
|
||||||
logger.debug(`Response-Data:`, data, errors, extensions, headers, status)
|
logger.debug(`Response-Data:`, data, errors, extensions, headers, status)
|
||||||
if (data) {
|
if (data) {
|
||||||
logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey)
|
logger.debug(`Response-PublicKey:`, data.getPublicKey.publicKey)
|
||||||
|
|||||||
@ -1,8 +1,14 @@
|
|||||||
import { GraphQLClient } from 'graphql-request'
|
import { GraphQLClient } from 'graphql-request'
|
||||||
import { PatchedRequestInit } from 'graphql-request/dist/types'
|
import { PatchedRequestInit } from 'graphql-request/dist/types'
|
||||||
|
|
||||||
|
type ClientInstance = {
|
||||||
|
url: string
|
||||||
|
// eslint-disable-next-line no-use-before-define
|
||||||
|
client: GraphQLGetClient
|
||||||
|
}
|
||||||
|
|
||||||
export class GraphQLGetClient extends GraphQLClient {
|
export class GraphQLGetClient extends GraphQLClient {
|
||||||
private static instance: GraphQLGetClient
|
private static instanceArray: ClientInstance[] = []
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Singleton's constructor should always be private to prevent direct
|
* The Singleton's constructor should always be private to prevent direct
|
||||||
@ -20,16 +26,18 @@ export class GraphQLGetClient extends GraphQLClient {
|
|||||||
* just one instance of each subclass around.
|
* just one instance of each subclass around.
|
||||||
*/
|
*/
|
||||||
public static getInstance(url: string): GraphQLGetClient {
|
public static getInstance(url: string): GraphQLGetClient {
|
||||||
if (!GraphQLGetClient.instance) {
|
const instance = GraphQLGetClient.instanceArray.find((instance) => instance.url === url)
|
||||||
GraphQLGetClient.instance = new GraphQLGetClient(url, {
|
if (instance) {
|
||||||
method: 'GET',
|
return instance.client
|
||||||
jsonSerializer: {
|
|
||||||
parse: JSON.parse,
|
|
||||||
stringify: JSON.stringify,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
const client = new GraphQLGetClient(url, {
|
||||||
return GraphQLGetClient.instance
|
method: 'GET',
|
||||||
|
jsonSerializer: {
|
||||||
|
parse: JSON.parse,
|
||||||
|
stringify: JSON.stringify,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
GraphQLGetClient.instanceArray.push({ url, client } as ClientInstance)
|
||||||
|
return client
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,7 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/unbound-method */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
|
|
||||||
@ -150,7 +154,8 @@ describe('validate Communities', () => {
|
|||||||
})
|
})
|
||||||
it('logs unsupported api for community with api 2_0 ', () => {
|
it('logs unsupported api for community with api 2_0 ', () => {
|
||||||
expect(logger.warn).toBeCalledWith(
|
expect(logger.warn).toBeCalledWith(
|
||||||
`Federation: dbCom: ${dbCom.id} with unsupported apiVersion=2_0; supported versions=1_0,1_1`,
|
`Federation: dbCom: ${dbCom.id} with unsupported apiVersion=2_0; supported versions`,
|
||||||
|
['1_0', '1_1'],
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -8,14 +8,14 @@ import { backendLogger as logger } from '@/server/logger'
|
|||||||
import { ApiVersionType } from './enum/apiVersionType'
|
import { ApiVersionType } from './enum/apiVersionType'
|
||||||
import LogError from '@/server/LogError'
|
import LogError from '@/server/LogError'
|
||||||
|
|
||||||
export async function startValidateCommunities(timerInterval: number): Promise<void> {
|
export function startValidateCommunities(timerInterval: number): void {
|
||||||
logger.info(
|
logger.info(
|
||||||
`Federation: startValidateCommunities loop with an interval of ${timerInterval} ms...`,
|
`Federation: startValidateCommunities loop with an interval of ${timerInterval} ms...`,
|
||||||
)
|
)
|
||||||
// TODO: replace the timer-loop by an event-based communication to verify announced foreign communities
|
// TODO: replace the timer-loop by an event-based communication to verify announced foreign communities
|
||||||
// better to use setTimeout twice than setInterval once -> see https://javascript.info/settimeout-setinterval
|
// better to use setTimeout twice than setInterval once -> see https://javascript.info/settimeout-setinterval
|
||||||
setTimeout(function run() {
|
setTimeout(function run() {
|
||||||
validateCommunities()
|
void validateCommunities()
|
||||||
setTimeout(run, timerInterval)
|
setTimeout(run, timerInterval)
|
||||||
}, timerInterval)
|
}, timerInterval)
|
||||||
}
|
}
|
||||||
@ -27,8 +27,8 @@ export async function validateCommunities(): Promise<void> {
|
|||||||
.getMany()
|
.getMany()
|
||||||
|
|
||||||
logger.debug(`Federation: found ${dbCommunities.length} dbCommunities`)
|
logger.debug(`Federation: found ${dbCommunities.length} dbCommunities`)
|
||||||
dbCommunities.forEach(async function (dbCom) {
|
for (const dbCom of dbCommunities) {
|
||||||
logger.debug(`Federation: dbCom: ${JSON.stringify(dbCom)}`)
|
logger.debug('Federation: dbCom', dbCom)
|
||||||
const apiValueStrings: string[] = Object.values(ApiVersionType)
|
const apiValueStrings: string[] = Object.values(ApiVersionType)
|
||||||
logger.debug(`suppported ApiVersions=`, apiValueStrings)
|
logger.debug(`suppported ApiVersions=`, apiValueStrings)
|
||||||
if (apiValueStrings.includes(dbCom.apiVersion)) {
|
if (apiValueStrings.includes(dbCom.apiVersion)) {
|
||||||
@ -38,19 +38,22 @@ export async function validateCommunities(): Promise<void> {
|
|||||||
try {
|
try {
|
||||||
const pubKey = await invokeVersionedRequestGetPublicKey(dbCom)
|
const pubKey = await invokeVersionedRequestGetPublicKey(dbCom)
|
||||||
logger.info(
|
logger.info(
|
||||||
`Federation: received publicKey=${pubKey} from endpoint=${dbCom.endPoint}/${dbCom.apiVersion}`,
|
'Federation: received publicKey from endpoint',
|
||||||
|
pubKey,
|
||||||
|
`${dbCom.endPoint}/${dbCom.apiVersion}`,
|
||||||
)
|
)
|
||||||
if (pubKey && pubKey === dbCom.publicKey.toString('hex')) {
|
if (pubKey && pubKey === dbCom.publicKey.toString()) {
|
||||||
logger.info(`Federation: matching publicKey: ${pubKey}`)
|
logger.info(`Federation: matching publicKey: ${pubKey}`)
|
||||||
DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() })
|
await DbCommunity.update({ id: dbCom.id }, { verifiedAt: new Date() })
|
||||||
logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`)
|
logger.debug(`Federation: updated dbCom: ${JSON.stringify(dbCom)}`)
|
||||||
|
} else {
|
||||||
|
logger.warn(
|
||||||
|
`Federation: received not matching publicKey -> received: ${
|
||||||
|
pubKey || 'null'
|
||||||
|
}, expected: ${dbCom.publicKey.toString()} `,
|
||||||
|
)
|
||||||
|
// DbCommunity.delete({ id: dbCom.id })
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
else {
|
|
||||||
logger.warn(`Federation: received unknown publicKey -> delete dbCom with id=${dbCom.id} `)
|
|
||||||
DbCommunity.delete({ id: dbCom.id })
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
if (!isLogError(err)) {
|
if (!isLogError(err)) {
|
||||||
logger.error(`Error:`, err)
|
logger.error(`Error:`, err)
|
||||||
@ -58,10 +61,11 @@ export async function validateCommunities(): Promise<void> {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
logger.warn(
|
logger.warn(
|
||||||
`Federation: dbCom: ${dbCom.id} with unsupported apiVersion=${dbCom.apiVersion}; supported versions=${apiValueStrings}`,
|
`Federation: dbCom: ${dbCom.id} with unsupported apiVersion=${dbCom.apiVersion}; supported versions`,
|
||||||
|
apiValueStrings,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function isLogError(err: unknown) {
|
function isLogError(err: unknown) {
|
||||||
|
|||||||
@ -22,7 +22,7 @@ export default class ContributionLinkArgs {
|
|||||||
validTo?: string | null
|
validTo?: string | null
|
||||||
|
|
||||||
@Field(() => Decimal, { nullable: true })
|
@Field(() => Decimal, { nullable: true })
|
||||||
maxAmountPerMonth: Decimal | null
|
maxAmountPerMonth?: Decimal | null
|
||||||
|
|
||||||
@Field(() => Int)
|
@Field(() => Int)
|
||||||
maxPerCycle: number
|
maxPerCycle: number
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ArgsType, Field, InputType } from 'type-graphql'
|
import { ArgsType, Field, Int, InputType } from 'type-graphql'
|
||||||
|
|
||||||
@InputType()
|
@InputType()
|
||||||
@ArgsType()
|
@ArgsType()
|
||||||
export default class ContributionMessageArgs {
|
export default class ContributionMessageArgs {
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
contributionId: number
|
contributionId: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
|
|||||||
@ -11,11 +11,11 @@ export default class CreateUserArgs {
|
|||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
lastName: string
|
lastName: string
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String, { nullable: true })
|
||||||
language?: string // Will default to DEFAULT_LANGUAGE
|
language?: string | null
|
||||||
|
|
||||||
@Field(() => Int, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
publisherId: number
|
publisherId?: number | null
|
||||||
|
|
||||||
@Field(() => String, { nullable: true })
|
@Field(() => String, { nullable: true })
|
||||||
redeemCode?: string | null
|
redeemCode?: string | null
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable type-graphql/invalid-nullable-input-type */
|
||||||
import { ArgsType, Field, Int } from 'type-graphql'
|
import { ArgsType, Field, Int } from 'type-graphql'
|
||||||
import { Order } from '@enum/Order'
|
import { Order } from '@enum/Order'
|
||||||
|
|
||||||
|
|||||||
@ -7,11 +7,14 @@ export default class SearchUsersArgs {
|
|||||||
searchText: string
|
searchText: string
|
||||||
|
|
||||||
@Field(() => Int, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
|
// eslint-disable-next-line type-graphql/invalid-nullable-input-type
|
||||||
currentPage?: number
|
currentPage?: number
|
||||||
|
|
||||||
@Field(() => Int, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
|
// eslint-disable-next-line type-graphql/invalid-nullable-input-type
|
||||||
pageSize?: number
|
pageSize?: number
|
||||||
|
|
||||||
|
// eslint-disable-next-line type-graphql/wrong-decorator-signature
|
||||||
@Field(() => SearchUsersFilters, { nullable: true, defaultValue: null })
|
@Field(() => SearchUsersFilters, { nullable: true, defaultValue: null })
|
||||||
filters: SearchUsersFilters
|
filters?: SearchUsersFilters | null
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,8 +3,8 @@ import { Field, InputType } from 'type-graphql'
|
|||||||
@InputType()
|
@InputType()
|
||||||
export default class SearchUsersFilters {
|
export default class SearchUsersFilters {
|
||||||
@Field(() => Boolean, { nullable: true, defaultValue: null })
|
@Field(() => Boolean, { nullable: true, defaultValue: null })
|
||||||
byActivated: boolean
|
byActivated?: boolean | null
|
||||||
|
|
||||||
@Field(() => Boolean, { nullable: true, defaultValue: null })
|
@Field(() => Boolean, { nullable: true, defaultValue: null })
|
||||||
byDeleted: boolean
|
byDeleted?: boolean | null
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +0,0 @@
|
|||||||
import { ArgsType, Field } from 'type-graphql'
|
|
||||||
|
|
||||||
@ArgsType()
|
|
||||||
export default class SubscribeNewsletterArgs {
|
|
||||||
@Field(() => String)
|
|
||||||
email: string
|
|
||||||
|
|
||||||
@Field(() => String)
|
|
||||||
language: string
|
|
||||||
}
|
|
||||||
@ -1,13 +1,14 @@
|
|||||||
|
/* eslint-disable type-graphql/invalid-nullable-input-type */
|
||||||
import { Field, InputType } from 'type-graphql'
|
import { Field, InputType } from 'type-graphql'
|
||||||
|
|
||||||
@InputType()
|
@InputType()
|
||||||
export default class TransactionLinkFilters {
|
export default class TransactionLinkFilters {
|
||||||
@Field(() => Boolean, { nullable: true })
|
@Field(() => Boolean, { nullable: true })
|
||||||
withDeleted: boolean
|
withDeleted?: boolean
|
||||||
|
|
||||||
@Field(() => Boolean, { nullable: true })
|
@Field(() => Boolean, { nullable: true })
|
||||||
withExpired: boolean
|
withExpired?: boolean
|
||||||
|
|
||||||
@Field(() => Boolean, { nullable: true })
|
@Field(() => Boolean, { nullable: true })
|
||||||
withRedeemed: boolean
|
withRedeemed?: boolean
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,5 +9,5 @@ export default class UnsecureLoginArgs {
|
|||||||
password: string
|
password: string
|
||||||
|
|
||||||
@Field(() => Int, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
publisherId: number
|
publisherId?: number | null
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ArgsType, Field } from 'type-graphql'
|
import { ArgsType, Field, Int } from 'type-graphql'
|
||||||
|
|
||||||
@ArgsType()
|
@ArgsType()
|
||||||
export default class UpdateUserInfosArgs {
|
export default class UpdateUserInfosArgs {
|
||||||
@ -11,8 +11,8 @@ export default class UpdateUserInfosArgs {
|
|||||||
@Field({ nullable: true })
|
@Field({ nullable: true })
|
||||||
language?: string
|
language?: string
|
||||||
|
|
||||||
@Field({ nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
publisherId?: number
|
publisherId?: number | null
|
||||||
|
|
||||||
@Field({ nullable: true })
|
@Field({ nullable: true })
|
||||||
password?: string
|
password?: string
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
|
||||||
import { AuthChecker } from 'type-graphql'
|
import { AuthChecker } from 'type-graphql'
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Int, Float } from 'type-graphql'
|
||||||
import Decimal from 'decimal.js-light'
|
import Decimal from 'decimal.js-light'
|
||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
@ -19,14 +19,14 @@ export class Balance {
|
|||||||
@Field(() => Decimal)
|
@Field(() => Decimal)
|
||||||
balance: Decimal
|
balance: Decimal
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Float, { nullable: true })
|
||||||
balanceGDT: number | null
|
balanceGDT: number | null
|
||||||
|
|
||||||
// the count of all transactions
|
// the count of all transactions
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
count: number
|
count: number
|
||||||
|
|
||||||
// the count of transaction links
|
// the count of transaction links
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
linkCount: number
|
linkCount: number
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,31 +1,47 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
import { ObjectType, Field, Int } from 'type-graphql'
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
import { Community as DbCommunity } from '@entity/Community'
|
||||||
import { ObjectType, Field } from 'type-graphql'
|
|
||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
export class Community {
|
export class Community {
|
||||||
constructor(json?: any) {
|
constructor(dbCom: DbCommunity) {
|
||||||
if (json) {
|
this.id = dbCom.id
|
||||||
this.id = Number(json.id)
|
this.foreign = dbCom.foreign
|
||||||
this.name = json.name
|
this.publicKey = dbCom.publicKey.toString()
|
||||||
this.url = json.url
|
this.url =
|
||||||
this.description = json.description
|
(dbCom.endPoint.endsWith('/') ? dbCom.endPoint : dbCom.endPoint + '/') +
|
||||||
this.registerUrl = json.registerUrl
|
'api/' +
|
||||||
}
|
dbCom.apiVersion
|
||||||
|
this.lastAnnouncedAt = dbCom.lastAnnouncedAt
|
||||||
|
this.verifiedAt = dbCom.verifiedAt
|
||||||
|
this.lastErrorAt = dbCom.lastErrorAt
|
||||||
|
this.createdAt = dbCom.createdAt
|
||||||
|
this.updatedAt = dbCom.updatedAt
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
|
@Field(() => Boolean)
|
||||||
|
foreign: boolean
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
name: string
|
publicKey: string
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
url: string
|
url: string
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => Date, { nullable: true })
|
||||||
description: string
|
lastAnnouncedAt: Date | null
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => Date, { nullable: true })
|
||||||
registerUrl: string
|
verifiedAt: Date | null
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
lastErrorAt: Date | null
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
createdAt: Date | null
|
||||||
|
|
||||||
|
@Field(() => Date, { nullable: true })
|
||||||
|
updatedAt: Date | null
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Int } from 'type-graphql'
|
||||||
import Decimal from 'decimal.js-light'
|
import Decimal from 'decimal.js-light'
|
||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
export class DynamicStatisticsFields {
|
export class DynamicStatisticsFields {
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
activeUsers: number
|
activeUsers: number
|
||||||
|
|
||||||
@Field(() => Decimal)
|
@Field(() => Decimal)
|
||||||
@ -15,13 +15,13 @@ export class DynamicStatisticsFields {
|
|||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
export class CommunityStatistics {
|
export class CommunityStatistics {
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
allUsers: number
|
allUsers: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
totalUsers: number
|
totalUsers: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
deletedUsers: number
|
deletedUsers: number
|
||||||
|
|
||||||
@Field(() => Decimal)
|
@Field(() => Decimal)
|
||||||
|
|||||||
@ -23,7 +23,7 @@ export class Contribution {
|
|||||||
this.deletedBy = contribution.deletedBy
|
this.deletedBy = contribution.deletedBy
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => String, { nullable: true })
|
@Field(() => String, { nullable: true })
|
||||||
@ -44,25 +44,25 @@ export class Contribution {
|
|||||||
@Field(() => Date, { nullable: true })
|
@Field(() => Date, { nullable: true })
|
||||||
confirmedAt: Date | null
|
confirmedAt: Date | null
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
confirmedBy: number | null
|
confirmedBy: number | null
|
||||||
|
|
||||||
@Field(() => Date, { nullable: true })
|
@Field(() => Date, { nullable: true })
|
||||||
deniedAt: Date | null
|
deniedAt: Date | null
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
deniedBy: number | null
|
deniedBy: number | null
|
||||||
|
|
||||||
@Field(() => Date, { nullable: true })
|
@Field(() => Date, { nullable: true })
|
||||||
deletedAt: Date | null
|
deletedAt: Date | null
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
deletedBy: number | null
|
deletedBy: number | null
|
||||||
|
|
||||||
@Field(() => Date)
|
@Field(() => Date)
|
||||||
contributionDate: Date
|
contributionDate: Date
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
messagesCount: number
|
messagesCount: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
|
|||||||
@ -21,7 +21,7 @@ export class ContributionLink {
|
|||||||
this.link = CONFIG.COMMUNITY_REDEEM_CONTRIBUTION_URL.replace(/{code}/g, this.code)
|
this.link = CONFIG.COMMUNITY_REDEEM_CONTRIBUTION_URL.replace(/{code}/g, this.code)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => Decimal)
|
@Field(() => Decimal)
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Int } from 'type-graphql'
|
||||||
import { ContributionLink } from '@model/ContributionLink'
|
import { ContributionLink } from '@model/ContributionLink'
|
||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
@ -6,6 +6,6 @@ export class ContributionLinkList {
|
|||||||
@Field(() => [ContributionLink])
|
@Field(() => [ContributionLink])
|
||||||
links: ContributionLink[]
|
links: ContributionLink[]
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
count: number
|
count: number
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { Field, ObjectType } from 'type-graphql'
|
import { Field, Int, ObjectType } from 'type-graphql'
|
||||||
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
|
import { ContributionMessage as DbContributionMessage } from '@entity/ContributionMessage'
|
||||||
import { User } from '@entity/User'
|
import { User } from '@entity/User'
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ export class ContributionMessage {
|
|||||||
this.isModerator = contributionMessage.isModerator
|
this.isModerator = contributionMessage.isModerator
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
@ -26,7 +26,7 @@ export class ContributionMessage {
|
|||||||
createdAt: Date
|
createdAt: Date
|
||||||
|
|
||||||
@Field(() => Date, { nullable: true })
|
@Field(() => Date, { nullable: true })
|
||||||
updatedAt?: Date | null
|
updatedAt: Date | null
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
type: string
|
type: string
|
||||||
@ -37,7 +37,7 @@ export class ContributionMessage {
|
|||||||
@Field(() => String, { nullable: true })
|
@Field(() => String, { nullable: true })
|
||||||
userLastName: string | null
|
userLastName: string | null
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
userId: number | null
|
userId: number | null
|
||||||
|
|
||||||
@Field(() => Boolean)
|
@Field(() => Boolean)
|
||||||
@ -45,7 +45,7 @@ export class ContributionMessage {
|
|||||||
}
|
}
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
export class ContributionMessageListResult {
|
export class ContributionMessageListResult {
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
count: number
|
count: number
|
||||||
|
|
||||||
@Field(() => [ContributionMessage])
|
@Field(() => [ContributionMessage])
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Float, Int } from 'type-graphql'
|
||||||
import { GdtEntryType } from '@enum/GdtEntryType'
|
import { GdtEntryType } from '@enum/GdtEntryType'
|
||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
@ -19,10 +21,10 @@ export class GdtEntry {
|
|||||||
this.gdt = json.gdt
|
this.gdt = json.gdt
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
amount: number
|
amount: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
@ -40,15 +42,15 @@ export class GdtEntry {
|
|||||||
@Field(() => GdtEntryType)
|
@Field(() => GdtEntryType)
|
||||||
gdtEntryType: GdtEntryType
|
gdtEntryType: GdtEntryType
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
factor: number
|
factor: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
amount2: number
|
amount2: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
factor2: number
|
factor2: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
gdt: number
|
gdt: number
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,10 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-call */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
import { GdtEntry } from './GdtEntry'
|
import { GdtEntry } from './GdtEntry'
|
||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Int, Float } from 'type-graphql'
|
||||||
|
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
export class GdtEntryList {
|
export class GdtEntryList {
|
||||||
@ -16,15 +19,15 @@ export class GdtEntryList {
|
|||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
state: string
|
state: string
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
count: number
|
count: number
|
||||||
|
|
||||||
@Field(() => [GdtEntry], { nullable: true })
|
@Field(() => [GdtEntry], { nullable: true })
|
||||||
gdtEntries?: GdtEntry[]
|
gdtEntries: GdtEntry[] | null
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
gdtSum: number
|
gdtSum: number
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Float)
|
||||||
timeUsed: number
|
timeUsed: number
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
|
||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field } from 'type-graphql'
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Int } from 'type-graphql'
|
||||||
import { Decay } from './Decay'
|
import { Decay } from './Decay'
|
||||||
import { Transaction as dbTransaction } from '@entity/Transaction'
|
import { Transaction as dbTransaction } from '@entity/Transaction'
|
||||||
import Decimal from 'decimal.js-light'
|
import Decimal from 'decimal.js-light'
|
||||||
@ -41,19 +41,19 @@ export class Transaction {
|
|||||||
this.memo = transaction.memo
|
this.memo = transaction.memo
|
||||||
this.creationDate = transaction.creationDate
|
this.creationDate = transaction.creationDate
|
||||||
this.linkedUser = linkedUser
|
this.linkedUser = linkedUser
|
||||||
this.linkedTransactionId = transaction.linkedTransactionId
|
this.linkedTransactionId = transaction.linkedTransactionId || null
|
||||||
this.linkId = transaction.contribution
|
this.linkId = transaction.contribution
|
||||||
? transaction.contribution.contributionLinkId
|
? transaction.contribution.contributionLinkId
|
||||||
: transaction.transactionLinkId
|
: transaction.transactionLinkId || null
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => User)
|
@Field(() => User)
|
||||||
user: User
|
user: User
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
previous: number | null
|
previous: number | null
|
||||||
|
|
||||||
@Field(() => TransactionTypeId)
|
@Field(() => TransactionTypeId)
|
||||||
@ -80,10 +80,10 @@ export class Transaction {
|
|||||||
@Field(() => User, { nullable: true })
|
@Field(() => User, { nullable: true })
|
||||||
linkedUser: User | null
|
linkedUser: User | null
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
linkedTransactionId?: number | null
|
linkedTransactionId: number | null
|
||||||
|
|
||||||
// Links to the TransactionLink/ContributionLink when transaction was created by a link
|
// Links to the TransactionLink/ContributionLink when transaction was created by a link
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
linkId?: number | null
|
linkId: number | null
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,7 +21,7 @@ export class TransactionLink {
|
|||||||
this.link = CONFIG.COMMUNITY_REDEEM_URL.replace(/{code}/g, this.code)
|
this.link = CONFIG.COMMUNITY_REDEEM_URL.replace(/{code}/g, this.code)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => User)
|
@Field(() => User)
|
||||||
|
|||||||
@ -24,12 +24,12 @@ export class UnconfirmedContribution {
|
|||||||
firstName: string
|
firstName: string
|
||||||
|
|
||||||
@Field(() => Int)
|
@Field(() => Int)
|
||||||
id?: number
|
id: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
lastName: string
|
lastName: string
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
userId: number
|
userId: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
@ -44,7 +44,7 @@ export class UnconfirmedContribution {
|
|||||||
@Field(() => Decimal)
|
@Field(() => Decimal)
|
||||||
amount: Decimal
|
amount: Decimal
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
moderator: number | null
|
moderator: number | null
|
||||||
|
|
||||||
@Field(() => [Decimal])
|
@Field(() => [Decimal])
|
||||||
@ -53,6 +53,6 @@ export class UnconfirmedContribution {
|
|||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
state: string
|
state: string
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
messageCount: number
|
messageCount: number
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import { ObjectType, Field } from 'type-graphql'
|
import { ObjectType, Field, Int } from 'type-graphql'
|
||||||
import { KlickTipp } from './KlickTipp'
|
import { KlickTipp } from './KlickTipp'
|
||||||
import { User as dbUser } from '@entity/User'
|
import { User as dbUser } from '@entity/User'
|
||||||
import { UserContact } from './UserContact'
|
import { UserContact } from './UserContact'
|
||||||
@ -28,21 +28,21 @@ export class User {
|
|||||||
this.hideAmountGDT = user.hideAmountGDT
|
this.hideAmountGDT = user.hideAmountGDT
|
||||||
}
|
}
|
||||||
|
|
||||||
@Field(() => Number)
|
@Field(() => Int)
|
||||||
id: number
|
id: number
|
||||||
|
|
||||||
@Field(() => String)
|
@Field(() => String)
|
||||||
gradidoID: string
|
gradidoID: string
|
||||||
|
|
||||||
@Field(() => String, { nullable: true })
|
@Field(() => String, { nullable: true })
|
||||||
alias?: string
|
alias: string | null
|
||||||
|
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
emailId: number | null
|
emailId: number | null
|
||||||
|
|
||||||
// TODO privacy issue here
|
// TODO privacy issue here
|
||||||
@Field(() => String, { nullable: true })
|
@Field(() => String, { nullable: true })
|
||||||
email: string
|
email: string | null
|
||||||
|
|
||||||
@Field(() => UserContact)
|
@Field(() => UserContact)
|
||||||
emailContact: UserContact
|
emailContact: UserContact
|
||||||
@ -72,7 +72,7 @@ export class User {
|
|||||||
hideAmountGDT: boolean
|
hideAmountGDT: boolean
|
||||||
|
|
||||||
// This is not the users publisherId, but the one of the users who recommend him
|
// This is not the users publisherId, but the one of the users who recommend him
|
||||||
@Field(() => Number, { nullable: true })
|
@Field(() => Int, { nullable: true })
|
||||||
publisherId: number | null
|
publisherId: number | null
|
||||||
|
|
||||||
@Field(() => Date, { nullable: true })
|
@Field(() => Date, { nullable: true })
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user