diff --git a/ProjectLighthouse/Controllers/PhotosController.cs b/ProjectLighthouse/Controllers/PhotosController.cs index 59c5df91..5e3de091 100644 --- a/ProjectLighthouse/Controllers/PhotosController.cs +++ b/ProjectLighthouse/Controllers/PhotosController.cs @@ -53,6 +53,11 @@ namespace LBPUnion.ProjectLighthouse.Controllers photo.CreatorId = user.UserId; photo.Creator = user; + if (photo.Subjects.Count > 4) + { + return this.BadRequest(); + } + foreach (PhotoSubject subject in photo.Subjects) { subject.User = await this.database.Users.FirstOrDefaultAsync(u => u.Username == subject.Username); @@ -67,6 +72,17 @@ namespace LBPUnion.ProjectLighthouse.Controllers await this.database.SaveChangesAsync(); + // Check for duplicate photo subjects + List subjectUserIds = new(4); + foreach (PhotoSubject subject in photo.Subjects) + { + if (subjectUserIds.Contains(subject.UserId)) + { + return this.BadRequest(); + } + subjectUserIds.Add(subject.UserId); + } + photo.PhotoSubjectIds = photo.Subjects.Select(subject => subject.PhotoSubjectId.ToString()).ToArray(); // photo.Slot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == photo.SlotId); diff --git a/ProjectLighthouse/Maintenance/MaintenanceJobs/CleanupBrokenPhotosMaintenanceJob.cs b/ProjectLighthouse/Maintenance/MaintenanceJobs/CleanupBrokenPhotosMaintenanceJob.cs index 78d45fde..252ee93f 100644 --- a/ProjectLighthouse/Maintenance/MaintenanceJobs/CleanupBrokenPhotosMaintenanceJob.cs +++ b/ProjectLighthouse/Maintenance/MaintenanceJobs/CleanupBrokenPhotosMaintenanceJob.cs @@ -13,7 +13,7 @@ namespace LBPUnion.ProjectLighthouse.Maintenance.MaintenanceJobs { private readonly Database database = new(); public string Name() => "Cleanup Broken Photos"; - public string Description() => "Deletes all photos that have missing assets."; + public string Description() => "Deletes all photos that have missing assets or invalid photo subjects."; [SuppressMessage("ReSharper", "LoopCanBePartlyConvertedToQuery")] public async Task Run() @@ -23,6 +23,8 @@ namespace LBPUnion.ProjectLighthouse.Maintenance.MaintenanceJobs bool hashNullOrEmpty = false; bool noHashesExist = false; bool largeHashIsInvalidFile = false; + bool tooManyPhotoSubjects = false; + bool duplicatePhotoSubjects = false; hashNullOrEmpty = string.IsNullOrEmpty (photo.LargeHash) || @@ -50,6 +52,23 @@ namespace LBPUnion.ProjectLighthouse.Maintenance.MaintenanceJobs goto removePhoto; } + if (photo.Subjects.Count > 4) + { + tooManyPhotoSubjects = true; + goto removePhoto; + } + + List subjectUserIds = new(4); + foreach (PhotoSubject subject in photo.Subjects) + { + if (subjectUserIds.Contains(subject.UserId)) + { + duplicatePhotoSubjects = true; + goto removePhoto; + } + subjectUserIds.Add(subject.UserId); + } + continue; removePhoto: @@ -59,7 +78,9 @@ namespace LBPUnion.ProjectLighthouse.Maintenance.MaintenanceJobs $"Removing photo (id: {photo.PhotoId}): " + $"{nameof(hashNullOrEmpty)}: {hashNullOrEmpty}, " + $"{nameof(noHashesExist)}: {noHashesExist}, " + - $"{nameof(largeHashIsInvalidFile)}: {largeHashIsInvalidFile}" + $"{nameof(largeHashIsInvalidFile)}: {largeHashIsInvalidFile}, " + + $"{nameof(tooManyPhotoSubjects)}: {tooManyPhotoSubjects}" + + $"{nameof(duplicatePhotoSubjects)}: {duplicatePhotoSubjects}" ); this.database.Photos.Remove(photo);