From ea7910b54cac57bd444b99f74c5ce518d57ebf06 Mon Sep 17 00:00:00 2001 From: Christian Zosel Date: Wed, 8 May 2024 17:20:47 +0200 Subject: [PATCH] fix(auth): refactor current user handling into service Writing instances of JS classes directly to the `data` property of the ember simple auth service is problematic, because ember simple auth always saves the _serialized_ form of the class in local storage. In our case, this caused issues when the application is open in multiple tabs, and on tab triggers a token refresh: In that case, the initialization of the class instance is not triggered, and the serialized data is read directly from local storage. This refactors the current implementation to use a separate service, as suggested by the ember-simple-auth docs: https://github.com/mainmatter/ember-simple-auth/blob/master/guides/managing-current-user.md --- frontend/app/abilities/absence-credit.js | 4 +- frontend/app/abilities/overtime-credit.js | 4 +- frontend/app/abilities/page.js | 4 +- frontend/app/abilities/report.js | 4 +- frontend/app/abilities/user.js | 4 +- frontend/app/analysis/edit/controller.js | 10 ++--- frontend/app/analysis/index/controller.js | 3 +- .../report-review-warning/component.js | 2 +- .../report-review-warning/template.hbs | 4 +- .../app/components/sy-topnav/component.js | 2 +- .../app/components/sy-topnav/template.hbs | 6 +-- frontend/app/index/activities/controller.js | 3 +- frontend/app/index/activities/route.js | 6 --- frontend/app/index/attendances/controller.js | 3 +- frontend/app/index/attendances/route.js | 15 +------ frontend/app/index/controller.js | 19 ++++----- frontend/app/index/reports/controller.js | 7 ++-- frontend/app/index/reports/route.js | 4 +- frontend/app/index/route.js | 5 ++- frontend/app/projects/controller.js | 4 +- frontend/app/protected/controller.js | 5 ++- frontend/app/protected/route.js | 35 ++-------------- frontend/app/services/current-user.js | 40 +++++++++++++++++++ frontend/app/services/rejected-reports.js | 4 +- frontend/app/services/unverified-reports.js | 4 +- frontend/app/users/index/controller.js | 10 ++--- frontend/app/users/index/template.hbs | 2 +- frontend/tests/helpers/current-user-mock.js | 9 +++++ frontend/tests/unit/abilities/report-test.js | 32 +++++++-------- .../tests/unit/services/current-user-test.js | 11 +++++ 30 files changed, 140 insertions(+), 125 deletions(-) create mode 100644 frontend/app/services/current-user.js create mode 100644 frontend/tests/helpers/current-user-mock.js create mode 100644 frontend/tests/unit/services/current-user-test.js diff --git a/frontend/app/abilities/absence-credit.js b/frontend/app/abilities/absence-credit.js index d9854c28..c8cea5d7 100644 --- a/frontend/app/abilities/absence-credit.js +++ b/frontend/app/abilities/absence-credit.js @@ -2,10 +2,10 @@ import { inject as service } from "@ember/service"; import { Ability } from "ember-can"; export default class AbsenceCreditAbility extends Ability { - @service session; + @service currentUser; get user() { - return this.session.data.user; + return this.currentUser.user; } get canEdit() { return this.user.isSuperuser; diff --git a/frontend/app/abilities/overtime-credit.js b/frontend/app/abilities/overtime-credit.js index 5c14354c..040f38b3 100644 --- a/frontend/app/abilities/overtime-credit.js +++ b/frontend/app/abilities/overtime-credit.js @@ -2,10 +2,10 @@ import { inject as service } from "@ember/service"; import { Ability } from "ember-can"; export default class OvertimeCreditAbility extends Ability { - @service session; + @service currentUser; get user() { - return this.session.data.user; + return this.currentUser.user; } get canEdit() { return this.user.isSuperuser; diff --git a/frontend/app/abilities/page.js b/frontend/app/abilities/page.js index 557c9d27..133f00e6 100644 --- a/frontend/app/abilities/page.js +++ b/frontend/app/abilities/page.js @@ -2,10 +2,10 @@ import { inject as service } from "@ember/service"; import { Ability } from "ember-can"; export default class PageAbility extends Ability { - @service session; + @service currentUser; get user() { - return this.session.data.user; + return this.currentUser.user; } get canAccess() { if (!this.user) { diff --git a/frontend/app/abilities/report.js b/frontend/app/abilities/report.js index b68eed97..a80212e0 100644 --- a/frontend/app/abilities/report.js +++ b/frontend/app/abilities/report.js @@ -2,10 +2,10 @@ import { inject as service } from "@ember/service"; import { Ability } from "ember-can"; export default class ReportAbility extends Ability { - @service session; + @service currentUser; get user() { - return this.session.data.user; + return this.currentUser.user; } get canEdit() { diff --git a/frontend/app/abilities/user.js b/frontend/app/abilities/user.js index f7706a94..ada672a1 100644 --- a/frontend/app/abilities/user.js +++ b/frontend/app/abilities/user.js @@ -2,10 +2,10 @@ import { inject as service } from "@ember/service"; import { Ability } from "ember-can"; export default class UserAbility extends Ability { - @service session; + @service currentUser; get user() { - return this.session.data.user; + return this.currentUser.user; } get canRead() { diff --git a/frontend/app/analysis/edit/controller.js b/frontend/app/analysis/edit/controller.js index 290e7cfd..e8fe3a2d 100644 --- a/frontend/app/analysis/edit/controller.js +++ b/frontend/app/analysis/edit/controller.js @@ -55,7 +55,7 @@ export default class AnalysisEditController extends Controller { @service notify; @service router; @service fetch; - @service session; + @service currentUser; @service store; @service unverifiedReports; @@ -86,11 +86,11 @@ export default class AnalysisEditController extends Controller { } get isAccountant() { - return this.session.data.user.isAccountant; + return this.currentUser.user.isAccountant; } get isSuperuser() { - return this.session.data.user.isSuperuser; + return this.currentUser.user.isSuperuser; } @task @@ -130,11 +130,11 @@ export default class AnalysisEditController extends Controller { } get hasSelectedOwnReports() { - return this.intersectionModel.user.get("id") === this.session.data.user.id; + return this.intersectionModel.user.get("id") === this.currentUser.user.id; } get isReviewer() { - return allQueryParams(this).reviewer === this.session.data.user.id; + return allQueryParams(this).reviewer === this.currentUser.user.id; } get canVerify() { diff --git a/frontend/app/analysis/index/controller.js b/frontend/app/analysis/index/controller.js index 2b7c1f66..5eb454d0 100644 --- a/frontend/app/analysis/index/controller.js +++ b/frontend/app/analysis/index/controller.js @@ -50,6 +50,7 @@ export default class AnalysisController extends QPController { exportLimit = config.APP.EXPORT_LIMIT; @service session; + @service currentUser; @service store; @service router; @service notify; @@ -119,7 +120,7 @@ export default class AnalysisController extends QPController { get canBill() { return ( - this.session.data.user.isAccountant || this.session.data.user.isSuperuser + this.currentUser.user.isAccountant || this.currentUser.user.isSuperuser ); } diff --git a/frontend/app/components/report-review-warning/component.js b/frontend/app/components/report-review-warning/component.js index c168de6c..93bc3310 100644 --- a/frontend/app/components/report-review-warning/component.js +++ b/frontend/app/components/report-review-warning/component.js @@ -2,7 +2,7 @@ import { inject as service } from "@ember/service"; import Component from "@glimmer/component"; export default class ReportReviewWarning extends Component { - @service session; + @service currentUser; @service unverifiedReports; diff --git a/frontend/app/components/report-review-warning/template.hbs b/frontend/app/components/report-review-warning/template.hbs index efff3fa5..deb5b2ba 100644 --- a/frontend/app/components/report-review-warning/template.hbs +++ b/frontend/app/components/report-review-warning/template.hbs @@ -8,7 +8,7 @@ toDate=(moment-format this.unverifiedReports.reportsToDate "YYYY-MM-DD" ) - reviewer=this.session.data.user.id + reviewer=this.currentUser.user.id editable=1 rejected=null verified=0 @@ -34,7 +34,7 @@ @query={{hash fromDate=null toDate=null - user=this.session.data.user.id + user=this.currentUser.user.id editable=1 rejected=1 verified=0 diff --git a/frontend/app/components/sy-topnav/component.js b/frontend/app/components/sy-topnav/component.js index c73f531d..c879d4c4 100644 --- a/frontend/app/components/sy-topnav/component.js +++ b/frontend/app/components/sy-topnav/component.js @@ -3,7 +3,7 @@ import Component from "@glimmer/component"; import { tracked } from "@glimmer/tracking"; export default class SyTopnav extends Component { - @service session; + @service currentUser; @service media; diff --git a/frontend/app/components/sy-topnav/template.hbs b/frontend/app/components/sy-topnav/template.hbs index 379ec5ea..5662fd1a 100644 --- a/frontend/app/components/sy-topnav/template.hbs +++ b/frontend/app/components/sy-topnav/template.hbs @@ -47,7 +47,7 @@ {{/if}} {{/unless}} - {{#if this.session.data.user.isSuperuser}} + {{#if this.currentUser.user.isSuperuser}}