@@ -16,6 +16,7 @@ public enum ApplyFilterOperation
1616 Union ,
1717 Subtract
1818 }
19+
1920 public class CourseFilterService : ICourseFilterService
2021 {
2122 private const string GlobalFilterUserId = "" ;
@@ -65,56 +66,56 @@ await _courseFilterRepository.UpdateAsync(courseFilterId, f =>
6566
6667 public async Task < CourseDTO [ ] > ApplyFiltersToCourses ( string userId , CourseDTO [ ] courses )
6768 {
68- var courseIds = courses . Select ( c => c . Id ) . ToArray ( ) ;
69-
7069 var result = new List < CourseDTO > ( ) ;
7170 foreach ( var course in courses )
7271 {
7372 result . Add ( await ApplyFilter ( course , userId ) ) ;
7473 }
74+
7575 return result . ToArray ( ) ;
7676 }
7777
78- public async Task < CourseDTO > ApplyFilter ( CourseDTO courseDto , string userId )
78+ public async Task < CourseDTO > ApplyFilter ( CourseDTO course , string userId )
7979 {
80- var isMentor = courseDto . MentorIds . Contains ( userId ) ;
81- var isCourseStudent = courseDto . AcceptedStudents . Any ( t => t . StudentId == userId ) ;
80+ var isMentor = course . MentorIds . Contains ( userId ) ;
81+ var isCourseStudent = course . AcceptedStudents . Any ( t => t . StudentId == userId ) ;
82+
8283 var findFiltersFor = isMentor || ! isCourseStudent
8384 ? new [ ] { userId , GlobalFilterUserId }
84- : courseDto . MentorIds . Concat ( new [ ] { userId , GlobalFilterUserId } ) . ToArray ( ) ;
85+ : course . MentorIds . Concat ( new [ ] { userId , GlobalFilterUserId } ) . ToArray ( ) ;
8586
8687 var courseFilters =
87- ( await _courseFilterRepository . GetAsync ( findFiltersFor , courseDto . Id ) )
88+ ( await _courseFilterRepository . GetAsync ( findFiltersFor , course . Id ) )
8889 . ToDictionary ( x => x . UserId , x => x . CourseFilter ) ;
8990
9091 if ( ! isMentor )
9192 {
92- var studentCourse = courseDto ;
93+ var studentCourse = course ;
9394 if ( courseFilters . TryGetValue ( GlobalFilterUserId , out var groupFilter ) )
94- studentCourse = ApplyFilterInternal ( courseDto , studentCourse , groupFilter , ApplyFilterOperation . Subtract ) ;
95-
96- return courseFilters . TryGetValue ( userId , out var studentFilter )
97- ? ApplyFilterInternal ( courseDto , studentCourse , studentFilter , ApplyFilterOperation . Union )
98- : studentCourse ;
95+ studentCourse = ApplyFilterInternal ( course , studentCourse , groupFilter ,
96+ ApplyFilterOperation . Subtract ) ;
97+
98+ studentCourse = courseFilters . TryGetValue ( userId , out var studentFilter )
99+ ? ApplyFilterInternal ( course , studentCourse , studentFilter , ApplyFilterOperation . Union )
100+ : studentCourse ;
101+
102+ var mentorIds = course . MentorIds
103+ . Where ( u =>
104+ // Фильтрация не настроена вообще
105+ ! courseFilters . TryGetValue ( u , out var courseFilter ) ||
106+ // Не отфильтрованы студенты
107+ ! courseFilter . Filter . StudentIds . Any ( ) ||
108+ // Фильтр содержит студента
109+ courseFilter . Filter . StudentIds . Contains ( userId ) )
110+ . ToArray ( ) ;
111+
112+ studentCourse . MentorIds = mentorIds ;
113+ return studentCourse ;
99114 }
100115
101- var course = courseFilters . TryGetValue ( userId , out var userFilter )
102- ? ApplyFilterInternal ( courseDto , courseDto , userFilter , ApplyFilterOperation . Intersect )
103- : courseDto ;
104- if ( isMentor || ! isCourseStudent ) return course ;
105-
106- var mentorIds = course . MentorIds
107- . Where ( u =>
108- // Фильтрация не настроена вообще
109- ! courseFilters . TryGetValue ( u , out var courseFilter ) ||
110- // Не отфильтрованы студенты
111- ! courseFilter . Filter . StudentIds . Any ( ) ||
112- // Фильтр содержит студента
113- courseFilter . Filter . StudentIds . Contains ( userId ) )
114- . ToArray ( ) ;
115-
116- courseDto . MentorIds = mentorIds ;
117- return course ;
116+ return courseFilters . TryGetValue ( userId , out var userFilter )
117+ ? ApplyFilterInternal ( course , course , userFilter , ApplyFilterOperation . Intersect )
118+ : course ;
118119 }
119120
120121 public async Task < MentorToAssignedStudentsDTO [ ] > GetAssignedStudentsIds ( long courseId , string [ ] mentorsIds )
@@ -138,14 +139,15 @@ private async Task<long> AddCourseFilter(Filter filter, long courseId, string us
138139 return courseFilterId ;
139140 }
140141
141- private CourseDTO ApplyFilterInternal ( CourseDTO initialCourseDto , CourseDTO editingCourseDto , CourseFilter ? courseFilter , ApplyFilterOperation filterType )
142+ private CourseDTO ApplyFilterInternal ( CourseDTO initialCourseDto , CourseDTO editingCourseDto ,
143+ CourseFilter ? courseFilter , ApplyFilterOperation filterType )
142144 {
143145 var filter = courseFilter ? . Filter ;
144146
145147 if ( filter == null )
146148 return editingCourseDto ;
147149
148- var homeworks = filter . HomeworkIds . Any ( )
150+ var homeworks = filter . HomeworkIds . Count != 0
149151 ? filterType switch
150152 {
151153 ApplyFilterOperation . Intersect => editingCourseDto . Homeworks
@@ -182,6 +184,7 @@ private CourseDTO ApplyFilterInternal(CourseDTO initialCourseDto, CourseDTO edit
182184 ? new GroupViewModel
183185 {
184186 Id = gs . Id ,
187+ Name = gs . Name ,
185188 StudentsIds = filteredStudentsIds
186189 }
187190 : null ;
@@ -201,71 +204,50 @@ private CourseDTO ApplyFilterInternal(CourseDTO initialCourseDto, CourseDTO edit
201204 } ;
202205 }
203206
204- public async Task UpdateGroupFilters ( long courseId , long homeworkId , GroupMate [ ] groupMates )
207+ public async Task UpdateGroupFilters ( long courseId , long homeworkId , IEnumerable < string > studentIds )
205208 {
206- // Добавление группового домашнего задания в глобальный фильтр курса
207- var globalFilter = await _courseFilterRepository . GetAsync ( GlobalFilterUserId , courseId ) ;
209+ var filterIds = studentIds . Union ( new [ ] { GlobalFilterUserId } ) . ToArray ( ) ;
210+ var filters = ( await _courseFilterRepository . GetAsync ( filterIds , courseId ) )
211+ . ToDictionary ( x => x . UserId , x => x . CourseFilter ) ;
208212
209- if ( globalFilter != null )
213+ foreach ( var filterId in filterIds )
210214 {
211- var filter = globalFilter . Filter ;
212-
213- if ( ! filter . HomeworkIds . Contains ( homeworkId ) )
214- filter . HomeworkIds . Add ( homeworkId ) ;
215+ await AddOrUpdateHomeworkToFilter ( filters . GetValueOrDefault ( filterId ) , filterId , courseId , homeworkId ) ;
216+ }
217+ }
215218
216- await _courseFilterRepository . UpdateAsync ( globalFilter . Id , f =>
217- new CourseFilter
218- {
219- FilterJson = new CourseFilter { Filter = filter } . FilterJson
220- } ) ;
219+ private async Task AddOrUpdateHomeworkToFilter ( CourseFilter filter , string userId , long courseId ,
220+ long homeworkId )
221+ {
222+ if ( filter != null )
223+ {
224+ await UpdateFilterWithHomework ( filter , homeworkId ) ;
221225 }
222226 else
223227 {
224- var newFilter = new Filter
225- {
226- StudentIds = new List < string > ( ) ,
227- HomeworkIds = new List < long > { homeworkId } ,
228- MentorIds = new List < string > ( ) ,
229- } ;
230-
231- await _courseFilterRepository . AddAsync ( new CourseFilter { Filter = newFilter } , GlobalFilterUserId , courseId ) ;
228+ await CreateFilterWithHomework ( userId , courseId , homeworkId ) ;
232229 }
230+ }
233231
234- // Добавление группового домашнего задания в персональные фильтры участников группы
235- var studentIds = groupMates . Select ( gm => gm . StudentId ) . ToArray ( ) ;
236- var studentFilters = ( await _courseFilterRepository . GetAsync ( studentIds , courseId ) )
237- . ToDictionary ( x => x . UserId , x => x . CourseFilter ) ;
238-
239- foreach ( var groupMate in groupMates )
232+ private async Task UpdateFilterWithHomework ( CourseFilter courseFilter , long homeworkId )
233+ {
234+ if ( ! courseFilter . Filter . HomeworkIds . Contains ( homeworkId ) )
240235 {
241- if ( studentFilters . TryGetValue ( groupMate . StudentId , out var studentFilter ) )
242- {
243- var filter = studentFilter . Filter ;
244- if ( ! filter . HomeworkIds . Contains ( homeworkId ) )
245- filter . HomeworkIds . Add ( homeworkId ) ;
246-
247- await _courseFilterRepository . UpdateAsync ( studentFilter . Id , f =>
248- new CourseFilter
249- {
250- FilterJson = new CourseFilter { Filter = filter } . FilterJson
251- } ) ;
252- }
253- else
254- {
255- var newFilter = new Filter
256- {
257- StudentIds = new List < string > ( ) ,
258- HomeworkIds = new List < long > { homeworkId } ,
259- MentorIds = new List < string > ( )
260- } ;
261-
262- await _courseFilterRepository . AddAsync (
263- new CourseFilter { Filter = newFilter } ,
264- groupMate . StudentId ,
265- courseId
266- ) ;
267- }
236+ courseFilter . Filter . HomeworkIds . Add ( homeworkId ) ;
237+ await UpdateAsync ( courseFilter . Id , courseFilter . Filter ) ;
268238 }
269239 }
240+
241+ private async Task CreateFilterWithHomework ( string userId , long courseId , long homeworkId )
242+ {
243+ var newFilter = new Filter
244+ {
245+ StudentIds = new List < string > ( ) ,
246+ HomeworkIds = new List < long > { homeworkId } ,
247+ MentorIds = new List < string > ( )
248+ } ;
249+
250+ await AddCourseFilter ( newFilter , courseId , userId ) ;
251+ }
270252 }
271253}
0 commit comments