GroupController.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System.Diagnostics;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.EntityFrameworkCore;
  5. using bitforum.Models;
  6. using bitforum.Models.BBS;
  7. namespace bitforum.Controllers.BBS.Board
  8. {
  9. [Authorize]
  10. [Route("BBS/Board")]
  11. public class GroupController : Controller
  12. {
  13. private readonly ILogger<GroupController> _logger;
  14. private readonly DefaultDbContext _db;
  15. private readonly string _ViewPath = "~/Views/BBS/Board/Group.cshtml";
  16. public GroupController(ILogger<GroupController> logger, DefaultDbContext db)
  17. {
  18. _logger = logger;
  19. _db = db;
  20. }
  21. [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
  22. public IActionResult Error()
  23. {
  24. return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
  25. }
  26. [HttpGet("Group")]
  27. public IActionResult Index()
  28. {
  29. ViewBag.BoardGroups = _db.BoardGroup.OrderBy(c => c.Order).ToList();
  30. ViewBag.Total = ViewBag.BoardGroups?.Count ?? 0;
  31. return View(_ViewPath);
  32. }
  33. [HttpPost("Group")]
  34. public async Task<IActionResult> Save([FromForm] List<BoardGroup> request)
  35. {
  36. using var transaction = await _db.Database.BeginTransactionAsync();
  37. try
  38. {
  39. if (request == null || !request.Any())
  40. {
  41. // 전체 삭제
  42. var boardGroups = await _db.BoardGroup.ToListAsync();
  43. if (boardGroups.Any())
  44. {
  45. _db.BoardGroup.RemoveRange(boardGroups);
  46. await _db.SaveChangesAsync();
  47. }
  48. await transaction.CommitAsync();
  49. return Index();
  50. }
  51. if (!ModelState.IsValid)
  52. {
  53. throw new Exception("유효성 검사에 실패하였습니다.");
  54. }
  55. var requestIDs = request.Select(x => x.ID).ToList(); // 요청 데이터의 ID 목록
  56. var existingIDs = await _db.BoardGroup.Select(c => c.ID).ToListAsync(); // 데이터베이스에 존재하는 ID 목록
  57. var IDsToDelete = existingIDs.Except(requestIDs).ToList(); // 삭제 대상 ID: 요청 데이터에 없는 항목
  58. // 삭제 대상 항목 제거
  59. if (IDsToDelete.Any())
  60. {
  61. _db.BoardGroup.RemoveRange(
  62. await _db.BoardGroup.Where(c => IDsToDelete.Contains(c.ID) && !c.Board.Any()).ToListAsync()
  63. );
  64. }
  65. foreach (var row in request)
  66. {
  67. // 중복 확인
  68. if (await _db.BoardGroup.AnyAsync(c => c.Code == row.Code && c.ID != row.ID))
  69. {
  70. throw new Exception($"{row.Code} `Code`는 이미 존재합니다.");
  71. }
  72. if (row.ID == 0)
  73. {
  74. row.CreatedAt = DateTime.UtcNow;
  75. await _db.BoardGroup.AddAsync(row);
  76. }
  77. else
  78. {
  79. var boardGroup = await _db.BoardGroup.FindAsync(row.ID);
  80. if (boardGroup == null)
  81. {
  82. throw new Exception($"ID {row.ID}에 해당하는 정보가 없습니다.");
  83. }
  84. boardGroup.Code = row.Code;
  85. boardGroup.Name = row.Name;
  86. boardGroup.Order = row.Order;
  87. boardGroup.UpdatedAt = DateTime.UtcNow;
  88. _db.BoardGroup.Update(boardGroup);
  89. }
  90. }
  91. await transaction.CommitAsync();
  92. int affectedRows = await _db.SaveChangesAsync();
  93. if (affectedRows <= 0)
  94. {
  95. throw new Exception("저장 중 오류가 발생했습니다.");
  96. }
  97. string message = "게시판 분류가 저장되었습니다.";
  98. TempData["SuccessMessage"] = message;
  99. _logger.LogInformation(message);
  100. return RedirectToAction("Index");
  101. }
  102. catch (Exception e)
  103. {
  104. await transaction.RollbackAsync();
  105. TempData["ErrorMessages"] = e.Message;
  106. _logger.LogError(e, e.Message);
  107. return Index();
  108. }
  109. }
  110. }
  111. }