Skip to content

Commit b22d9df

Browse files
authored
Refactored Database files to MVC architecture (#1604)
* created Program file in models folder * created Meeting file in models folder * removed CourseQueries.hs and CourseInsertion.hs * renamed post -> program across the codebase, excluding database tables and route names
1 parent 8046ede commit b22d9df

File tree

16 files changed

+212
-233
lines changed

16 files changed

+212
-233
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
- Upgraded `jest-environment-jsdom` to v30
2727
- Refactored navigation bar into a React component (for the graph, grid and generate pages only - the about page navigation bar is still rendered using Blaze)
2828
- Refactored backend tests to use `tasty` and `tasty-hunit` instead of `HUnit`
29+
- Refactored course insertion and query functions to align with MVC architectural principles
30+
- Renamed functions that query the database for post/program information from post -> program
2931
- Modified CircleCI configuration so that Jest tests now emit coverage reports which are then uploaded to Coveralls
3032
- Refactored export modal behaviour such that it is handled entirely through React state, rather than through DOM manipulation with vanilla JS
3133
- Added test cases for the `ExportModal` component in `js/components/common`

app/Controllers/Course.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@ module Controllers.Course
44
import Config (runDb)
55
import Control.Monad.IO.Class (liftIO)
66
import qualified Data.Text as T (Text, unlines)
7-
import qualified Database.CourseQueries as CourseHelpers (getDeptCourses)
87
import Database.Persist (Entity)
98
import Database.Persist.Sqlite (SqlPersistM, entityVal, selectList)
109
import Database.Tables as Tables (Courses, coursesCode)
1110
import Happstack.Server (Response, ServerPart, lookText', toResponse)
12-
import Models.Course (returnCourse)
11+
import Models.Course (getDeptCourses, returnCourse)
1312
import Util.Happstack (createJSONResponse)
1413

1514
-- | Takes a course code (e.g. \"CSC108H1\") and sends a JSON representation
@@ -33,4 +32,4 @@ index = do
3332
courseInfo :: ServerPart Response
3433
courseInfo = do
3534
dept <- lookText' "dept"
36-
fmap createJSONResponse (CourseHelpers.getDeptCourses dept)
35+
fmap createJSONResponse (getDeptCourses dept)

app/Controllers/Generate.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ import Data.Aeson (decode, object, (.=))
77
import Data.List (nub)
88
import Data.Maybe (fromJust, isNothing, mapMaybe)
99
import qualified Data.Text.Lazy as TL
10-
import Database.CourseQueries (reqsForPost, returnPost)
1110
import DynamicGraphs.GraphOptions (CourseGraphOptions (..), GraphOptions (..))
1211
import DynamicGraphs.WriteRunDot (generateAndSavePrereqResponse, getBody)
1312
import Happstack.Server
1413
import MasterTemplate
14+
import Models.Program (reqsForProgram, returnProgram)
1515
import Scripts
1616
import Text.Blaze ((!))
1717
import qualified Text.Blaze.Html5 as H
@@ -43,7 +43,7 @@ findAndSavePrereqsResponse = do
4343
let coursesOptions :: CourseGraphOptions = fromJust $ decode requestBody
4444

4545
postResults <- liftIO $ mapM (\code -> do
46-
post <- returnPost (TL.toStrict code)
46+
post <- returnProgram (TL.toStrict code)
4747
return (TL.toStrict code, post))
4848
(programs coursesOptions)
4949

@@ -52,7 +52,7 @@ findAndSavePrereqsResponse = do
5252

5353
allCourses <- liftIO $ nub <$>
5454
if all (== TL.empty) (courses coursesOptions)
55-
then return $ map TL.pack (concatMap reqsForPost validPrograms)
55+
then return $ map TL.pack (concatMap reqsForProgram validPrograms)
5656
else return $ courses coursesOptions
5757

5858
let updatedCoursesOptions = coursesOptions

app/Controllers/Program.hs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
1-
module Controllers.Program(index) where
1+
module Controllers.Program(index, retrieveProgram) where
22

33
import Config (runDb)
44
import Control.Monad.IO.Class (liftIO)
55
import qualified Data.Text as T (Text, unlines)
66
import Database.Persist (Entity)
77
import Database.Persist.Sqlite (SqlPersistM, entityVal, selectList)
8-
import Database.Tables as Tables (Post, postCode)
9-
import Happstack.Server (Response, ServerPart, toResponse)
8+
import Database.Tables as Tables (Post, postCode, postModified)
9+
import Happstack.Server (Request, Response, ServerPart, askRq, ifModifiedSince, lookText',
10+
toResponse)
11+
import Models.Program (returnProgram)
12+
import Util.Happstack (createJSONResponse)
1013

1114
-- | Builds a list of all program codes in the database
1215
index :: ServerPart Response
@@ -16,3 +19,22 @@ index = do
1619
let codes = map (postCode . entityVal) programsList
1720
return $ T.unlines codes :: SqlPersistM T.Text
1821
return $ toResponse response
22+
23+
-- | Takes a http request with a program code and sends a JSON response containing the program data
24+
-- | if the program data has been modified since the timestamp in the request,
25+
-- | or a 304 "Not Modified" response otherwise
26+
retrieveProgram :: ServerPart Response
27+
retrieveProgram = do
28+
req <- askRq
29+
code <- lookText' "code"
30+
liftIO $ queryProgram req code
31+
32+
-- | Queries the database for the program data then returns a JSON response of it
33+
-- | if the program data has been modified since the timestamp in the request,
34+
-- | or a 304 "Not Modified" response otherwise
35+
queryProgram :: Request -> T.Text -> IO Response
36+
queryProgram req code = do
37+
programMaybe <- returnProgram code
38+
case programMaybe of
39+
Nothing -> return $ createJSONResponse (Nothing :: Maybe Post)
40+
Just program -> return $ ifModifiedSince (postModified program) req (createJSONResponse program)

app/Controllers/Timetable.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ import Data.List.Split (splitOn)
1212
import qualified Data.Text as T
1313
import Data.Time (Day, defaultTimeLocale, formatTime, getCurrentTime, toGregorian)
1414
import Data.Time.Calendar.OrdinalDate (fromMondayStartWeek, mondayStartWeek)
15-
import Database.CourseQueries (returnMeeting)
1615
import Database.Persist.Sqlite (entityKey, entityVal, selectList, (==.))
1716
import Database.Tables
1817
import Export.GetImages
1918
import Export.LatexGenerator
2019
import Export.PdfGenerator
2120
import Happstack.Server
2221
import MasterTemplate
22+
import Models.Meeting (returnMeeting)
2323
import Response.Image (returnImageData)
2424
import Scripts
2525
import System.Directory (removeFile)

app/Database/CourseInsertion.hs

Lines changed: 0 additions & 47 deletions
This file was deleted.

app/Database/CourseQueries.hs

Lines changed: 0 additions & 135 deletions
This file was deleted.

app/DynamicGraphs/CourseFinder.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import Control.Monad.Trans.State (StateT, execStateT, modify)
1212
import qualified Data.Map.Strict as Map
1313
import qualified Data.Set as Set
1414
import qualified Data.Text.Lazy as T
15-
import Database.CourseQueries (prereqsForCourse)
1615
import Database.Requirement (Modifier (..), Req (..))
1716
import DynamicGraphs.GraphOptions (GraphOptions (..))
17+
import Models.Course (prereqsForCourse)
1818
import WebParsing.ReqParser (parseReqs)
1919

2020
lookupCourses :: GraphOptions -> [T.Text] -> IO (Map.Map T.Text Req)

app/Export/GetImages.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ import Data.Fixed (mod')
1717
import qualified Data.Map as M
1818
import Data.Maybe (fromMaybe)
1919
import qualified Data.Text as T
20-
import Database.CourseQueries (getMeetingTime)
2120
import Database.Tables as Tables
2221
import Export.ImageConversion
2322
import Export.TimetableImageCreator (renderTable, renderTableHelper, times)
23+
import Models.Meeting (getMeetingTime)
2424
import Svg.Generator
2525
import System.Random (genWord32, newStdGen)
2626

0 commit comments

Comments
 (0)