Skip to content

Commit ea7910b

Browse files
czoselc0rydoras
authored andcommitted
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
1 parent 4b386f1 commit ea7910b

30 files changed

+140
-125
lines changed

frontend/app/abilities/absence-credit.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { inject as service } from "@ember/service";
22
import { Ability } from "ember-can";
33

44
export default class AbsenceCreditAbility extends Ability {
5-
@service session;
5+
@service currentUser;
66

77
get user() {
8-
return this.session.data.user;
8+
return this.currentUser.user;
99
}
1010
get canEdit() {
1111
return this.user.isSuperuser;

frontend/app/abilities/overtime-credit.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { inject as service } from "@ember/service";
22
import { Ability } from "ember-can";
33

44
export default class OvertimeCreditAbility extends Ability {
5-
@service session;
5+
@service currentUser;
66

77
get user() {
8-
return this.session.data.user;
8+
return this.currentUser.user;
99
}
1010
get canEdit() {
1111
return this.user.isSuperuser;

frontend/app/abilities/page.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { inject as service } from "@ember/service";
22
import { Ability } from "ember-can";
33

44
export default class PageAbility extends Ability {
5-
@service session;
5+
@service currentUser;
66

77
get user() {
8-
return this.session.data.user;
8+
return this.currentUser.user;
99
}
1010
get canAccess() {
1111
if (!this.user) {

frontend/app/abilities/report.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { inject as service } from "@ember/service";
22
import { Ability } from "ember-can";
33

44
export default class ReportAbility extends Ability {
5-
@service session;
5+
@service currentUser;
66

77
get user() {
8-
return this.session.data.user;
8+
return this.currentUser.user;
99
}
1010

1111
get canEdit() {

frontend/app/abilities/user.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { inject as service } from "@ember/service";
22
import { Ability } from "ember-can";
33

44
export default class UserAbility extends Ability {
5-
@service session;
5+
@service currentUser;
66

77
get user() {
8-
return this.session.data.user;
8+
return this.currentUser.user;
99
}
1010

1111
get canRead() {

frontend/app/analysis/edit/controller.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export default class AnalysisEditController extends Controller {
5555
@service notify;
5656
@service router;
5757
@service fetch;
58-
@service session;
58+
@service currentUser;
5959
@service store;
6060
@service unverifiedReports;
6161

@@ -86,11 +86,11 @@ export default class AnalysisEditController extends Controller {
8686
}
8787

8888
get isAccountant() {
89-
return this.session.data.user.isAccountant;
89+
return this.currentUser.user.isAccountant;
9090
}
9191

9292
get isSuperuser() {
93-
return this.session.data.user.isSuperuser;
93+
return this.currentUser.user.isSuperuser;
9494
}
9595

9696
@task
@@ -130,11 +130,11 @@ export default class AnalysisEditController extends Controller {
130130
}
131131

132132
get hasSelectedOwnReports() {
133-
return this.intersectionModel.user.get("id") === this.session.data.user.id;
133+
return this.intersectionModel.user.get("id") === this.currentUser.user.id;
134134
}
135135

136136
get isReviewer() {
137-
return allQueryParams(this).reviewer === this.session.data.user.id;
137+
return allQueryParams(this).reviewer === this.currentUser.user.id;
138138
}
139139

140140
get canVerify() {

frontend/app/analysis/index/controller.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export default class AnalysisController extends QPController {
5050
exportLimit = config.APP.EXPORT_LIMIT;
5151

5252
@service session;
53+
@service currentUser;
5354
@service store;
5455
@service router;
5556
@service notify;
@@ -119,7 +120,7 @@ export default class AnalysisController extends QPController {
119120

120121
get canBill() {
121122
return (
122-
this.session.data.user.isAccountant || this.session.data.user.isSuperuser
123+
this.currentUser.user.isAccountant || this.currentUser.user.isSuperuser
123124
);
124125
}
125126

frontend/app/components/report-review-warning/component.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { inject as service } from "@ember/service";
22
import Component from "@glimmer/component";
33

44
export default class ReportReviewWarning extends Component {
5-
@service session;
5+
@service currentUser;
66

77
@service unverifiedReports;
88

frontend/app/components/report-review-warning/template.hbs

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
toDate=(moment-format
99
this.unverifiedReports.reportsToDate "YYYY-MM-DD"
1010
)
11-
reviewer=this.session.data.user.id
11+
reviewer=this.currentUser.user.id
1212
editable=1
1313
rejected=null
1414
verified=0
@@ -34,7 +34,7 @@
3434
@query={{hash
3535
fromDate=null
3636
toDate=null
37-
user=this.session.data.user.id
37+
user=this.currentUser.user.id
3838
editable=1
3939
rejected=1
4040
verified=0

frontend/app/components/sy-topnav/component.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Component from "@glimmer/component";
33
import { tracked } from "@glimmer/tracking";
44

55
export default class SyTopnav extends Component {
6-
@service session;
6+
@service currentUser;
77

88
@service media;
99

frontend/app/components/sy-topnav/template.hbs

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
</li>
4848
{{/if}}
4949
{{/unless}}
50-
{{#if this.session.data.user.isSuperuser}}
50+
{{#if this.currentUser.user.isSuperuser}}
5151
<li class="nav-top-list-item">
5252
<LinkTo @route="users.index">
5353
<FaIcon @icon="users" @prefix="fas" />
@@ -59,9 +59,9 @@
5959
<ul class="nav-top-list nav-top-list--right">
6060
<ReportReviewWarning />
6161
<li class="nav-top-list-item">
62-
<LinkTo @route="users.edit" @model={{this.session.data.user.id}}>
62+
<LinkTo @route="users.edit" @model={{this.currentUser.user.id}}>
6363
<FaIcon @icon="user" />
64-
{{this.session.data.user.fullName}}
64+
{{this.currentUser.user.fullName}}
6565
</LinkTo>
6666
</li>
6767
<li class="nav-top-list-item">

frontend/app/index/activities/controller.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export default class ActivitiesIndexController extends Controller {
2222
@service store;
2323
@service notify;
2424
@service tracking;
25+
@service currentUser;
2526

2627
@tracked showUnknownWarning = false;
2728
@tracked showOverlappingWarning = false;
@@ -58,7 +59,7 @@ export default class ActivitiesIndexController extends Controller {
5859
return (
5960
activity.get("date") &&
6061
activity.get("date").isSame(this.model, "day") &&
61-
activity.get("user.id") === this.user.id &&
62+
activity.get("user.id") === this.currentUser.user.id &&
6263
!activity.get("isNew") &&
6364
!activity.get("isDeleted")
6465
);

frontend/app/index/activities/route.js

-6
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,4 @@ export default class IndexActivitiesRoute extends Route {
44
model() {
55
return this.modelFor("index");
66
}
7-
8-
setupController(controller, ...args) {
9-
super.setupController(controller, ...args);
10-
11-
controller.set("user", this.modelFor("protected"));
12-
}
137
}

frontend/app/index/attendances/controller.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export default class AttendanceController extends Controller {
1919
@service notify;
2020
@service store;
2121
@service tracking;
22+
@service currentUser;
2223

2324
AttendanceValidator = AttendanceValidator;
2425

@@ -53,7 +54,7 @@ export default class AttendanceController extends Controller {
5354
return this._allAttendances.filter((a) => {
5455
return (
5556
a.get("date").isSame(this.model, "day") &&
56-
a.get("user.id") === this.user.id &&
57+
a.get("user.id") === this.currentUser.user.id &&
5758
!a.get("isDeleted")
5859
);
5960
});

frontend/app/index/attendances/route.js

+1-14
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,4 @@ import Route from "@ember/routing/route";
1212
* @extends Ember.Route
1313
* @public
1414
*/
15-
export default class AttendaceIndexRoute extends Route {
16-
/**
17-
* Setup controller hook, set the current user
18-
*
19-
* @method setupContrller
20-
* @param {Ember.Controller} controller The controller
21-
* @public
22-
*/
23-
setupController(controller, ...args) {
24-
super.setupController(controller, ...args);
25-
26-
controller.set("user", this.modelFor("protected"));
27-
}
28-
}
15+
export default class AttendaceIndexRoute extends Route {}

frontend/app/index/controller.js

+10-9
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export default class IndexController extends Controller {
3636
@service store;
3737
@service notify;
3838
@service tracking;
39+
@service currentUser;
3940

4041
AbsenceValidations = AbsenceValidations;
4142
MultipleAbsenceValidations = MultipleAbsenceValidations;
@@ -55,7 +56,7 @@ export default class IndexController extends Controller {
5556
return (
5657
a.get("date") &&
5758
a.get("date").isSame(this.date, "day") &&
58-
a.get("user.id") === this.user?.id &&
59+
a.get("user.id") === this.currentUser.user?.id &&
5960
!a.get("isDeleted")
6061
);
6162
});
@@ -166,7 +167,7 @@ export default class IndexController extends Controller {
166167
return (
167168
attendance.get("date") &&
168169
attendance.get("date").isSame(this.date, "day") &&
169-
attendance.get("user.id") === this.user?.id &&
170+
attendance.get("user.id") === this.currentUser.user?.id &&
170171
!attendance.get("isDeleted")
171172
);
172173
});
@@ -214,7 +215,7 @@ export default class IndexController extends Controller {
214215
return this.allReports.filter((report) => {
215216
return (
216217
report.date.isSame(this.date, "day") &&
217-
report.get("user.id") === this.user?.id &&
218+
report.get("user.id") === this.currentUser.user?.id &&
218219
!report.isNew &&
219220
!report.isDeleted
220221
);
@@ -231,7 +232,7 @@ export default class IndexController extends Controller {
231232
return this.allAbsences.filter((absence) => {
232233
return (
233234
absence.date.isSame(this.date, "day") &&
234-
absence.get("user.id") === this.user?.id &&
235+
absence.get("user.id") === this.currentUser.user?.id &&
235236
!absence.isNew &&
236237
!absence.isDeleted
237238
);
@@ -301,7 +302,7 @@ export default class IndexController extends Controller {
301302
* @public
302303
*/
303304
get expectedWorktime() {
304-
return this.user.activeEmployment.worktimePerDay;
305+
return this.currentUser.user.activeEmployment.worktimePerDay;
305306
}
306307

307308
/**
@@ -312,7 +313,7 @@ export default class IndexController extends Controller {
312313
*/
313314
get workdays() {
314315
// eslint-disable-next-line ember/no-get
315-
return get(this, "user.activeEmployment.location.workdays");
316+
return get(this, "currentUser.user.activeEmployment.location.workdays");
316317
}
317318

318319
/**
@@ -324,14 +325,14 @@ export default class IndexController extends Controller {
324325
weeklyOverviewData = trackedFunction(this, {}, async () => {
325326
const allReports = this.allReports.filter(
326327
(report) =>
327-
report.get("user.id") === this.user.get("id") &&
328+
report.get("user.id") === this.currentUser.user.get("id") &&
328329
!report.get("isDeleted") &&
329330
!report.get("isNew")
330331
);
331332

332333
const allAbsences = this.allAbsences.filter(
333334
(absence) =>
334-
absence.get("user.id") === this.user.get("id") &&
335+
absence.get("user.id") === this.currentUser.user.get("id") &&
335336
!absence.get("isDeleted") &&
336337
!absence.get("isNew")
337338
);
@@ -420,7 +421,7 @@ export default class IndexController extends Controller {
420421
const params = {
421422
from_date: from.format("YYYY-MM-DD"),
422423
to_date: to.format("YYYY-MM-DD"),
423-
user: this.user?.id,
424+
user: this.currentUser.user?.id,
424425
};
425426

426427
const absences = yield this.store.query("absence", params);

frontend/app/index/reports/controller.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default class IndexReportController extends Controller {
3333
@service store;
3434
@service notify;
3535
@service router;
36+
@service currentUser;
3637

3738
ReportValidations = ReportValidations;
3839

@@ -65,7 +66,7 @@ export default class IndexReportController extends Controller {
6566
get reports() {
6667
const reportsToday = this._allReports.filter((r) => {
6768
return (
68-
(!r.get("user.id") || r.get("user.id") === this.user.id) &&
69+
(!r.get("user.id") || r.get("user.id") === this.currentUser.user.id) &&
6970
r.get("date").isSame(this.model, "day") &&
7071
!r.get("isDeleted")
7172
);
@@ -74,7 +75,7 @@ export default class IndexReportController extends Controller {
7475
if (!reportsToday.filterBy("isNew", true).get("length")) {
7576
this.store.createRecord("report", {
7677
date: this.model,
77-
user: this.user,
78+
user: this.currentUser.user,
7879
});
7980
}
8081

@@ -86,7 +87,7 @@ export default class IndexReportController extends Controller {
8687
const absences = this.store.peekAll("absence").filter((absence) => {
8788
return (
8889
absence.date.isSame(this.model, "day") &&
89-
absence.get("user.id") === this.user.id &&
90+
absence.get("user.id") === this.currentUser.user.id &&
9091
!absence.isNew &&
9192
!absence.isDeleted
9293
);

frontend/app/index/reports/route.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import moment from "moment";
44

55
export default class IndexReportsRoute extends Route {
66
@service store;
7+
@service currentUser;
78
@service notify;
89

910
/**
@@ -22,7 +23,6 @@ export default class IndexReportsRoute extends Route {
2223
async setupController(controller, model, ...args) {
2324
super.setupController(controller, model, ...args);
2425

25-
controller.set("user", this.modelFor("protected"));
2626
controller.set("rescheduleDate", model);
2727

2828
if (controller.task) {
@@ -36,7 +36,7 @@ export default class IndexReportsRoute extends Route {
3636
: "",
3737
date: model,
3838
comment: controller.comment ?? "",
39-
user: this.modelFor("protected"),
39+
user: this.currentUser.user,
4040
review: controller.review ?? false,
4141
notBillable: controller.notBillable ?? false,
4242
remainingEffort: task.mostRecentRemainingEffort,

0 commit comments

Comments
 (0)