@@ -31,30 +31,35 @@ public class ExerciseService(
3131{
3232 public async Task < IEnumerable < ExerciseResponse > > GetAllAsync ( )
3333 {
34- return await gradeManagementDbContext . Exercise
34+ var exercises = await gradeManagementDbContext . Exercise
3535 . Include ( e => e . ScoreTypeExercises ) . ThenInclude ( ste => ste . ScoreType )
3636 . ProjectTo < ExerciseResponse > ( mapper . ConfigurationProvider )
3737 . ToListAsync ( ) ;
38+ return exercises ;
3839 }
3940
4041 public async Task < ExerciseResponse > GetByIdAsync ( long id )
4142 {
42- return await gradeManagementDbContext . Exercise
43- . Include ( e => e . ScoreTypeExercises ) . ThenInclude ( ste => ste . ScoreType )
44- . ProjectTo < ExerciseResponse > ( mapper . ConfigurationProvider )
43+ var exerciseEntity = await gradeManagementDbContext . Exercise
44+ . Include ( e => e . ScoreTypeExercises )
45+ . ThenInclude ( ste => ste . ScoreType )
4546 . SingleEntityAsync ( e => e . Id == id , id ) ;
47+
48+ return mapper . Map < ExerciseResponse > ( exerciseEntity ) ;
4649 }
4750
4851 public async Task < ExerciseResponse > CreateAsync ( ExerciseRequest requestDto )
4952 {
53+ Exercise exerciseEntity ;
5054 await using var transaction = await gradeManagementDbContext . Database . BeginTransactionAsync ( ) ;
5155 try
5256 {
53- var exerciseEntity = new Exercise ( )
57+ exerciseEntity = new Exercise ( )
5458 {
5559 Name = requestDto . Name ,
5660 GithubPrefix = requestDto . GithubPrefix ,
57- dueDate = requestDto . dueDate ,
61+ ClassroomUrl = requestDto . ClassroomUrl ,
62+ DueDate = requestDto . DueDate ,
5863 CourseId = requestDto . CourseId ,
5964 SubjectId = gradeManagementDbContext . SubjectIdValue
6065 } ;
@@ -63,16 +68,17 @@ public async Task<ExerciseResponse> CreateAsync(ExerciseRequest requestDto)
6368 exerciseEntity = await gradeManagementDbContext . Exercise
6469 . SingleEntityAsync ( e => e . Id == exerciseEntity . Id , exerciseEntity . Id ) ;
6570 exerciseEntity . ScoreTypeExercises =
66- await GetScoreTypeExercisesByTypeAndOrderAsync ( requestDto . ScoreTypes , exerciseEntity . Id ) ;
71+ await GetScoreTypeExercisesByTypeAndOrdernAsync ( requestDto . ScoreTypes , exerciseEntity . Id ) ;
6772 await gradeManagementDbContext . SaveChangesAsync ( ) ;
6873 await transaction . CommitAsync ( ) ;
69- return await GetByIdAsync ( exerciseEntity . Id ) ;
7074 }
7175 catch
7276 {
7377 await transaction . RollbackAsync ( ) ;
7478 throw ;
7579 }
80+
81+ return await GetByIdAsync ( exerciseEntity . Id ) ;
7682 }
7783
7884 public async Task < ExerciseResponse > UpdateAsync ( long id , ExerciseRequest requestDto )
@@ -88,9 +94,10 @@ public async Task<ExerciseResponse> UpdateAsync(long id, ExerciseRequest request
8894
8995 exerciseEntity . Name = requestDto . Name ;
9096 exerciseEntity . GithubPrefix = requestDto . GithubPrefix ;
91- exerciseEntity . dueDate = requestDto . dueDate ;
97+ exerciseEntity . DueDate = requestDto . DueDate ;
9298 exerciseEntity . CourseId = requestDto . CourseId ;
93- exerciseEntity . ScoreTypeExercises = await GetScoreTypeExercisesByTypeAndOrderAsync ( requestDto . ScoreTypes , id ) ;
99+ exerciseEntity . ScoreTypeExercises =
100+ await GetScoreTypeExercisesByTypeAndOrderInTransactionAsync ( requestDto . ScoreTypes , id ) ;
94101
95102 await gradeManagementDbContext . SaveChangesAsync ( ) ;
96103 return await GetByIdAsync ( exerciseEntity . Id ) ;
@@ -121,22 +128,13 @@ public async Task<Exercise> GetExerciseModelByGitHubRepoNameWithoutQfAsync(strin
121128 . SingleEntityAsync ( e => githubRepoName . StartsWith ( e . GithubPrefix ) , 0 ) ;
122129 }
123130
124- private async Task < List < ScoreTypeExercise > > GetScoreTypeExercisesByTypeAndOrderAsync (
131+ private async Task < List < ScoreTypeExercise > > GetScoreTypeExercisesByTypeAndOrderInTransactionAsync (
125132 Dictionary < int , string > scoreTypes , long exerciseId )
126133 {
127134 await using var transaction = await gradeManagementDbContext . Database . BeginTransactionAsync ( ) ;
128135 try
129136 {
130- foreach ( var ( order , type ) in scoreTypes )
131- {
132- var scoreType = await scoreTypeService . GetOrCreateScoreTypeByTypeStringAsync ( type ) ;
133- gradeManagementDbContext . ScoreTypeExercise . Add ( new ScoreTypeExercise
134- {
135- ScoreTypeId = scoreType . Id , ExerciseId = exerciseId , Order = order
136- } ) ;
137- }
138-
139- await gradeManagementDbContext . SaveChangesAsync ( ) ;
137+ await GetScoreTypeExercisesByTypeAndOrdernAsync ( scoreTypes , exerciseId ) ;
140138
141139 await transaction . CommitAsync ( ) ;
142140 }
@@ -146,74 +144,32 @@ private async Task<List<ScoreTypeExercise>> GetScoreTypeExercisesByTypeAndOrderA
146144 throw ;
147145 }
148146
149- return gradeManagementDbContext . ScoreTypeExercise . Where ( s => s . ExerciseId == exerciseId ) . ToList ( ) ;
150- }
151-
152- public async Task < ScoreType > GetScoreTypeByOrderAndExerciseIdAsync ( int order , long exerciseId )
153- {
154- var scoreTypeExercise = await gradeManagementDbContext . ScoreTypeExercise
155- . Include ( ste => ste . ScoreType )
156- . SingleEntityAsync ( ste => ste . ExerciseId == exerciseId && ste . Order == order , 0 ) ;
157- return scoreTypeExercise . ScoreType ;
147+ return await gradeManagementDbContext . ScoreTypeExercise . Where ( s => s . ExerciseId == exerciseId ) . ToListAsync ( ) ;
158148 }
159149
160- public async Task < string > GetCsvByExerciseId ( long exerciseId )
150+ private async Task < List < ScoreTypeExercise > > GetScoreTypeExercisesByTypeAndOrdernAsync (
151+ Dictionary < int , string > scoreTypes , long exerciseId )
161152 {
162- var assignments = await gradeManagementDbContext . Assignment
163- . Where ( a => a . ExerciseId == exerciseId )
164- . Include ( assignment => assignment . Student )
165- . ToListAsync ( ) ;
166-
167- var records = new List < Dictionary < string , object > > ( ) ;
168-
169- foreach ( var assignment in assignments )
153+ foreach ( var ( order , type ) in scoreTypes )
170154 {
171- var pullRequest = await assignmentService . GetMergedPullRequestModelByIdAsync ( assignment . Id ) ;
172- if ( pullRequest == null )
173- {
174- continue ;
175- }
176-
177- var scores = await pullRequestService . GetApprovedScoreModelsByIdAsync ( pullRequest . Id ) ;
178- var record = new Dictionary < string , object >
155+ var scoreType = await scoreTypeService . GetOrCreateScoreTypeByTypeStringAsync ( type ) ;
156+ gradeManagementDbContext . ScoreTypeExercise . Add ( new ScoreTypeExercise
179157 {
180- { "NeptunCode" , assignment . Student . NeptunCode } , { "SumOfScores" , scores . Sum ( s => s . Value ) }
181- } ;
182- foreach ( var score in scores )
183- {
184- record [ score . ScoreType . Type ] = score . Value ;
185- }
186-
187-
188- records . Add ( record ) ;
189- }
190-
191- await using var writer = new StringWriter ( ) ;
192- await using var csv = new CsvWriter ( writer , CultureInfo . InvariantCulture ) ;
193-
194- // Write the header
195- var keys = records [ 0 ] . Keys ;
196- foreach ( var key in keys )
197- {
198- csv . WriteField ( key ) ;
158+ ScoreTypeId = scoreType . Id , ExerciseId = exerciseId , Order = order
159+ } ) ;
199160 }
200161
201- await csv . NextRecordAsync ( ) ;
202-
203- // Write the records
204- foreach ( var record in records )
205- {
206- foreach ( var value in record . Values )
207- {
208- csv . WriteField ( value ) ;
209- }
210-
211- await csv . NextRecordAsync ( ) ;
212- }
162+ await gradeManagementDbContext . SaveChangesAsync ( ) ;
213163
214- await csv . FlushAsync ( ) ;
164+ return await gradeManagementDbContext . ScoreTypeExercise . Where ( s => s . ExerciseId == exerciseId ) . ToListAsync ( ) ;
165+ }
215166
216- return writer . ToString ( ) ;
167+ public async Task < ScoreType > GetScoreTypeByOrderAndExerciseIdAsync ( int order , long exerciseId )
168+ {
169+ var scoreTypeExercise = await gradeManagementDbContext . ScoreTypeExercise
170+ . Include ( ste => ste . ScoreType )
171+ . SingleEntityAsync ( ste => ste . ExerciseId == exerciseId && ste . Order == order , 0 ) ;
172+ return scoreTypeExercise . ScoreType ;
217173 }
218174
219175 public async Task < IEnumerable < Shared . Dtos . ScoreTypeExercise > > GetScoreTypeExercisesByIdAsync ( long id )
@@ -225,4 +181,12 @@ public async Task<string> GetCsvByExerciseId(long exerciseId)
225181 . ProjectTo < Shared . Dtos . ScoreTypeExercise > ( mapper . ConfigurationProvider )
226182 . ToListAsync ( ) ;
227183 }
184+
185+ public async Task SetMoodleScoreUrlByClassroomUrlWithoutQueryFilterAsync ( string clasroomUrl , string moodleScoreUrl )
186+ {
187+ var exercise = await gradeManagementDbContext . Exercise . IgnoreQueryFiltersButNotIsDeleted ( ) . SingleEntityAsync ( e => e . ClassroomUrl == clasroomUrl , 0 ) ;
188+ if ( exercise . MoodleScoreUrl == moodleScoreUrl ) return ;
189+ exercise . MoodleScoreUrl = moodleScoreUrl ;
190+ await gradeManagementDbContext . SaveChangesAsync ( ) ;
191+ }
228192}
0 commit comments