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