Merge branch 'entity_models_into_database' of github.com:gradido/gradido into entity_models_into_database

This commit is contained in:
Moriz Wahl 2021-10-18 20:18:37 +02:00
commit 9b1d4f243a
60 changed files with 825 additions and 718 deletions

View File

@ -1,13 +1,13 @@
---
name: 🏅 Release
name: 🎂 Release
about: Define a Release
labels: release
title: 🏅 [RELEASE]
title: 🎂 [RELEASE]
---
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
<!-- THIS ISSUE-TYPE IS NOT FOR YOU! -->
<!-- Proceed only if you know what you are doing - have a chat with Project's Team first -->
## 🏅 RELEASE
## 🎂 RELEASE
<!-- Describe your Release in detail. Include screenshots and drawings -->

View File

@ -344,7 +344,7 @@ jobs:
report_name: Coverage Frontend
type: lcov
result_path: ./coverage/lcov.info
min_coverage: 76
min_coverage: 82
token: ${{ github.token }}
##############################################################################

View File

@ -4,8 +4,153 @@ 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).
#### [1.3.1](https://github.com/gradido/gradido/compare/1.2.1...1.3.1)
#### [1.5.1](https://github.com/gradido/gradido/compare/1.5.0...1.5.1)
> 15 October 2021
- fix isExitInDb [`#994`](https://github.com/gradido/gradido/pull/994)
- fix [`80228ef`](https://github.com/gradido/gradido/commit/80228ef842d4087ea4b80934b15b8112611e3e33)
#### [1.5.0](https://github.com/gradido/gradido/compare/1.4.0...1.5.0)
> 15 October 2021
- v1.5.0 [`#986`](https://github.com/gradido/gradido/pull/986)
- default value for empty field [`#993`](https://github.com/gradido/gradido/pull/993)
- fix language registriert [`#992`](https://github.com/gradido/gradido/pull/992)
- Change the publisherId to nullable. [`#991`](https://github.com/gradido/gradido/pull/991)
- Revert "deliver a decay block every time" [`#990`](https://github.com/gradido/gradido/pull/990)
- update first name, last name and username in community server db on c… [`#989`](https://github.com/gradido/gradido/pull/989)
- deliver a decay block every time [`#988`](https://github.com/gradido/gradido/pull/988)
- refactor: Activate Registration [`#978`](https://github.com/gradido/gradido/pull/978)
- fix: summe-gdd-schoepfun [`#980`](https://github.com/gradido/gradido/pull/980)
- fix: Use TransactionId as Collapse Identifier [`#985`](https://github.com/gradido/gradido/pull/985)
- icon in one row - fix [`#979`](https://github.com/gradido/gradido/pull/979)
- error rounding in transactions list fixed [`#974`](https://github.com/gradido/gradido/pull/974)
- fix publisherId config [`#973`](https://github.com/gradido/gradido/pull/973)
- refactor: In Production only Show one Community [`#968`](https://github.com/gradido/gradido/pull/968)
- 804 elopage registration [`#959`](https://github.com/gradido/gradido/pull/959)
- Add autocorrect keys [`#960`](https://github.com/gradido/gradido/pull/960)
- check for elopage account [`#949`](https://github.com/gradido/gradido/pull/949)
- check pid on gdt server [`#958`](https://github.com/gradido/gradido/pull/958)
- add check for empty user list [`#957`](https://github.com/gradido/gradido/pull/957)
- feat: Improve Test of Navigation Guard of Vue Router [`#950`](https://github.com/gradido/gradido/pull/950)
- refactor: Clean Up Frontend Links, Tests and Logic [`#952`](https://github.com/gradido/gradido/pull/952)
- feat: Global Catch of Publisher ID to Store [`#943`](https://github.com/gradido/gradido/pull/943)
- Add User on createUser to community server db [`#915`](https://github.com/gradido/gradido/pull/915)
- Frontend tests & coinanimation fixes [`#936`](https://github.com/gradido/gradido/pull/936)
- 803 community selection page of registration process 2 [`#918`](https://github.com/gradido/gradido/pull/918)
- feat: Test Vue Router [`#940`](https://github.com/gradido/gradido/pull/940)
- Frontend style documentation wallet-app [`#938`](https://github.com/gradido/gradido/pull/938)
- Clean graphql structure [`#935`](https://github.com/gradido/gradido/pull/935)
- silence webpack, it was very noisy [`#934`](https://github.com/gradido/gradido/pull/934)
- Community test database fix [`#932`](https://github.com/gradido/gradido/pull/932)
- 585 coin animation on and off switchable [`#813`](https://github.com/gradido/gradido/pull/813)
- Bug fixes recent changes [`#931`](https://github.com/gradido/gradido/pull/931)
- fix migrations to use only the entity model [`#928`](https://github.com/gradido/gradido/pull/928)
- Refactor graphql [`#929`](https://github.com/gradido/gradido/pull/929)
- Clean models2 [`#927`](https://github.com/gradido/gradido/pull/927)
- Docu graphics mocks [`#930`](https://github.com/gradido/gradido/pull/930)
- feat: Setup Unit Tests for Backend [`#920`](https://github.com/gradido/gradido/pull/920)
- refactor: Provide pubKey in Resolver Context to Avoid API Calls [`#906`](https://github.com/gradido/gradido/pull/906)
- fix: Double Redirect After Logout with Expired JWT [`#914`](https://github.com/gradido/gradido/pull/914)
- fix: Whitespace in Password Shows Validation Error [`#907`](https://github.com/gradido/gradido/pull/907)
- feat: Test Change Language in User Profile [`#904`](https://github.com/gradido/gradido/pull/904)
- Apollo list transactions [`#893`](https://github.com/gradido/gradido/pull/893)
- Remove api endpoints from frontend config [`#912`](https://github.com/gradido/gradido/pull/912)
- register process simplified [`#908`](https://github.com/gradido/gradido/pull/908)
- Cleaned up locales for settings and adjusted texts in files [`#905`](https://github.com/gradido/gradido/pull/905)
- fix: Warnings in Gdd Transaction List Spec [`#903`](https://github.com/gradido/gradido/pull/903)
- docu release plan [`#868`](https://github.com/gradido/gradido/pull/868)
- update password check, allow every special char [`#890`](https://github.com/gradido/gradido/pull/890)
- fix error with apollo, typeorm and build [`#897`](https://github.com/gradido/gradido/pull/897)
- Db check with typeorm [`#894`](https://github.com/gradido/gradido/pull/894)
- fix bug col to cols on &lt;b-col&gt; [`#895`](https://github.com/gradido/gradido/pull/895)
- bug fix givenType 2,3,5,6 change to givenType 1 [`#896`](https://github.com/gradido/gradido/pull/896)
- Apollo list gdt transactions [`#891`](https://github.com/gradido/gradido/pull/891)
- 826 different design of gdd and gdt lists [`#886`](https://github.com/gradido/gradido/pull/886)
- decay calculation is calculated [`#815`](https://github.com/gradido/gradido/pull/815)
- round corners removed from profile settings page [`#887`](https://github.com/gradido/gradido/pull/887)
- Implement getBalance in Apollo [`#831`](https://github.com/gradido/gradido/pull/831)
- feat: Redirect to Login when JWT has expired [`#889`](https://github.com/gradido/gradido/pull/889)
- refactor: Queries to Mutations [`#863`](https://github.com/gradido/gradido/pull/863)
- Community-Server Test with new db migration [`#881`](https://github.com/gradido/gradido/pull/881)
- fix database not reading config [`#871`](https://github.com/gradido/gradido/pull/871)
- 733 language switch toast success [`#880`](https://github.com/gradido/gradido/pull/880)
- UserProfil Language switch has an error & UserProfil Language switch don't show right language text [`#879`](https://github.com/gradido/gradido/pull/879)
- docker skeema: mount sql files folder dynamic [`#864`](https://github.com/gradido/gradido/pull/864)
- disable auto-resend of not finished transactions on login-server restart [`#865`](https://github.com/gradido/gradido/pull/865)
- add commit hash with link to github into frontend [`#794`](https://github.com/gradido/gradido/pull/794)
- mock_choose_community [`#844`](https://github.com/gradido/gradido/pull/844)
- Remove discord link for issue templates [`#845`](https://github.com/gradido/gradido/pull/845)
- update docker files [`#830`](https://github.com/gradido/gradido/pull/830)
- added publisher_id field to user [`#245`](https://github.com/gradido/gradido/pull/245)
- webpack update [`#811`](https://github.com/gradido/gradido/pull/811)
- resolvers [`562ad9a`](https://github.com/gradido/gradido/commit/562ad9ae31d97f90a371452bed1ffe10ebf2d3a5)
- deleted inputs (now args) [`8ab542a`](https://github.com/gradido/gradido/commit/8ab542a28acf6b78d7a9e7fe7757363d225f7b4f)
- fix UserCard_CoinAnimation to properly use the store, have 100% coverage and other minor fixes & simplifications [`ce826de`](https://github.com/gradido/gradido/commit/ce826deb1d6d92caba514713539dca2da3f74de7)
#### [1.4.0](https://github.com/gradido/gradido/compare/1.3.1...1.4.0)
> 16 September 2021
- feat: Release 1.4.0 [`#814`](https://github.com/gradido/gradido/pull/814)
- Integration of the KlicktippAPI to the User management [`#753`](https://github.com/gradido/gradido/pull/753)
- feat: Locale Management [`#809`](https://github.com/gradido/gradido/pull/809)
- feat: Increase Coverage Test Frontend [`#812`](https://github.com/gradido/gradido/pull/812)
- My thoughts to jwt [`#800`](https://github.com/gradido/gradido/pull/800)
- Remove discord link [`#808`](https://github.com/gradido/gradido/pull/808)
- refactor: Pagination Buttons [`#806`](https://github.com/gradido/gradido/pull/806)
- add new components selectLanguage and Usercard_Language [`#798`](https://github.com/gradido/gradido/pull/798)
- gdt transaction with arrays and without slots [`#793`](https://github.com/gradido/gradido/pull/793)
- feat: New JWT in Every Authenticated Response [`#797`](https://github.com/gradido/gradido/pull/797)
- fix euro after comma gdt view [`#799`](https://github.com/gradido/gradido/pull/799)
- different path for checkEmail and resetPassword [`#796`](https://github.com/gradido/gradido/pull/796)
- fix old frontend wrong display of event gdt [`#795`](https://github.com/gradido/gradido/pull/795)
- update scripts and doc for login-server setup without docker [`#783`](https://github.com/gradido/gradido/pull/783)
- fix: Flaky Test for Logout [`#792`](https://github.com/gradido/gradido/pull/792)
- Analyse Iota Colored Coins [`#779`](https://github.com/gradido/gradido/pull/779)
- Fix Bug in displaying GDT in Old frontend [`#788`](https://github.com/gradido/gradido/pull/788)
- feat: JSON Web Token for Authentification [`#777`](https://github.com/gradido/gradido/pull/777)
- select language during registration [`#778`](https://github.com/gradido/gradido/pull/778)
- Fix missing gdt id [`#782`](https://github.com/gradido/gradido/pull/782)
- Remove Migrations from community server [`#776`](https://github.com/gradido/gradido/pull/776)
- fix_database_migrations [`#775`](https://github.com/gradido/gradido/pull/775)
- decay with the value 0 is no longer displayed [`#773`](https://github.com/gradido/gradido/pull/773)
- database_migrations [`#770`](https://github.com/gradido/gradido/pull/770)
- backend_version [`#756`](https://github.com/gradido/gradido/pull/756)
- issue_type_release [`#769`](https://github.com/gradido/gradido/pull/769)
- some_docu [`#771`](https://github.com/gradido/gradido/pull/771)
- database_reachable_in_testmode [`#768`](https://github.com/gradido/gradido/pull/768)
- logo changed, old logos and icons deleted [`#734`](https://github.com/gradido/gradido/pull/734)
- change default value of communty url [`#755`](https://github.com/gradido/gradido/pull/755)
- feat: Testing Tabs of TransactionLists [`#737`](https://github.com/gradido/gradido/pull/737)
- Added a fetchPolicy: 'no-cache' to the login vall. [`#736`](https://github.com/gradido/gradido/pull/736)
- Docu fragen community [`#731`](https://github.com/gradido/gradido/pull/731)
- feat: Vue Apollo Client [`#701`](https://github.com/gradido/gradido/pull/701)
- change text from Geld to Gradidos [`#711`](https://github.com/gradido/gradido/pull/711)
- fix fix [`#728`](https://github.com/gradido/gradido/pull/728)
- sort locales [`ec12a28`](https://github.com/gradido/gradido/commit/ec12a28f81577d530f58b42b7f8c2c7d20dffd64)
- feat: Unify and Sort Locales [`aba4f4d`](https://github.com/gradido/gradido/commit/aba4f4d20e0a13016e3528a1c5c30c111eb3a9f1)
- feat: Increase Coverage [`3c061bc`](https://github.com/gradido/gradido/commit/3c061bcb8d1a3a47442ed6a351e1428e15b314aa)
#### [1.3.1](https://github.com/gradido/gradido/compare/1.3.0...1.3.1)
> 12 August 2021
- fix: Translations and Formula Display [`#727`](https://github.com/gradido/gradido/pull/727)
- 612 docu structure [`#688`](https://github.com/gradido/gradido/pull/688)
- Community update for gdt list GDT transaction format [`#726`](https://github.com/gradido/gradido/pull/726)
- [#612] new directory structure in /docu/Concepts [`10bf3b0`](https://github.com/gradido/gradido/commit/10bf3b0cdfa6c44f879be0155e93f636601a051b)
- #612 additional documents [`ac0ed4f`](https://github.com/gradido/gradido/commit/ac0ed4fee81caff26d09b5de47dd130f12abdb45)
- #612 docu restructuring [`e67e1c4`](https://github.com/gradido/gradido/commit/e67e1c41e78264698e6fae4cf1d29751de7e7b29)
#### [1.3.0](https://github.com/gradido/gradido/compare/1.2.1...1.3.0)
> 12 August 2021
- Update README.md [`#719`](https://github.com/gradido/gradido/pull/719)
- fixed bugs, step 1 [`#718`](https://github.com/gradido/gradido/pull/718)
- update code for correct transactions listening [`#725`](https://github.com/gradido/gradido/pull/725)
- bugfix: change to new frontend passwort reset [`#724`](https://github.com/gradido/gradido/pull/724)
- feat: Add Pagination Buttons to GDT Transaction List [`#716`](https://github.com/gradido/gradido/pull/716)

View File

@ -1,418 +0,0 @@
### Changelog
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
#### [1.4.0](https://github.com/gradido/gradido/compare/1.3.1...1.4.0)
- Integration of the KlicktippAPI to the User management [`#753`](https://github.com/gradido/gradido/pull/753)
- feat: Locale Management [`#809`](https://github.com/gradido/gradido/pull/809)
- feat: Increase Coverage Test Frontend [`#812`](https://github.com/gradido/gradido/pull/812)
- My thoughts to jwt [`#800`](https://github.com/gradido/gradido/pull/800)
- Remove discord link [`#808`](https://github.com/gradido/gradido/pull/808)
- refactor: Pagination Buttons [`#806`](https://github.com/gradido/gradido/pull/806)
- add new components selectLanguage and Usercard_Language [`#798`](https://github.com/gradido/gradido/pull/798)
- gdt transaction with arrays and without slots [`#793`](https://github.com/gradido/gradido/pull/793)
- feat: New JWT in Every Authenticated Response [`#797`](https://github.com/gradido/gradido/pull/797)
- fix euro after comma gdt view [`#799`](https://github.com/gradido/gradido/pull/799)
- different path for checkEmail and resetPassword [`#796`](https://github.com/gradido/gradido/pull/796)
- fix old frontend wrong display of event gdt [`#795`](https://github.com/gradido/gradido/pull/795)
- update scripts and doc for login-server setup without docker [`#783`](https://github.com/gradido/gradido/pull/783)
- fix: Flaky Test for Logout [`#792`](https://github.com/gradido/gradido/pull/792)
- Analyse Iota Colored Coins [`#779`](https://github.com/gradido/gradido/pull/779)
- Fix Bug in displaying GDT in Old frontend [`#788`](https://github.com/gradido/gradido/pull/788)
- feat: JSON Web Token for Authentification [`#777`](https://github.com/gradido/gradido/pull/777)
- select language during registration [`#778`](https://github.com/gradido/gradido/pull/778)
- Fix missing gdt id [`#782`](https://github.com/gradido/gradido/pull/782)
- Remove Migrations from community server [`#776`](https://github.com/gradido/gradido/pull/776)
- fix_database_migrations [`#775`](https://github.com/gradido/gradido/pull/775)
- decay with the value 0 is no longer displayed [`#773`](https://github.com/gradido/gradido/pull/773)
- database_migrations [`#770`](https://github.com/gradido/gradido/pull/770)
- backend_version [`#756`](https://github.com/gradido/gradido/pull/756)
- issue_type_release [`#769`](https://github.com/gradido/gradido/pull/769)
- some_docu [`#771`](https://github.com/gradido/gradido/pull/771)
- database_reachable_in_testmode [`#768`](https://github.com/gradido/gradido/pull/768)
- logo changed, old logos and icons deleted [`#734`](https://github.com/gradido/gradido/pull/734)
- change default value of communty url [`#755`](https://github.com/gradido/gradido/pull/755)
- feat: Testing Tabs of TransactionLists [`#737`](https://github.com/gradido/gradido/pull/737)
- Added a fetchPolicy: 'no-cache' to the login vall. [`#736`](https://github.com/gradido/gradido/pull/736)
- Docu fragen community [`#731`](https://github.com/gradido/gradido/pull/731)
- feat: Vue Apollo Client [`#701`](https://github.com/gradido/gradido/pull/701)
- change text from Geld to Gradidos [`#711`](https://github.com/gradido/gradido/pull/711)
- fix fix [`#728`](https://github.com/gradido/gradido/pull/728)
- sort locales [`ec12a28`](https://github.com/gradido/gradido/commit/ec12a28f81577d530f58b42b7f8c2c7d20dffd64)
- feat: Unify and Sort Locales [`aba4f4d`](https://github.com/gradido/gradido/commit/aba4f4d20e0a13016e3528a1c5c30c111eb3a9f1)
- feat: Increase Coverage [`3c061bc`](https://github.com/gradido/gradido/commit/3c061bcb8d1a3a47442ed6a351e1428e15b314aa)
#### [1.3.1](https://github.com/gradido/gradido/compare/1.3.0...1.3.1)
> 12 August 2021
- fix: Translations and Formula Display [`#727`](https://github.com/gradido/gradido/pull/727)
- 612 docu structure [`#688`](https://github.com/gradido/gradido/pull/688)
- Community update for gdt list GDT transaction format [`#726`](https://github.com/gradido/gradido/pull/726)
- [#612] new directory structure in /docu/Concepts [`10bf3b0`](https://github.com/gradido/gradido/commit/10bf3b0cdfa6c44f879be0155e93f636601a051b)
- #612 additional documents [`ac0ed4f`](https://github.com/gradido/gradido/commit/ac0ed4fee81caff26d09b5de47dd130f12abdb45)
- #612 docu restructuring [`e67e1c4`](https://github.com/gradido/gradido/commit/e67e1c41e78264698e6fae4cf1d29751de7e7b29)
#### [1.3.0](https://github.com/gradido/gradido/compare/1.2.1...1.3.0)
> 12 August 2021
- Update README.md [`#719`](https://github.com/gradido/gradido/pull/719)
- fixed bugs, step 1 [`#718`](https://github.com/gradido/gradido/pull/718)
- update code for correct transactions listening [`#725`](https://github.com/gradido/gradido/pull/725)
- bugfix: change to new frontend passwort reset [`#724`](https://github.com/gradido/gradido/pull/724)
- feat: Add Pagination Buttons to GDT Transaction List [`#716`](https://github.com/gradido/gradido/pull/716)
- fix bug, change statment from transaction infbox [`#712`](https://github.com/gradido/gradido/pull/712)
- 650-display of the gdt transactions [`#687`](https://github.com/gradido/gradido/pull/687)
- Login-Server bug fix, allow names with 2 characters also [`#714`](https://github.com/gradido/gradido/pull/714)
- Apollo sendCoins via Login-Server [`#699`](https://github.com/gradido/gradido/pull/699)
- increase coverage to 34% [`#700`](https://github.com/gradido/gradido/pull/700)
- mobile friendly, add text, change text [`#683`](https://github.com/gradido/gradido/pull/683)
- Css color input error [`#646`](https://github.com/gradido/gradido/pull/646)
- Apollo gdt [`#686`](https://github.com/gradido/gradido/pull/686)
- Backend Setup [`#584`](https://github.com/gradido/gradido/pull/584)
- text-size in textarea and font-variante if focus [`#677`](https://github.com/gradido/gradido/pull/677)
- 680 app large maximum width [`#681`](https://github.com/gradido/gradido/pull/681)
- linting, server is working [`34b30b2`](https://github.com/gradido/gradido/commit/34b30b216b6fafcb5b686d4b023b05f2e9766bdf)
- server stack seems to work. Graphql does not load properly yet [`43f7cf8`](https://github.com/gradido/gradido/commit/43f7cf87679713d436a64d569d6af1594a12ee33)
- initial commit, base packages [`fdf0979`](https://github.com/gradido/gradido/commit/fdf0979830fece04208a6b3bb06bb5323a3c149b)
#### [1.2.1](https://github.com/gradido/gradido/compare/1.2.0...1.2.1)
> 22 July 2021
- release 1.2.1 [`#670`](https://github.com/gradido/gradido/pull/670)
- exchange positions of decay in transaction in old frontend [`#662`](https://github.com/gradido/gradido/pull/662)
- fix unneccessary migration run on fresh (docker) setup [`#654`](https://github.com/gradido/gradido/pull/654)
- move back decay as standalone transaction in old frontend [`#656`](https://github.com/gradido/gradido/pull/656)
- fix display error with creation [`#652`](https://github.com/gradido/gradido/pull/652)
- release [`a0b8056`](https://github.com/gradido/gradido/commit/a0b8056c17b22570a1b1dbb6fa6ce71e561b04af)
- update content for frontend [`d37ce09`](https://github.com/gradido/gradido/commit/d37ce0949ef97d2a6c6ffaf0be31db9f6d92e743)
- exchange positions [`bc000ef`](https://github.com/gradido/gradido/commit/bc000efd87c9701480c4aeaa7b819ab49bfe8f01)
#### [1.2.0](https://github.com/gradido/gradido/compare/1.1.1...1.2.0)
> 20 July 2021
- feat: Release v1.2.0 [`#648`](https://github.com/gradido/gradido/pull/648)
- 630 frontend text improvemets [`#645`](https://github.com/gradido/gradido/pull/645)
- #435 Visual Feedback on not sending GDD [`#647`](https://github.com/gradido/gradido/pull/647)
- Make E-Mail Text 100% German [`#643`](https://github.com/gradido/gradido/pull/643)
- Login fix crash [`#641`](https://github.com/gradido/gradido/pull/641)
- check for null date [`#640`](https://github.com/gradido/gradido/pull/640)
- Login fix wrong check email link [`#642`](https://github.com/gradido/gradido/pull/642)
- Change timeout for email resend to 10 Minutes [`#635`](https://github.com/gradido/gradido/pull/635)
- fix last Transaction are not shown in new frontend [`#633`](https://github.com/gradido/gradido/pull/633)
- fix bug with user roles and pending transactions [`#627`](https://github.com/gradido/gradido/pull/627)
- fix type not found error in listTransaction Call [`#628`](https://github.com/gradido/gradido/pull/628)
- refactor: Use Vue-Toasted to Toast Messages [`#619`](https://github.com/gradido/gradido/pull/619)
- feat: Test UserProfileTransactionList [`#624`](https://github.com/gradido/gradido/pull/624)
- fix: QRCode Error after Logout [`#623`](https://github.com/gradido/gradido/pull/623)
- fix: Fix Infinite Loop in Transaction List [`#622`](https://github.com/gradido/gradido/pull/622)
- feat: Transaction Details [`#607`](https://github.com/gradido/gradido/pull/607)
- fix: Test for ScrollTo in Transaction List [`#621`](https://github.com/gradido/gradido/pull/621)
- Allow empty description [`#618`](https://github.com/gradido/gradido/pull/618)
- fix: Do Not Pass Userdata Description to Server [`#617`](https://github.com/gradido/gradido/pull/617)
- fix: Transaction Pagination Scroll Top [`#615`](https://github.com/gradido/gradido/pull/615)
- fix: Mobile Pagination [`#614`](https://github.com/gradido/gradido/pull/614)
- feat: Test AccountOverview [`#611`](https://github.com/gradido/gradido/pull/611)
- feat: Test Validation Rules [`#610`](https://github.com/gradido/gradido/pull/610)
- refactor: Reset Password Page [`#606`](https://github.com/gradido/gradido/pull/606)
- refactor: Change Password [`#603`](https://github.com/gradido/gradido/pull/603)
- refactor: Forgot Password Form [`#602`](https://github.com/gradido/gradido/pull/602)
- refactor: Update Store Tests [`#601`](https://github.com/gradido/gradido/pull/601)
- Community fix [`#598`](https://github.com/gradido/gradido/pull/598)
- refactor: Password Component [`#564`](https://github.com/gradido/gradido/pull/564)
- Fix crashing Problem with Login-Server [`#600`](https://github.com/gradido/gradido/pull/600)
- Update Password Reset E-Mail Subject Encoding [`#579`](https://github.com/gradido/gradido/pull/579)
- move decay between transactions into the transactions [`#483`](https://github.com/gradido/gradido/pull/483)
- fix #591 [`#591`](https://github.com/gradido/gradido/issues/591)
- fix style decay startblick [`cc7778b`](https://github.com/gradido/gradido/commit/cc7778b55d1baaa7be2d9440480e0fb27bb9a930)
- Remove dynamic cast because it lead to errors again and agin (Poco::AutoPtr don't work correct with that) [`0db5912`](https://github.com/gradido/gradido/commit/0db5912a67158be8f313c01f06350f8339cb0e28)
- Remove dynamic cast because it lead to errors again and agin (Poco::AutoPtr don't work correct with that) [`cee7d7a`](https://github.com/gradido/gradido/commit/cee7d7ac3c4c8c1f481cc3a87fb15422c858413b)
#### [1.1.1](https://github.com/gradido/gradido/compare/1.1.0...1.1.1)
> 22 June 2021
- release [`#581`](https://github.com/gradido/gradido/pull/581)
- Auto deploy [`#580`](https://github.com/gradido/gradido/pull/580)
- update transfer email text [`#574`](https://github.com/gradido/gradido/pull/574)
- update mysql because tuple has changed [`#576`](https://github.com/gradido/gradido/pull/576)
- Login fix pending transactions [`#578`](https://github.com/gradido/gradido/pull/578)
- add test to prevent bug in future [`630d667`](https://github.com/gradido/gradido/commit/630d667e996870a1bf9aa9586b0467d58419e525)
- use standard path. add nginx example [`ac249b4`](https://github.com/gradido/gradido/commit/ac249b46830a8039aec52d30b48084b50a264b6f)
- add autodeploy bash scripts [`f49cf4d`](https://github.com/gradido/gradido/commit/f49cf4d7f8054d87efa1e12055a7ef0c6d3b9872)
#### [1.1.0](https://github.com/gradido/gradido/compare/1.0.2...1.1.0)
> 17 June 2021
- add first error additional as msg [`#573`](https://github.com/gradido/gradido/pull/573)
- fix: Remove Grouping for Max Error [`#572`](https://github.com/gradido/gradido/pull/572)
- fix: API Call for Reset Password [`#571`](https://github.com/gradido/gradido/pull/571)
- Login reset password [`#570`](https://github.com/gradido/gradido/pull/570)
- Hide unuse components in profil [`#566`](https://github.com/gradido/gradido/pull/566)
- fix: Thousend Dividers on GDD Send Amount Field [`#567`](https://github.com/gradido/gradido/pull/567)
- reorganisiere Dockerfiles [`#550`](https://github.com/gradido/gradido/pull/550)
- hot fixes shown by test [`#551`](https://github.com/gradido/gradido/pull/551)
- fix to big text ths [`#565`](https://github.com/gradido/gradido/pull/565)
- feat: Trim Email on Blur [`#556`](https://github.com/gradido/gradido/pull/556)
- Mobile UI send gdd form [`#562`](https://github.com/gradido/gradido/pull/562)
- fix: Change Password Form [`#561`](https://github.com/gradido/gradido/pull/561)
- change userdata button disable rules [`#548`](https://github.com/gradido/gradido/pull/548)
- Change password require old password [`#519`](https://github.com/gradido/gradido/pull/519)
- feat: Test Forget Password [`#546`](https://github.com/gradido/gradido/pull/546)
- feat: Validate Change Username [`#545`](https://github.com/gradido/gradido/pull/545)
- Remove base input example login vue [`#524`](https://github.com/gradido/gradido/pull/524)
- Feature: Change Username [`#490`](https://github.com/gradido/gradido/pull/490)
- feat: Toaster to Display Messages [`#512`](https://github.com/gradido/gradido/pull/512)
- fix: Validation of GDD Send Amount Field [`#525`](https://github.com/gradido/gradido/pull/525)
- Community coverage [`#496`](https://github.com/gradido/gradido/pull/496)
- compare with last transaction sended [`#523`](https://github.com/gradido/gradido/pull/523)
- remove check decays for being at least 100 GDD cent [`#526`](https://github.com/gradido/gradido/pull/526)
- fix: Remove Target Date in Send Coins Request [`#518`](https://github.com/gradido/gradido/pull/518)
- Feature profile page bugs [`#511`](https://github.com/gradido/gradido/pull/511)
- fix: GDD Send Amount Input Field [`#491`](https://github.com/gradido/gradido/pull/491)
- change transfer confirmation email [`#485`](https://github.com/gradido/gradido/pull/485)
- Login wait on passwords with missing chars [`#487`](https://github.com/gradido/gradido/pull/487)
- fix problem with create User [`#486`](https://github.com/gradido/gradido/pull/486)
- Feature: Profile Page + Update API [`#474`](https://github.com/gradido/gradido/pull/474)
- add new API Call checkUsername [`#482`](https://github.com/gradido/gradido/pull/482)
- feat: Pagination Buttons for Transaction List [`#473`](https://github.com/gradido/gradido/pull/473)
- Login-Server & Community-Server Coverage [`#472`](https://github.com/gradido/gradido/pull/472)
- login without hedera [`#478`](https://github.com/gradido/gradido/pull/478)
- fix: Show Correct Version Number in Footer [`#475`](https://github.com/gradido/gradido/pull/475)
- refactor: Remove Element-UI [`#476`](https://github.com/gradido/gradido/pull/476)
- remove components Charts, Notification, SearchUser, ButtonCheckbox, Button RadioGroup, Breadcrumb [`159bff7`](https://github.com/gradido/gradido/commit/159bff71df20a5c48f93389b2f990f7fe54e53b9)
- fix bug, update dockerfiles to use dependencies without grpc [`dedcebd`](https://github.com/gradido/gradido/commit/dedcebdb95ee0f3dfd2ad62074d4181af38476a2)
- add warning to able to forward warnings from community server to client [`2fc3fe9`](https://github.com/gradido/gradido/commit/2fc3fe94a09bae199bf2f34f9df90e8fc3879c2b)
#### [1.0.2](https://github.com/gradido/gradido/compare/1.0.1...1.0.2)
> 27 May 2021
- feat: Test Transaction List [`#470`](https://github.com/gradido/gradido/pull/470)
- fixed problem with finding cpsp parse binary under windows with conan [`#471`](https://github.com/gradido/gradido/pull/471)
- fix: GDD Amount is Always Displayed with Two Digits [`#468`](https://github.com/gradido/gradido/pull/468)
- fix: Date Time Formats [`#469`](https://github.com/gradido/gradido/pull/469)
- Community ipv6 localhost [`#466`](https://github.com/gradido/gradido/pull/466)
- Login html pages autoparse [`#464`](https://github.com/gradido/gradido/pull/464)
- everything I find and fix crash related in login server this week (kw 20) [`#448`](https://github.com/gradido/gradido/pull/448)
- 437 bug mobile transaction list is not easy to read [`#462`](https://github.com/gradido/gradido/pull/462)
- Require memo in send [`#455`](https://github.com/gradido/gradido/pull/455)
- bug: Thx Page Shows Content Dependent of Route From [`#459`](https://github.com/gradido/gradido/pull/459)
- bug: responsive display error on pads fixed [`#461`](https://github.com/gradido/gradido/pull/461)
- [Bug] German "Dir" is written with capital D in send validation bug [`#460`](https://github.com/gradido/gradido/pull/460)
- feat: Save Locale in Database [`#450`](https://github.com/gradido/gradido/pull/450)
- attention! notice in send area removed [`#458`](https://github.com/gradido/gradido/pull/458)
- Remove Error Message encoding [`#456`](https://github.com/gradido/gradido/pull/456)
- bug fix:mobile menu closes on logout, probs value problem on logout f… [`#454`](https://github.com/gradido/gradido/pull/454)
- bug-login password change show hide inserted [`#453`](https://github.com/gradido/gradido/pull/453)
- fix sorting and use total count [`#451`](https://github.com/gradido/gradido/pull/451)
- add dynamic error email if transaction failed [`#452`](https://github.com/gradido/gradido/pull/452)
- ceil the last decay [`#449`](https://github.com/gradido/gradido/pull/449)
- feat: Raise Coverage of Frontend Unit Tets to 18% [`#447`](https://github.com/gradido/gradido/pull/447)
- parse cpsp files automatic in build [`a4a12bb`](https://github.com/gradido/gradido/commit/a4a12bb62b4000e035ff15e17c5a5f5861653ff6)
- translate german html encoded error messages to english and use gettext for automatic translation [`d339627`](https://github.com/gradido/gradido/commit/d33962736d94c1cb7a12ff775bc2c8d7505d646e)
- 100% coverage of GddTransactionList [`96fb245`](https://github.com/gradido/gradido/commit/96fb245821c69f4d321204a663247d5eee60d92f)
#### [1.0.1](https://github.com/gradido/gradido/compare/1.0.0...1.0.1)
> 14 May 2021
- Login crash fix [`#444`](https://github.com/gradido/gradido/pull/444)
- add try catch blocks to prevent login-server from crashing [`22ff220`](https://github.com/gradido/gradido/commit/22ff22072956f8b843037c75c5b16b7ff5d6a2a3)
- fix [`14a4243`](https://github.com/gradido/gradido/commit/14a424347817b1fe6912a113bffd70e55d688112)
### [1.0.0](https://github.com/gradido/gradido/compare/0.9.4...1.0.0)
> 14 May 2021
- Login build alpine [`#423`](https://github.com/gradido/gradido/pull/423)
- Release fix [`#428`](https://github.com/gradido/gradido/pull/428)
- Send button only click [`#427`](https://github.com/gradido/gradido/pull/427)
- use new function for balance overview in old frontend, update balance… [`#422`](https://github.com/gradido/gradido/pull/422)
- thx.vue coloured background removed. design adapted to app [`#426`](https://github.com/gradido/gradido/pull/426)
- translation password rules in Register.vue and ResetPasswort.vue fixed [`#424`](https://github.com/gradido/gradido/pull/424)
- 06x style [`#419`](https://github.com/gradido/gradido/pull/419)
- feat: Dash is Shown When Balance is Loading [`#396`](https://github.com/gradido/gradido/pull/396)
- refactor: Split GddSend into Components [`#415`](https://github.com/gradido/gradido/pull/415)
- fix: Set Maximum Transactions Loaded to 1000 [`#395`](https://github.com/gradido/gradido/pull/395)
- BUG : preRELEASE : thx transaction false [`#394`](https://github.com/gradido/gradido/pull/394)
- feat: Validation of Input Fields of GddSend [`#386`](https://github.com/gradido/gradido/pull/386)
- add validation, check if user has tried to send themself gradidos [`#277`](https://github.com/gradido/gradido/pull/277)
- fix link generation [`#347`](https://github.com/gradido/gradido/pull/347)
- Community start decay [`#387`](https://github.com/gradido/gradido/pull/387)
- transaction error message, translations [`#388`](https://github.com/gradido/gradido/pull/388)
- docu: locales schöpfen-mysql befehl [`#392`](https://github.com/gradido/gradido/pull/392)
- Fix: QR Scanner Hide [`#380`](https://github.com/gradido/gradido/pull/380)
- change design- dark-blue of text-ligth [`#381`](https://github.com/gradido/gradido/pull/381)
- spelling & translation [`#385`](https://github.com/gradido/gradido/pull/385)
- 350 6 login [`#383`](https://github.com/gradido/gradido/pull/383)
- fix: breakout error [`#375`](https://github.com/gradido/gradido/pull/375)
- 233-Support-Button fix, and col error fix [`#343`](https://github.com/gradido/gradido/pull/343)
- fix: membersarea open in a new tap [`#370`](https://github.com/gradido/gradido/pull/370)
- 00x table footer componente [`#345`](https://github.com/gradido/gradido/pull/345)
- clickevent from icon to button [`#364`](https://github.com/gradido/gradido/pull/364)
- 404 link to login page fix [`#366`](https://github.com/gradido/gradido/pull/366)
- bug: session_id vs sessionId [`#365`](https://github.com/gradido/gradido/pull/365)
- eslint rule standard [`#344`](https://github.com/gradido/gradido/pull/344)
- don't show decays smaller than 0,01 GDD [`#329`](https://github.com/gradido/gradido/pull/329)
- 338 - mt-5 margin top 5 eingebunden [`#341`](https://github.com/gradido/gradido/pull/341)
- feat: Update Transactions When GddTable Is Rendered [`#339`](https://github.com/gradido/gradido/pull/339)
- my profile auskommentiert [`#337`](https://github.com/gradido/gradido/pull/337)
- give balance as float value in GDD (not longer GDD cent) [`#273`](https://github.com/gradido/gradido/pull/273)
- fix error with password reset email [`#276`](https://github.com/gradido/gradido/pull/276)
- transaction.show_all in en.json hinzugefügt [`#335`](https://github.com/gradido/gradido/pull/335)
- refactor: Add Paramerts to ListTransactions API Call [`#332`](https://github.com/gradido/gradido/pull/332)
- css abstände vom rand in mobilen style [`#272`](https://github.com/gradido/gradido/pull/272)
- error messages are displayed [`#304`](https://github.com/gradido/gradido/pull/304)
- cancel to reset, form rest event added [`#334`](https://github.com/gradido/gradido/pull/334)
- remove from error messages because its no longer exist [`#330`](https://github.com/gradido/gradido/pull/330)
- xx deleted [`#333`](https://github.com/gradido/gradido/pull/333)
- fix bug on Login group add host [`#274`](https://github.com/gradido/gradido/pull/274)
- transactionslist load and icon [`#324`](https://github.com/gradido/gradido/pull/324)
- THX changed to Thank you [`#305`](https://github.com/gradido/gradido/pull/305)
- fix_bug_template [`#284`](https://github.com/gradido/gradido/pull/284)
- feat: Restructure Overview [`#271`](https://github.com/gradido/gradido/pull/271)
- fix: Dynamic Balance in User Profile [`#278`](https://github.com/gradido/gradido/pull/278)
- refactor: Test and Clean Up Store [`#270`](https://github.com/gradido/gradido/pull/270)
- remove links to not work [`#267`](https://github.com/gradido/gradido/pull/267)
- change order of session_id [`#269`](https://github.com/gradido/gradido/pull/269)
- bug: Dynamic Balance [`#260`](https://github.com/gradido/gradido/pull/260)
- Fix problems with transactions in docker environment [`#261`](https://github.com/gradido/gradido/pull/261)
- update skeema call to allow also for unsafe db updates [`#250`](https://github.com/gradido/gradido/pull/250)
- turn registration on and off [`#266`](https://github.com/gradido/gradido/pull/266)
- 243 vue loader component - varante 2 [`#257`](https://github.com/gradido/gradido/pull/257)
- fix_issue_templates [`#262`](https://github.com/gradido/gradido/pull/262)
- fix_nginx_docker [`#253`](https://github.com/gradido/gradido/pull/253)
- 13_coverage [`#255`](https://github.com/gradido/gradido/pull/255)
- add language as fields which will be returned with user-object [`#244`](https://github.com/gradido/gradido/pull/244)
- add short description for target date in creation transaction [`#252`](https://github.com/gradido/gradido/pull/252)
- fix error "Integrity constraint violation: 1052 Column 'id' in where … [`#251`](https://github.com/gradido/gradido/pull/251)
- Clicks on button [`#246`](https://github.com/gradido/gradido/pull/246)
- Change css [`#231`](https://github.com/gradido/gradido/pull/231)
- feat: Reset Password [`#212`](https://github.com/gradido/gradido/pull/212)
- fix bug #221 [`#228`](https://github.com/gradido/gradido/pull/228)
- fix empty reply by empty group_id [`#227`](https://github.com/gradido/gradido/pull/227)
- Bugfix 22 04 21 [`#226`](https://github.com/gradido/gradido/pull/226)
- Rollback use prebuild dependencies [`#225`](https://github.com/gradido/gradido/pull/225)
- Docu [`#199`](https://github.com/gradido/gradido/pull/199)
- update login-server build [`#222`](https://github.com/gradido/gradido/pull/222)
- Login add language [`#220`](https://github.com/gradido/gradido/pull/220)
- User Object on Json Login [`#219`](https://github.com/gradido/gradido/pull/219)
- refactor: Remove loginAPI Call from Store [`#215`](https://github.com/gradido/gradido/pull/215)
- fix: Remove Rules for Password on Login [`#214`](https://github.com/gradido/gradido/pull/214)
- Community 15 04 2021 [`#198`](https://github.com/gradido/gradido/pull/198)
- refactor: Remove Right Menu [`#204`](https://github.com/gradido/gradido/pull/204)
- feat: Raise Frontend Test Coverage to 12% [`#206`](https://github.com/gradido/gradido/pull/206)
- refactor: Remove Cookies [`#202`](https://github.com/gradido/gradido/pull/202)
- fix_docker_compose [`#205`](https://github.com/gradido/gradido/pull/205)
- 62 pwd reset [`#203`](https://github.com/gradido/gradido/pull/203)
- workflows_refactor [`#200`](https://github.com/gradido/gradido/pull/200)
- feat: Link to Whitepaper in Content-Footer [`#196`](https://github.com/gradido/gradido/pull/196)
- update code which produce error which last fix (._.); [`#197`](https://github.com/gradido/gradido/pull/197)
- refactor: Redirects and Misuse of Children in Router [`#194`](https://github.com/gradido/gradido/pull/194)
- fix: Gradido-Akademie in Footer Links to gradido.net [`#170`](https://github.com/gradido/gradido/pull/170)
- fix register [`#160`](https://github.com/gradido/gradido/pull/160)
- Login 14.04.21 [`#175`](https://github.com/gradido/gradido/pull/175)
- coverage_no_report [`#176`](https://github.com/gradido/gradido/pull/176)
- Community 14.04.21 [`#174`](https://github.com/gradido/gradido/pull/174)
- feat: Add Coverage Check To GitHub Workflow [`#158`](https://github.com/gradido/gradido/pull/158)
- Stage2 [`#49`](https://github.com/gradido/gradido/pull/49)
- feat: Unit Test for KontoOverview [`#169`](https://github.com/gradido/gradido/pull/169)
- fix: Remove Hashtag From Route [`#167`](https://github.com/gradido/gradido/pull/167)
- documentation for reset password [`#166`](https://github.com/gradido/gradido/pull/166)
- 90 show release version in frontend [`#153`](https://github.com/gradido/gradido/pull/153)
- docu frontend menu page structur [`#159`](https://github.com/gradido/gradido/pull/159)
- userstorry_button.txt example [`#157`](https://github.com/gradido/gradido/pull/157)
- fix getBalance API call [`#147`](https://github.com/gradido/gradido/pull/147)
- Locale clear list merge master [`#119`](https://github.com/gradido/gradido/pull/119)
- fix-125-link-to-community [`#152`](https://github.com/gradido/gradido/pull/152)
- feat: Test Dashboard Layout [`#154`](https://github.com/gradido/gradido/pull/154)
- feat: Activate Coverage Report For Unit Tests In Frontend [`#156`](https://github.com/gradido/gradido/pull/156)
- Docu [`#120`](https://github.com/gradido/gradido/pull/120)
- Fix compose bug [`#138`](https://github.com/gradido/gradido/pull/138)
- feat: Test Login Form [`#113`](https://github.com/gradido/gradido/pull/113)
- at last, fix email-bug [`#134`](https://github.com/gradido/gradido/pull/134)
- Api password reset [`#82`](https://github.com/gradido/gradido/pull/82)
- Optimize login server build [`#101`](https://github.com/gradido/gradido/pull/101)
- markdown of login server api [`#111`](https://github.com/gradido/gradido/pull/111)
- Fix lineendings [`#112`](https://github.com/gradido/gradido/pull/112)
- Background color change [`#117`](https://github.com/gradido/gradido/pull/117)
- Delete unused files [`#116`](https://github.com/gradido/gradido/pull/116)
- store aufräumen teil 1 [`#115`](https://github.com/gradido/gradido/pull/115)
- add migrations table for automatic table data migration [`40a9a8c`](https://github.com/gradido/gradido/commit/40a9a8c2b587f5bef0fcc54136ed7bd13dd91b2b)
- update yarn.lock after running yarn install [`7f38c80`](https://github.com/gradido/gradido/commit/7f38c801213ad886e9d34a8d43b00ae423f5f2a0)
- use new function for balance overview in old frontend, update balance in session on every php-request [`97c570c`](https://github.com/gradido/gradido/commit/97c570c08cc51ed17a69eb8be8d987f95f3c2ce0)
#### [0.9.4](https://github.com/gradido/gradido/compare/0.9.3...0.9.4)
> 30 March 2021
- Vue with nginx [`#84`](https://github.com/gradido/gradido/pull/84)
- Build on run [`#103`](https://github.com/gradido/gradido/pull/103)
- update debug docker to use dependencies container pushed to docker hub [`1f002f4`](https://github.com/gradido/gradido/commit/1f002f4ed0b12d4b2bf63efceabe546d0c5b58ea)
- removed email tasks complete [`8a143be`](https://github.com/gradido/gradido/commit/8a143be8423d7bd894d4f512848895df8b9694b0)
- build login-server on docker-compose up in a docker volume so it rebuild only neccessary parts if some c++ files have changed [`0da5279`](https://github.com/gradido/gradido/commit/0da527917523530186e6effe63dc001fc99bd3e3)
#### [0.9.3](https://github.com/gradido/gradido/compare/0.9.2...0.9.3)
> 30 March 2021
- new version 0.9.3 [`#110`](https://github.com/gradido/gradido/pull/110)
- feat: Frontend tests for Content Footer [`#102`](https://github.com/gradido/gradido/pull/102)
- add check session state json function and doc [`#96`](https://github.com/gradido/gradido/pull/96)
- activity page stap 2 [`#86`](https://github.com/gradido/gradido/pull/86)
- qrcode scanner fixed, datum in activitäten fixed, sprache not null fixed [`#88`](https://github.com/gradido/gradido/pull/88)
- add additional docker container which is running skeema on startup to… [`#83`](https://github.com/gradido/gradido/pull/83)
- New fix up frontend for presentation [`#85`](https://github.com/gradido/gradido/pull/85)
- feat: Tougher eslint rules [`#77`](https://github.com/gradido/gradido/pull/77)
- feat: improve translations [`#81`](https://github.com/gradido/gradido/pull/81)
- use_correct_send_api [`#80`](https://github.com/gradido/gradido/pull/80)
- fix bug with access rights [`#78`](https://github.com/gradido/gradido/pull/78)
- make response.html better accessible [`#75`](https://github.com/gradido/gradido/pull/75)
- feat: Lokalize Validation Messages [`#67`](https://github.com/gradido/gradido/pull/67)
- feat: Localize links to gradito.net [`#74`](https://github.com/gradido/gradido/pull/74)
- fix-padding [`#73`](https://github.com/gradido/gradido/pull/73)
- Correctly use transactions API in frontend [`#69`](https://github.com/gradido/gradido/pull/69)
- Qr code scanner [`#72`](https://github.com/gradido/gradido/pull/72)
- Login fail message [`#71`](https://github.com/gradido/gradido/pull/71)
- Setup unit tests for frontend [`#55`](https://github.com/gradido/gradido/pull/55)
- Update doc [`#63`](https://github.com/gradido/gradido/pull/63)
- Add Feature in user search old frontend because Support has requested the feature long ago [`#56`](https://github.com/gradido/gradido/pull/56)
- sprache angepasst, for login, pwd, sigin [`#54`](https://github.com/gradido/gradido/pull/54)
- Improve workflows [`#53`](https://github.com/gradido/gradido/pull/53)
- setup eslint with tougher rules [`1f13507`](https://github.com/gradido/gradido/commit/1f13507eacfd93c2248fb841de5f481c9eb1e6bd)
- semicolon rule implemented [`6762a02`](https://github.com/gradido/gradido/commit/6762a028f2a3e4f2713b26bed81029defe686ad7)
- dev meeting, bernd [`a99de7f`](https://github.com/gradido/gradido/commit/a99de7f5d1f7557c0877eae565aa4263d65aaaf3)
#### [0.9.2](https://github.com/gradido/gradido/compare/0.9.1...0.9.2)
> 18 March 2021
- v0.9.2 [`#51`](https://github.com/gradido/gradido/pull/51)
- Reload after login fixed [`#50`](https://github.com/gradido/gradido/pull/50)
- Monorepo login server [`#48`](https://github.com/gradido/gradido/pull/48)
- Stage0 [`#3`](https://github.com/gradido/gradido/pull/3)
- Add auto-sign Transaction functionality [`5592275`](https://github.com/gradido/gradido/commit/55922753a7ffd9552be132501d744da491c409b5)
- read in login the real client ip X-Real-IP from nginx forwarded not from community server [`512d307`](https://github.com/gradido/gradido/commit/512d307a19b955bb6e26ae8b274def354829b50f)
- move check if all passwords allow direct into pwdValidation so it will work with every code which ask for password [`e2c38c1`](https://github.com/gradido/gradido/commit/e2c38c1a0fc25a4a2bc922c4bbc44d86b6d00d8b)
#### 0.9.1
> 13 March 2021
- Login gbb [`#12`](https://github.com/gradido/gradido/pull/12)
- Admin prework axios json [`#10`](https://github.com/gradido/gradido/pull/10)
- Merge pull request #1 from gradido/master [`#8`](https://github.com/gradido/gradido/pull/8)
- [WIP] 2 create a dockerfile for the frontend application [`#6`](https://github.com/gradido/gradido/pull/6)
- Master - first step [`#1`](https://github.com/gradido/gradido/pull/1)
- Add docker compose [`#7`](https://github.com/gradido/gradido/pull/7)
- style 404 side :) [`c7bdf89`](https://github.com/gradido/gradido/commit/c7bdf8978594b932615e48f9bb1c19d3c3bf3fcf)
- publish workflow test [`df6f66f`](https://github.com/gradido/gradido/commit/df6f66ffe70baa9ed3f70b460a6c0c14011bb944)
- many translations. translation structure [`bf68547`](https://github.com/gradido/gradido/commit/bf685479767d19c246c4d6abe3577dc3cb666346)

View File

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

View File

@ -11,6 +11,7 @@ const server = {
LOGIN_API_URL: process.env.LOGIN_API_URL || 'http://login-server:1201/',
COMMUNITY_API_URL: process.env.COMMUNITY_API_URL || 'http://nginx/api/',
GDT_API_URL: process.env.GDT_API_URL || 'https://gdt.gradido.net',
PRODUCTION: process.env.NODE_ENV === 'production' || false,
}
const database = {

View File

@ -1,4 +1,4 @@
import { ArgsType, Field } from 'type-graphql'
import { ArgsType, Field, Int } from 'type-graphql'
@ArgsType()
export default class CreateUserArgs {
@ -16,4 +16,7 @@ export default class CreateUserArgs {
@Field(() => String)
language: string
@Field(() => Int, { nullable: true })
publisherId: number
}

View File

@ -1,4 +1,4 @@
import { ArgsType, Field } from 'type-graphql'
import { ArgsType, Field, Int } from 'type-graphql'
@ArgsType()
export default class UnsecureLoginArgs {
@ -7,4 +7,7 @@ export default class UnsecureLoginArgs {
@Field(() => String)
password: string
@Field(() => Int, { nullable: true })
publisherId: number
}

View File

@ -1,6 +1,6 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { ObjectType, Field } from 'type-graphql'
import { ObjectType, Field, Int } from 'type-graphql'
import { KlickTipp } from './KlickTipp'
@ObjectType()
@ -66,12 +66,15 @@ export class User {
groupId: number
*/
// what is publisherId?
@Field(() => Number)
publisherId: number
@Field(() => Int, { nullable: true })
publisherId?: number
@Field(() => Boolean)
coinanimation: boolean
@Field(() => KlickTipp)
klickTipp: KlickTipp
@Field(() => Boolean, { nullable: true })
hasElopage?: boolean
}

View File

@ -19,9 +19,17 @@ export class CommunityResolver {
@Query(() => [Community])
async communities(): Promise<Community[]> {
const communities: Community[] = []
communities.push(
if (CONFIG.PRODUCTION)
return [
new Community({
id: 3,
name: 'Gradido-Akademie',
description: 'Freies Institut für Wirtschaftsbionik.',
url: 'https://gradido.net',
registerUrl: 'https://gdd1.gradido.com/vue/register-community',
}),
]
return [
new Community({
id: 1,
name: 'Gradido Entwicklung',
@ -43,7 +51,6 @@ export class CommunityResolver {
url: 'https://gradido.net',
registerUrl: 'https://gdd1.gradido.com/vue/register-community',
}),
)
return communities
]
}
}

View File

@ -1,7 +1,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Resolver, Query, Args, Ctx, Authorized } from 'type-graphql'
import { Resolver, Query, Args, Ctx, Authorized, Arg } from 'type-graphql'
import { getCustomRepository } from 'typeorm'
import CONFIG from '../../config'
import { GdtEntryList } from '../model/GdtEntryList'
@ -32,4 +32,16 @@ export class GdtResolver {
}
return new GdtEntryList(resultGDT.data)
}
@Authorized()
@Query(() => Number)
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async existPid(@Arg('pid') pid: number): Promise<number> {
// load user
const resultPID = await apiGet(`${CONFIG.GDT_API_URL}/publishers/checkPidApi/${pid}`)
if (!resultPID.success) {
throw new Error(resultPID.data)
}
return resultPID.data.pid
}
}

View File

@ -71,24 +71,27 @@ async function calculateAndAddDecayTransactions(
finalTransaction.date = transaction.received.toISOString()
finalTransaction.memo = transaction.memo
finalTransaction.totalBalance = roundFloorFrom4(userTransaction.balance)
const prev = i > 0 ? userTransactions[i - 1] : null
const previousTransaction = i > 0 ? userTransactions[i - 1] : null
if (prev && prev.balance > 0) {
const current = userTransaction
if (previousTransaction) {
const currentTransaction = userTransaction
const decay = await calculateDecayWithInterval(
prev.balance,
prev.balanceDate,
current.balanceDate,
previousTransaction.balance,
previousTransaction.balanceDate,
currentTransaction.balanceDate,
)
const balance = prev.balance - decay.balance
const balance = previousTransaction.balance - decay.balance
if (balance) {
if (
decayStartTransaction &&
decayStartTransaction.received < currentTransaction.balanceDate
) {
finalTransaction.decay = decay
finalTransaction.decay.balance = roundFloorFrom4(balance)
if (
decayStartTransaction &&
prev.transactionId < decayStartTransaction.id &&
current.transactionId > decayStartTransaction.id
previousTransaction.transactionId < decayStartTransaction.id &&
currentTransaction.transactionId > decayStartTransaction.id
) {
finalTransaction.decay.decayStartBlock = (
decayStartTransaction.received.getTime() / 1000
@ -144,15 +147,14 @@ async function calculateAndAddDecayTransactions(
now.getTime(),
)
const balance = userTransaction.balance - decay.balance
if (balance) {
const decayTransaction = new Transaction()
decayTransaction.type = 'decay'
decayTransaction.balance = roundFloorFrom4(balance)
decayTransaction.decayDuration = decay.decayDuration
decayTransaction.decayStart = decay.decayStart
decayTransaction.decayEnd = decay.decayEnd
finalTransactions.push(decayTransaction)
}
const decayTransaction = new Transaction()
decayTransaction.type = 'decay'
decayTransaction.balance = roundFloorFrom4(balance)
decayTransaction.decayDuration = decay.decayDuration
decayTransaction.decayStart = decay.decayStart
decayTransaction.decayEnd = decay.decayEnd
finalTransactions.push(decayTransaction)
}
}

View File

@ -31,7 +31,10 @@ import { UserRepository } from '../../typeorm/repository/User'
export class UserResolver {
@Query(() => User)
@UseMiddleware(klicktippNewsletterStateMiddleware)
async login(@Args() { email, password }: UnsecureLoginArgs, @Ctx() context: any): Promise<User> {
async login(
@Args() { email, password, publisherId }: UnsecureLoginArgs,
@Ctx() context: any,
): Promise<User> {
email = email.trim().toLowerCase()
const result = await apiPost(CONFIG.LOGIN_API_URL + 'unsecureLogin', { email, password })
@ -45,9 +48,38 @@ export class UserResolver {
value: encode(result.data.session_id, result.data.user.public_hex),
})
const user = new User(result.data.user)
// Hack: Database Field is not validated properly and not nullable
if (user.publisherId === 0) {
user.publisherId = undefined
}
user.hasElopage = result.data.hasElopage
// read additional settings from settings table
const userRepository = getCustomRepository(UserRepository)
const userEntity = await userRepository.findByPubkeyHex(user.pubkey)
let userEntity: void | DbUser
userEntity = await userRepository.findByPubkeyHex(user.pubkey).catch(() => {
userEntity = new DbUser()
userEntity.firstName = user.firstName
userEntity.lastName = user.lastName
userEntity.username = user.username
userEntity.email = user.email
userEntity.pubkey = Buffer.from(fromHex(user.pubkey))
userEntity.save().catch(() => {
throw new Error('error by save userEntity')
})
})
if (!userEntity) {
throw new Error('error with cannot happen')
}
// Save publisherId if Elopage is not yet registered
if (!user.hasElopage && publisherId) {
user.publisherId = publisherId
await this.updateUserInfos(
{ publisherId },
{ sessionId: result.data.session_id, pubKey: result.data.user.public_hex },
)
}
const userSettingRepository = getCustomRepository(UserSettingRepository)
const coinanimation = await userSettingRepository
@ -87,7 +119,7 @@ export class UserResolver {
@Mutation(() => String)
async createUser(
@Args() { email, firstName, lastName, password, language }: CreateUserArgs,
@Args() { email, firstName, lastName, password, language, publisherId }: CreateUserArgs,
): Promise<string> {
const payload = {
email,
@ -97,7 +129,7 @@ export class UserResolver {
emailType: 2,
login_after_register: true,
language: language,
publisher_id: 0,
publisher_id: publisherId,
}
const result = await apiPost(CONFIG.LOGIN_API_URL + 'createUser', payload)
if (!result.success) {
@ -183,6 +215,8 @@ export class UserResolver {
},
}
let response: UpdateUserInfosResponse | undefined
const userRepository = getCustomRepository(UserRepository)
if (
firstName ||
lastName ||
@ -196,11 +230,32 @@ export class UserResolver {
const result = await apiPost(CONFIG.LOGIN_API_URL + 'updateUserInfos', payload)
if (!result.success) throw new Error(result.data)
response = new UpdateUserInfosResponse(result.data)
const userEntity = await userRepository.findByPubkeyHex(context.pubKey)
let userEntityChanged = false
if (firstName) {
userEntity.firstName = firstName
userEntityChanged = true
}
if (lastName) {
userEntity.lastName = lastName
userEntityChanged = true
}
if (username) {
userEntity.username = username
userEntityChanged = true
}
if (userEntityChanged) {
userEntity.save().catch((error) => {
throw new Error(error)
})
}
}
if (coinanimation !== undefined) {
// load user and balance
const userRepository = getCustomRepository(UserRepository)
const userEntity = await userRepository.findByPubkeyHex(context.pubKey)
const userSettingRepository = getCustomRepository(UserSettingRepository)
userSettingRepository
.setOrUpdate(userEntity.id, Setting.COIN_ANIMATION, coinanimation.toString())
@ -242,4 +297,13 @@ export class UserResolver {
}
return new CheckEmailResponse(result.data)
}
@Query(() => Boolean)
async hasElopage(@Ctx() context: any): Promise<boolean> {
const result = await apiGet(CONFIG.LOGIN_API_URL + 'hasElopage?session_id=' + context.sessionId)
if (!result.success) {
throw new Error(result.data)
}
return result.data.hasElopage
}
}

View File

@ -24,10 +24,12 @@ export const klicktippNewsletterStateMiddleware: MiddlewareFn = async (
const result = await next()
let klickTipp = new KlickTipp({ status: 'Unsubscribed' })
if (CONFIG.KLICKTIPP) {
const klickTippUser = await getKlickTippUser(result.email)
if (klickTippUser) {
klickTipp = new KlickTipp(klickTippUser)
}
try {
const klickTippUser = await getKlickTippUser(result.email)
if (klickTippUser) {
klickTipp = new KlickTipp(klickTippUser)
}
} catch (err) {}
}
result.klickTipp = klickTipp
return result

View File

@ -10,6 +10,7 @@ export class UserRepository extends Repository<User> {
}
async getUsersIndiced(userIds: number[]): Promise<User[]> {
if (!userIds.length) return []
const users = await this.createQueryBuilder('user')
.select(['user.id', 'user.firstName', 'user.lastName', 'user.email'])
.where('user.id IN (:...users)', { users: userIds })

View File

@ -67,6 +67,7 @@ In case of success returns:
"username": ""
},
"session_id": -127182,
"hasElopage": true,
"clientIP":"123.123.123.123"
}
```
@ -86,6 +87,7 @@ In case of success returns:
- `role`: role of user currently only "none" or "admin"
- `username`: not used yet
- `clientIP`: should be the same as where the js-client is running, else maybe a man-in-the-middle attacks is happening or
- `hasElopage`: only present if hasElopage was set to true in request, true if user has an elopage account
nginx was wrong configured.
- `session_id`: can be also negative
@ -593,3 +595,29 @@ or:
"msg": "session not found"
}
```
## Check if User has an Elopage Account
Check if logged in user has already an elopage account
### Request
`GET http://localhost/login_api/hasElopage?session_id=-127182`
### Response
In case of success returns:
```json
{
"state":"success",
"hasElopage": true
}
```
or:
```json
{
"state":"not found",
"msg": "session not found"
}
```

View File

@ -1,3 +1,3 @@
ALLOW_REGISTER=true
GRAPHQL_URI=http://localhost:4000/graphql
DEFAULT_PUBLISHER_ID=2896
//BUILD_COMMIT=0000000

View File

@ -1,2 +0,0 @@
## [1.0.0] - 2020-07-27
### Initial Release

View File

@ -1,11 +1,12 @@
{
"name": "bootstrap-vue-gradido-wallet",
"version": "1.4.0",
"version": "1.5.1",
"private": true,
"scripts": {
"start": "node run/server.js",
"serve": "vue-cli-service serve --open",
"build": "vue-cli-service build",
"analyse-bundle": "yarn build && webpack-bundle-analyzer dist/webpack.stats.json",
"lint": "eslint --ext .js,.vue .",
"dev": "yarn run serve",
"i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'",
@ -54,7 +55,6 @@
"nouislider": "^12.1.0",
"particles-bg-vue": "1.2.3",
"perfect-scrollbar": "^1.3.0",
"portal-vue": "^2.1.7",
"prettier": "^2.2.1",
"qrcode": "^1.4.4",
"quill": "^1.3.6",
@ -93,7 +93,9 @@
"dotenv-webpack": "^7.0.3",
"node-sass": "^6.0.1",
"sass-loader": "^10",
"vue-template-compiler": "^2.6.11"
"stats-webpack-plugin": "^0.7.0",
"vue-template-compiler": "^2.6.11",
"webpack-bundle-analyzer": "^4.5.0"
},
"postcss": {
"plugins": {

View File

@ -2,7 +2,7 @@
<div class="decayinformation">
<span v-if="decaytyp === 'short'">
<span v-if="decay.balance > 0">
{{ decay ? ' -' + decay.balance + ' ' + decayStartBlockTextShort : '' }}
{{ decay ? ' -' + $n(decay.balance, 'decimal') + ' ' + decayStartBlockTextShort : '' }}
</span>
<span v-else>
{{ $t('decay.noDecay') }}
@ -65,7 +65,7 @@
<div>{{ $t('decay.decay') }}</div>
</b-col>
<b-col cols="6">
<div>- {{ decay.balance }}</div>
<div>- {{ $n(decay.balance, 'decimal') }}</div>
</b-col>
</b-row>
<hr class="mt-2 mb-2" />
@ -81,8 +81,8 @@
<div v-if="type === 'receive'">{{ $t('decay.received') }}</div>
</b-col>
<b-col cols="6">
<div v-if="type === 'send'">- {{ balance }}</div>
<div v-if="type === 'receive'">+ {{ balance }}</div>
<div v-if="type === 'send'">- {{ $n(balance, 'decimal') }}</div>
<div v-if="type === 'receive'">+ {{ $n(balance, 'decimal') }}</div>
</b-col>
</b-row>
<!-- Decay-->
@ -91,7 +91,7 @@
<div>{{ $t('decay.decay') }}</div>
</b-col>
<b-col cols="6">
<div>- {{ decay.balance }}</div>
<div>- {{ $n(decay.balance, 'decimal') }}</div>
</b-col>
</b-row>
<!-- Total-->
@ -101,10 +101,13 @@
</b-col>
<b-col cols="6">
<div v-if="type === 'send'">
<b>- {{ parseInt(balance) + decay.balance }}</b>
<b>- {{ $n(balance + decay.balance, 'decimal') }}</b>
</div>
<div v-if="type === 'receive'">
<b>{{ parseInt(balance) - decay.balance }}</b>
<b>{{ $n(balance - decay.balance, 'decimal') }}</b>
</div>
<div v-if="type === 'creation'">
<b>- {{ $n(balance - decay.balance, 'decimal') }}</b>
</div>
</b-col>
</b-row>

View File

@ -18,6 +18,10 @@ describe('SideBar', () => {
$store: {
state: {
email: 'test@example.org',
publisherId: 123,
firstName: 'test',
lastName: 'example',
hasElopage: false,
},
commit: jest.fn(),
},
@ -78,14 +82,18 @@ describe('SideBar', () => {
})
describe('static menu items', () => {
describe("member's area", () => {
describe("member's area without publisher ID", () => {
it('has a link to the elopage', () => {
expect(wrapper.findAll('li').at(0).text()).toBe('members_area')
expect(wrapper.findAll('li').at(0).text()).toContain('members_area')
})
it('links to the elopage', () => {
it('has a badge', () => {
expect(wrapper.findAll('li').at(0).text()).toContain('!')
})
it('links to the elopage registration', () => {
expect(wrapper.findAll('li').at(0).find('a').attributes('href')).toBe(
'https://elopage.com/s/gradido/sign_in?locale=en',
'https://elopage.com/s/gradido/basic-de/payment?locale=en&prid=111&pid=123&firstName=test&lastName=example&email=test@example.org',
)
})
@ -94,11 +102,27 @@ describe('SideBar', () => {
mocks.$i18n.locale = 'de'
})
it('links to the German elopage when locale is set to de', () => {
it('links to the German elopage registration when locale is set to de', () => {
expect(wrapper.findAll('li').at(0).find('a').attributes('href')).toBe(
'https://elopage.com/s/gradido/basic-de/payment?locale=de&prid=111&pid=123&firstName=test&lastName=example&email=test@example.org',
)
})
})
describe("member's area with publisher ID", () => {
beforeEach(() => {
mocks.$store.state.hasElopage = true
})
it('links to the elopage member area', () => {
expect(wrapper.findAll('li').at(0).find('a').attributes('href')).toBe(
'https://elopage.com/s/gradido/sign_in?locale=de',
)
})
it('has no badge', () => {
expect(wrapper.findAll('li').at(0).text()).not.toContain('!')
})
})
})

View File

@ -47,12 +47,9 @@
<hr class="my-2" />
<ul class="navbar-nav ml-3">
<li class="nav-item">
<a
:href="`https://elopage.com/s/gradido/sign_in?locale=${$i18n.locale}`"
class="nav-link"
target="_blank"
>
{{ $t('members_area') }}
<a :href="getElopageLink()" class="nav-link" target="_blank">
{{ $t('members_area') }}&nbsp;
<b-badge v-if="!this.$store.state.hasElopage" pill variant="danger">!</b-badge>
</a>
</li>
</ul>
@ -71,6 +68,7 @@
<script>
import NavbarToggleButton from '@/components/NavbarToggleButton'
import VueQrcode from 'vue-qrcode'
import CONFIG from '../../config'
export default {
name: 'sidebar',
@ -114,6 +112,16 @@ export default {
logout() {
this.$emit('logout')
},
getElopageLink() {
const pId = this.$store.state.publisherId
? this.$store.state.publisherId
: CONFIG.DEFAULT_PUBLISHER_ID
return encodeURI(
this.$store.state.hasElopage
? `https://elopage.com/s/gradido/sign_in?locale=${this.$i18n.locale}`
: `https://elopage.com/s/gradido/basic-de/payment?locale=${this.$i18n.locale}&prid=111&pid=${pId}&firstName=${this.$store.state.firstName}&lastName=${this.$store.state.lastName}&email=${this.$store.state.email}`,
)
},
},
}
</script>

View File

@ -15,15 +15,14 @@ const environment = {
NODE_ENV: process.env.NODE_ENV,
DEBUG: process.env.NODE_ENV !== 'production' || false,
PRODUCTION: process.env.NODE_ENV === 'production' || false,
DEFAULT_PUBLISHER_ID: process.env.DEFAULT_PUBLISHER_ID || 2896,
}
const server = {
GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000/graphql',
}
const options = {
ALLOW_REGISTER: process.env.ALLOW_REGISTER !== 'false',
}
const options = {}
const CONFIG = {
...version,

View File

@ -51,6 +51,7 @@ export const registerUser = gql`
$email: String!
$password: String!
$language: String!
$publisherId: Int
) {
createUser(
email: $email
@ -58,6 +59,7 @@ export const registerUser = gql`
lastName: $lastName
password: $password
language: $language
publisherId: $publisherId
)
}
`

View File

@ -1,8 +1,8 @@
import gql from 'graphql-tag'
export const login = gql`
query($email: String!, $password: String!) {
login(email: $email, password: $password) {
query($email: String!, $password: String!, $publisherId: Int) {
login(email: $email, password: $password, publisherId: $publisherId) {
email
username
firstName
@ -13,6 +13,8 @@ export const login = gql`
klickTipp {
newsletterState
}
hasElopage
publisherId
}
}
`

View File

@ -180,7 +180,7 @@
"thx": {
"checkEmail": "Deine Email würde erfolgreich verifiziert.",
"email": "Wir haben dir eine eMail gesendet.",
"register": "Du bist jetzt regisriert.",
"register": "Du bist jetzt registriert.",
"reset": "Dein Passwort wurde geändert.",
"title": "Danke!"
}

View File

@ -1,10 +1,7 @@
import '@/polyfills'
import GlobalComponents from './globalComponents'
import GlobalDirectives from './globalDirectives'
import SideBar from '@/components/SidebarPlugin'
import PortalVue from 'portal-vue'
import Toasted from 'vue-toasted'
// vue-bootstrap
@ -32,7 +29,6 @@ export default {
Vue.use(GlobalComponents)
Vue.use(GlobalDirectives)
Vue.use(SideBar)
Vue.use(PortalVue)
Vue.use(BootstrapVue)
Vue.use(IconsPlugin)
Vue.use(VueMoment)

View File

@ -1,96 +0,0 @@
/* eslint-disable */
import 'es6-promise/auto'
export default (function initPollyFills () {
if (!Array.prototype.find) {
Object.defineProperty(Array.prototype, 'find', {
value: function (predicate) {
// 1. Let O be ? ToObject(this value).
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
var len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') {
throw new TypeError('predicate must be a function');
}
// 4. If thisArg was supplied, let T be thisArg; else let T be undefined.
var thisArg = arguments[1];
// 5. Let k be 0.
var k = 0;
// 6. Repeat, while k < len
while (k < len) {
// a. Let Pk be ! ToString(k).
// b. Let kValue be ? Get(O, Pk).
// c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).
// d. If testResult is true, return kValue.
var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) {
return kValue;
}
// e. Increase k by 1.
k++;
}
// 7. Return undefined.
return undefined;
}
});
}
if (typeof Object.assign !== 'function') {
// Must be writable: true, enumerable: false, configurable: true
Object.defineProperty(Object, "assign", {
value: function assign (target, varArgs) { // .length of function is 2
'use strict';
if (target == null) { // TypeError if undefined or null
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
},
writable: true,
configurable: true
});
}
if (!String.prototype.startsWith) {
String.prototype.startsWith = function(search, pos) {
return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search;
};
}
if (!String.prototype.includes) {
String.prototype.includes = function(search, start) {
'use strict';
if (typeof start !== 'number') {
start = 0;
}
if (start + search.length > this.length) {
return false;
} else {
return this.indexOf(search, start) !== -1;
}
};
}
}())

View File

@ -18,21 +18,30 @@ describe('navigation guards', () => {
})
describe('publisher ID', () => {
it('commits the pid to the store when present', () => {
router.push({ path: 'login', query: { pid: 42 } })
it('commits the pid to the store when present', async () => {
await router.push({ path: 'register', query: { pid: 42 } })
expect(storeCommitMock).toBeCalledWith('publisherId', '42')
})
it('does not commit the pid when not present', () => {
router.push({ path: 'register' })
it('does not commit the pid when not present', async () => {
await router.push({ path: 'password' })
expect(storeCommitMock).not.toBeCalled()
})
})
describe('authorization', () => {
it.skip('redirects to login when not authorized', async () => {
router.push({ path: 'overview' })
expect(router.history.current.path).toBe('/login')
const navGuard = router.beforeHooks[0]
const next = jest.fn()
it('redirects to login when not authorized', () => {
navGuard({ meta: { requiresAuth: true }, query: {} }, {}, next)
expect(next).toBeCalledWith({ path: '/login' })
})
it('does not redirect to login when authorized', () => {
store.state.token = 'valid token'
navGuard({ meta: { requiresAuth: true }, query: {} }, {}, next)
expect(next).toBeCalledWith()
})
})
})

View File

@ -1,7 +1,6 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import CONFIG from '../config'
Vue.use(VueRouter)
@ -21,11 +20,4 @@ const router = new VueRouter({
},
})
if (CONFIG.ALLOW_REGISTER) {
router.addRoute({
path: '/register',
component: () => import('../views/Pages/Register.vue'),
})
}
export default router

View File

@ -44,19 +44,13 @@ describe('router', () => {
})
})
describe('register page', () => {
it('is not present', () => {
expect(routes.find((r) => r.path === '/register')).toBe(undefined)
})
})
describe('routes', () => {
it('has "/login" as default', () => {
expect(routes.find((r) => r.path === '/').redirect()).toEqual({ path: '/login' })
})
it('has twelve routes defined', () => {
expect(routes).toHaveLength(12)
expect(routes).toHaveLength(13)
})
describe('overview', () => {
@ -99,6 +93,13 @@ describe('router', () => {
})
})
describe('register', () => {
it('loads the "register" component', async () => {
const component = await routes.find((r) => r.path === '/register').component()
expect(component.default.name).toBe('register')
})
})
describe('thx', () => {
const thx = routes.find((r) => r.path === '/thx/:comingFrom')

View File

@ -32,6 +32,10 @@ const routes = [
path: '/login',
component: () => import('../views/Pages/Login.vue'),
},
{
path: '/register',
component: () => import('../views/Pages/Register.vue'),
},
{
path: '/thx/:comingFrom',
component: () => import('../views/Pages/thx.vue'),

View File

@ -30,7 +30,9 @@ export const mutations = {
state.newsletterState = newsletterState
},
publisherId: (state, publisherId) => {
state.publisherId = publisherId
let pubId = parseInt(publisherId)
if (isNaN(pubId)) pubId = null
state.publisherId = pubId
},
community: (state, community) => {
state.community = community
@ -38,6 +40,9 @@ export const mutations = {
coinanimation: (state, coinanimation) => {
state.coinanimation = coinanimation
},
hasElopage: (state, hasElopage) => {
state.hasElopage = hasElopage
},
}
export const actions = {
@ -50,6 +55,8 @@ export const actions = {
commit('description', data.description)
commit('coinanimation', data.coinanimation)
commit('newsletterState', data.klickTipp.newsletterState)
commit('hasElopage', data.hasElopage)
commit('publisherId', data.publisherId)
},
logout: ({ commit, state }) => {
commit('token', null)
@ -60,6 +67,8 @@ export const actions = {
commit('description', '')
commit('coinanimation', true)
commit('newsletterState', null)
commit('hasElopage', false)
commit('publisherId', null)
localStorage.clear()
},
}
@ -81,6 +90,8 @@ export const store = new Vuex.Store({
coinanimation: true,
newsletterState: null,
community: null,
hasElopage: false,
publisherId: null,
},
getters: {},
// Syncronous mutation of the state

View File

@ -12,6 +12,7 @@ const {
newsletterState,
publisherId,
community,
hasElopage,
} = mutations
const { login, logout } = actions
@ -95,6 +96,12 @@ describe('Vuex store', () => {
publisherId(state, 42)
expect(state.publisherId).toEqual(42)
})
it('sets publisherId to null with NaN', () => {
const state = {}
publisherId(state, 'abc')
expect(state.publisherId).toEqual(null)
})
})
describe('community', () => {
@ -114,6 +121,14 @@ describe('Vuex store', () => {
})
})
})
describe('hasElopage', () => {
it('sets the state of hasElopage', () => {
const state = { hasElopage: false }
hasElopage(state, true)
expect(state.hasElopage).toBeTruthy()
})
})
})
describe('actions', () => {
@ -131,11 +146,13 @@ describe('Vuex store', () => {
klickTipp: {
newsletterState: true,
},
hasElopage: false,
publisherId: 1234,
}
it('calls eight commits', () => {
it('calls ten commits', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenCalledTimes(8)
expect(commit).toHaveBeenCalledTimes(10)
})
it('commits email', () => {
@ -177,15 +194,25 @@ describe('Vuex store', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(8, 'newsletterState', true)
})
it('commits hasElopage', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(9, 'hasElopage', false)
})
it('commits publisherId', () => {
login({ commit, state }, commitedData)
expect(commit).toHaveBeenNthCalledWith(10, 'publisherId', 1234)
})
})
describe('logout', () => {
const commit = jest.fn()
const state = {}
it('calls eight commits', () => {
it('calls ten commits', () => {
logout({ commit, state })
expect(commit).toHaveBeenCalledTimes(8)
expect(commit).toHaveBeenCalledTimes(10)
})
it('commits token', () => {
@ -228,6 +255,16 @@ describe('Vuex store', () => {
expect(commit).toHaveBeenNthCalledWith(8, 'newsletterState', null)
})
it('commits hasElopage', () => {
logout({ commit, state })
expect(commit).toHaveBeenNthCalledWith(9, 'hasElopage', false)
})
it('commits publisherId', () => {
logout({ commit, state })
expect(commit).toHaveBeenNthCalledWith(10, 'publisherId', null)
})
// how to get this working?
it.skip('calls localStorage.clear()', () => {
const clearStorageMock = jest.fn()

View File

@ -1,15 +0,0 @@
/**
* Simple throttle function that executes a passed function only once in the specified timeout
* @param handlerFunc
* @param [timeout] the throttle interval
*/
export function throttle(handlerFunc, timeout = 66) {
let resizeTimeout
if (!resizeTimeout) {
resizeTimeout = setTimeout(() => {
resizeTimeout = null
handlerFunc()
// The actualResizeHandler will execute at a rate of 15fps
}, timeout)
}
}

View File

@ -0,0 +1,51 @@
import { mount } from '@vue/test-utils'
import AuthLayoutGdd from './AuthLayout_gdd'
const localVue = global.localVue
describe('AuthLayoutGdd', () => {
let wrapper
const mocks = {
$i18n: {
locale: 'en',
},
$t: jest.fn((t) => t),
$route: {
meta: {
hideFooter: false,
},
},
$store: {
state: {},
commit: jest.fn(),
},
}
const stubs = {
// RouterLink: RouterLinkStub,
RouterView: true,
}
const Wrapper = () => {
return mount(AuthLayoutGdd, { localVue, mocks, stubs })
}
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('has no sidebar', () => {
expect(wrapper.find('nav#sidenav-main').exists()).not.toBeTruthy()
})
it('has a main content div', () => {
expect(wrapper.find('div.main-content').exists()).toBeTruthy()
})
it('has a footer inside the main content', () => {
expect(wrapper.find('div.main-content').find('footer.footer').exists()).toBeTruthy()
})
})
})

View File

@ -45,6 +45,9 @@ describe('DashboardLayoutGdd', () => {
$store: {
state: {
email: 'user@example.org',
publisherId: 123,
firstName: 'User',
lastName: 'Example',
},
dispatch: storeDispatchMock,
commit: storeCommitMock,
@ -114,9 +117,10 @@ describe('DashboardLayoutGdd', () => {
})
it('has a link to the members area', () => {
expect(wrapper.findAll('ul').at(2).text()).toBe('members_area')
expect(wrapper.findAll('ul').at(2).text()).toContain('members_area')
expect(wrapper.findAll('ul').at(2).text()).toContain('!')
expect(wrapper.findAll('ul').at(2).find('a').attributes('href')).toBe(
'https://elopage.com/s/gradido/sign_in?locale=en',
'https://elopage.com/s/gradido/basic-de/payment?locale=en&prid=111&pid=123&firstName=User&lastName=Example&email=user@example.org',
)
})

View File

@ -0,0 +1,22 @@
import { mount } from '@vue/test-utils'
import NotFoundPage from './NotFoundPage'
const localVue = global.localVue
describe('NotFoundPage', () => {
let wrapper
const Wrapper = () => {
return mount(NotFoundPage, { localVue })
}
describe('mount', () => {
beforeEach(() => {
wrapper = Wrapper()
})
it('has a svg', () => {
expect(wrapper.find('svg').exists()).toBeTruthy()
})
})
})

View File

@ -6,7 +6,10 @@
:key="transactionId"
:style="type === 'decay' ? 'background-color:#f1e0ae3d' : ''"
>
<div class="list-group-item gdd-transaction-list-item" v-b-toggle="'a' + date + ''">
<div
class="list-group-item gdd-transaction-list-item"
v-b-toggle="'decay-' + transactionId"
>
<!-- Collaps Button -->
<div
v-if="type != 'decay' && decay"
@ -19,62 +22,88 @@
</div>
<div>
<!-- ICON -->
<div class="col-1 gdd-transaction-list-item-icon">
<b-icon :icon="getProperties(type).icon" :class="getProperties(type).class" />
</div>
<b-row>
<!-- ICON -->
<b-col cols="1">
<div class="gdd-transaction-list-item-icon">
<b-icon :icon="getProperties(type).icon" :class="getProperties(type).class" />
</div>
</b-col>
<div>
<!-- Betrag / Name Email -->
<b-row>
<div class="col-5 text-right">
<span class="gdd-transaction-list-item-operator">
{{ getProperties(type).operator }}
</span>
<span class="gdd-transaction-list-item-amount">{{ $n(balance, 'decimal') }}</span>
</div>
<div class="col-7 gdd-transaction-list-item-name">
{{ type !== 'decay' ? name : $t('decay.decay_since_last_transaction') }}
</div>
</b-row>
<b-col cols="11">
<!-- Betrag / Name Email -->
<b-row>
<b-col cols="5">
<div class="text-right">
<span class="gdd-transaction-list-item-operator">
{{ getProperties(type).operator }}
</span>
<span class="gdd-transaction-list-item-amount">
{{ $n(balance, 'decimal') }}
</span>
</div>
</b-col>
<b-col cols="7">
<div class="gdd-transaction-list-item-name">
{{ type !== 'decay' ? name : $t('decay.decay_since_last_transaction') }}
</div>
</b-col>
</b-row>
<!-- Nachricht -->
<b-row v-if="type !== 'decay'">
<div class="col-5 text-right">{{ $t('form.memo') }}</div>
<div class="col-7 gdd-transaction-list-message">{{ memo }}</div>
</b-row>
<!-- Nachricht -->
<b-row v-if="type !== 'decay'">
<b-col cols="5">
<div class="text-right">{{ $t('form.memo') }}</div>
</b-col>
<b-col cols="7">
<div class="gdd-transaction-list-message">{{ memo }}</div>
</b-col>
</b-row>
<!-- Datum -->
<b-row v-if="type !== 'decay'">
<div class="col-5 text-right">{{ $t('form.date') }}</div>
<div class="col-7 gdd-transaction-list-item-date">
{{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
</div>
</b-row>
<!-- Datum -->
<b-row v-if="type !== 'decay'">
<b-col cols="5">
<div class="text-right">{{ $t('form.date') }}</div>
</b-col>
<b-col cols="7">
<div class="gdd-transaction-list-item-date">
{{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
</div>
</b-col>
</b-row>
<!-- Decay -->
<b-row v-if="decay && !decay.decayStartBlock">
<div class="col-5 text-right">
<b-icon v-if="type != 'decay'" icon="droplet-half" height="15" class="mb-1" />
</div>
<div class="col-7 gdd-transaction-list-item-decay">
<decay-information v-if="decay" decaytyp="short" :decay="decay" />
</div>
</b-row>
<b-row v-if="decay && decay.decayStartBlock">
<div class="col-5 text-right">
<b-icon v-if="type != 'decay'" icon="droplet-half" height="15" class="mb-1" />
</div>
<div class="col-7 gdd-transaction-list-item-decay">
<b>{{ $t('decay.Starting_block_decay') }}</b>
</div>
</b-row>
</div>
<!-- Decay -->
<b-row v-if="decay && !decay.decayStartBlock">
<b-col cols="5">
<div class="text-right">
<b-icon v-if="type != 'decay'" icon="droplet-half" height="15" class="mb-1" />
</div>
</b-col>
<b-col cols="7">
<div class="gdd-transaction-list-item-decay">
<decay-information v-if="decay" decaytyp="short" :decay="decay" />
</div>
</b-col>
</b-row>
<b-row v-if="decay && decay.decayStartBlock">
<b-col cols="5">
<div class="text-right">
<b-icon v-if="type != 'decay'" icon="droplet-half" height="15" class="mb-1" />
</div>
</b-col>
<b-col cols="7">
<div class="gdd-transaction-list-item-decay">
<b>{{ $t('decay.Starting_block_decay') }}</b>
</div>
</b-col>
</b-row>
</b-col>
</b-row>
</div>
<!-- Collaps Start -->
<b-collapse v-if="type != 'decay'" class="pb-4" :id="'a' + date + ''">
<b-collapse v-if="type != 'decay' && decay" class="pb-4" :id="'decay-' + transactionId">
<div style="border: 0px; background-color: #f1f1f1" class="p-2 pb-4 mb-4">
<decay-information
v-if="decay"

View File

@ -44,6 +44,7 @@ describe('Login', () => {
registerUrl: 'http://localhost/vue/register',
description: 'Die lokale Entwicklungsumgebung von Gradido.',
},
publisherId: 12345,
},
},
$loading: {
@ -135,9 +136,7 @@ describe('Login', () => {
})
it('links to /register when clicking "Create new account"', () => {
expect(wrapper.findAllComponents(RouterLinkStub).at(1).props().to).toBe(
'/register-community',
)
expect(wrapper.findAllComponents(RouterLinkStub).at(1).props().to).toBe('/register')
})
})
@ -199,6 +198,7 @@ describe('Login', () => {
variables: {
email: 'user@example.org',
password: '1234',
publisherId: 12345,
},
}),
)

View File

@ -48,12 +48,8 @@
{{ $t('settings.password.forgot_pwd') }}
</router-link>
</b-col>
<b-col
cols="6"
class="text-center text-sm-right col-12 col-sm-6"
v-show="allowRegister"
>
<router-link to="/register-community" class="mt-3">
<b-col cols="6" class="text-center text-sm-right col-12 col-sm-6">
<router-link to="/register" class="mt-3">
{{ $t('site.login.new_wallet') }}
</router-link>
</b-col>
@ -64,7 +60,6 @@
</div>
</template>
<script>
import CONFIG from '../../config'
import InputPassword from '../../components/Inputs/InputPassword'
import InputEmail from '../../components/Inputs/InputEmail'
import { login, communityInfo } from '../../graphql/queries'
@ -81,7 +76,6 @@ export default {
email: '',
password: '',
},
allowRegister: CONFIG.ALLOW_REGISTER,
passwordVisible: false,
}
},
@ -96,6 +90,7 @@ export default {
variables: {
email: this.form.email,
password: this.form.password,
publisherId: this.$store.state.publisherId,
},
fetchPolicy: 'network-only',
})

View File

@ -32,6 +32,7 @@ describe('Register', () => {
registerUrl: 'http://localhost/vue/register',
description: 'Die lokale Entwicklungsumgebung von Gradido.',
},
publisherId: 12345,
},
},
}
@ -145,6 +146,7 @@ describe('Register', () => {
})
})
/*
describe('link Choose another community', () => {
it('has a link "Choose another community"', () => {
expect(wrapper.find('.test-button-another-community').text()).toEqual(
@ -156,6 +158,7 @@ describe('Register', () => {
expect(wrapper.find('.test-button-another-community').props().to).toBe('/select-community')
})
})
*/
describe('API calls', () => {
beforeEach(() => {
@ -216,6 +219,7 @@ describe('Register', () => {
lastName: 'Mustermann',
password: 'Aa123456_',
language: 'en',
publisherId: 12345,
},
}),
)

View File

@ -125,7 +125,7 @@
<div class="text-center">
<div class="text-center">
<router-link class="test-button-back" to="/login">
<b-button variant="outline-secondary">
<b-button variant="outline-secondary" class="mr-4">
{{ $t('back') }}
</b-button>
</router-link>
@ -145,6 +145,7 @@
</b-col>
</b-row>
</b-container>
<!--
<div class="text-center pt-4">
<router-link class="test-button-another-community" to="/select-community">
<b-button variant="outline-secondary">
@ -152,6 +153,7 @@
</b-button>
</router-link>
</div>
-->
</div>
</template>
<script>
@ -199,6 +201,7 @@ export default {
lastName: this.form.lastname,
password: this.form.password.password,
language: this.language,
publisherId: this.$store.state.publisherId,
},
})
.then(() => {

View File

@ -1,6 +1,7 @@
const path = require('path')
const webpack = require('webpack')
const Dotenv = require('dotenv-webpack')
const StatsPlugin = require('stats-webpack-plugin')
// vue.config.js
module.exports = {
@ -25,15 +26,18 @@ module.exports = {
},
},
plugins: [
// .env and Environment Variables
new Dotenv(),
new webpack.DefinePlugin({
// Those are Environment Variables transmitted via Docker
// Those are Environment Variables transmitted via Docker and are only available when defined here aswell
// 'process.env.DOCKER_WORKDIR': JSON.stringify(process.env.DOCKER_WORKDIR),
// 'process.env.BUILD_DATE': JSON.stringify(process.env.BUILD_DATE),
// 'process.env.BUILD_VERSION': JSON.stringify(process.env.BUILD_VERSION),
'process.env.BUILD_COMMIT': JSON.stringify(process.env.BUILD_COMMIT),
// 'process.env.PORT': JSON.stringify(process.env.PORT),
}),
// generate webpack stats to allow analysis of the bundlesize
new StatsPlugin('webpack.stats.json'),
],
infrastructureLogging: {
level: 'warn', // 'none' | 'error' | 'warn' | 'info' | 'log' | 'verbose'

View File

@ -1673,6 +1673,11 @@
consola "^2.15.0"
node-fetch "^2.6.1"
"@polka/url@^1.0.0-next.20":
version "1.0.0-next.21"
resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1"
integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==
"@sinonjs/commons@^1.7.0":
version "1.8.2"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b"
@ -2450,6 +2455,11 @@ acorn-walk@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
acorn-walk@^8.0.0:
version "8.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^3.0.4:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
@ -2470,6 +2480,11 @@ acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.0.4:
version "8.5.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
acorn@^8.0.5:
version "8.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe"
@ -4130,6 +4145,11 @@ commander@^4.0.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
commander@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
commander@~2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@ -5344,7 +5364,7 @@ duplexer2@~0.1.4:
dependencies:
readable-stream "^2.0.2"
duplexer@^0.1.1:
duplexer@^0.1.1, duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
@ -6936,6 +6956,13 @@ gzip-size@^5.0.0:
duplexer "^0.1.1"
pify "^4.0.1"
gzip-size@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==
dependencies:
duplexer "^0.1.2"
handle-thing@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
@ -9465,7 +9492,7 @@ mime@1.6.0:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.0.3, mime@^2.4.4:
mime@^2.0.3, mime@^2.3.1, mime@^2.4.4:
version "2.5.2"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
@ -10117,7 +10144,7 @@ open@^6.3.0:
dependencies:
is-wsl "^1.1.0"
opener@^1.5.1:
opener@^1.5.1, opener@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
@ -12057,6 +12084,15 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
sirv@^1.0.7:
version "1.0.18"
resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.18.tgz#105fab52fb656ce8a2bebbf36b11052005952899"
integrity sha512-f2AOPogZmXgJ9Ma2M22ZEhc1dNtRIzcEkiflMFeVTRq+OViOZMvH1IPMVOwrKaxpSaHioBJiDR0SluRqGa7atA==
dependencies:
"@polka/url" "^1.0.0-next.20"
mime "^2.3.1"
totalist "^1.0.0"
sisteransi@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@ -12351,6 +12387,13 @@ static-module@^2.2.0:
static-eval "^2.0.0"
through2 "~2.0.3"
stats-webpack-plugin@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz#ccffe9b745de8bbb155571e063f8263fc0e2bc06"
integrity sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ==
dependencies:
lodash "^4.17.4"
"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
@ -12915,6 +12958,11 @@ toposort@^1.0.0:
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
totalist@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df"
integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==
tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@ -13739,6 +13787,21 @@ webpack-bundle-analyzer@^3.3.0:
opener "^1.5.1"
ws "^6.0.0"
webpack-bundle-analyzer@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz#1b0eea2947e73528754a6f9af3e91b2b6e0f79d5"
integrity sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==
dependencies:
acorn "^8.0.4"
acorn-walk "^8.0.0"
chalk "^4.1.0"
commander "^7.2.0"
gzip-size "^6.0.0"
lodash "^4.17.20"
opener "^1.5.2"
sirv "^1.0.7"
ws "^7.3.1"
webpack-chain@^4.11.0:
version "4.12.1"
resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6"
@ -14041,6 +14104,11 @@ ws@^7.0.0, ws@^7.4.4:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59"
integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==
ws@^7.3.1:
version "7.5.5"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
xml-name-validator@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"

View File

@ -1,6 +1,6 @@
CREATE TABLE `elopage_buys` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`elopage_user_id` int NOT NULL,
`elopage_user_id` int DEFAULT NULL,
`affiliate_program_id` int NOT NULL,
`publisher_id` int NOT NULL,
`order_id` int NOT NULL,

View File

@ -328,6 +328,7 @@ const Poco::UInt16* Passphrase::getWordIndices() const
bool Passphrase::checkIfValid()
{
if (!mWordSource) return false;
std::istringstream iss(mPassphraseString);
std::vector<std::string> results(std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>());

View File

@ -0,0 +1,16 @@
#include "JsonHasElopage.h"
#include "../model/table/ElopageBuy.h"
Poco::JSON::Object* JsonHasElopage::handle(Poco::Dynamic::Var params)
{
auto result = checkAndLoadSession(params);
if (result) {
return result;
}
auto elopage_buy = Poco::AutoPtr<model::table::ElopageBuy>(new model::table::ElopageBuy);
result = stateSuccess();
result->set("hasElopage", elopage_buy->isExistInDB("payer_email", mSession->getNewUser()->getModel()->getEmail()));
return result;
}

View File

@ -0,0 +1,15 @@
#ifndef __JSON_INTERFACE_JSON_HAS_ELOPAGE_
#define __JSON_INTERFACE_JSON_HAS_ELOPAGE_
#include "JsonRequestHandler.h"
class JsonHasElopage : public JsonRequestHandler
{
public:
Poco::JSON::Object* handle(Poco::Dynamic::Var params);
protected:
};
#endif // __JSON_INTERFACE_JSON_HAS_ELOPAGE_

View File

@ -81,22 +81,30 @@ void JsonRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Po
}
if (json_result) {
NotificationList errors;
if (!json_result->isNull("session_id")) {
int session_id = 0;
try {
json_result->get("session_id").convert(session_id);
}
catch (Poco::Exception& e) {
NotificationList erros;
erros.addError(new Error("json request", "invalid session_id"));
erros.sendErrorsAsEmail();
errors.addError(new Error("json request", "invalid session_id"));
}
if (session_id) {
auto session = SessionManager::getInstance()->getSession(session_id);
response.addCookie(session->getLoginCookie());
}
}
json_result->stringify(responseStream);
try {
json_result->stringify(responseStream);
}
catch (Poco::Exception& e) {
errors.addError(new ParamError("json request", "error on stringify from json result:", e.message()));
errors.addError(new ParamError("json request", "caller url", request.getURI()));
}
if (errors.errorCount()) {
errors.sendErrorsAsEmail();
}
delete json_result;
}

View File

@ -16,6 +16,7 @@
#include "JsonUnknown.h"
#include "JsonGetRunningUserTasks.h"
#include "JsonGetUsers.h"
#include "JsonHasElopage.h"
#include "JsonLoginViaEmailVerificationCode.h"
#include "JsonLogout.h"
#include "JsonNetworkInfos.h"
@ -140,6 +141,9 @@ Poco::Net::HTTPRequestHandler* JsonRequestHandlerFactory::createRequestHandler(c
else if (url_first_part == "/logout") {
return new JsonLogout(client_host);
}
else if (url_first_part == "/hasElopage") {
return new JsonHasElopage;
}
return new JsonUnknown;
}

View File

@ -8,6 +8,8 @@
#include "../lib/DataTypeConverter.h"
#include "../model/table/ElopageBuy.h"
Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params)
{
@ -105,9 +107,21 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params)
USER_COMPLETE,
USER_DISABLED
*/
// run query for checking if user has already an account async
Poco::AutoPtr<model::table::UserHasElopageTask> hasElopageTask = new model::table::UserHasElopageTask(email);
hasElopageTask->scheduleTask(hasElopageTask);
auto user_state = session->loadUser(email, password);
auto user_model = session->getNewUser()->getModel();
Poco::JSON::Array infos;
// AUTOMATIC ERROR CORRECTION
// if something went wrong by initial key generation for user, generate keys again
if (user_state >= USER_LOADED_FROM_DB && !user_model->getPublicKey()) {
if (session->generateKeys(true, true)) {
user_state = session->getNewUser()->getUserState();
}
}
switch (user_state) {
case USER_EMPTY:
@ -140,7 +154,9 @@ Poco::JSON::Object* JsonUnsecureLogin::handle(Poco::Dynamic::Var params)
session->setClientIp(mClientIP);
if(infos.size() > 0) {
result->set("info", infos);
}
}
AWAIT(hasElopageTask)
result->set("hasElopage", hasElopageTask->hasElopage());
return result;
default:
result->set("state", "error");

View File

@ -169,8 +169,10 @@ Poco::JSON::Object* JsonUpdateUserInfos::handle(Poco::Dynamic::Var params)
if (value.isInteger()) {
int publisher_id = 0;
value.convert(publisher_id);
user_model->setPublisherId(publisher_id);
extractet_values++;
if(user_model->getPublisherId() != publisher_id) {
user_model->setPublisherId(publisher_id);
extractet_values++;
}
}
else {
jsonErrorsArray.add("User.publisher_id isn't a valid integer");

View File

@ -746,7 +746,7 @@ void Session::detectSessionState()
bool cryptedPassphrase = userBackups.size() > 0;
for (auto it = userBackups.begin(); it != userBackups.end(); it++) {
auto passphrase = (*it)->getModel()->getPassphrase();
Mnemonic* wordSource = nullptr;
const Mnemonic* wordSource = Passphrase::detectMnemonic(passphrase);
auto passphrase_obj = Passphrase::create(passphrase, wordSource);
if (!passphrase_obj.isNull() && passphrase_obj->checkIfValid()) {
auto key_pair = KeyPairEd25519::create(passphrase_obj);

View File

@ -9,6 +9,11 @@ namespace model {
"product[affiliate_program_id]", "publisher[id]", "order_id", "product_id",
"product[price]", "payer[email]", "publisher[email]", "payment_state", "success_date", "event" };
ElopageBuy::ElopageBuy()
{
}
ElopageBuy::ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData)
: mPayed(false)
{
@ -103,6 +108,14 @@ namespace model {
return select;
}
// --------------------------- Tasks --------------------------------------------
int UserHasElopageTask::run()
{
auto elopage_buy = Poco::AutoPtr<model::table::ElopageBuy>(new model::table::ElopageBuy);
mHasElopage = elopage_buy->isExistInDB("payer_email", mEmail);
return 0;
}
}
}

View File

@ -31,6 +31,7 @@ namespace model {
{
public:
ElopageBuy(const Poco::Net::NameValueCollection& elopage_webhook_requestData);
ElopageBuy();
// generic db operations
const char* getTableName() const { return "elopage_buys"; }
@ -51,6 +52,22 @@ namespace model {
Poco::DateTime mSuccessDate;
std::string mEvent;
};
// check for user existing
class UserHasElopageTask : public UniLib::controller::CPUTask
{
public:
UserHasElopageTask(std::string email) : mEmail(email), mHasElopage(false) {}
int run();
const char* getResourceType() const { return "UserHasElopageTask"; };
bool hasElopage() const { return mHasElopage; }
protected:
std::string mEmail;
bool mHasElopage;
};
}
}

View File

@ -166,20 +166,19 @@ namespace model {
auto session = cm->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
Poco::Data::Statement select(session);
int id;
select << "SELECT " << "id "
select << "SELECT " << "count(*) as id"
<< " FROM " << getTableName()
<< " WHERE " << fieldName << " = ?"
, Poco::Data::Keywords::into(id), Poco::Data::Keywords::useRef(fieldValue);
try {
if (select.execute() == 1) {
return true;
}
select.execute();
return id != 0;
}
catch (Poco::Exception& ex) {
/*lock();
lock();
addError(new ParamError(getTableName(), "mysql error by isExistInDB", ex.displayText().data()));
addError(new ParamError(getTableName(), "field name for select: ", fieldName.data()));
unlock();*/
unlock();
}
return false;
}

View File

@ -68,5 +68,7 @@ namespace UniLib {
}
}
#define AWAIT(task) while (!hasElopageTask->isTaskFinished()) { Poco::Thread::sleep(10); }
#endif //__DR_UNIVERSUM_LIB_CONTROLLER_CPU_TASK_H__

View File

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

View File

@ -5,6 +5,7 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
PROJECT_DIR="${SCRIPT_DIR}/../"
FRONTEND_DIR="${PROJECT_DIR}/frontend/"
BACKEND_DIR="${PROJECT_DIR}/backend/"
DATABASE_DIR="${PROJECT_DIR}/database/"
# navigate to project directory
cd ${PROJECT_DIR}
@ -20,6 +21,9 @@ cd ${FRONTEND_DIR}
yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version ${VERSION}
cd ${BACKEND_DIR}
yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version ${VERSION}
cd ${DATABASE_DIR}
yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version ${VERSION}
# generate changelog
cd ${PROJECT_DIR}
auto-changelog --latest-version ${VERSION}