EmailController.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using System.Diagnostics;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.EntityFrameworkCore;
  5. using Microsoft.AspNetCore.Mvc.Filters;
  6. using Microsoft.AspNetCore.WebUtilities;
  7. using DeviceDetectorNET;
  8. using bitforum.Helpers;
  9. using bitforum.Models;
  10. namespace bitforum.Controllers.Member.Log
  11. {
  12. [Authorize]
  13. [Route("Member/Log")]
  14. public class Emailontroller : Controller
  15. {
  16. private readonly ILogger<Emailontroller> _logger;
  17. private readonly DefaultDbContext _db;
  18. private string? _queryString = null;
  19. public Emailontroller(ILogger<Emailontroller> logger, DefaultDbContext db)
  20. {
  21. _logger = logger;
  22. _db = db;
  23. }
  24. [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
  25. public IActionResult Error()
  26. {
  27. return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
  28. }
  29. public override void OnActionExecuting(ActionExecutingContext context)
  30. {
  31. ViewBag.QueryString = _queryString = string.Join("&", QueryHelpers.ParseQuery(HttpContext.Request.QueryString.Value).Select(r => $"{r.Key}={r.Value.FirstOrDefault()}"));
  32. base.OnActionExecuting(context);
  33. }
  34. [HttpGet("Email")]
  35. public async Task<IActionResult> Index([FromQuery] int page = 1, int perPage = 10, byte? search = null, string? keyword = null, string startAt = null!, string endAt = null!)
  36. {
  37. var query = _db.EmailChangeLog.AsQueryable();
  38. // 검색 조건 적용
  39. if (!string.IsNullOrEmpty(keyword) && search.HasValue)
  40. {
  41. if (search == 1) // ID 검색
  42. {
  43. if (int.TryParse(keyword, out int memberID))
  44. {
  45. query = query.Where(log => log.MemberID == memberID);
  46. }
  47. else
  48. {
  49. query = query.Where(log => log.MemberID == 0);
  50. }
  51. }
  52. else if (search == 2)
  53. {
  54. query = query.Where(log => _db.Member.Any(c => c.Email.Contains(keyword))); // 회원 이메일 검색
  55. }
  56. else if (search == 3)
  57. {
  58. query = query.Where(log => _db.Member.Any(c => c.Name != null && c.Name.Contains(keyword))); // 회원 별명 검색
  59. }
  60. else if (search == 4)
  61. {
  62. query = query.Where(log => log.BeforeEmail != null && log.BeforeEmail.Contains(keyword));
  63. }
  64. else if (search == 5)
  65. {
  66. query = query.Where(log => log.AfterEmail.Contains(keyword));
  67. }
  68. }
  69. var today = DateTime.UtcNow.Date;
  70. if (startAt != null && DateTime.TryParse(startAt, out var st))
  71. {
  72. query = query.Where(log => log.CreatedAt >= st);
  73. }
  74. if (endAt != null && DateTime.TryParse(endAt, out var et))
  75. {
  76. query = query.Where(log => log.CreatedAt <= et);
  77. }
  78. query = query.OrderByDescending(c => c.CreatedAt);
  79. var logs = await (from C in query
  80. join M in _db.Member on C.MemberID equals M.ID into MB
  81. from M in MB.DefaultIfEmpty()
  82. select new
  83. {
  84. M.Name,
  85. M.Email,
  86. C.ID,
  87. C.MemberID,
  88. C.BeforeEmail,
  89. C.AfterEmail,
  90. C.CreatedAt
  91. }).Skip((page -1) * perPage).Take(perPage).ToListAsync();
  92. var data = new List<object>();
  93. if (logs.Count > 0)
  94. {
  95. foreach (var row in logs)
  96. {
  97. data.Add(new
  98. {
  99. row.ID,
  100. row.MemberID,
  101. row.Name,
  102. row.Email,
  103. row.BeforeEmail,
  104. row.AfterEmail,
  105. DeleteURL = $"/Member/Log/Email/{row.ID}/Delete?{_queryString}",
  106. CreatedAt = row.CreatedAt.GetDateAt()
  107. });
  108. }
  109. }
  110. var parameter = new
  111. {
  112. Page = page,
  113. PerPage = perPage,
  114. Search = search,
  115. Keyword = keyword,
  116. StartAt = startAt,
  117. EndAt = endAt
  118. };
  119. ViewBag.Data = data;
  120. ViewBag.Total = await query.CountAsync();
  121. ViewBag.Parameter = parameter;
  122. ViewBag.Pagination = new Pagination(ViewBag.Total, page, perPage, parameter);
  123. return View("~/Views/Member/Log/Email.cshtml");
  124. }
  125. [HttpGet("Email/{id}/Delete")]
  126. public async Task<IActionResult> Delete(int id)
  127. {
  128. try
  129. {
  130. if (id <= 0)
  131. {
  132. throw new Exception("유효하지 않은 접근입니다.");
  133. }
  134. var data = await _db.NameChangeLog.FindAsync(id);
  135. if (data == null)
  136. {
  137. throw new Exception("별명 변경 정보를 찾을 수 없습니다.");
  138. }
  139. _db.NameChangeLog.Remove(data);
  140. int affectedRows = await _db.SaveChangesAsync();
  141. if (affectedRows <= 0)
  142. {
  143. throw new Exception("별명 변경 내역 삭제 중 오류가 발생했습니다.");
  144. }
  145. string message = "별명 변경 내역이 삭제되었습니다.";
  146. TempData["SuccessMessage"] = message;
  147. _logger.LogInformation(message);
  148. }
  149. catch (Exception e)
  150. {
  151. TempData["ErrorMessages"] = e.Message;
  152. _logger.LogError(e, e.Message);
  153. }
  154. return Redirect($"/Member/Log/Email?{_queryString}");
  155. }
  156. [HttpPost("Email/Delete")]
  157. public async Task<IActionResult> Delete([FromForm] int[] ids)
  158. {
  159. try
  160. {
  161. if (ids == null || ids.Length <= 0)
  162. {
  163. throw new Exception("유효하지 않은 접근입니다.");
  164. }
  165. foreach (var id in ids)
  166. {
  167. var data = await _db.NameChangeLog.FindAsync(id);
  168. if (data == null)
  169. {
  170. throw new Exception($"{id}번 이메일 변경 정보를 찾을 수 없습니다.");
  171. }
  172. _db.NameChangeLog.Remove(data);
  173. int affectedRows = await _db.SaveChangesAsync();
  174. if (affectedRows <= 0)
  175. {
  176. throw new Exception($"{id}번 이메일 변경 내역 삭제 중 오류가 발생했습니다.");
  177. }
  178. }
  179. string message = $"{ids.Length}건의 이메일 변경 내역이 삭제되었습니다.";
  180. TempData["SuccessMessage"] = message;
  181. _logger.LogInformation(message);
  182. }
  183. catch (Exception e)
  184. {
  185. TempData["ErrorMessages"] = e.Message;
  186. _logger.LogError(e, e.Message);
  187. }
  188. return Redirect($"/Member/Log/Email?{_queryString}");
  189. }
  190. }
  191. }