Skip to content

Commit 21930a0

Browse files
committed
feat: change to work on group filters
1 parent 90d370a commit 21930a0

5 files changed

Lines changed: 57 additions & 45 deletions

File tree

HwProj.CoursesService/HwProj.CoursesService.API/AutomapperProfile.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ public AutomapperProfile()
2323
CreateMap<Filter, CourseFilterDTO>();
2424

2525
CreateMap<UpdateGroupViewModel, Group>().ReverseMap();
26+
CreateMap<Group, UserGroupDescription>();
2627

2728
CreateMap<GroupMateViewModel, GroupMate>().ReverseMap();
2829
}

HwProj.CoursesService/HwProj.CoursesService.API/Services/CourseFilterService.cs

Lines changed: 37 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using HwProj.Models.CoursesService.ViewModels;
88
using HwProj.Models.Result;
99
using System.Collections.Generic;
10+
using System;
1011

1112
namespace HwProj.CoursesService.API.Services
1213
{
@@ -19,13 +20,15 @@ public enum ApplyFilterOperation
1920

2021
public class CourseFilterService : ICourseFilterService
2122
{
22-
private const string GlobalFilterUserId = "";
23+
private const string GlobalFilterId = "";
2324
private readonly ICourseFilterRepository _courseFilterRepository;
25+
private readonly IGroupsService _groupsService;
2426

2527
public CourseFilterService(
26-
ICourseFilterRepository courseFilterRepository)
28+
ICourseFilterRepository courseFilterRepository, IGroupsService groupsService)
2729
{
2830
_courseFilterRepository = courseFilterRepository;
31+
_groupsService = groupsService;
2932
}
3033

3134
public async Task<Result<long>> CreateOrUpdateCourseFilter(CreateCourseFilterModel courseFilterModel)
@@ -80,9 +83,13 @@ public async Task<CourseDTO> ApplyFilter(CourseDTO course, string userId)
8083
var isMentor = course.MentorIds.Contains(userId);
8184
var isCourseStudent = course.AcceptedStudents.Any(t => t.StudentId == userId);
8285

86+
// Получаем группы пользователя, чтобы найти фильтры для них
87+
var studentGroups = await _groupsService.GetStudentGroupsAsync(course.Id, userId);
88+
var groupIds = studentGroups.Select(g => g.Id.ToString()).ToArray();
89+
8390
var findFiltersFor = isMentor || !isCourseStudent
84-
? new[] { userId, GlobalFilterUserId }
85-
: course.MentorIds.Concat(new[] { userId, GlobalFilterUserId }).ToArray();
91+
? new[] { userId, GlobalFilterId }
92+
: course.MentorIds.Concat(new[] { userId, GlobalFilterId }).Concat(groupIds).ToArray();
8693

8794
var courseFilters =
8895
(await _courseFilterRepository.GetAsync(findFiltersFor, course.Id))
@@ -91,13 +98,16 @@ public async Task<CourseDTO> ApplyFilter(CourseDTO course, string userId)
9198
if (!isMentor)
9299
{
93100
var studentCourse = course;
94-
if (courseFilters.TryGetValue(GlobalFilterUserId, out var groupFilter))
101+
if (courseFilters.TryGetValue(GlobalFilterId, out var groupFilter))
95102
studentCourse = ApplyFilterInternal(course, studentCourse, groupFilter,
96103
ApplyFilterOperation.Subtract);
97104

98-
studentCourse = courseFilters.TryGetValue(userId, out var studentFilter)
99-
? ApplyFilterInternal(course, studentCourse, studentFilter, ApplyFilterOperation.Union)
100-
: studentCourse;
105+
// Применяем фильтры всех групп студента
106+
foreach (var group in studentGroups)
107+
{
108+
if (courseFilters.TryGetValue(group.Id.ToString(), out var groupCourseFilter))
109+
studentCourse = ApplyFilterInternal(course, studentCourse, groupCourseFilter, ApplyFilterOperation.Union);
110+
}
101111

102112
var mentorIds = course.MentorIds
103113
.Where(u =>
@@ -204,50 +214,36 @@ private CourseDTO ApplyFilterInternal(CourseDTO initialCourseDto, CourseDTO edit
204214
};
205215
}
206216

207-
public async Task UpdateGroupFilters(long courseId, long homeworkId, IEnumerable<string> studentIds)
217+
public async Task UpdateGroupFilters(long courseId, long homeworkId, Group group)
208218
{
209-
var filterIds = studentIds.Union(new[] { GlobalFilterUserId }).ToArray();
210-
var filters = (await _courseFilterRepository.GetAsync(filterIds, courseId))
219+
var groupMates = (group?.GroupMates.ToArray() ?? Array.Empty<GroupMate>()).Select(gm => gm.StudentId).ToList();
220+
221+
var existingFilters = (await _courseFilterRepository.GetAsync(new[] { GlobalFilterId, group.Id.ToString() }, courseId))
211222
.ToDictionary(x => x.Id, x => x.CourseFilter);
212223

213-
foreach (var filterId in filterIds)
214-
{
215-
await AddOrUpdateHomeworkToFilter(filters.GetValueOrDefault(filterId), filterId, courseId, homeworkId);
216-
}
224+
await UpdateOrCreateFilter(GlobalFilterId, courseId, homeworkId, new List<string>(), existingFilters);
225+
await UpdateOrCreateFilter(group.Id.ToString(), courseId, homeworkId, groupMates, existingFilters);
217226
}
218227

219-
private async Task AddOrUpdateHomeworkToFilter(CourseFilter filter, string userId, long courseId,
220-
long homeworkId)
228+
private async Task UpdateOrCreateFilter(string id, long courseId, long homeworkId, List<string> studentIds,
229+
Dictionary<string, CourseFilter> existingFilters)
221230
{
222-
if (filter != null)
231+
if (existingFilters.TryGetValue(id, out var courseFilter) && courseFilter.Filter is { } filter)
223232
{
224-
await UpdateFilterWithHomework(filter, homeworkId);
233+
filter.StudentIds = studentIds;
234+
filter.HomeworkIds.Add(homeworkId);
235+
await UpdateAsync(courseFilter.Id, courseFilter.Filter);
225236
}
226237
else
227238
{
228-
await CreateFilterWithHomework(userId, courseId, homeworkId);
229-
}
230-
}
231-
232-
private async Task UpdateFilterWithHomework(CourseFilter courseFilter, long homeworkId)
233-
{
234-
if (!courseFilter.Filter.HomeworkIds.Contains(homeworkId))
235-
{
236-
courseFilter.Filter.HomeworkIds.Add(homeworkId);
237-
await UpdateAsync(courseFilter.Id, courseFilter.Filter);
239+
var newFilter = new Filter
240+
{
241+
StudentIds = studentIds,
242+
HomeworkIds = new List<long> { homeworkId },
243+
MentorIds = new List<string>()
244+
};
245+
await AddCourseFilter(newFilter, courseId, id);
238246
}
239247
}
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-
}
252248
}
253249
}

HwProj.CoursesService/HwProj.CoursesService.API/Services/GroupsService.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using AutoMapper;
55
using HwProj.CoursesService.API.Models;
6+
using HwProj.CoursesService.API.Repositories;
67
using HwProj.CoursesService.API.Repositories.Groups;
78
using HwProj.Models.CoursesService.DTO;
89
using Microsoft.EntityFrameworkCore;
@@ -13,14 +14,17 @@ public class GroupsService : IGroupsService
1314
{
1415
private readonly IGroupsRepository _groupsRepository;
1516
private readonly IGroupMatesRepository _groupMatesRepository;
17+
private readonly ICourseFilterRepository _courseFilterRepository;
1618
private readonly IMapper _mapper;
1719

1820
public GroupsService(IGroupsRepository groupsRepository,
1921
IGroupMatesRepository groupMatesRepository,
22+
ICourseFilterRepository courseFilterRepository,
2023
IMapper mapper)
2124
{
2225
_groupsRepository = groupsRepository;
2326
_groupMatesRepository = groupMatesRepository;
27+
_courseFilterRepository = courseFilterRepository;
2428
_mapper = mapper;
2529
}
2630

@@ -89,6 +93,17 @@ await _groupMatesRepository
8993
{
9094
Name = updated.Name
9195
});
96+
97+
// Обновляем участников в фильтре группы
98+
var groupFilter = await _courseFilterRepository.GetAsync(groupId.ToString(), group.CourseId);
99+
if (groupFilter != null)
100+
{
101+
groupFilter.Filter.StudentIds = updatedStudentIds.ToList();
102+
await _courseFilterRepository.UpdateAsync(groupFilter.Id, f => new CourseFilter
103+
{
104+
FilterJson = groupFilter.FilterJson
105+
});
106+
}
92107
}
93108

94109
public async Task<UserGroupDescription[]> GetStudentGroupsAsync(long courseId, string studentId)

HwProj.CoursesService/HwProj.CoursesService.API/Services/HomeworksService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public async Task<Homework> AddHomeworkAsync(long courseId, CreateHomeworkViewMo
4747
var group = (await _groupsService.GetGroupsAsync(groupId)).SingleOrDefault();
4848
var groupMates = group?.GroupMates.ToArray() ?? Array.Empty<GroupMate>();
4949

50-
await _courseFilterService.UpdateGroupFilters(courseId, homework.Id, groupMates.Select(gm => gm.StudentId));
50+
await _courseFilterService.UpdateGroupFilters(courseId, homework.Id, group);
5151
notifyStudentIds = groupMates.Select(gm => gm.StudentId).ToArray();
5252
}
5353

@@ -93,10 +93,10 @@ public async Task<Homework> UpdateHomeworkAsync(long homeworkId, CreateHomeworkV
9393

9494
if (update.GroupId is { } groupId)
9595
{
96-
var group = (await _groupsService.GetGroupsAsync(groupId)).FirstOrDefault();
96+
var group = (await _groupsService.GetGroupsAsync(groupId)).SingleOrDefault();
9797
var groupMates = group?.GroupMates.ToArray() ?? Array.Empty<GroupMate>();
9898

99-
await _courseFilterService.UpdateGroupFilters(course.Id, homework.Id, groupMates.Select(gm => gm.StudentId));
99+
await _courseFilterService.UpdateGroupFilters(course.Id, homework.Id, group);
100100
notifyStudentIds = groupMates.Select(gm => gm.StudentId).ToArray();
101101
}
102102

HwProj.CoursesService/HwProj.CoursesService.API/Services/ICourseFilterService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ public interface ICourseFilterService
1515
Task<CourseDTO[]> ApplyFiltersToCourses(string userId, CourseDTO[] courses);
1616
Task<CourseDTO> ApplyFilter(CourseDTO courseDto, string userId);
1717
Task<MentorToAssignedStudentsDTO[]> GetAssignedStudentsIds(long courseId, string[] mentorsIds);
18-
Task UpdateGroupFilters(long courseId, long homeworkId, IEnumerable<string> studentIds);
18+
Task UpdateGroupFilters(long courseId, long homeworkId, Group group);
1919
}
2020
}

0 commit comments

Comments
 (0)