feature: scheduled flag removal

This commit is contained in:
Gary Sharp
2025-09-19 12:18:45 +10:00
parent 356762c811
commit 7603cac01a
34 changed files with 2210 additions and 1055 deletions
@@ -13,19 +13,26 @@ namespace Disco.Services
public static class UserFlagExtensions
{
#region Edit Comments
#region Edit
public static bool CanEdit(this UserFlagAssignment fa)
{
var (_, permission) = UserFlagService.GetUserFlag(fa.UserFlagId);
return permission.CanEdit();
}
public static void OnEdit(this UserFlagAssignment fa, string comments)
public static void OnEdit(this UserFlagAssignment fa, string comments, DateTime? removeDate)
{
if (!fa.CanEdit())
throw new InvalidOperationException("Editing comments for user flags is denied");
fa.Comments = string.IsNullOrWhiteSpace(comments) ? null : comments.Trim();
if (fa.CanRemove() && removeDate != fa.RemoveDate &&
(!removeDate.HasValue || removeDate.Value >= DateTime.Today))
{
fa.RemoveDate = removeDate?.Date;
fa.RemoveUserId = UserService.CurrentUser.UserId;
}
}
#endregion
@@ -48,6 +55,11 @@ namespace Disco.Services
}
public static void OnRemoveUnsafe(this UserFlagAssignment fa, DiscoDataContext database, User removingUser)
{
OnRemoveUnsafe(fa, database, removingUser, false);
}
internal static void OnRemoveUnsafe(this UserFlagAssignment fa, DiscoDataContext database, User removingUser, bool isScheduled)
{
fa = database.UserFlagAssignments.First(a => a.Id == fa.Id);
removingUser = database.Users.First(u => u.UserId == removingUser.UserId);
@@ -55,6 +67,13 @@ namespace Disco.Services
fa.RemovedDate = DateTime.Now;
fa.RemovedUserId = removingUser.UserId;
if (!isScheduled)
{
fa.RemoveDate = null;
fa.RemoveUser = null;
fa.RemoveUserId = null;
}
if (!string.IsNullOrWhiteSpace(fa.UserFlag.OnUnassignmentExpression))
{
try
@@ -87,14 +106,40 @@ namespace Disco.Services
return permission.CanAssign();
}
public static UserFlagAssignment OnAddUserFlag(this User u, DiscoDataContext database, UserFlag flag, string comments)
{
var removeDate = (DateTime?)null;
if (flag.DefaultRemoveDays.HasValue)
removeDate = DateTime.Today.AddDays(flag.DefaultRemoveDays.Value);
return OnAddUserFlag(u, database, flag, comments, removeDate);
}
public static UserFlagAssignment OnAddUserFlag(this User u, DiscoDataContext database, UserFlag flag, string comments, DateTime? removeDate)
{
if (!u.CanAddUserFlag(flag))
throw new InvalidOperationException("Adding user flag is denied");
return u.OnAddUserFlagUnsafe(database, flag, UserService.CurrentUser, comments);
if (u.CanRemoveUserFlag(flag))
return u.OnAddUserFlagUnsafe(database, flag, UserService.CurrentUser, comments, removeDate);
else
return u.OnAddUserFlagUnsafe(database, flag, UserService.CurrentUser, comments);
}
public static bool CanRemoveUserFlag(this User u, UserFlag flag)
{
var (_, permission) = UserFlagService.GetUserFlag(flag.Id);
return permission.CanRemove();
}
public static UserFlagAssignment OnAddUserFlagUnsafe(this User u, DiscoDataContext database, UserFlag flag, User addingUser, string comments)
{
var removeDate = (DateTime?)null;
if (flag.DefaultRemoveDays.HasValue)
removeDate = DateTime.Today.AddDays(flag.DefaultRemoveDays.Value);
return OnAddUserFlagUnsafe(u, database, flag, addingUser, comments, removeDate);
}
public static UserFlagAssignment OnAddUserFlagUnsafe(this User u, DiscoDataContext database, UserFlag flag, User addingUser, string comments, DateTime? removeDate)
{
flag = database.UserFlags.First(f => f.Id == flag.Id);
u = database.Users.First(user => user.UserId == u.UserId);
@@ -110,6 +155,13 @@ namespace Disco.Services
Comments = string.IsNullOrWhiteSpace(comments) ? null : comments.Trim()
};
if (removeDate.HasValue)
{
fa.RemoveDate = removeDate.Value.Date;
fa.RemoveUser = addingUser;
fa.RemoveUserId = addingUser.UserId;
}
database.UserFlagAssignments.Add(fa);
if (!string.IsNullOrWhiteSpace(flag.OnAssignmentExpression))