@@ -20,6 +20,7 @@ router.post('/create', async (req, res) => {
2020 await PermissionRequest . create ( {
2121 userId : decoded . token . _id ,
2222 type,
23+ status : 'PENDING' ,
2324 } ) ;
2425 res . sendStatus ( OK ) ;
2526 } catch ( error ) {
@@ -66,37 +67,55 @@ router.post('/delete', async (req, res) => {
6667 const decoded = await decodeToken ( req , membershipState . MEMBER ) ;
6768 if ( decoded . status !== OK ) return res . sendStatus ( decoded . status ) ;
6869
69- const { type, _id } = req . body ;
70- if ( ! type || ! Object . keys ( PermissionRequestTypes ) . includes ( type ) ) {
71- return res . status ( BAD_REQUEST ) . send ( { error : `${ type } is an invalid type, try
72- ${ Object . keys ( PermissionRequestTypes ) } ` } ) ;
73- }
70+ const { _id } = req . body ;
71+ const isOfficer = decoded . token . accessLevel >= membershipState . OFFICER ;
7472
7573 try {
76- let idToUse = _id ;
77-
78- if ( ! idToUse ) {
79- idToUse = decoded . token . _id ;
80- }
81-
82- if ( decoded . token . accessLevel < membershipState . OFFICER ) {
83- idToUse = decoded . token . _id ;
84- }
85-
8674 const query = {
87- _id : idToUse ,
88- type,
75+ _id,
8976 deletedAt : null ,
9077 } ;
9178
92- const request = await PermissionRequest . findOne ( query ) ;
79+ if ( ! isOfficer ) {
80+ query . userId = decoded . token . _id ;
81+ query . status = 'PENDING' ;
82+ }
9383
84+ const request = await PermissionRequest . findOne ( query ) ;
9485 if ( ! request ) return res . sendStatus ( NOT_FOUND ) ;
86+
87+ // if the officer deletes a pending request, consider it denied.
88+ // if a user deletes their pending request, consider they gave up asking
89+ if ( request . status === 'PENDING' && isOfficer ) {
90+ request . status = 'DENIED' ;
91+ } else if ( request . status === 'APPROVED' ) {
92+ request . status = 'REVOKED' ;
93+ }
94+
9595 request . deletedAt = new Date ( ) ;
9696 await request . save ( ) ;
9797 res . sendStatus ( OK ) ;
9898 } catch ( error ) {
99- logger . error ( 'Failed to delete permission request:' , error ) ;
99+ logger . error ( 'Failed to mark permission request as deleted:' , error ) ;
100+ res . sendStatus ( SERVER_ERROR ) ;
101+ }
102+ } ) ;
103+
104+ router . post ( '/approve' , async ( req , res ) => {
105+ const decoded = await decodeToken ( req , membershipState . OFFICER ) ;
106+ if ( decoded . status !== OK ) return res . sendStatus ( decoded . status ) ;
107+
108+ const { _id } = req . body ;
109+
110+ try {
111+ const request = await PermissionRequest . findOne ( { _id, status : 'PENDING' } ) ;
112+ if ( ! request ) return res . status ( NOT_FOUND ) . send ( { error : 'Pending request not found' } ) ;
113+
114+ request . status = 'APPROVED' ;
115+ await request . save ( ) ;
116+ res . sendStatus ( OK ) ;
117+ } catch ( error ) {
118+ logger . error ( 'Failed to approve permission request:' , error ) ;
100119 res . sendStatus ( SERVER_ERROR ) ;
101120 }
102121} ) ;
0 commit comments