2
2
3
3
import { defineStore } from 'pinia' ;
4
4
import { api } from 'boot/axios' ;
5
- import { ParseableUser , User } from 'src/common/models/users' ;
6
- import type { SessionInfo } from 'src/common/models/session' ;
5
+ import { SessionUser , User } from 'src/common/models/users' ;
6
+ import { ParseableSessionInfo , parseSessionInfo , SessionInfo , UserPassword } from 'src/common/models/session' ;
7
7
import { ParseableUserCourse } from 'src/common/models/courses' ;
8
8
import { logger } from 'boot/logger' ;
9
9
import { ResponseError } from 'src/common/api-requests/errors' ;
10
10
11
11
import { useUserStore } from 'src/stores/users' ;
12
12
import { useSettingsStore } from 'src/stores/settings' ;
13
13
import { useProblemSetStore } from 'src/stores/problem_sets' ;
14
- import { UserRole } from 'src/stores/permissions' ;
14
+ import { usePermissionStore , UserRole } from 'src/stores/permissions' ;
15
15
16
16
interface CourseInfo {
17
17
course_name : string ;
@@ -25,18 +25,20 @@ interface CourseInfo {
25
25
export interface SessionState {
26
26
logged_in : boolean ;
27
27
expiry : number ;
28
- user : ParseableUser ;
28
+ user : SessionUser ;
29
29
course : CourseInfo ;
30
30
user_courses : ParseableUserCourse [ ] ;
31
31
}
32
32
33
+ const logged_out_user = { username : 'logged_out' , user_id : 0 , is_admin : false } ;
34
+
33
35
export const useSessionStore = defineStore ( 'session' , {
34
36
// Stores this in localStorage.
35
37
persist : true ,
36
38
state : ( ) : SessionState => ( {
37
39
logged_in : false ,
38
40
expiry : 0 ,
39
- user : { username : 'logged_out' } ,
41
+ user : logged_out_user ,
40
42
course : {
41
43
course_id : 0 ,
42
44
role : '' ,
@@ -45,7 +47,7 @@ export const useSessionStore = defineStore('session', {
45
47
user_courses : [ ]
46
48
} ) ,
47
49
getters : {
48
- full_name : ( state ) : string => `${ state . user ? .first_name ?? '' } ${ state . user ? .last_name ?? '' } ` ,
50
+ full_name : ( state ) : string => `${ state . user . first_name ?? '' } ${ state . user . last_name ?? '' } ` ,
49
51
getUser : ( state ) : User => new User ( state . user ) ,
50
52
} ,
51
53
actions : {
@@ -63,7 +65,7 @@ export const useSessionStore = defineStore('session', {
63
65
if ( this . logged_in ) {
64
66
this . user = session_info . user ;
65
67
} else {
66
- this . user = new User ( { username : 'logged_out' } ) . toObject ( ) ;
68
+ this . user = logged_out_user ;
67
69
}
68
70
} ,
69
71
setCourse ( course_id : number ) : void {
@@ -102,9 +104,29 @@ export const useSessionStore = defineStore('session', {
102
104
throw response . data as ResponseError ;
103
105
}
104
106
} ,
107
+ /**
108
+ * Attempt to login to webwork3 with username/password. If successful, fetch
109
+ * needed data (usercourses, roles, permissions).
110
+ */
111
+ async login ( user_pass : UserPassword ) : Promise < boolean > {
112
+ const response = await api . post ( 'login' , user_pass ) ;
113
+ const session_info = parseSessionInfo ( response . data as ParseableSessionInfo ) ;
114
+ if ( ! session_info . logged_in || ! session_info . user . user_id ) {
115
+ return false ;
116
+ } else {
117
+ // success
118
+ this . updateSessionInfo ( session_info ) ;
119
+ const permission_store = usePermissionStore ( ) ;
120
+ // permissions require access to user courses and respective roles
121
+ await this . fetchUserCourses ( ) ;
122
+ await permission_store . fetchRoles ( ) ;
123
+ await permission_store . fetchRoutePermissions ( ) ;
124
+ return true ;
125
+ }
126
+ } ,
105
127
logout ( ) {
106
128
this . logged_in = false ;
107
- this . user = new User ( { username : 'logged_out' } ) . toObject ( ) ;
129
+ this . user = logged_out_user ;
108
130
this . course = { course_id : 0 , role : '' , course_name : '' } ;
109
131
useProblemSetStore ( ) . clearAll ( ) ;
110
132
useSettingsStore ( ) . clearAll ( ) ;
0 commit comments