Skip to content

Delayed Notifications #298

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 23 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4c06e83
feat: add HangFire settings to startup and app settings.
BakhorikovEgor Sep 22, 2023
248c316
feat: add delete and update delayed methods for tasks
BakhorikovEgor Sep 25, 2023
4443ebb
feat: Moved hangfire to NotificationsService
BakhorikovEgor Oct 6, 2023
8557b6c
feat: create ScheduleEvent
BakhorikovEgor Oct 8, 2023
6e0d6ca
feat: add UpdateScheduleEvent class
BakhorikovEgor Oct 8, 2023
20d7fbf
fix: delete delayed logic from CourseService
BakhorikovEgor Oct 23, 2023
635920d
feat: change ScheduleWork id to string
BakhorikovEgor Oct 23, 2023
f3a7d6a
feat: add and delete delayed task events and eventhandlers
BakhorikovEgor Oct 26, 2023
ac1eaa0
feat: add delete update task events and eventhandlers are written
BakhorikovEgor Oct 27, 2023
53e2616
fix: style fixes
BakhorikovEgor Nov 15, 2023
2cb1af1
feat: bear main schedule event handler logic
BakhorikovEgor Nov 19, 2023
1a9e978
feat: transfer CourseDataFilterAttribute.cs to ApiGateway
BakhorikovEgor Nov 22, 2023
323dfd2
feat: add lazy getting course data in task event-handlers
BakhorikovEgor Nov 22, 2023
1d4d5b5
feat: change part of ScheduleWorkId
BakhorikovEgor Nov 22, 2023
eab2e10
Merge pull request #340 from InteIIigeNET/TransferringCourseDataFilter
BakhorikovEgor Dec 2, 2023
d220d21
feat: transfer hangfire dashboard to apigateway
BakhorikovEgor Dec 3, 2023
6476105
Revert "feat: transfer hangfire dashboard to apigateway"
BakhorikovEgor Jan 7, 2024
7ca52e4
fix: composite delayed job key
BakhorikovEgor Feb 16, 2024
5d50b4a
feat: better choice for continuation
BakhorikovEgor Feb 16, 2024
3017b8f
fix: style fixes
BakhorikovEgor Feb 16, 2024
8d8cec2
fix: duplicate reference fix
BakhorikovEgor Feb 23, 2024
70d9ec8
wip
DedSec256 Feb 25, 2024
dac4582
feat: change update extension to rescheduling + add lazy addorupdate…
BakhorikovEgor Mar 6, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<CSharpLanguageVersion>preview</CSharpLanguageVersion>
<CSharpLanguageVersion>8</CSharpLanguageVersion>
</PropertyGroup>

<PropertyGroup>
Original file line number Diff line number Diff line change
@@ -2,6 +2,7 @@
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using HwProj.APIGateway.API.Filters;
using HwProj.APIGateway.API.Models;
using HwProj.AuthService.Client;
using HwProj.CoursesService.Client;
@@ -34,6 +35,7 @@ public async Task<CoursePreviewView[]> GetAllCourses()
return result;
}

[CourseDataFilter]
[HttpGet("{courseId}")]
[ProducesResponseType(typeof(CourseViewModel), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetCourseData(long courseId)
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using HwProj.Models;
using HwProj.Models.AuthService.DTO;
using HwProj.Models.CoursesService.ViewModels;
using HwProj.Utils.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace HwProj.CoursesService.API.Filters
namespace HwProj.APIGateway.API.Filters
{
public class CourseDataFilterAttribute : ResultFilterAttribute
{
public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
var userId = context.HttpContext.Request.GetUserIdFromHeader();
var userId = context.HttpContext.User.FindFirst("_id").Value;

if (userId == null)
{
@@ -22,21 +23,18 @@ public override async Task OnResultExecutionAsync(ResultExecutingContext context
else
{
var result = context.Result as ObjectResult;
if (result?.Value is CourseDTO courseDto && !courseDto.MentorIds.Contains(userId))
if (result?.Value is CourseViewModel courseViewModel &&
courseViewModel.Mentors.All(mentor => mentor.UserId != userId))
{
var currentDate = DateTimeUtils.GetMoscowNow();
foreach (var homework in courseDto.Homeworks)
foreach (var homework in courseViewModel.Homeworks)
{
homework.Tasks =
new List<HomeworkTaskViewModel>(homework.Tasks.Where(t =>
currentDate >= t.PublicationDate));
}

courseDto.CourseMates = courseDto.CourseMates
.Where(t => t.IsAccepted || t.StudentId == userId)
.ToArray();

courseDto.Groups = courseDto.Groups.Where(g => g.StudentsIds.Contains(userId)).ToArray();
courseViewModel.NewStudents = Array.Empty<AccountDataDto>();
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Identity;
using System.Threading.Tasks;
using HwProj.AuthService.API.Events;
using HwProj.Models.Events.AuthEvents;
using HwProj.EventBus.Client.Interfaces;
using HwProj.Models.Roles;
using HwProj.Models.AuthService.ViewModels;
Original file line number Diff line number Diff line change
@@ -5,7 +5,7 @@
using AutoMapper;
using HwProj.AuthService.API.Extensions;
using HwProj.Models.Roles;
using HwProj.AuthService.API.Events;
using HwProj.Models.Events.AuthEvents;
using HwProj.EventBus.Client.Interfaces;
using HwProj.Models.AuthService.DTO;
using HwProj.Models.AuthService.ViewModels;
13 changes: 13 additions & 0 deletions HwProj.Common/HwProj.Events/HwProj.Events.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RootNamespace>HwProj.Events2</RootNamespace>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\HwProj.EventBus\HwProj.EventBus.Client\HwProj.EventBus.Client.csproj" />
<ProjectReference Include="..\HwProj.Models\HwProj.Models.csproj" />
</ItemGroup>

</Project>
2 changes: 1 addition & 1 deletion HwProj.Common/HwProj.HttpUtils/RequestHeaderBuilder.cs
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ public static class RequestHeaderBuilder
{
public static void TryAddUserId(this HttpRequestMessage request, IHttpContextAccessor httpContextAccessor)
{
var userId = httpContextAccessor.HttpContext.User.FindFirst("_id");
var userId = httpContextAccessor.HttpContext?.User.FindFirst("_id");
if (userId != null) request.Headers.Add("UserId", userId.Value);
}
}
Original file line number Diff line number Diff line change
@@ -29,6 +29,18 @@ public class HomeworkTaskViewModel
public bool IsDeferred { get; set; }
}


public class HomeworkTaskDTO
{
public long Id { get; set; }

public string Title { get; set; }

public DateTime PublicationDate { get; set; }

public DateTime? DeadlineDate { get; set; }
}

public class CreateTaskViewModel
{
[Required]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using HwProj.EventBus.Client;

namespace HwProj.Models.Events.AuthEvents
{
public class AdminRegisterEvent : RegisterEvent
{
public AdminRegisterEvent(string userId, string email, string name, string surname = "", string middleName = "")
: base(userId, email, name, surname, middleName)
{
}

public override string EventName => "AdminRegisterEvent";
public override EventCategory Category => EventCategory.Users;
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
using HwProj.EventBus.Client;

namespace HwProj.AuthService.API.Events
namespace HwProj.Models.Events.AuthEvents
{
public class InviteLecturerEvent : Event
{
public string UserId { get; set; }
public string UserEmail { get; set; }
public override string EventName => "InviteLecturerEvent";
public override EventCategory Category => EventCategory.Users;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using HwProj.EventBus.Client;

namespace HwProj.AuthService.API.Events
namespace HwProj.Models.Events.AuthEvents
{
public class PasswordRecoveryEvent : Event
{
@@ -9,5 +9,7 @@ public class PasswordRecoveryEvent : Event
public string Surname { get; set; }
public string Email { get; set; }
public string Token { get; set; }
public override string EventName => "PasswordRecoveryEvent";
public override EventCategory Category => EventCategory.Users;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using HwProj.EventBus.Client;

namespace HwProj.AuthService.API.Events
namespace HwProj.Models.Events.AuthEvents
{
public abstract class RegisterEvent : Event
{
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using HwProj.EventBus.Client;

namespace HwProj.Models.Events.AuthEvents
{
public class StudentRegisterEvent : RegisterEvent
{
public StudentRegisterEvent(string userId, string email, string name, string surname = "",
string middleName = "")
: base(userId, email, name, surname, middleName)
{
}

public override string EventName => "StudentRegisterEvent";
public override EventCategory Category => EventCategory.Users;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using HwProj.EventBus.Client;
using HwProj.Models.CoursesService.ViewModels;

namespace HwProj.Models.Events.CourseEvents
{
public class AddOrUpdateTaskEvent : Event
{
public bool IsUpdate { get; set; }
public long TaskId { get; set; }
public override string EventName => "UpdateTaskEvent";
public override EventCategory Category => EventCategory.Tasks;

public AddOrUpdateTaskEvent(long taskId, bool isUpdate)
{
TaskId = taskId;
IsUpdate = isUpdate;
}
}
}
16 changes: 16 additions & 0 deletions HwProj.Common/HwProj.Models/Events/CourseEvents/DeleteTaskEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using HwProj.EventBus.Client;

namespace HwProj.Models.Events.CourseEvents
{
public class DeleteTaskEvent : Event
{
public long TaskId { get; set; }
public override string EventName => "DeleteTaskEvent";
public override EventCategory Category => EventCategory.Tasks;

public DeleteTaskEvent(long taskId)
{
TaskId = taskId;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
using HwProj.EventBus.Client;

namespace HwProj.CoursesService.API.Events
namespace HwProj.Models.Events.CourseEvents
{
public class LecturerAcceptToCourseEvent : Event
{
public long CourseId { get; set; }
public string CourseName { get; set; }
public string MentorIds { get; set; }
public string StudentId { get; set; }

public override string EventName => "AcceptToCourseEvent";
public override EventCategory Category => EventCategory.Courses;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
using HwProj.EventBus.Client;

namespace HwProj.CoursesService.API.Events
namespace HwProj.Models.Events.CourseEvents
{
public class LecturerInvitedToCourseEvent : Event
{
public long CourseId { get; set; }
public string CourseName { get; set; }
public string MentorId { get; set; }
public string MentorEmail { get; set; }

public override string EventName => "LecturerInvitedToCourseEvent";
public override EventCategory Category => EventCategory.Courses;
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
using HwProj.EventBus.Client;

namespace HwProj.CoursesService.API.Events
namespace HwProj.Models.Events.CourseEvents
{
public class LecturerRejectToCourseEvent : Event
{
public long CourseId { get; set; }
public string CourseName { get; set; }
public string MentorIds { get; set; }
public string StudentId { get; set; }

public override string EventName => "RejectToCourseEvent";
public override EventCategory Category => EventCategory.Courses;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using HwProj.EventBus.Client;

namespace HwProj.CoursesService.API.Events
namespace HwProj.Models.Events.CourseEvents
{
public class NewCourseMateEvent : Event
{
@@ -9,5 +9,8 @@ public class NewCourseMateEvent : Event
public string MentorIds { get; set; }
public string StudentId { get; set; }
public bool IsAccepted { get; set; }

public override string EventName => "NewCourseMateEvent";
public override EventCategory Category => EventCategory.Courses;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
using HwProj.EventBus.Client;
using HwProj.Models.CoursesService.ViewModels;

namespace HwProj.CoursesService.API.Events
namespace HwProj.Models.Events.CourseEvents
{
public class NewHomeworkEvent : Event
{
public string Homework { get; set; }
public CourseDTO Course { get; set; }

public override string EventName => "NewHomeworkEvent";
public override EventCategory Category => EventCategory.Homeworks;

public NewHomeworkEvent(string homework, CourseDTO course)
{
Homework = homework;
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
using HwProj.EventBus.Client;
using HwProj.Models.CoursesService.ViewModels;

namespace HwProj.CoursesService.API.Events
namespace HwProj.Models.Events.CourseEvents
{
public class UpdateHomeworkEvent : Event
{
public HomeworkViewModel Homework { get; set; }
public CourseDTO Course { get; set; }

public override string EventName => "UpdateHomeworkEvent";
public override EventCategory Category => EventCategory.Homeworks;

public UpdateHomeworkEvent(HomeworkViewModel homework, CourseDTO course)
{
Homework = homework;
Original file line number Diff line number Diff line change
@@ -2,13 +2,16 @@
using HwProj.Models.CoursesService.ViewModels;
using HwProj.Models.SolutionsService;

namespace HwProj.SolutionsService.API.Events
namespace HwProj.Models.Events.SolutionEvents
{
public class RateEvent : Event
{
public HomeworkTaskViewModel Task { get; set; }
public SolutionViewModel Solution { get; set; }

public override string EventName => "RateEvent";
public override EventCategory Category => EventCategory.Solutions;

public RateEvent(HomeworkTaskViewModel task, SolutionViewModel solution)
{
Task = task;
Loading