diff --git a/src/Model/DBContext.cs b/src/Model/DBContext.cs index c72f7c0..a9fb2b3 100644 --- a/src/Model/DBContext.cs +++ b/src/Model/DBContext.cs @@ -25,6 +25,7 @@ public class DBContext : DbContext { public DbSet Parties { get; set; } = null!; public DbSet Neighborhoods { get; set; } = null!; // we had a brief debate on whether it's neighborhoods or neighborheed + public DbSet UserBans { get; set; } = null!; private readonly IOptions config; @@ -252,5 +253,9 @@ public class DBContext : DbContext { builder.Entity().HasOne(r => r.Viking) .WithOne(e => e.Neighborhood) .HasForeignKey(e => e.VikingId); + + builder.Entity().HasOne(r => r.User) + .WithMany(e => e.Bans) + .HasForeignKey(e => e.UserId); } } diff --git a/src/Model/User.cs b/src/Model/User.cs index 358feb1..daac900 100644 --- a/src/Model/User.cs +++ b/src/Model/User.cs @@ -17,4 +17,5 @@ public class User { public virtual ICollection Sessions { get; set; } = null!; public virtual ICollection Vikings { get; set; } = null!; public virtual ICollection PairData { get; set; } = null!; + public virtual ICollection Bans { get; set; } = null!; } diff --git a/src/Model/UserBan.cs b/src/Model/UserBan.cs new file mode 100644 index 0000000..17bf54f --- /dev/null +++ b/src/Model/UserBan.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.DataAnnotations; +using sodoff.Schema; + +namespace sodoff.Model; + +public class UserBan +{ + [Key] + public int Id { get; set; } + + [Required] + public Guid? UserId { get; set; } = null!; + + public UserBanType BanType { get; set; } = UserBanType.TemporarySuspension; + public DateTime? CreatedAt { get; set; } = new DateTime(); + public DateTime? EndsAt { get; set; } = new DateTime(); + + public virtual User User { get; set; } = null!; +} diff --git a/src/Program.cs b/src/Program.cs index 5bbe5c6..84874e3 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -40,6 +40,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); bool assetServer = builder.Configuration.GetSection("AssetServer").GetValue("Enabled"); string assetIP = builder.Configuration.GetSection("AssetServer").GetValue("ListenIP"); diff --git a/src/Schema/UserBanType.cs b/src/Schema/UserBanType.cs new file mode 100644 index 0000000..04ef4d9 --- /dev/null +++ b/src/Schema/UserBanType.cs @@ -0,0 +1,11 @@ +namespace sodoff.Schema; + +public enum UserBanType +{ + IndefiniteSuspension = 1, + IndefiniteMPSuspension = 2, + TemporarySuspension = 3, + TemporaryMPSuspension = 4, + IndefiniteTCSuspension = 5, + TemporaryTCSuspension = 6 +} diff --git a/src/Services/ModerationService.cs b/src/Services/ModerationService.cs new file mode 100644 index 0000000..26526d4 --- /dev/null +++ b/src/Services/ModerationService.cs @@ -0,0 +1,67 @@ +using System; +using sodoff.Model; +using sodoff.Schema; + +namespace sodoff.Services; + +public class ModerationService +{ + private readonly DBContext ctx; + + public ModerationService(DBContext ctx) + { + this.ctx = ctx; + } + + public UserBan AddBanToUser(User user, UserBanType banType, DateTime dateEnd = new DateTime()) + { + // create a ban in relation to the specified user + UserBan userBan = new UserBan + { + BanType = banType, + CreatedAt = DateTime.UtcNow + }; + + // if suspension is indefinite, set end date to infinity + if(banType == UserBanType.IndefiniteSuspension || banType == UserBanType.IndefiniteMPSuspension || banType == UserBanType.IndefiniteTCSuspension) userBan.EndsAt = new DateTime(9999, 01, 01); + else userBan.EndsAt = dateEnd; + + // add ban to user ban list + user.Bans.Add(userBan); + + // update database + ctx.SaveChanges(); + + // return ban + return userBan; + } + + public bool RemoveBanFromUser(User user, UserBan ban) + { + // remove ban from database if it exists on the user + if(user.Bans.FirstOrDefault(e => e == ban) != null) { user.Bans.Remove(ban); ctx.SaveChanges(); return true; } + else return false; + } + + public bool RemoveAllBansFromUser(User user) + { + // remove all bans from user if user has any + if(user.Bans.Count >= 0) { foreach(var ban in user.Bans) user.Bans.Remove(ban); ctx.SaveChanges(); return true; } + else return false; + } + + public UserBan GetLatestBanFromUser(User user) + { + // retreive the most recently created ban from user + UserBan? userBan = user.Bans.OrderByDescending(e => e.CreatedAt).FirstOrDefault(); + + if(userBan != null) return userBan; + else return null!; // return null if the user has no bans on record + } + + public ICollection GetAllBansFromUser(User user, bool descendingOrder = false) + { + if(descendingOrder) return user.Bans.OrderByDescending(e => e.CreatedAt).ToList(); + else return user.Bans.OrderBy(e => e.CreatedAt).ToList(); // return sorted list by created date + } +}