KIM-JINO5 3 ヶ月 前
コミット
bb0f74491b
46 ファイル変更206 行追加117 行削除
  1. 2 1
      Admin/Pages/Forum/Attachments/CommentFile/Index.cshtml.cs
  2. 2 1
      Admin/Pages/Forum/Attachments/CommentImage/Index.cshtml.cs
  3. 3 2
      Admin/Pages/Forum/Attachments/PostFile/Index.cshtml.cs
  4. 3 2
      Admin/Pages/Forum/Attachments/PostImage/Index.cshtml.cs
  5. 2 1
      Admin/Pages/Forum/Reactions/Comment/Index.cshtml.cs
  6. 3 2
      Admin/Pages/Forum/Reactions/Post/Index.cshtml.cs
  7. 2 0
      Admin/Pages/Forum/Reports/Comment/Index.cshtml.cs
  8. 3 2
      Admin/Pages/Forum/Reports/Post/Index.cshtml.cs
  9. 7 3
      Admin/Pages/Forum/Trash/Comment/Index.cshtml.cs
  10. 9 3
      Admin/Pages/Forum/Trash/Post/Index.cshtml.cs
  11. 4 3
      Application/Features/Forum/CommentFile/Delete/Handler.cs
  12. 13 5
      Application/Features/Forum/CommentFile/Search/Handler.cs
  13. 2 0
      Application/Features/Forum/CommentFile/Search/Query.cs
  14. 1 3
      Application/Features/Forum/CommentFile/ToggleDisable/Handler.cs
  15. 4 3
      Application/Features/Forum/CommentImage/Delete/Handler.cs
  16. 13 5
      Application/Features/Forum/CommentImage/Search/Handler.cs
  17. 2 0
      Application/Features/Forum/CommentImage/Search/Query.cs
  18. 1 3
      Application/Features/Forum/CommentImage/ToggleDisable/Handler.cs
  19. 2 3
      Application/Features/Forum/CommentReaction/Delete/Handler.cs
  20. 13 6
      Application/Features/Forum/CommentReaction/Search/Handler.cs
  21. 2 0
      Application/Features/Forum/CommentReaction/Search/Query.cs
  22. 2 3
      Application/Features/Forum/CommentReport/Delete/Handler.cs
  23. 13 6
      Application/Features/Forum/CommentReport/Search/Handler.cs
  24. 2 0
      Application/Features/Forum/CommentReport/Search/Query.cs
  25. 3 3
      Application/Features/Forum/CommentReport/UpdateStatus/Handler.cs
  26. 4 3
      Application/Features/Forum/PostFile/Delete/Handler.cs
  27. 13 4
      Application/Features/Forum/PostFile/Search/Handler.cs
  28. 2 0
      Application/Features/Forum/PostFile/Search/Query.cs
  29. 1 3
      Application/Features/Forum/PostFile/ToggleDisable/Handler.cs
  30. 4 3
      Application/Features/Forum/PostImage/Delete/Handler.cs
  31. 13 4
      Application/Features/Forum/PostImage/Search/Handler.cs
  32. 2 0
      Application/Features/Forum/PostImage/Search/Query.cs
  33. 1 3
      Application/Features/Forum/PostImage/ToggleDisable/Handler.cs
  34. 2 3
      Application/Features/Forum/PostReaction/Delete/Handler.cs
  35. 13 5
      Application/Features/Forum/PostReaction/Search/Handler.cs
  36. 2 0
      Application/Features/Forum/PostReaction/Search/Query.cs
  37. 2 3
      Application/Features/Forum/PostReport/Delete/Handler.cs
  38. 13 5
      Application/Features/Forum/PostReport/Search/Handler.cs
  39. 2 0
      Application/Features/Forum/PostReport/Search/Query.cs
  40. 3 3
      Application/Features/Forum/PostReport/UpdateStatus/Handler.cs
  41. 2 3
      Application/Features/Forum/Trash/Comment/PermanentDelete/Handler.cs
  42. 1 3
      Application/Features/Forum/Trash/Comment/Restore/Handler.cs
  43. 9 6
      Application/Features/Forum/Trash/Comment/Search/Handler.cs
  44. 1 0
      Application/Features/Forum/Trash/Comment/Search/Query.cs
  45. 2 3
      Application/Features/Forum/Trash/Post/PermanentDelete/Handler.cs
  46. 1 3
      Application/Features/Forum/Trash/Post/Restore/Handler.cs

+ 2 - 1
Admin/Pages/Forum/Attachments/CommentFile/Index.cshtml.cs

@@ -71,7 +71,8 @@ namespace Admin.Pages.Forum.Attachments.CommentFile
             })];
 
             var result = await mediator.Send(new SearchCommentFiles.Query(
-                Query.BoardID, Query.PostID, Query.CommentID, Query.IsDisabled,
+                Query.BoardID, Query.PostID, Query.CommentID,
+                Query.Search, Query.Keyword, Query.IsDisabled,
                 Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
             ), ct);
 

+ 2 - 1
Admin/Pages/Forum/Attachments/CommentImage/Index.cshtml.cs

@@ -72,7 +72,8 @@ namespace Admin.Pages.Forum.Attachments.CommentImage
             })];
 
             var result = await mediator.Send(new SearchCommentImages.Query(
-                Query.BoardID, Query.PostID, Query.CommentID, Query.IsDisabled,
+                Query.BoardID, Query.PostID, Query.CommentID,
+                Query.Search, Query.Keyword, Query.IsDisabled,
                 Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
             ), ct);
 

+ 3 - 2
Admin/Pages/Forum/Attachments/PostFile/Index.cshtml.cs

@@ -69,8 +69,9 @@ namespace Admin.Pages.Forum.Attachments.PostFile
             })];
 
             var result = await mediator.Send(new SearchPostFiles.Query(
-                Query.BoardID, Query.PostID, Query.IsDisabled,
-                Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
+                Query.BoardID, Query.PostID, Query.Search, Query.Keyword,
+                Query.IsDisabled, Query.StartAt, Query.EndAt,
+                Query.PageNum, Query.PerPage
             ), ct);
 
             Total = result.Total;

+ 3 - 2
Admin/Pages/Forum/Attachments/PostImage/Index.cshtml.cs

@@ -70,8 +70,9 @@ namespace Admin.Pages.Forum.Attachments.PostImage
             })];
 
             var result = await mediator.Send(new SearchPostImages.Query(
-                Query.BoardID, Query.PostID, Query.IsDisabled,
-                Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
+                Query.BoardID, Query.PostID, Query.Search, Query.Keyword,
+                Query.IsDisabled, Query.StartAt, Query.EndAt,
+                Query.PageNum, Query.PerPage
             ), ct);
 
             Total = result.Total;

+ 2 - 1
Admin/Pages/Forum/Reactions/Comment/Index.cshtml.cs

@@ -70,7 +70,8 @@ namespace Admin.Pages.Forum.Reactions.Comment
             })];
 
             var result = await mediator.Send(new SearchCommentReactions.Query(
-                Query.BoardID, Query.PostID, Query.CommentID, Query.Reaction,
+                Query.BoardID, Query.PostID, Query.CommentID,
+                Query.Search, Query.Keyword, Query.Reaction,
                 Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
             ), ct);
 

+ 3 - 2
Admin/Pages/Forum/Reactions/Post/Index.cshtml.cs

@@ -68,8 +68,9 @@ namespace Admin.Pages.Forum.Reactions.Post
             })];
 
             var result = await mediator.Send(new SearchPostReactions.Query(
-                Query.BoardID, Query.PostID, Query.Reaction,
-                Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
+                Query.BoardID, Query.PostID, Query.Search, Query.Keyword,
+                Query.Reaction, Query.StartAt, Query.EndAt,
+                Query.PageNum, Query.PerPage
             ), ct);
 
             Total = result.Total;

+ 2 - 0
Admin/Pages/Forum/Reports/Comment/Index.cshtml.cs

@@ -78,6 +78,8 @@ namespace Admin.Pages.Forum.Reports.Comment
                 Query.BoardID,
                 Query.PostID,
                 Query.CommentID,
+                Query.Search,
+                Query.Keyword,
                 Query.Status,
                 Query.Type,
                 Query.StartAt,

+ 3 - 2
Admin/Pages/Forum/Reports/Post/Index.cshtml.cs

@@ -72,8 +72,9 @@ namespace Admin.Pages.Forum.Reports.Post
             })];
 
             var result = await mediator.Send(new SearchPostReports.Query(
-                Query.BoardID, Query.PostID, Query.Status, Query.Type,
-                Query.StartAt, Query.EndAt, Query.PageNum, Query.PerPage
+                Query.BoardID, Query.PostID, Query.Search, Query.Keyword,
+                Query.Status, Query.Type, Query.StartAt, Query.EndAt,
+                Query.PageNum, Query.PerPage
             ), ct);
 
             Total = result.Total;

+ 7 - 3
Admin/Pages/Forum/Trash/Comment/Index.cshtml.cs

@@ -65,9 +65,13 @@ namespace Admin.Pages.Forum.Trash.Comment
             })];
 
             var result = await mediator.Send(new SearchTrashComments.Query(
-                Query.BoardID, Query.Keyword,
-                Query.StartAt, Query.EndAt,
-                Query.PageNum, Query.PerPage
+                Query.BoardID,
+                Query.Search,
+                Query.Keyword,
+                Query.StartAt,
+                Query.EndAt,
+                Query.PageNum,
+                Query.PerPage
             ), ct);
 
             Total = result.Total;

+ 9 - 3
Admin/Pages/Forum/Trash/Post/Index.cshtml.cs

@@ -76,9 +76,15 @@ namespace Admin.Pages.Forum.Trash.Post
 
             Total = result.Total;
             List = [..result.List.Select(c => (
-                c.Num, c.ID, c.BoardID, c.BoardName,
-                c.Subject, c.Name, c.SID,
-                c.Views, c.Comments,
+                c.Num,
+                c.ID,
+                c.BoardID,
+                c.BoardName,
+                c.Subject,
+                c.Name,
+                c.SID,
+                c.Views,
+                c.Comments,
                 c.DeletedAt.GetDateAt() ?? "-",
                 c.CreatedAt.GetDateAt()
             ))];

+ 4 - 3
Application/Features/Forum/CommentFile/Delete/Handler.cs

@@ -14,14 +14,15 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
             return;
         }
 
-        var files = await db.CommentFile
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var files = await db.CommentFile.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var file in files)
+        {
             fileStorage.DeleteByUrl(file.Url);
+        }
 
         db.CommentFile.RemoveRange(files);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 5
Application/Features/Forum/CommentFile/Search/Handler.cs

@@ -8,11 +8,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.CommentFile.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Include(c => c.Comment)
-            .AsQueryable();
+        var query = db.CommentFile.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Include(c => c.Comment).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -29,6 +25,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.CommentID == request.CommentID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => (c.Post.Name != null && c.Post.Name.Contains(kw)) || (c.Post.SID != null && c.Post.SID.Contains(kw))),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.IsDisabled.HasValue)
         {
             query = query.Where(c => c.IsDisabled == request.IsDisabled.Value);

+ 2 - 0
Application/Features/Forum/CommentFile/Search/Query.cs

@@ -6,6 +6,8 @@ public sealed record Query(
     int? BoardID,
     int? PostID,
     int? CommentID,
+    int? Search,
+    string? Keyword,
     bool? IsDisabled,
     string? StartAt,
     string? EndAt,

+ 1 - 3
Application/Features/Forum/CommentFile/ToggleDisable/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var files = await db.CommentFile
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var files = await db.CommentFile.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var file in files)
         {

+ 4 - 3
Application/Features/Forum/CommentImage/Delete/Handler.cs

@@ -14,14 +14,15 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
             return;
         }
 
-        var images = await db.CommentImage
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var images = await db.CommentImage.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var image in images)
+        {
             fileStorage.DeleteByUrl(image.Url);
+        }
 
         db.CommentImage.RemoveRange(images);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 5
Application/Features/Forum/CommentImage/Search/Handler.cs

@@ -8,11 +8,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.CommentImage.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Include(c => c.Comment)
-            .AsQueryable();
+        var query = db.CommentImage.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Include(c => c.Comment).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -29,6 +25,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.CommentID == request.CommentID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => (c.Post.Name != null && c.Post.Name.Contains(kw)) || (c.Post.SID != null && c.Post.SID.Contains(kw))),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.IsDisabled.HasValue)
         {
             query = query.Where(c => c.IsDisabled == request.IsDisabled.Value);

+ 2 - 0
Application/Features/Forum/CommentImage/Search/Query.cs

@@ -6,6 +6,8 @@ public sealed record Query(
     int? BoardID,
     int? PostID,
     int? CommentID,
+    int? Search,
+    string? Keyword,
     bool? IsDisabled,
     string? StartAt,
     string? EndAt,

+ 1 - 3
Application/Features/Forum/CommentImage/ToggleDisable/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var images = await db.CommentImage
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var images = await db.CommentImage.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var image in images)
         {

+ 2 - 3
Application/Features/Forum/CommentReaction/Delete/Handler.cs

@@ -14,9 +14,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var reactions = await db.CommentReaction
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var reactions = await db.CommentReaction.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         var commentIDs = reactions.Select(c => c.CommentID).Distinct().ToList();
         var comments = await db.Comment.Where(c => commentIDs.Contains(c.ID)).ToListAsync(ct);
@@ -31,6 +29,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
         }
 
         db.CommentReaction.RemoveRange(reactions);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 6
Application/Features/Forum/CommentReaction/Search/Handler.cs

@@ -9,12 +9,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.CommentReaction.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Include(c => c.Comment)
-            .Include(c => c.Member)
-            .AsQueryable();
+        var query = db.CommentReaction.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Include(c => c.Comment).Include(c => c.Member).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -31,6 +26,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.CommentID == request.CommentID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => c.Member != null && c.Member.Name != null && c.Member.Name.Contains(kw)),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.Reaction.HasValue)
         {
             query = query.Where(c => c.Reaction == (Reaction)request.Reaction.Value);

+ 2 - 0
Application/Features/Forum/CommentReaction/Search/Query.cs

@@ -6,6 +6,8 @@ public sealed record Query(
     int? BoardID,
     int? PostID,
     int? CommentID,
+    int? Search,
+    string? Keyword,
     byte? Reaction,
     string? StartAt,
     string? EndAt,

+ 2 - 3
Application/Features/Forum/CommentReport/Delete/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var reports = await db.CommentReport
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var reports = await db.CommentReport.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         var commentIDs = reports.Select(c => c.CommentID).Distinct().ToList();
         var comments = await db.Comment.Where(c => commentIDs.Contains(c.ID)).ToListAsync(ct);
@@ -28,6 +26,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
         }
 
         db.CommentReport.RemoveRange(reports);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 6
Application/Features/Forum/CommentReport/Search/Handler.cs

@@ -9,12 +9,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.CommentReport.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Include(c => c.Comment)
-            .Include(c => c.Member)
-            .AsQueryable();
+        var query = db.CommentReport.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Include(c => c.Comment).Include(c => c.Member).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -31,6 +26,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.CommentID == request.CommentID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => c.Member != null && c.Member.Name != null && c.Member.Name.Contains(kw)),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.Status.HasValue)
         {
             query = query.Where(c => c.Status == (ReportStatus)request.Status.Value);

+ 2 - 0
Application/Features/Forum/CommentReport/Search/Query.cs

@@ -6,6 +6,8 @@ public sealed record Query(
     int? BoardID,
     int? PostID,
     int? CommentID,
+    int? Search,
+    string? Keyword,
     byte? Status,
     byte? Type,
     string? StartAt,

+ 3 - 3
Application/Features/Forum/CommentReport/UpdateStatus/Handler.cs

@@ -13,17 +13,17 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var reports = await db.CommentReport
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var reports = await db.CommentReport.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var report in reports)
         {
             report.Status = request.Status;
+
             if (request.Memo is not null)
             {
                 report.Memo = request.Memo;
             }
+
             report.UpdatedAt = DateTime.UtcNow;
         }
 

+ 4 - 3
Application/Features/Forum/PostFile/Delete/Handler.cs

@@ -14,12 +14,12 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
             return;
         }
 
-        var files = await db.PostFile
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var files = await db.PostFile.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var file in files)
+        {
             fileStorage.DeleteByUrl(file.Url);
+        }
 
         var postIDs = files.Select(c => c.PostID).Distinct().ToList();
         var posts = await db.Post.Where(c => postIDs.Contains(c.ID)).ToListAsync(ct);
@@ -32,6 +32,7 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
         }
 
         db.PostFile.RemoveRange(files);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 4
Application/Features/Forum/PostFile/Search/Handler.cs

@@ -8,10 +8,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.PostFile.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .AsQueryable();
+        var query = db.PostFile.AsNoTracking().Include(c => c.Board).Include(c => c.Post).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -23,6 +20,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.PostID == request.PostID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => (c.Post.Name != null && c.Post.Name.Contains(kw)) || (c.Post.SID != null && c.Post.SID.Contains(kw))),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.IsDisabled.HasValue)
         {
             query = query.Where(c => c.IsDisabled == request.IsDisabled.Value);

+ 2 - 0
Application/Features/Forum/PostFile/Search/Query.cs

@@ -5,6 +5,8 @@ namespace Application.Features.Forum.PostFile.Search;
 public sealed record Query(
     int? BoardID,
     int? PostID,
+    int? Search,
+    string? Keyword,
     bool? IsDisabled,
     string? StartAt,
     string? EndAt,

+ 1 - 3
Application/Features/Forum/PostFile/ToggleDisable/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var files = await db.PostFile
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var files = await db.PostFile.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var file in files)
         {

+ 4 - 3
Application/Features/Forum/PostImage/Delete/Handler.cs

@@ -14,12 +14,12 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
             return;
         }
 
-        var images = await db.PostImage
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var images = await db.PostImage.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var image in images)
+        {
             fileStorage.DeleteByUrl(image.Url);
+        }
 
         var postIDs = images.Select(c => c.PostID).Distinct().ToList();
         var posts = await db.Post.Where(c => postIDs.Contains(c.ID)).ToListAsync(ct);
@@ -32,6 +32,7 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
         }
 
         db.PostImage.RemoveRange(images);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 4
Application/Features/Forum/PostImage/Search/Handler.cs

@@ -8,10 +8,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.PostImage.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .AsQueryable();
+        var query = db.PostImage.AsNoTracking().Include(c => c.Board).Include(c => c.Post).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -23,6 +20,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.PostID == request.PostID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => (c.Post.Name != null && c.Post.Name.Contains(kw)) || (c.Post.SID != null && c.Post.SID.Contains(kw))),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.IsDisabled.HasValue)
         {
             query = query.Where(c => c.IsDisabled == request.IsDisabled.Value);

+ 2 - 0
Application/Features/Forum/PostImage/Search/Query.cs

@@ -5,6 +5,8 @@ namespace Application.Features.Forum.PostImage.Search;
 public sealed record Query(
     int? BoardID,
     int? PostID,
+    int? Search,
+    string? Keyword,
     bool? IsDisabled,
     string? StartAt,
     string? EndAt,

+ 1 - 3
Application/Features/Forum/PostImage/ToggleDisable/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var images = await db.PostImage
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var images = await db.PostImage.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var image in images)
         {

+ 2 - 3
Application/Features/Forum/PostReaction/Delete/Handler.cs

@@ -14,9 +14,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var reactions = await db.PostReaction
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var reactions = await db.PostReaction.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         var postIDs = reactions.Select(c => c.PostID).Distinct().ToList();
         var posts = await db.Post.Where(c => postIDs.Contains(c.ID)).ToListAsync(ct);
@@ -31,6 +29,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
         }
 
         db.PostReaction.RemoveRange(reactions);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 5
Application/Features/Forum/PostReaction/Search/Handler.cs

@@ -9,11 +9,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.PostReaction.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Include(c => c.Member)
-            .AsQueryable();
+        var query = db.PostReaction.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Include(c => c.Member).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -25,6 +21,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.PostID == request.PostID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => c.Member != null && c.Member.Name != null && c.Member.Name.Contains(kw)),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.Reaction.HasValue)
         {
             query = query.Where(c => c.Reaction == (Reaction)request.Reaction.Value);

+ 2 - 0
Application/Features/Forum/PostReaction/Search/Query.cs

@@ -5,6 +5,8 @@ namespace Application.Features.Forum.PostReaction.Search;
 public sealed record Query(
     int? BoardID,
     int? PostID,
+    int? Search,
+    string? Keyword,
     byte? Reaction,
     string? StartAt,
     string? EndAt,

+ 2 - 3
Application/Features/Forum/PostReport/Delete/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var reports = await db.PostReport
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var reports = await db.PostReport.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         var postIDs = reports.Select(c => c.PostID).Distinct().ToList();
         var posts = await db.Post.Where(c => postIDs.Contains(c.ID)).ToListAsync(ct);
@@ -28,6 +26,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
         }
 
         db.PostReport.RemoveRange(reports);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 13 - 5
Application/Features/Forum/PostReport/Search/Handler.cs

@@ -9,11 +9,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.PostReport.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Include(c => c.Member)
-            .AsQueryable();
+        var query = db.PostReport.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Include(c => c.Member).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -25,6 +21,18 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
             query = query.Where(c => c.PostID == request.PostID.Value);
         }
 
+        if (!string.IsNullOrWhiteSpace(request.Keyword))
+        {
+            var kw = request.Keyword.Trim();
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => c.Member != null && c.Member.Name != null && c.Member.Name.Contains(kw)),
+                _ => query.Where(c => c.Post.Subject.Contains(kw))
+            };
+        }
+
         if (request.Status.HasValue)
         {
             query = query.Where(c => c.Status == (ReportStatus)request.Status.Value);

+ 2 - 0
Application/Features/Forum/PostReport/Search/Query.cs

@@ -5,6 +5,8 @@ namespace Application.Features.Forum.PostReport.Search;
 public sealed record Query(
     int? BoardID,
     int? PostID,
+    int? Search,
+    string? Keyword,
     byte? Status,
     byte? Type,
     string? StartAt,

+ 3 - 3
Application/Features/Forum/PostReport/UpdateStatus/Handler.cs

@@ -13,17 +13,17 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var reports = await db.PostReport
-            .Where(c => request.IDs.Contains(c.ID))
-            .ToListAsync(ct);
+        var reports = await db.PostReport.Where(c => request.IDs.Contains(c.ID)).ToListAsync(ct);
 
         foreach (var report in reports)
         {
             report.Status = request.Status;
+
             if (request.Memo is not null)
             {
                 report.Memo = request.Memo;
             }
+
             report.UpdatedAt = DateTime.UtcNow;
         }
 

+ 2 - 3
Application/Features/Forum/Trash/Comment/PermanentDelete/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var comments = await db.Comment
-            .Where(c => request.IDs.Contains(c.ID) && c.IsDeleted)
-            .ToListAsync(ct);
+        var comments = await db.Comment.Where(c => request.IDs.Contains(c.ID) && c.IsDeleted).ToListAsync(ct);
 
         var postIDs = comments.Select(c => c.PostID).Distinct().ToList();
         var posts = await db.Post.Where(c => postIDs.Contains(c.ID)).ToListAsync(ct);
@@ -38,6 +36,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
         }
 
         db.Comment.RemoveRange(comments);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 1 - 3
Application/Features/Forum/Trash/Comment/Restore/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var comments = await db.Comment
-            .Where(c => request.IDs.Contains(c.ID) && c.IsDeleted)
-            .ToListAsync(ct);
+        var comments = await db.Comment.Where(c => request.IDs.Contains(c.ID) && c.IsDeleted).ToListAsync(ct);
 
         foreach (var comment in comments)
         {

+ 9 - 6
Application/Features/Forum/Trash/Comment/Search/Handler.cs

@@ -8,11 +8,7 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
 {
     public async Task<Response> Handle(Query request, CancellationToken ct)
     {
-        var query = db.Comment.AsNoTracking()
-            .Include(c => c.Board)
-            .Include(c => c.Post)
-            .Where(c => c.IsDeleted)
-            .AsQueryable();
+        var query = db.Comment.AsNoTracking().Include(c => c.Board).Include(c => c.Post).Where(c => c.IsDeleted).AsQueryable();
 
         if (request.BoardID.HasValue)
         {
@@ -22,7 +18,14 @@ public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
         if (!string.IsNullOrWhiteSpace(request.Keyword))
         {
             var kw = request.Keyword.Trim();
-            query = query.Where(c => c.Content.Contains(kw));
+            query = request.Search switch
+            {
+                1 => query.Where(c => c.PostID.ToString().Contains(kw)),
+                2 => query.Where(c => c.Post.Subject.Contains(kw)),
+                3 => query.Where(c => c.Content.Contains(kw)),
+                4 => query.Where(c => (c.Name != null && c.Name.Contains(kw)) || (c.SID != null && c.SID.Contains(kw))),
+                _ => query.Where(c => c.Content.Contains(kw))
+            };
         }
 
         if (!string.IsNullOrWhiteSpace(request.StartAt) && DateTime.TryParse(request.StartAt, out var startDate))

+ 1 - 0
Application/Features/Forum/Trash/Comment/Search/Query.cs

@@ -4,6 +4,7 @@ namespace Application.Features.Forum.Trash.Comment.Search;
 
 public sealed record Query(
     int? BoardID,
+    int? Search,
     string? Keyword,
     string? StartAt,
     string? EndAt,

+ 2 - 3
Application/Features/Forum/Trash/Post/PermanentDelete/Handler.cs

@@ -14,9 +14,7 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
             return;
         }
 
-        var posts = await db.Post
-            .Where(c => request.IDs.Contains(c.ID) && c.IsDeleted)
-            .ToListAsync(ct);
+        var posts = await db.Post.Where(c => request.IDs.Contains(c.ID) && c.IsDeleted).ToListAsync(ct);
 
         foreach (var post in posts)
         {
@@ -47,6 +45,7 @@ public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IComma
         }
 
         db.Post.RemoveRange(posts);
+
         await db.SaveChangesAsync(ct);
     }
 }

+ 1 - 3
Application/Features/Forum/Trash/Post/Restore/Handler.cs

@@ -13,9 +13,7 @@ public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
             return;
         }
 
-        var posts = await db.Post
-            .Where(c => request.IDs.Contains(c.ID) && c.IsDeleted)
-            .ToListAsync(ct);
+        var posts = await db.Post.Where(c => request.IDs.Contains(c.ID) && c.IsDeleted).ToListAsync(ct);
 
         foreach (var post in posts)
         {