package Ġcore . ems . service . exercise Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonProperty Ċ import Ġcom . fasterxml . jackson . databind . annotation . Json Serialize Ċ import Ġcore . conf . security . Easy User Ċ import Ġcore . db .* Ċ import Ġcore . ems . service .* Ċ import Ġcore . ems . service . exercise . Teacher Read Course Ex ercises Controller . Course Exercise Resp Ċ import Ġcore . util . DateTime Serializer Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . jetbrains . ex posed . sql . SortOrder Ċ import Ġorg . jetbrains . ex posed . sql . and Ċ import Ġorg . jetbrains . ex posed . sql . select Ċ import Ġorg . jetbrains . ex posed . sql . transactions . transaction Ċ import Ġorg . joda . time . DateTime Ċ import Ġorg . springframework . security . access . annotation . Sec ured Ċ import Ġorg . springframework . web . bind . annotation . GetMapping Ċ import Ġorg . springframework . web . bind . annotation . PathVariable Ċ import Ġorg . springframework . web . bind . annotation . RequestMapping Ċ import Ġorg . springframework . web . bind . annotation . RestController ĊĊ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊ Ċ @ RestController Ċ @ RequestMapping ("/ v 2 ") Ċ class ĠTe acher Read Course Ex ercises Controller ( val Ġcourse Service : ĠCourse Service ) Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠCourse Exercise Resp (@ JsonProperty (" id ") Ġval Ġid : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" effective _ title ") Ġval Ġtitle : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Json Serialize ( using Ġ= ĠDateTime Serializer :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" soft _ deadline ") Ġval Ġsoft Deadline : ĠDateTime ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" grader _ type ") Ġval Ġgr ader Type : ĠGr ader Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" ordering _ idx ") Ġval Ġordering Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" un started _ count ") Ġval Ġun started Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" un graded _ count ") Ġval Ġun graded Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" started _ count ") Ġval Ġstarted Count : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ JsonProperty (" completed _ count ") Ġval Ġcompleted Count : ĠInt ) ĊĊĠĠĠ Ġdata Ġclass ĠResp (@ JsonProperty (" exercises ") Ġval Ġcourse Ex ercises : ĠList < Course Exercise Resp >) ĊĊĠĠĠ Ġ@ Sec ured (" ROLE _ TE AC HER ", Ġ" ROLE _ ADMIN ") ĊĠĠĠ Ġ@ GetMapping ("/ teacher / courses /{ course Id }/ exercises ") ĊĠĠĠ Ġfun Ġcontroller (@ PathVariable (" course Id ") Ġcourse Id String : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaller : ĠEasy User ): ĠResp Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Getting Ġexercises Ġon Ġcourse Ġ$ course Id String Ġfor Ġteacher / admin Ġ${ caller . id }" Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcourse Id Ġ= Ġcourse Id String . id To Long Or Invalid Req () ĊĊĠĠĠĠĠĠĠ Ġassert Teacher Or Admin Has Access To Course ( caller , Ġcourse Id ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResp ( select Teacher Ex ercises On Course ( course Id , Ġcaller , Ġcourse Service )) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġfun Ġselect Teacher Ex ercises On Course ( course Id : ĠLong , Ġcaller : ĠEasy User , Ġcourse Service : ĠCourse Service ): ĠList < Course Exercise Resp > Ġ{ ĊĊĠĠĠ Ġreturn Ġtransaction Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrestricted Groups Ġ= Ġget Teacher Restricted Course Groups ( course Id , Ġcaller ) ĊĠĠĠĠĠĠĠ Ġval Ġstudent Query Ġ= Ġcourse Service . select Students On Course Query ( course Id , Ġempty List (), Ġrestricted Groups , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstudent Count Ġ= Ġstudent Query . count (). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġstudents Ġ= Ġstudent Query . map Ġ{ Ġit [ Student . id ]. value Ġ} ĊĊĠĠĠĠĠĠĠ Ġ( Course Exercise Ġinner Join ĠExercise Ġinner Join ĠExercise Ver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. slice ( Course Exercise . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCourse Exercise . grade Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCourse Exercise . soft Deadline , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExercise Ver . grader Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExercise Ver . title , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCourse Exercise . title Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. select Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCourse Exercise . course Ġeq Ġcourse Id Ġand ĠExercise Ver . valid To . isNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Course Exercise . order Idx , ĠSort Order . ASC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġce Id Ġ= Ġex [ Course Exercise . id ]. value ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatest Submission Valid Gr ades Ġ= Ġcourse Service . select Latest Valid Gr ades ( ce Id , Ġstudents ). map Ġ{ Ġit . grade Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgrade Threshold Ġ= Ġex [ Course Exercise . grade Threshold ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun started Count Ġ= Ġstudent Count Ġ- Ġlatest Submission Valid Gr ades . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun graded Count Ġ= Ġlatest Submission Valid Gr ades . count Ġ{ Ġit Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstarted Count Ġ= Ġlatest Submission Valid Gr ades . count Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit Ġ< Ġgrade Threshold Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompleted Count Ġ= Ġlatest Submission Valid Gr ades . count Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit Ġ>= Ġgrade Threshold Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSan ity Ġcheck ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un started Count Ġ+ Ġun graded Count Ġ+ Ġstarted Count Ġ+ Ġcompleted Count Ġ!= Ġstudent Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Student Ġgrade Ġsanity Ġcheck Ġfailed . Ġun started : Ġ$ un started Count , Ġun graded : Ġ$ un graded Count , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" started : Ġ$ started Count , Ġcompleted : Ġ$ completed Count , Ġstudents Ġin Ġcourse : Ġ$ student Count " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCourse Exercise Resp ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex [ Course Exercise . id ]. value . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex [ Course Exercise . title Alias ] Ġ?: Ġex [ Exercise Ver . title ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex [ Course Exercise . soft Deadline ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex [ Exercise Ver . grader Type ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun started Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun graded Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstarted Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompleted Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ