Skip to content

Commit 740c562

Browse files
refactor: moved the logic of filling tasks with LTI information to TaskServices
1 parent b59a18a commit 740c562

7 files changed

Lines changed: 38 additions & 34 deletions

File tree

HwProj.APIGateway/HwProj.APIGateway.API/Lti/Controllers/LtiDeepLinkingReturnController.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class LtiDeepLinkingReturnController(
2323
ILtiKeyService ltiKeyService
2424
) : ControllerBase
2525
{
26+
private static readonly JwtSecurityTokenHandler Handler = new();
27+
2628
[HttpPost("deepLinkReturn")]
2729
[AllowAnonymous]
2830
public async Task<IActionResult> OnDeepLinkingReturnAsync([FromForm] IFormCollection form)
@@ -33,14 +35,13 @@ public async Task<IActionResult> OnDeepLinkingReturnAsync([FromForm] IFormCollec
3335
}
3436

3537
var tokenString = jwtValue.ToString();
36-
var handler = new JwtSecurityTokenHandler();
3738

38-
if (!handler.CanReadToken(tokenString))
39+
if (!Handler.CanReadToken(tokenString))
3940
{
4041
return BadRequest("Invalid JWT structure");
4142
}
4243

43-
var unverifiedToken = handler.ReadJwtToken(tokenString);
44+
var unverifiedToken = Handler.ReadJwtToken(tokenString);
4445
var clientId = unverifiedToken.Subject;
4546

4647
var tool = toolService.GetByClientId(clientId);
@@ -54,7 +55,7 @@ public async Task<IActionResult> OnDeepLinkingReturnAsync([FromForm] IFormCollec
5455

5556
try
5657
{
57-
handler.ValidateToken(tokenString, new TokenValidationParameters
58+
Handler.ValidateToken(tokenString, new TokenValidationParameters
5859
{
5960
ValidateIssuer = true,
6061
ValidIssuer = tool.issuer,
@@ -85,7 +86,7 @@ public async Task<IActionResult> OnDeepLinkingReturnAsync([FromForm] IFormCollec
8586
return Content("<script>window.close();</script>", "text/html");
8687
}
8788

88-
string safeJsonPayload;
89+
string jsonPayload;
8990
var options = new JsonSerializerOptions
9091
{
9192
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
@@ -95,30 +96,31 @@ public async Task<IActionResult> OnDeepLinkingReturnAsync([FromForm] IFormCollec
9596
{
9697
var singleParsed = JsonSerializer.Deserialize<JsonElement>(itemsClaims[0]);
9798

98-
safeJsonPayload = singleParsed.ValueKind ==JsonValueKind.Array ?
99+
jsonPayload = singleParsed.ValueKind == JsonValueKind.Array ?
99100
JsonSerializer.Serialize(singleParsed, options) : JsonSerializer.Serialize(new[] { singleParsed }, options);
100101
}
101102
else
102103
{
103104
var elements = itemsClaims
104105
.Select(v => JsonSerializer.Deserialize<JsonElement>(v))
105106
.ToList();
106-
safeJsonPayload = JsonSerializer.Serialize(elements, options);
107+
jsonPayload = JsonSerializer.Serialize(elements, options);
107108
}
108109

110+
// language=html
109111
var htmlResponse = $@"
110112
<!DOCTYPE html>
111113
<html>
112114
<head><title>Processing LTI Return...</title></head>
113-
<body
115+
<body>
114116
<script type=""application/json"" id=""lti-payload"">
115-
{safeJsonPayload}
117+
{jsonPayload}
116118
</script>
117119
118120
<script>
119121
try {{
120-
var payloadElement = document.getElementById('lti-payload');
121-
var payload = JSON.parse(payloadElement.textContent);
122+
let payloadElement = document.getElementById('lti-payload');
123+
let payload = JSON.parse(payloadElement.textContent);
122124
123125
if (window.opener) {{
124126
window.opener.postMessage({{

HwProj.Common/HwProj.Models/CoursesService/ViewModels/HomeworkTaskViewModels.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ public class HomeworkTaskViewModel
3131

3232
public bool DeadlineDateNotSet { get; set; }
3333

34+
public long CourseId { get; set; }
35+
3436
public long HomeworkId { get; set; }
3537

3638
public bool IsGroupWork { get; set; }

HwProj.CoursesService/HwProj.CoursesService.API/Controllers/TasksController.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,7 @@ public async Task<IActionResult> GetTask(long taskId, [FromQuery] bool withCrite
4545
if (!lecturers.Contains(userId)) return BadRequest();
4646
}
4747

48-
var taskViewModel = task.ToHomeworkTaskViewModel();
49-
await _tasksService.FillTaskViewModelWithLtiLaunchDataAsync(taskViewModel, taskId);
50-
51-
return Ok(taskViewModel);
48+
return Ok(task);
5249
}
5350

5451
[HttpGet("getForEditing/{taskId}")]
@@ -102,7 +99,7 @@ await _tasksService.UpdateTaskAsync(taskId,
10299
taskViewModel,
103100
taskViewModel.ActionOptions ?? ActionOptions.Default);
104101

105-
return Ok(updatedTask.ToHomeworkTaskViewModel());
102+
return Ok(updatedTask);
106103
}
107104

108105
[HttpPost("addQuestion")]
@@ -115,7 +112,7 @@ public async Task<IActionResult> AddQuestionForTask([FromBody] AddTaskQuestionDt
115112
if (string.IsNullOrEmpty(question.Text))
116113
return BadRequest("Текст вопроса пуст");
117114

118-
if (!await _coursesService.HasStudent(task.Homework.CourseId, studentId))
115+
if (!await _coursesService.HasStudent(task.CourseId, studentId))
119116
return Forbid();
120117

121118
await _taskQuestionsService.AddQuestionAsync(new TaskQuestion
@@ -125,6 +122,7 @@ await _taskQuestionsService.AddQuestionAsync(new TaskQuestion
125122
Text = question.Text,
126123
IsPrivate = question.IsPrivate,
127124
});
125+
128126
return Ok();
129127
}
130128

@@ -135,7 +133,7 @@ public async Task<IActionResult> GetQuestionsForTask(long taskId)
135133
var task = await _tasksService.GetTaskAsync(taskId);
136134
if (userId == null || task == null) return NotFound();
137135

138-
var courseId = task.Homework.CourseId;
136+
var courseId = task.CourseId;
139137
var isLecturer = (await _coursesService.GetCourseLecturers(courseId)).Contains(userId);
140138
var isStudent = await _coursesService.HasStudent(courseId, userId);
141139
if (!isLecturer && !isStudent)
@@ -154,6 +152,7 @@ public async Task<IActionResult> GetQuestionsForTask(long taskId)
154152
IsPrivate = x.IsPrivate,
155153
LecturerId = x.LecturerId
156154
});
155+
157156
return Ok(result);
158157
}
159158

@@ -204,7 +203,7 @@ public async Task<IActionResult> AddAnswerForQuestion(AddAnswerForQuestionDto an
204203
var task = await _tasksService.GetTaskAsync(question.TaskId);
205204
if (task == null) return NotFound();
206205

207-
var courseId = task.Homework.CourseId;
206+
var courseId = task.CourseId;
208207
var isLecturer = (await _coursesService.GetCourseLecturers(courseId)).Contains(lecturerId);
209208
if (!isLecturer) return Forbid();
210209

HwProj.CoursesService/HwProj.CoursesService.API/Domains/MappingExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public static HomeworkTaskViewModel ToHomeworkTaskViewModel(this HomeworkTask ta
5757
DeadlineDateNotSet = task.DeadlineDate == null || task.DeadlineDate == DateToOverride,
5858
IsDeferred = DateTime.UtcNow < evaluatedPublicationDate,
5959
IsGroupWork = tags.Contains(HomeworkTags.GroupWork),
60+
CourseId = task.Homework.CourseId,
6061
HomeworkId = task.HomeworkId,
6162
Tags = tags,
6263
Criteria = task.Criteria.Select(c => new CriterionViewModel

HwProj.CoursesService/HwProj.CoursesService.API/Filters/CourseMentorOnlyAttribute.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public override async Task OnActionExecutionAsync(ActionExecutingContext context
4444
else if (routeData.Values.TryGetValue("taskId", out var taskId))
4545
{
4646
var task = await _taskService.GetTaskAsync(long.Parse(taskId.ToString()));
47-
mentorIds = await _coursesService.GetCourseLecturers(task.Homework.CourseId);
47+
mentorIds = await _coursesService.GetCourseLecturers(task.CourseId);
4848
}
4949

5050
if (mentorIds != null && !mentorIds.Contains(userId.ToString()))

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ namespace HwProj.CoursesService.API.Services
88
{
99
public interface ITasksService
1010
{
11-
Task<HomeworkTask> GetTaskAsync(long taskId, bool withCriteria = false);
11+
Task<HomeworkTaskViewModel> GetTaskAsync(long taskId, bool withCriteria = false);
1212
Task<HomeworkTask> GetForEditingTaskAsync(long taskId);
13-
Task<LtiLaunchData?> GetTaskLtiDataAsync(long taskId);
14-
Task<HomeworkTask> AddTaskAsync(long homeworkId, PostTaskViewModel taskViewModel);
13+
Task<HomeworkTaskViewModel> AddTaskAsync(long homeworkId, PostTaskViewModel taskViewModel);
1514
Task DeleteTaskAsync(long taskId);
16-
Task<HomeworkTask> UpdateTaskAsync(long taskId, PostTaskViewModel taskViewModel, ActionOptions options);
17-
Task FillTaskViewModelWithLtiLaunchDataAsync(HomeworkTaskViewModel taskViewModel, long taskId);
15+
Task<HomeworkTaskViewModel> UpdateTaskAsync(long taskId, PostTaskViewModel taskViewModel, ActionOptions options);
1816
Task FillLtiLaunchDataForTasks(HomeworkViewModel viewModel);
1917
}
2018
}

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,25 @@ public TasksService(ITasksRepository tasksRepository, IEventBus eventBus, ICours
2828
_coursesRepository = coursesRepository;
2929
}
3030

31-
public async Task<HomeworkTask> GetTaskAsync(long taskId, bool withCriteria = false)
31+
public async Task<HomeworkTaskViewModel> GetTaskAsync(long taskId, bool withCriteria = false)
3232
{
3333
var taskFromDb = withCriteria
3434
? await _tasksRepository.GetWithHomeworkAndCriteriaAsync(taskId)
3535
: await _tasksRepository.GetWithHomeworkAsync(taskId);
3636

3737
CourseDomain.FillTask(taskFromDb.Homework, taskFromDb);
38+
var taskViewModel = taskFromDb.ToHomeworkTaskViewModel();
39+
await this.FillTaskViewModelWithLtiLaunchDataAsync(taskViewModel, taskId);
3840

39-
return taskFromDb;
41+
return taskViewModel;
4042
}
4143

4244
public async Task<HomeworkTask> GetForEditingTaskAsync(long taskId)
4345
{
4446
return await _tasksRepository.GetWithHomeworkAndCriteriaAsync(taskId);
4547
}
4648

47-
public async Task<HomeworkTask> AddTaskAsync(
49+
public async Task<HomeworkTaskViewModel> AddTaskAsync(
4850
long homeworkId,
4951
PostTaskViewModel taskViewModel)
5052
{
@@ -76,7 +78,7 @@ public async Task DeleteTaskAsync(long taskId)
7678
await _tasksRepository.DeleteAsync(taskId);
7779
}
7880

79-
public async Task<HomeworkTask> UpdateTaskAsync(
81+
public async Task<HomeworkTaskViewModel> UpdateTaskAsync(
8082
long taskId,
8183
PostTaskViewModel taskViewModel,
8284
ActionOptions options)
@@ -119,11 +121,6 @@ public async Task FillTaskViewModelWithLtiLaunchDataAsync(HomeworkTaskViewModel
119121
taskViewModel.LtiLaunchData = ltiLaunchData.ToLtiLaunchData();
120122
}
121123

122-
public async Task<LtiLaunchData?> GetTaskLtiDataAsync(long taskId)
123-
{
124-
return await _tasksRepository.GetLtiDataAsync(taskId);
125-
}
126-
127124
public async Task FillLtiLaunchDataForTasks(HomeworkViewModel viewModel)
128125
{
129126
if (viewModel.Tasks != null && viewModel.Tasks.Any())
@@ -141,6 +138,11 @@ public async Task FillLtiLaunchDataForTasks(HomeworkViewModel viewModel)
141138
}
142139
}
143140

141+
private async Task<LtiLaunchData?> GetTaskLtiDataAsync(long taskId)
142+
{
143+
return await _tasksRepository.GetLtiDataAsync(taskId);
144+
}
145+
144146
private async Task<Dictionary<long, LtiLaunchData>> GetLtiDataForTasksAsync(long[] taskIds)
145147
{
146148
return await _tasksRepository.GetLtiDataForTasksAsync(taskIds);

0 commit comments

Comments
 (0)