Skip to content

Commit b6a268b

Browse files
refactor: improved the structure in LtiKeyServices and HomeworkController
1 parent b9efaf0 commit b6a268b

7 files changed

Lines changed: 75 additions & 83 deletions

File tree

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Services/LtiKeyService.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
public class LtiKeyService(IHttpClientFactory httpClientFactory, IMemoryCache keycMemoryCache) : ILtiKeyService
1010
{
1111

12+
private const int ageByDefault = 24;
13+
1214
public async Task<IEnumerable<SecurityKey>?> GetKeysAsync(string jwksUrl)
1315
{
1416
if (string.IsNullOrEmpty(jwksUrl))
@@ -18,7 +20,7 @@ public class LtiKeyService(IHttpClientFactory httpClientFactory, IMemoryCache ke
1820

1921
if (keycMemoryCache.TryGetValue(jwksUrl, out JsonWebKeySet? keySet))
2022
{
21-
return keySet!.Keys;
23+
return keySet?.Keys;
2224
}
2325

2426
try
@@ -32,24 +34,24 @@ public class LtiKeyService(IHttpClientFactory httpClientFactory, IMemoryCache ke
3234
var json = await response.Content.ReadAsStringAsync();
3335
keySet = new JsonWebKeySet(json);
3436

35-
if (response.Headers.CacheControl?.NoCache == true ||
36-
response.Headers.CacheControl?.NoStore == true ||
37-
response.Headers.CacheControl?.Private == true)
37+
var cacheControl = response.Headers.CacheControl;
38+
if (cacheControl?.NoCache == true ||
39+
cacheControl?.NoStore == true ||
40+
cacheControl?.Private == true)
3841
{
3942
return keySet.Keys;
4043
}
4144

42-
const int ageByDefault = 24;
4345
var cacheDuration = TimeSpan.FromHours(ageByDefault);
4446

45-
if (response.Headers.CacheControl?.MaxAge.HasValue == true)
47+
if (cacheControl?.MaxAge.HasValue == true)
4648
{
47-
cacheDuration = response.Headers.CacheControl.MaxAge.Value;
49+
cacheDuration = cacheControl.MaxAge.Value;
4850
}
4951

5052
var cacheOptions = new MemoryCacheEntryOptions()
5153
.SetAbsoluteExpiration(cacheDuration)
52-
.SetPriority(CacheItemPriority.High); //Не нужно же удалять первым при нехватке памяти?
54+
.SetPriority(CacheItemPriority.High);
5355

5456
keycMemoryCache.Set(jwksUrl, keySet, cacheOptions);
5557

HwProj.CoursesService/HwProj.CoursesService.API/Controllers/HomeworksController.cs

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,10 @@ namespace HwProj.CoursesService.API.Controllers
1313
public class HomeworksController : Controller
1414
{
1515
private readonly IHomeworksService _homeworksService;
16-
private readonly ITasksService _tasksService;
1716

18-
public HomeworksController(IHomeworksService homeworksService, ITasksService tasksService)
17+
public HomeworksController(IHomeworksService homeworksService)
1918
{
2019
_homeworksService = homeworksService;
21-
_tasksService = tasksService;
2220
}
2321

2422
[HttpPost("{courseId}/add")]
@@ -29,36 +27,19 @@ public async Task<IActionResult> AddHomework(long courseId,
2927
var validationResult = Validator.ValidateHomework(homeworkViewModel);
3028
if (validationResult.Any()) return BadRequest(validationResult);
3129

32-
var newHomework = await _homeworksService.AddHomeworkAsync(courseId, homeworkViewModel);
33-
var responseViewModel = newHomework.ToHomeworkViewModel();
34-
35-
await FillLtiLaunchDataForTasks(responseViewModel);
30+
var responseViewModel = await _homeworksService.AddHomeworkAsync(courseId, homeworkViewModel);
3631

3732
return Ok(responseViewModel);
3833
}
3934

4035
[HttpGet("get/{homeworkId}")]
4136
public async Task<HomeworkViewModel> GetHomework(long homeworkId)
42-
{
43-
var homeworkFromDb = await _homeworksService.GetHomeworkAsync(homeworkId);
44-
var homeworkViewModel = homeworkFromDb.ToHomeworkViewModel();
45-
46-
await FillLtiLaunchDataForTasks(homeworkViewModel);
47-
48-
return homeworkViewModel;
49-
}
37+
=> await _homeworksService.GetHomeworkAsync(homeworkId);
5038

5139
[HttpGet("getForEditing/{homeworkId}")]
5240
[ServiceFilter(typeof(CourseMentorOnlyAttribute))]
5341
public async Task<HomeworkViewModel> GetForEditingHomework(long homeworkId)
54-
{
55-
var homeworkFromDb = await _homeworksService.GetForEditingHomeworkAsync(homeworkId);
56-
var homeworkViewModel = homeworkFromDb.ToHomeworkViewModel();
57-
58-
await FillLtiLaunchDataForTasks(homeworkViewModel);
59-
60-
return homeworkViewModel;
61-
}
42+
=> await _homeworksService.GetForEditingHomeworkAsync(homeworkId);
6243

6344
[HttpDelete("delete/{homeworkId}")]
6445
[ServiceFilter(typeof(CourseMentorOnlyAttribute))]
@@ -77,28 +58,8 @@ public async Task<IActionResult> UpdateHomework(long homeworkId,
7758
if (validationResult.Any()) return BadRequest(validationResult);
7859

7960
var updatedHomework = await _homeworksService.UpdateHomeworkAsync(homeworkId, homeworkViewModel);
80-
var responseViewModel = updatedHomework.ToHomeworkViewModel();
81-
82-
await FillLtiLaunchDataForTasks(responseViewModel);
83-
84-
return Ok(responseViewModel);
85-
}
86-
87-
private async Task FillLtiLaunchDataForTasks(HomeworkViewModel viewModel)
88-
{
89-
if (viewModel.Tasks != null && viewModel.Tasks.Any())
90-
{
91-
var taskIds = viewModel.Tasks.Select(t => t.Id).ToArray();
92-
var ltilaunchMultipleData = await _tasksService.GetLtiDataForTasksAsync(taskIds);
9361

94-
foreach (var task in viewModel.Tasks)
95-
{
96-
if (ltilaunchMultipleData.TryGetValue(task.Id, out var ltiLaunchData))
97-
{
98-
task.LtiLaunchData = ltiLaunchData.ToLtiLaunchData();
99-
}
100-
}
101-
}
62+
return Ok(updatedHomework);
10263
}
10364
}
10465
}

HwProj.CoursesService/HwProj.CoursesService.API/Domains/Validations.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace HwProj.CoursesService.API.Domains
88
{
99
public static class Validator
1010
{
11-
public static List<string> ValidateTask(PostTaskViewModel task, Homework homework,
11+
public static List<string> ValidateTask(PostTaskViewModel task, HomeworkViewModel homework,
1212
HomeworkTask? previousState = null)
1313
{
1414
var errors = new List<string>();
@@ -72,11 +72,11 @@ public static List<string> ValidateTask(PostTaskViewModel task, Homework homewor
7272
return errors;
7373
}
7474

75-
public static List<string> ValidateHomework(CreateHomeworkViewModel homework, Homework? previousState = null)
75+
public static List<string> ValidateHomework(CreateHomeworkViewModel homework, HomeworkViewModel? previousState = null)
7676
{
7777
var errors = new List<string>();
7878

79-
homework.Tasks.ForEach(task => errors.AddRange(ValidateTask(task, homework.ToHomework())));
79+
homework.Tasks.ForEach(task => errors.AddRange(ValidateTask(task, homework.ToHomework().ToHomeworkViewModel())));
8080

8181
if (homework.HasDeadline == false && homework.DeadlineDate != null)
8282
{

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

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,19 @@ public class HomeworksService : IHomeworksService
1717
private readonly IEventBus _eventBus;
1818
private readonly ICoursesRepository _coursesRepository;
1919
private readonly ITasksRepository _tasksRepository;
20+
private readonly ITasksService _tasksService;
2021

2122
public HomeworksService(IHomeworksRepository homeworksRepository, IEventBus eventBus,
22-
ICoursesRepository coursesRepository, ITasksRepository tasksRepository)
23+
ICoursesRepository coursesRepository, ITasksRepository tasksRepository, ITasksService tasksService)
2324
{
2425
_homeworksRepository = homeworksRepository;
2526
_eventBus = eventBus;
2627
_coursesRepository = coursesRepository;
2728
_tasksRepository = tasksRepository;
29+
_tasksService = tasksService;
2830
}
2931

30-
public async Task<Homework> AddHomeworkAsync(long courseId, CreateHomeworkViewModel homeworkViewModel)
32+
public async Task<HomeworkViewModel> AddHomeworkAsync(long courseId, CreateHomeworkViewModel homeworkViewModel)
3133
{
3234
homeworkViewModel.Tags = homeworkViewModel.Tags.Where(t => !string.IsNullOrWhiteSpace(t)).ToList();
3335
var homework = homeworkViewModel.ToHomework();
@@ -41,40 +43,46 @@ public async Task<Homework> AddHomeworkAsync(long courseId, CreateHomeworkViewMo
4143
homework.DeadlineDate));
4244
}
4345

44-
await _homeworksRepository.AddAsync(homework);
46+
await _homeworksRepository.AddAsync(homework);
47+
var savedHomework = await GetHomeworkAsync(homework.Id, withCriteria: true);
4548

46-
if (homeworkViewModel.Tasks != null && homework.Tasks != null)
47-
{
48-
var createdTasks = homework.Tasks.ToList();
49-
var taskModels = homeworkViewModel.Tasks;
49+
if (homeworkViewModel.Tasks == null || homework.Tasks == null) return savedHomework;
5050

51-
for (var i = 0; i < createdTasks.Count && i < taskModels.Count; i++)
52-
{
53-
var ltiLaunchData = taskModels[i].LtiLaunchData.ToLtiLaunchData();
54-
if (ltiLaunchData == null)
55-
{
56-
continue;
57-
}
51+
var createdTasks = homework.Tasks.ToList();
5852

59-
await _tasksRepository.AddOrUpdateLtiLaunchDataAsync(createdTasks[i].Id, ltiLaunchData);
53+
for (var i = 0; i < createdTasks.Count && i < homeworkViewModel.Tasks.Count; i++)
54+
{
55+
var taskModel = homeworkViewModel.Tasks[i];
56+
var ltiLaunchData = taskModel.LtiLaunchData.ToLtiLaunchData();
57+
if (ltiLaunchData == null)
58+
{
59+
continue;
6060
}
61+
62+
await _tasksRepository.AddOrUpdateLtiLaunchDataAsync(createdTasks[i].Id, ltiLaunchData);
63+
savedHomework.Tasks[i].LtiLaunchData = taskModel.LtiLaunchData;
6164
}
6265

63-
return await GetHomeworkAsync(homework.Id, withCriteria: true);
66+
return savedHomework;
6467
}
6568

66-
public async Task<Homework> GetHomeworkAsync(long homeworkId, bool withCriteria = false)
69+
public async Task<HomeworkViewModel> GetHomeworkAsync(long homeworkId, bool withCriteria = false)
6770
{
6871
var homework = await _homeworksRepository.GetWithTasksAsync(homeworkId, withCriteria);
6972

7073
CourseDomain.FillTasksInHomework(homework);
7174

72-
return homework;
75+
var resultViewModelHomework = homework.ToHomeworkViewModel();
76+
await _tasksService.FillLtiLaunchDataForTasks(resultViewModelHomework);
77+
78+
return resultViewModelHomework;
7379
}
7480

75-
public async Task<Homework> GetForEditingHomeworkAsync(long homeworkId)
81+
public async Task<HomeworkViewModel> GetForEditingHomeworkAsync(long homeworkId)
7682
{
77-
var result = await _homeworksRepository.GetWithTasksAsync(homeworkId);
83+
var homework = await _homeworksRepository.GetWithTasksAsync(homeworkId);
84+
var result = homework.ToHomeworkViewModel();
85+
await _tasksService.FillLtiLaunchDataForTasks(result);
7886
return result;
7987
}
8088

@@ -83,7 +91,7 @@ public async Task DeleteHomeworkAsync(long homeworkId)
8391
await _homeworksRepository.DeleteAsync(homeworkId);
8492
}
8593

86-
public async Task<Homework> UpdateHomeworkAsync(long homeworkId, CreateHomeworkViewModel homeworkViewModel)
94+
public async Task<HomeworkViewModel> UpdateHomeworkAsync(long homeworkId, CreateHomeworkViewModel homeworkViewModel)
8795
{
8896
homeworkViewModel.Tags = homeworkViewModel.Tags.Where(t => !string.IsNullOrWhiteSpace(t)).ToList();
8997
var update = homeworkViewModel.ToHomework();
@@ -109,7 +117,11 @@ public async Task<Homework> UpdateHomeworkAsync(long homeworkId, CreateHomeworkV
109117

110118
var updatedHomework = await _homeworksRepository.GetWithTasksAsync(homeworkId);
111119
CourseDomain.FillTasksInHomework(updatedHomework);
112-
return updatedHomework;
120+
121+
var updatedHomeworkViewModel = updatedHomework.ToHomeworkViewModel();
122+
await _tasksService.FillLtiLaunchDataForTasks(updatedHomeworkViewModel);
123+
124+
return updatedHomeworkViewModel;
113125
}
114126
}
115127
}

HwProj.CoursesService/HwProj.CoursesService.API/Services/IHomeworksService.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ namespace HwProj.CoursesService.API.Services
66
{
77
public interface IHomeworksService
88
{
9-
Task<Homework> AddHomeworkAsync(long courseId, CreateHomeworkViewModel homeworkViewModel);
9+
Task<HomeworkViewModel> AddHomeworkAsync(long courseId, CreateHomeworkViewModel homeworkViewModel);
1010

11-
Task<Homework> GetHomeworkAsync(long homeworkId, bool withCriteria = false);
11+
Task<HomeworkViewModel> GetHomeworkAsync(long homeworkId, bool withCriteria = false);
1212

13-
Task<Homework> GetForEditingHomeworkAsync(long homeworkId);
13+
Task<HomeworkViewModel> GetForEditingHomeworkAsync(long homeworkId);
1414

1515
Task DeleteHomeworkAsync(long homeworkId);
1616

17-
Task<Homework> UpdateHomeworkAsync(long homeworkId, CreateHomeworkViewModel homeworkViewModel);
17+
Task<HomeworkViewModel> UpdateHomeworkAsync(long homeworkId, CreateHomeworkViewModel homeworkViewModel);
1818
}
1919
}

HwProj.CoursesService/HwProj.CoursesService.API/Services/ITasksService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ public interface ITasksService
1111
Task<HomeworkTask> GetTaskAsync(long taskId, bool withCriteria = false);
1212
Task<HomeworkTask> GetForEditingTaskAsync(long taskId);
1313
Task<LtiLaunchData?> GetTaskLtiDataAsync(long taskId);
14-
Task<Dictionary<long, LtiLaunchData>> GetLtiDataForTasksAsync(long[] taskIds);
1514
Task<HomeworkTask> AddTaskAsync(long homeworkId, PostTaskViewModel taskViewModel);
1615
Task DeleteTaskAsync(long taskId);
1716
Task<HomeworkTask> UpdateTaskAsync(long taskId, PostTaskViewModel taskViewModel, ActionOptions options);
1817
Task FillTaskViewModelWithLtiLaunchDataAsync(HomeworkTaskViewModel taskViewModel, long taskId);
18+
Task FillLtiLaunchDataForTasks(HomeworkViewModel viewModel);
1919
}
2020
}

HwProj.CoursesService/HwProj.CoursesService.API/Services/TasksService.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,24 @@ public async Task FillTaskViewModelWithLtiLaunchDataAsync(HomeworkTaskViewModel
124124
return await _tasksRepository.GetLtiDataAsync(taskId);
125125
}
126126

127-
public async Task<Dictionary<long, LtiLaunchData>> GetLtiDataForTasksAsync(long[] taskIds)
127+
public async Task FillLtiLaunchDataForTasks(HomeworkViewModel viewModel)
128+
{
129+
if (viewModel.Tasks != null && viewModel.Tasks.Any())
130+
{
131+
var taskIds = viewModel.Tasks.Select(t => t.Id).ToArray();
132+
var ltiLaunchMultipleData = await this.GetLtiDataForTasksAsync(taskIds);
133+
134+
foreach (var task in viewModel.Tasks)
135+
{
136+
if (ltiLaunchMultipleData.TryGetValue(task.Id, out var ltiLaunchData))
137+
{
138+
task.LtiLaunchData = ltiLaunchData.ToLtiLaunchData();
139+
}
140+
}
141+
}
142+
}
143+
144+
private async Task<Dictionary<long, LtiLaunchData>> GetLtiDataForTasksAsync(long[] taskIds)
128145
{
129146
return await _tasksRepository.GetLtiDataForTasksAsync(taskIds);
130147
}

0 commit comments

Comments
 (0)