22
33import  {  defineStore  }  from  'pinia' ; 
44import  {  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' ; 
77import  {  ParseableUserCourse  }  from  'src/common/models/courses' ; 
88import  {  logger  }  from  'boot/logger' ; 
99import  {  ResponseError  }  from  'src/common/api-requests/errors' ; 
1010
1111import  {  useUserStore  }  from  'src/stores/users' ; 
1212import  {  useSettingsStore  }  from  'src/stores/settings' ; 
1313import  {  useProblemSetStore  }  from  'src/stores/problem_sets' ; 
14- import  {  UserRole  }  from  'src/stores/permissions' ; 
14+ import  {  usePermissionStore ,   UserRole  }  from  'src/stores/permissions' ; 
1515
1616interface  CourseInfo  { 
1717	course_name : string ; 
@@ -25,18 +25,20 @@ interface CourseInfo {
2525export  interface  SessionState  { 
2626	logged_in : boolean ; 
2727	expiry : number ; 
28- 	user : ParseableUser ; 
28+ 	user : SessionUser ; 
2929	course : CourseInfo ; 
3030	user_courses : ParseableUserCourse [ ] ; 
3131} 
3232
33+ const  logged_out_user  =  {  username : 'logged_out' ,  user_id : 0 ,  is_admin : false  } ; 
34+ 
3335export  const  useSessionStore  =  defineStore ( 'session' ,  { 
3436	// Stores this in localStorage. 
3537	persist : true , 
3638	state : ( ) : SessionState  =>  ( { 
3739		logged_in : false , 
3840		expiry : 0 , 
39- 		user : {   username :  'logged_out'   } , 
41+ 		user : logged_out_user , 
4042		course : { 
4143			course_id : 0 , 
4244			role : '' , 
@@ -45,7 +47,7 @@ export const useSessionStore = defineStore('session', {
4547		user_courses : [ ] 
4648	} ) , 
4749	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  ??  '' }  ` , 
4951		getUser : ( state ) : User  =>  new  User ( state . user ) , 
5052	} , 
5153	actions : { 
@@ -63,7 +65,7 @@ export const useSessionStore = defineStore('session', {
6365			if  ( this . logged_in )  { 
6466				this . user  =  session_info . user ; 
6567			}  else  { 
66- 				this . user  =  new   User ( {   username :  'logged_out'   } ) . toObject ( ) ; 
68+ 				this . user  =  logged_out_user ; 
6769			} 
6870		} , 
6971		setCourse ( course_id : number ) : void   { 
@@ -102,9 +104,29 @@ export const useSessionStore = defineStore('session', {
102104				throw  response . data  as  ResponseError ; 
103105			} 
104106		} , 
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+ 		} , 
105127		logout ( )  { 
106128			this . logged_in  =  false ; 
107- 			this . user  =  new   User ( {   username :  'logged_out'   } ) . toObject ( ) ; 
129+ 			this . user  =  logged_out_user ; 
108130			this . course  =   {  course_id : 0 ,  role : '' ,  course_name : ''  } ; 
109131			useProblemSetStore ( ) . clearAll ( ) ; 
110132			useSettingsStore ( ) . clearAll ( ) ; 
0 commit comments