UserService.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IdentityModel.Tokens.Jwt;
  4. using System.Linq;
  5. using System.Security.Claims;
  6. using System.Text;
  7. using FMSAdmin.Data;
  8. using FMSAdmin.Helpers;
  9. using FMSAdmin.Entities;
  10. using Microsoft.EntityFrameworkCore;
  11. using Microsoft.Extensions.Logging;
  12. using Microsoft.Extensions.Options;
  13. using Microsoft.IdentityModel.Tokens;
  14. using FMSAdmin.Models;
  15. namespace FMSAdmin.Services {
  16. public class UserService {
  17. private readonly ILogger<UserService> _logger;
  18. private readonly FMSContext _context;
  19. private readonly StorageHelper _storage;
  20. private readonly AppSettings _appSettings;
  21. public UserService(
  22. ILogger<UserService> logger,
  23. FMSContext context,
  24. IOptions<AppSettings> appSettings,
  25. StorageHelper storage) {
  26. _logger = logger;
  27. _context = context;
  28. _appSettings = appSettings.Value;
  29. _storage = storage;
  30. }
  31. public void Delete(object id) {
  32. try {
  33. CmUser data = _context.CmUser.Find(id);
  34. data.IsUse = false;
  35. _context.SaveChanges();
  36. } catch (Exception ex) {
  37. throw ex;
  38. }
  39. }
  40. public void Delete(string[] list) {
  41. var query = from x in _context.CmUser
  42. where list.Contains(x.UserId)
  43. select x;
  44. foreach (var item in query) {
  45. item.IsUse = false;
  46. }
  47. _context.SaveChanges();
  48. }
  49. public CmUser Login(LoginModel model) {
  50. CmUser user = null;
  51. try {
  52. int siteId = Util.ToInt(model.SiteId);
  53. /*
  54. if (model.Type == LoginModelType.본사) {
  55. siteId = 1;
  56. }
  57. */
  58. user = (from c in _context.CmUser
  59. where c.IsUse == true && c.SiteId == siteId && c.UserId == model.UserId
  60. select c).FirstOrDefault();
  61. if (user != null && user.Passwd == model.Passwd) {
  62. var tokenHandler = new JwtSecurityTokenHandler();
  63. var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
  64. var tokenDescriptor = new SecurityTokenDescriptor {
  65. Subject = new ClaimsIdentity(new Claim[]
  66. {
  67. new Claim(ClaimTypes.Name, user.UserId),
  68. new Claim("UserId", user.UserId.ToString()),
  69. new Claim("SiteId", user.SiteId.ToString()),
  70. new Claim("UserGroupId", user.UserGroupId.ToString()),
  71. new Claim("BusinessFieldId", user.BusinessFieldId.ToString()),
  72. new Claim("Name", user.Name),
  73. new Claim("IsAdmin", user.IsAdmin?"true":""),
  74. new Claim("SiteName", user.CmSite.Name),
  75. }),
  76. Expires = DateTime.UtcNow.AddHours(10),
  77. SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
  78. };
  79. var token = tokenHandler.CreateToken(tokenDescriptor);
  80. user.AccessToken = tokenHandler.WriteToken(token);
  81. _context.SaveChanges();
  82. } else {
  83. return null;
  84. }
  85. } catch (Exception ex) {
  86. throw ex;
  87. }
  88. _context.Entry(user).State = EntityState.Deleted;
  89. return user;
  90. }
  91. public CmUser GetByUserId(string id, bool deleteCheck = false) {
  92. var item = _context.CmUser.AsNoTracking()
  93. .Where(x => x.UserId == id).FirstOrDefault();
  94. if (deleteCheck && item.IsUse == false) return null;
  95. return item;
  96. }
  97. public IQueryable<CmUser> Gets(string id, int siteId) {
  98. var data = _context.CmUser.Where(x => x.UserId == id && x.SiteId == siteId);
  99. return data;
  100. }
  101. public void Save(CmUser data) {
  102. using (var transaction = _context.Database.BeginTransaction()) {
  103. if (data.CmFile != null && data.CmFile.IsUpload) {
  104. data.CmFile.SiteId = data.SiteId;
  105. var category = _context.CmFileCategory.First(x => x.Name == "user");
  106. data.CmFile.FileCategory = category;
  107. data.CmFile.CreatedDate = DateTime.Now;
  108. }
  109. var persist = _context.CmUser
  110. .Where(x => x.UserId == data.UserId).FirstOrDefault();
  111. if (persist == null) {
  112. var check = _context.CmUser.Where(x => x.UserId == data.UserId && x.IsUse == false).Count();
  113. if (check > 0) {
  114. throw new ServiceException("아이디가 중복됩니다.");
  115. }
  116. data.IsUse = true;
  117. _context.CmUser.Add(data);
  118. _context.SaveChanges();
  119. } else {
  120. persist.SiteId = data.SiteId;
  121. persist.UserGroupId = data.UserGroupId;
  122. persist.UserId = data.UserId;
  123. persist.Name = data.Name;
  124. persist.OfficePhoneNo = data.OfficePhoneNo;
  125. persist.EmploymentStatus = data.EmploymentStatus;
  126. persist.EmploymentType = data.EmploymentType;
  127. persist.CompanyId = data.CompanyId;
  128. persist.DepartmentId = data.DepartmentId;
  129. persist.PositionId = data.PositionId;
  130. persist.BusinessFieldId = data.BusinessFieldId;
  131. persist.MobilePhoneNo = data.MobilePhoneNo;
  132. persist.EnterDate = data.EnterDate;
  133. persist.RetireDate = data.RetireDate;
  134. persist.Certificated = data.Certificated;
  135. persist.IsScheduleUser = data.IsScheduleUser;
  136. persist.IsSi = data.IsSi;
  137. persist.IsMobile = data.IsMobile;
  138. persist.IsAdmin = data.IsAdmin;
  139. persist.Comment = data.Comment;
  140. persist.Email = data.Email;
  141. if (data.CmFile != null && data.CmFile.IsUpload) {
  142. persist.CmFile = data.CmFile;
  143. }
  144. _context.SaveChanges();
  145. }
  146. if (data.CmFile != null && data.CmFile.IsUpload) {
  147. // 카피
  148. _storage.CopyEntity(data.CmFile.Path, persist.CmFile);
  149. }
  150. transaction.Commit();
  151. }
  152. }
  153. public void Create(CmUser data) {
  154. using (var transaction = _context.Database.BeginTransaction()) {
  155. if (data.CmFile != null && data.CmFile.IsUpload) {
  156. data.CmFile.SiteId = data.SiteId;
  157. var category = _context.CmFileCategory.First(x => x.Name == "user");
  158. data.CmFile.FileCategory = category;
  159. data.CmFile.CreatedDate = DateTime.Now;
  160. } else {
  161. data.CmFile = null;
  162. }
  163. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  164. var category = _context.CmFileCategory.First(x => x.Name == "user_sign");
  165. data.CmFile1.SiteId = data.SiteId;
  166. data.CmFile1.FileCategory = category;
  167. data.CmFile1.CreatedDate = DateTime.Now;
  168. } else {
  169. data.CmFile1 = null;
  170. }
  171. var persist = _context.CmUser.Where(x => x.UserId == data.UserId).FirstOrDefault();
  172. if (persist != null) {
  173. throw new ServiceException("이미 동일 아이디가 존재합니다.");
  174. }
  175. data.IsUse = true;
  176. _context.CmUser.Add(data);
  177. _context.SaveChanges();
  178. if (data.CmFile != null && data.CmFile.IsUpload) {
  179. // 카피
  180. _storage.CopyEntity(data.CmFile.Path, data.CmFile);
  181. }
  182. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  183. // 카피
  184. _storage.CopyEntity(data.CmFile1.Path, data.CmFile1);
  185. }
  186. transaction.Commit();
  187. }
  188. }
  189. public void Edit(string id, int siteId, CmUser data) {
  190. using (var transaction = _context.Database.BeginTransaction()) {
  191. if (data.CmFile != null && data.CmFile.IsUpload) {
  192. data.CmFile.SiteId = data.SiteId;
  193. var category = _context.CmFileCategory.First(x => x.Name == "user");
  194. data.CmFile.FileCategory = category;
  195. data.CmFile.CreatedDate = DateTime.Now;
  196. }
  197. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  198. var category = _context.CmFileCategory.First(x => x.Name == "user_sign");
  199. data.CmFile1.FileCategory = category;
  200. data.CmFile1.CreatedDate = DateTime.Now;
  201. }
  202. var persist = _context.CmUser.Where(x => x.UserId == id && x.SiteId == siteId).FirstOrDefault();
  203. if (persist == null) {
  204. throw new ServiceException("정보를 찾을 수 없습니다.");
  205. }
  206. persist.UserGroupId = data.UserGroupId;
  207. persist.Name = data.Name;
  208. persist.Passwd = data.Passwd;
  209. persist.PasswordUpdatedDate = DateTime.Now;
  210. persist.OfficePhoneNo = data.OfficePhoneNo;
  211. persist.EmploymentStatus = data.EmploymentStatus;
  212. persist.EmploymentType = data.EmploymentType;
  213. persist.CompanyId = data.CompanyId;
  214. persist.DepartmentId = data.DepartmentId;
  215. persist.PositionId = data.PositionId;
  216. persist.BusinessFieldId = data.BusinessFieldId;
  217. persist.MobilePhoneNo = data.MobilePhoneNo;
  218. persist.EnterDate = data.EnterDate;
  219. persist.RetireDate = data.RetireDate;
  220. persist.Certificated = data.Certificated;
  221. persist.IsScheduleUser = data.IsScheduleUser;
  222. persist.IsSi = data.IsSi;
  223. persist.IsMobile = data.IsMobile;
  224. persist.IsAdmin = data.IsAdmin;
  225. persist.Comment = data.Comment;
  226. persist.Email = data.Email;
  227. if (data.CmFile != null && data.CmFile.IsUpload) {
  228. persist.CmFile = data.CmFile;
  229. }
  230. if (data.CmFile1 != null) {
  231. if (data.CmFile1.IsUpload) {
  232. persist.CmFile1 = data.CmFile1;
  233. }
  234. if (data.CmFile1.IsDelete) {
  235. persist.SignImageFileId = null;
  236. persist.CmFile1 = null;
  237. }
  238. }
  239. _context.SaveChanges();
  240. if (data.CmFile != null && data.CmFile.IsUpload) {
  241. // 카피
  242. _storage.CopyEntity(data.CmFile.Path, persist.CmFile);
  243. if (persist.CmFile != null) {
  244. // 파일 삭제시 진짜 DB삭제?
  245. }
  246. }
  247. if (data.CmFile1 != null && data.CmFile1.IsUpload) {
  248. //카피
  249. _storage.CopyEntity(data.CmFile1.Path, persist.CmFile1);
  250. }
  251. transaction.Commit();
  252. }
  253. }
  254. public void ChangePassword(int siteId, string id, string password, bool bInit = false) {
  255. var data = _context.CmUser.First(x => x.UserId == id && x.SiteId == siteId);
  256. if (!bInit && data.Passwd == password) {
  257. //패스워드 초기화가 아닌 경우만 기존 패스워드 체크.
  258. throw new ServiceException("기존 패스워드와 동일한 패스워드를 사용할 수 없습니다.");
  259. }
  260. data.Passwd = password;
  261. data.PasswordUpdatedDate = DateTime.Now;
  262. _context.SaveChanges();
  263. }
  264. public void Delete(string id, int siteId) {
  265. var data = _context.CmUser.First(x => x.UserId == id && x.SiteId == siteId);
  266. _context.CmUser.Remove(data);
  267. _context.SaveChanges();
  268. }
  269. public IQueryable<CmUser> GetAll() {
  270. var query = _context.CmUser/*.AsNoTracking()*/
  271. .Include(x => x.CmUserGroup);
  272. return query;
  273. }
  274. public IQueryable<CmSite> GetCmSites() {
  275. var query = _context.CmSite.Where(x => x.IsUse == true);
  276. return query;
  277. }
  278. }
  279. }