1- import express , { Request , Response , Router } from "express" ;
1+ import express , { Request , Response , Router , NextFunction } from "express" ;
22import { DatabaseController } from "../database-controller" ;
33import { GetQuery , InsertData , RadData , Testing } from "../types" ;
4-
5- const router = express . Router ( ) ;
4+ import axios from "axios" ;
5+ import jwt from "jsonwebtoken" ;
6+ import authenticateJWT from "../auth/jwt-auth" ;
67
78export default function adminRouter ( dbController : DatabaseController ) : Router {
89 const router = Router ( ) ;
@@ -11,25 +12,82 @@ export default function adminRouter(dbController: DatabaseController): Router {
1112 // The data is in the correct format and ready to be input.
1213
1314 // THIS WILL NOT WORK WITH RAW PAPERS, Data MUST be in InsertData format
14- router . post ( "/insertPapers" , ( req : Request , res : Response ) => {
15- try {
16- insertRows ( requestFromJSON ( req . body ) , dbController ) . then ( ( ) => {
17- // 201: The request was successful, and a new resource was created
18- res . send ( 201 ) ;
19- } ) ;
20- } catch ( error ) {
21- console . error ( `${ error } ` ) ;
15+ router . post (
16+ "/insertPapers" ,
17+ authenticateJWT ,
18+ async ( req : Request , res : Response ) => {
19+ try {
20+ await insertRows ( requestFromJSON ( req . body ) , dbController ) . then ( ( ) => {
21+ // 201: The request was successful, and a new resource was created
22+ res . send ( 201 ) ;
23+ } ) ;
24+ } catch ( error ) {
25+ console . error ( `${ error } ` ) ;
26+ }
27+ } ,
28+ ) ;
29+
30+ router . post (
31+ "/parseRequest" ,
32+ authenticateJWT ,
33+ ( req : Request , res : Response ) => {
34+ try {
35+ // TODO
36+ parsePapers ( req . body ) . then ( ( result : InsertData [ ] ) => {
37+ res . send ( responseToJSON ( result ) ) ;
38+ } ) ;
39+ } catch ( error ) {
40+ console . error ( `` ) ;
41+ }
42+ } ,
43+ ) ;
44+
45+ // Example list of allowed NSIDs (replace with database table in the future)
46+ const allowedNSIDs = [
47+ "mrm322" ,
48+ "nec314" ,
49+ "stm875" ,
50+ "cmh860" ,
51+ "ara258" ,
52+ "xgr074" ,
53+ ] ;
54+
55+ router . get ( "/auth/cas-validate" , async ( req : Request , res : Response ) => {
56+ const { ticket, service } = req . query ;
57+
58+ if ( ! ticket || ! service ) {
59+ res . status ( 400 ) . json ( { error : "Missing ticket or service" } ) ;
2260 }
23- } ) ;
2461
25- router . post ( "/parseRequest" , ( req : Request , res : Response ) => {
2662 try {
27- // TODO
28- parsePapers ( req . body ) . then ( ( result : InsertData [ ] ) => {
29- res . send ( responseToJSON ( result ) ) ;
30- } ) ;
63+ // Validate CAS ticket
64+ const casResponse = await axios . get (
65+ `https://cas.usask.ca/serviceValidate` ,
66+ {
67+ params : { ticket, service } ,
68+ } ,
69+ ) ;
70+
71+ const casData = casResponse . data ; // assumed user CAS info, need to test to see
72+ const nsid = casData . user ; // Potentally the nsid of the user. Again need to test
73+
74+ if ( ! nsid ) {
75+ res . status ( 401 ) . json ( { error : "Invalid CAS Ticket" } ) ;
76+ }
77+
78+ if ( ! allowedNSIDs . includes ( nsid ) ) {
79+ res . status ( 403 ) . json ( { error : "Access denied" } ) ;
80+ }
81+
82+ const token = jwt . sign (
83+ { username : casData . user , roles : casData . roles } ,
84+ process . env . JWT_SECRET ! ,
85+ { expiresIn : "3h" } ,
86+ ) ;
87+
88+ res . json ( { token } ) ;
3189 } catch ( error ) {
32- console . error ( `` ) ;
90+ res . status ( 500 ) . json ( { error : "CAS validation failed" } ) ;
3391 }
3492 } ) ;
3593
0 commit comments