GradeController.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. using System.Diagnostics;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.EntityFrameworkCore;
  5. using bitforum.Helpers;
  6. using bitforum.Models;
  7. using bitforum.Models.Account;
  8. using bitforum.Services;
  9. namespace bitforum.Controllers.Member
  10. {
  11. [Authorize]
  12. [Route("Member")]
  13. public class GradeController : Controller
  14. {
  15. private readonly ILogger<GradeController> _logger;
  16. private readonly IFileUploadService _fileUploadService;
  17. private readonly DefaultDbContext _db;
  18. private readonly string _IndexViewPath = "~/Views/Member/Grade/Index.cshtml";
  19. private readonly string _WriteViewPath = "~/Views/Member/Grade/Write.cshtml";
  20. private readonly string _EditViewPath = "~/Views/Member/Grade/Edit.cshtml";
  21. public GradeController(ILogger<GradeController> logger, IFileUploadService fileUploadService, DefaultDbContext db)
  22. {
  23. _logger = logger;
  24. _fileUploadService = fileUploadService;
  25. _db = db;
  26. }
  27. [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
  28. public IActionResult Error()
  29. {
  30. return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
  31. }
  32. [HttpGet("Grade")]
  33. public IActionResult Index()
  34. {
  35. var memberGrades = _db.MemberGrade.OrderByDescending(c => c.Order).ToList();
  36. var data = new List<object>();
  37. if (memberGrades.Count > 0)
  38. {
  39. foreach (var row in memberGrades)
  40. {
  41. data.Add(new
  42. {
  43. row.ID,
  44. row.Image,
  45. Name = $"{row.KorName}({row.EngName})",
  46. row.Order,
  47. RequiredExp = row.RequiredExp.ToString("N0"),
  48. RequiredCoin = row.RequiredCoin.ToString("N0"),
  49. IsActive = (row.IsActive ? 'Y' : 'N'),
  50. UpdatedAt = row.UpdatedAt.GetDateAt(),
  51. CreatedAt = row.CreatedAt.GetDateAt(),
  52. MemberRows = _db.Member.Count(c => c.GradeID == row.ID),
  53. EditURL = $"/Member/Grade/{row.ID}/Edit",
  54. DeleteURL = $"/Member/Grade/{row.ID}/Delte"
  55. });
  56. }
  57. }
  58. ViewBag.Data = data;
  59. ViewBag.Total = (data?.Count ?? 0);
  60. return View(_IndexViewPath);
  61. }
  62. [HttpGet("Grade/Write")]
  63. public IActionResult Write()
  64. {
  65. return View(_WriteViewPath);
  66. }
  67. [HttpPost("Grade/Create")]
  68. public async Task<IActionResult> Create(MemberGrade request, IFormFile? Image)
  69. {
  70. try
  71. {
  72. if (!ModelState.IsValid)
  73. {
  74. throw new Exception("유효성 검사에 실패하였습니다.");
  75. }
  76. request.Image = await _fileUploadService.UploadImageAsync(Image, UploadFolder.Grade);
  77. request.UpdatedAt = null;
  78. request.CreatedAt = DateTime.UtcNow;
  79. _db.MemberGrade.Add(request);
  80. int affectedRows = await _db.SaveChangesAsync();
  81. if (affectedRows <= 0)
  82. {
  83. throw new Exception("회원등급 등록 중 오류가 발생했습니다.");
  84. }
  85. string message = "회원등급이 등록되었습니다.";
  86. TempData["SuccessMessage"] = message;
  87. _logger.LogInformation(message);
  88. return Redirect("/Member/Grade");
  89. }
  90. catch (ArgumentException e)
  91. {
  92. TempData["ErrorMessages"] = e.Message;
  93. _logger.LogError(e, e.Message);
  94. return Write();
  95. }
  96. catch (Exception e)
  97. {
  98. TempData["ErrorMessages"] = e.Message;
  99. _logger.LogError(e, e.Message);
  100. return Write();
  101. }
  102. }
  103. [HttpGet("Grade/{id}/Edit")]
  104. public async Task<IActionResult> Edit(int id)
  105. {
  106. try
  107. {
  108. if (id <= 0)
  109. {
  110. throw new Exception("유효하지 않은 접근입니다.");
  111. }
  112. var memberGrade = await _db.MemberGrade.FirstAsync(c => c.ID == id);
  113. if (memberGrade is null)
  114. {
  115. throw new Exception("회원등급 정보를 찾을 수 없습니다.");
  116. }
  117. return View(_EditViewPath, memberGrade);
  118. }
  119. catch (Exception e)
  120. {
  121. TempData["ErrorMessages"] = e.Message;
  122. _logger.LogError(e, e.Message);
  123. return Redirect("/Member/Grade");
  124. }
  125. }
  126. [HttpPost("Grade/Update")]
  127. public async Task<IActionResult> Update(MemberGrade request, IFormFile? Image, [FromForm] bool IsImageRemove = false)
  128. {
  129. try
  130. {
  131. if (!ModelState.IsValid)
  132. {
  133. throw new Exception("유효성 검사에 실패하였습니다.");
  134. }
  135. var memberGrade = await _db.MemberGrade.FirstAsync(c => c.ID == request.ID);
  136. if (memberGrade is null)
  137. {
  138. throw new Exception("회원등급 정보를 찾을 수 없습니다.");
  139. }
  140. // 이미지 저장
  141. if (IsImageRemove)
  142. {
  143. // 실제 파일 삭제
  144. _fileUploadService.RemoveFile(memberGrade.Image);
  145. memberGrade.Image = null;
  146. }
  147. else if (Image is not null)
  148. {
  149. memberGrade.Image = await _fileUploadService.UploadImageAsync(Image, UploadFolder.Grade);
  150. }
  151. memberGrade.KorName = request.KorName;
  152. memberGrade.EngName = request.EngName;
  153. memberGrade.Description = request.Description;
  154. memberGrade.Order = request.Order;
  155. memberGrade.RequiredExp = request.RequiredExp;
  156. memberGrade.RequiredCoin = request.RequiredCoin;
  157. memberGrade.IsActive = request.IsActive;
  158. memberGrade.UpdatedAt = DateTime.UtcNow;
  159. _db.MemberGrade.Update(memberGrade);
  160. int affectedRows = await _db.SaveChangesAsync();
  161. if (affectedRows <= 0)
  162. {
  163. throw new Exception("회원등급 수정 중 오류가 발생했습니다.");
  164. }
  165. string message = "회원등급이 수정되었습니다.";
  166. TempData["SuccessMessage"] = message;
  167. _logger.LogInformation(message);
  168. return Redirect($"/Member/Grade/{request.ID}/Edit");
  169. }
  170. catch (Exception e)
  171. {
  172. TempData["ErrorMessages"] = e.Message;
  173. _logger.LogError(e, e.Message);
  174. return await Edit(request.ID);
  175. }
  176. }
  177. [HttpGet("Grade/{id}/Delete")]
  178. public async Task<IActionResult> Delete(int id)
  179. {
  180. try
  181. {
  182. if (id <= 0)
  183. {
  184. throw new Exception("유효하지 않은 접근입니다.");
  185. }
  186. var memberGrade = await _db.MemberGrade.FindAsync(id);
  187. if (memberGrade == null)
  188. {
  189. throw new Exception("회원등급 정보를 찾을 수 없습니다.");
  190. }
  191. _fileUploadService.RemoveFile(memberGrade.Image);
  192. _db.MemberGrade.Remove(memberGrade);
  193. int affectedRows = await _db.SaveChangesAsync();
  194. if (affectedRows <= 0)
  195. {
  196. throw new Exception("회원등급 삭제 중 오류가 발생했습니다.");
  197. }
  198. _fileUploadService.RemoveFile(memberGrade.Image);
  199. string message = "회원등급이 삭제되었습니다.";
  200. TempData["SuccessMessage"] = message;
  201. _logger.LogInformation(message);
  202. }
  203. catch (Exception e)
  204. {
  205. TempData["ErrorMessages"] = e.Message;
  206. _logger.LogError(e, e.Message);
  207. }
  208. return Redirect("/Member/Grade");
  209. }
  210. }
  211. }