1- import { Faculty , FacultyMap , Subject } from "./types" ;
1+ import { Faculty , FacultyMap , Subject , SubjectMap } from "./types" ;
22import f from "./faculties.json" ;
3+ import s from "./subjects.json" ;
34import axios from "axios" ;
45import iconv from "iconv-lite" ;
5- const fs = require ( "fs" ) ;
6+ import fs from "fs" ;
67
78const faculties = f as FacultyMap ;
9+ const subjects = s as SubjectMap ;
810
911export const getFacultyList = ( ) : Faculty [ ] => {
1012 return Object . entries ( faculties ) . map ( ( [ code , { name_en, name_th } ] ) => ( {
@@ -20,19 +22,41 @@ export const getFaculty = (code: string): Faculty | undefined => {
2022 return { code, ...res } ;
2123} ;
2224
23- export const getSubjectList = async (
24- facultyCode : string ,
25- ) : Promise < Subject [ ] | undefined > => {
25+ export const getSubjectList = ( ) : Subject [ ] => {
26+ return Object . entries ( subjects ) . map (
27+ ( [
28+ code ,
29+ { abbr, facultyCode, name, isClosed, openSemester, closeSemester } ,
30+ ] ) => ( {
31+ code,
32+ abbr,
33+ facultyCode,
34+ name,
35+ isClosed,
36+ openSemester,
37+ closeSemester,
38+ } ) ,
39+ ) ;
40+ } ;
41+
42+ export const getSubject = ( code : string ) : Subject | undefined => {
43+ if ( ! ( code in subjects ) ) return ;
44+ const res = subjects [ code ] ;
45+ return { code, ...res } ;
46+ } ;
47+
48+ export const runGetSubject = async ( ) : Promise < Subject [ ] | undefined > => {
2649 const facultyList = getFacultyList ( ) ;
2750 const noSubjectFacultyCodeList = [ "56" , "58" , "99" , "01" ] ;
2851 const filteredFacultyList = facultyList . filter ( ( f ) => {
2952 return ! noSubjectFacultyCodeList . includes ( f . code ) ;
3053 } ) ;
31- let results : any [ ] = [ ] ;
32- for ( const fc of filteredFacultyList ) {
54+ let results ;
55+ const subjectData : SubjectMap = { } ;
56+ for ( const f of filteredFacultyList ) {
3357 try {
3458 const response = await axios . get (
35- `https://www.reg.chula.ac.th/document/courseName${ fc . code } .txt` ,
59+ `https://www.reg.chula.ac.th/document/courseName${ f . code } .txt` ,
3660 {
3761 responseType : "arraybuffer" ,
3862 transformResponse : [
@@ -42,31 +66,29 @@ export const getSubjectList = async (
4266 ] ,
4367 } ,
4468 ) ;
45- const regex = / ( \d + ) \s + ( \d + ) \s + ( (?: \S + \s ) + ) \s + ( \d \/ \d + ) (?: \s + ) ? ( \d \/ \d + ) ? \n (?: \s + ) ? ( [ ^ \n ] * ) ? \n (?: \s + ) ? ( [ ^ \n ] * ) \n / g;
69+ const regex = / ( \d + ) \s + ( \d + ) \s + ( (?: \S + \s ) + ) \s + ( \d \/ \d + ) (?: \s + ) ? ( \d \/ \d + ) ? \n (?: \ + ) ? ( [ ^ \n ] + ) ? \n (?: \ + ) ? ( [ ^ \n ] + ) ? \n / g;
4670 const regexResults : RegExpMatchArray | null = response . data . match ( regex ) ;
47- if ( regexResults === null ) throw new Error ( "NULL " ) ;
48- const subjectList = regexResults . map < Subject > ( ( s ) => {
71+ if ( regexResults === null ) throw new Error ( "regexResult is null " ) ;
72+ regexResults . forEach ( ( s ) => {
4973 const subject = s . split ( regex ) ;
50- return {
51- code : subject [ 2 ] ,
52- facultyCode : fc . code ,
53- abbr : subject [ 7 ] ,
74+ subjectData [ subject [ 2 ] ] = {
75+ facultyCode : f . code ,
76+ abbr : subject [ 3 ] . trim ( ) ,
5477 name : {
55- en : subject [ 3 ] . trim ( ) ,
56- th : subject [ 6 ] . trim ( ) ,
78+ en : subject [ 7 ] ,
79+ th : subject [ 6 ] ,
5780 } ,
5881 isClosed : subject [ 5 ] !== undefined ,
5982 openSemester : subject [ 4 ] ,
6083 closeSemester : subject [ 5 ] ,
6184 } ;
6285 } ) ;
63- results = results . concat ( subjectList ) ;
6486 } catch ( e ) {
6587 throw e ;
6688 }
6789 }
68- const jsonData = JSON . stringify ( results ) ;
69- fs . writeFile ( `subjects.json` , jsonData , function ( err : any ) {
90+ const jsonData = JSON . stringify ( subjectData ) ;
91+ await fs . writeFile ( `subjects.json` , jsonData , function ( err : any ) {
7092 if ( err ) {
7193 console . log ( err ) ;
7294 }
0 commit comments