CommonLogic.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. using System.Globalization;
  2. using System.IdentityModel.Tokens.Jwt;
  3. using System.Security.Claims;
  4. using System.Text;
  5. using System.Xml.Linq;
  6. using System.Xml.Serialization;
  7. using Common.Constant;
  8. using log4net;
  9. using Microsoft.AspNetCore.Http;
  10. using Microsoft.Extensions.Configuration;
  11. using Microsoft.IdentityModel.Tokens;
  12. using Newtonsoft.Json;
  13. using System.Net;
  14. namespace Common.Logic;
  15. public class CommonLogic
  16. {
  17. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(CommonLogic));
  18. public static String GenToken(IConfiguration configuration, String Email, String accountId)
  19. {
  20. var issuer = configuration["Jwt:Issuer"];
  21. var audience = configuration["Jwt:Audience"];
  22. var key = Encoding.ASCII.GetBytes(configuration["Jwt:Key"]!);
  23. var tokenDescriptor = new SecurityTokenDescriptor
  24. {
  25. Subject = new ClaimsIdentity(
  26. new[]
  27. {
  28. new Claim("Id", Guid.NewGuid().ToString()),
  29. new Claim("Msisdn", Email),
  30. new Claim("AccountId", accountId),
  31. new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
  32. }
  33. ),
  34. Expires = DateTime.UtcNow.AddMinutes(int.Parse(configuration["Jwt:Time"] ?? "900")),
  35. Issuer = issuer,
  36. Audience = audience,
  37. SigningCredentials = new SigningCredentials(
  38. new SymmetricSecurityKey(key),
  39. SecurityAlgorithms.HmacSha512Signature
  40. )
  41. };
  42. var tokenHandler = new JwtSecurityTokenHandler();
  43. var token = tokenHandler.CreateToken(tokenDescriptor);
  44. var jwtToken = tokenHandler.WriteToken(token);
  45. var stringToken = tokenHandler.WriteToken(token);
  46. return stringToken;
  47. }
  48. public static string GenRefreshToken(IConfiguration configuration, string msisdn)
  49. {
  50. var issuer = configuration["Jwt:Issuer"];
  51. var audience = configuration["Jwt:Audience"];
  52. var key = Encoding.ASCII.GetBytes(configuration["Jwt:Key"]);
  53. var tokenDescriptor = new SecurityTokenDescriptor
  54. {
  55. Subject = new ClaimsIdentity(
  56. new[]
  57. {
  58. new Claim("Id", Guid.NewGuid().ToString()),
  59. new Claim("Msisdn", msisdn),
  60. new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
  61. }
  62. ),
  63. Expires = DateTime.UtcNow.AddMinutes(int.Parse(configuration["Jwt:Time"] ?? "900")),
  64. Issuer = issuer,
  65. Audience = audience,
  66. SigningCredentials = new SigningCredentials(
  67. new SymmetricSecurityKey(key),
  68. SecurityAlgorithms.HmacSha512Signature
  69. )
  70. };
  71. var tokenHandler = new JwtSecurityTokenHandler();
  72. var token = tokenHandler.CreateToken(tokenDescriptor);
  73. var jwtToken = tokenHandler.WriteToken(token);
  74. var stringToken = tokenHandler.WriteToken(token);
  75. return stringToken;
  76. }
  77. public static string? GetDataFromToken(
  78. IConfiguration configuration,
  79. HttpRequest httpRequest,
  80. string nameKey
  81. )
  82. {
  83. string realToken = "";
  84. var token = httpRequest.Headers["Authorization"];
  85. if (token.Count == 0)
  86. {
  87. return null;
  88. }
  89. realToken = token[0];
  90. // Trim 'Bearer ' from the start since its just a prefix for the token
  91. var jwtEncodedString = realToken.Substring(7);
  92. string? value = GetPath(configuration, jwtEncodedString, nameKey);
  93. if (value == null)
  94. {
  95. return null;
  96. }
  97. string url = httpRequest.Path;
  98. log.Info("url: " + url + " || nameKey: " + nameKey + " value: " + value);
  99. return value;
  100. }
  101. public static string? GetPath(IConfiguration configuration, string token, string nameKey)
  102. {
  103. var key = Encoding.ASCII.GetBytes(configuration["Jwt:Key"] ?? "");
  104. var handler = new JwtSecurityTokenHandler();
  105. var validations = new TokenValidationParameters
  106. {
  107. ValidateIssuerSigningKey = true,
  108. IssuerSigningKey = new SymmetricSecurityKey(key),
  109. ValidateIssuer = false,
  110. ValidateAudience = false,
  111. ValidateLifetime = true
  112. };
  113. var claims = handler.ValidateToken(token, validations, out var tokenSecure);
  114. var data = claims.Claims.First(x => x.Type == nameKey).Value;
  115. return data;
  116. }
  117. public static string? ValidateMsisdn(string? input)
  118. {
  119. if (input == null || input.Length == 0 || !long.TryParse(input, out long temp))
  120. {
  121. return null;
  122. }
  123. else if (input.StartsWith("255") && input.Length == 12)
  124. {
  125. return input.Trim();
  126. }
  127. else if (input.StartsWith("0") && input.Length == 10)
  128. {
  129. input = "255" + input.Substring(1);
  130. return input.Trim();
  131. }
  132. return null;
  133. }
  134. public static string GenPassword(int length)
  135. {
  136. const string chars = "0123456789";
  137. var random = new Random();
  138. var password = new StringBuilder();
  139. for (int i = 0; i < length; i++)
  140. {
  141. password.Append(chars[random.Next(chars.Length)]);
  142. }
  143. return password.ToString();
  144. }
  145. /// <summary>
  146. /// Get language from request header or body
  147. /// Priority: header Lang > header Accept-Language > body lang > default "lo"
  148. /// </summary>
  149. /// <param name="httpRequest">HTTP request</param>
  150. /// <param name="bodyLang">Language from request body (optional)</param>
  151. /// <returns>Language code: "lo" or "en"</returns>
  152. public static string GetLanguage(HttpRequest httpRequest, string? bodyLang = null)
  153. {
  154. // Check custom Lang header first (highest priority)
  155. var langHeader = httpRequest.Headers["Lang"].FirstOrDefault();
  156. if (!string.IsNullOrEmpty(langHeader))
  157. {
  158. var lang = langHeader.ToLower();
  159. if (lang == "en" || lang == "lo")
  160. return lang;
  161. }
  162. // Check Accept-Language header
  163. var acceptLangHeader = httpRequest.Headers["Accept-Language"].FirstOrDefault();
  164. if (!string.IsNullOrEmpty(acceptLangHeader))
  165. {
  166. // Accept-Language can be "en", "lo", "en-US,en;q=0.9", etc.
  167. var lang = acceptLangHeader.Split(',')[0].Split('-')[0].ToLower();
  168. if (lang == "en" || lang == "lo")
  169. return lang;
  170. }
  171. // Then check body
  172. if (!string.IsNullOrEmpty(bodyLang))
  173. return bodyLang.ToLower();
  174. return "lo"; // Default
  175. }
  176. public static string ConvertIntStatus(int? status)
  177. {
  178. switch (status)
  179. {
  180. case CommonConstant.StatusActive:
  181. return "Active";
  182. case CommonConstant.StatusInactive:
  183. return "Inactive";
  184. case CommonConstant.StatusClaimed:
  185. return "Claimed";
  186. case CommonConstant.StatusNotClaimed:
  187. return "Not Claimed";
  188. default:
  189. return "All";
  190. }
  191. }
  192. public static DateTime ConvertStringToTime(string? time)
  193. {
  194. return DateTime.ParseExact(
  195. time!,
  196. CommonConstant.ListDateTimeFormat,
  197. System.Globalization.CultureInfo.InvariantCulture,
  198. DateTimeStyles.None
  199. );
  200. }
  201. public static string GetClassNameByIntStatus(int status)
  202. {
  203. switch (status)
  204. {
  205. case CommonConstant.StatusActive:
  206. return "bg-success";
  207. case CommonConstant.StatusClaimed:
  208. return "bg-success";
  209. case CommonConstant.StatusNotClaimed:
  210. return "bg-danger";
  211. case CommonConstant.StatusInactive:
  212. return "bg-black";
  213. default:
  214. return "bg-success";
  215. }
  216. }
  217. public static string? SendPostWithAuthen(ILog log, string Url, dynamic data, string authenToken,string lang = "tu")
  218. {
  219. var json = JsonConvert.SerializeObject(data);
  220. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  221. request.Method = "POST";
  222. request.ContentType = "application/json";
  223. request.ContentLength = json.Length;
  224. request.Headers.Add("Authorization", "Bearer " + authenToken);
  225. request.Headers.Add("Accept-Language", lang);
  226. log.Info("request: " + Url + " data: " + json);
  227. using (Stream webStream = request.GetRequestStream())
  228. using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
  229. {
  230. requestWriter.Write(json);
  231. }
  232. try
  233. {
  234. WebResponse webResponse = request.GetResponse();
  235. using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
  236. using (StreamReader responseReader = new StreamReader(webStream))
  237. {
  238. string response = responseReader.ReadToEnd();
  239. log.Info("request: " + Url + " /nData: " + json + " /n response: " + response);
  240. return response;
  241. }
  242. }
  243. catch (Exception e)
  244. {
  245. log.Info("-----------------");
  246. log.Info(e.Message);
  247. }
  248. return null;
  249. }
  250. public static string? SendPost(ILog log, string Url, dynamic data)
  251. {
  252. var json = JsonConvert.SerializeObject(data);
  253. log.Info("request: " + Url + " data: " + json);
  254. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
  255. request.Method = "POST";
  256. request.ContentType = "application/json";
  257. request.ContentLength = json.Length;
  258. // CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
  259. // log.Debug("Lang: " + currentCulture.Name);
  260. // request.Headers.Add("Lang", currentCulture.Name);
  261. using (Stream webStream = request.GetRequestStream())
  262. using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
  263. {
  264. requestWriter.Write(json);
  265. }
  266. try
  267. {
  268. WebResponse webResponse = request.GetResponse();
  269. using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
  270. using (StreamReader responseReader = new StreamReader(webStream))
  271. {
  272. string response = responseReader.ReadToEnd();
  273. log.Info("request: " + Url + " /nData: " + json + " /n response: " + response);
  274. return response;
  275. }
  276. }
  277. catch (Exception e)
  278. {
  279. log.Info("-----------------");
  280. log.Info(e.Message);
  281. }
  282. return null;
  283. }
  284. public static string GetErrorDescription(string code)
  285. {
  286. switch (code)
  287. {
  288. case "0":
  289. return "SUBSCRIBER put to queue Success";
  290. case "1":
  291. return "SUBSCRIBER put to Queue failed";
  292. case "2":
  293. return "Unauthentic";
  294. case "15":
  295. return "Missing value (Input params null) / Invalid Parameter(s)";
  296. case "200":
  297. return "Invalid username or password";
  298. case "201":
  299. return "Invalid Request Type";
  300. case "202":
  301. return "Invalid Request";
  302. case "203":
  303. return "Invalid package";
  304. case "204":
  305. return "Server too busy";
  306. case "400":
  307. return "Not register";
  308. case "401":
  309. return "Not enough money";
  310. case "403":
  311. return "Already register";
  312. case "408":
  313. return "Get price charge error";
  314. case "411":
  315. return "Subscriber was cancel service";
  316. case "412":
  317. return "Subscriber not use service";
  318. case "413":
  319. return "Conflict package. Subscriber is using other package in same service";
  320. case "418":
  321. return "MO command not support";
  322. case "419":
  323. return "3rd Party is incorrect";
  324. case "420":
  325. return "Wrong format datetime: yyyy-MM-dd";
  326. case "504":
  327. return "Unknown error";
  328. default:
  329. return "Unknown error code";
  330. }
  331. }
  332. //public static EnvelopeNoNs ParseSoapResponse(string xml)
  333. //{
  334. // // Bỏ namespace để dễ deserialize
  335. // XDocument doc = XDocument.Parse(xml);
  336. // foreach (var elem in doc.Descendants())
  337. // elem.Name = elem.Name.LocalName;
  338. // string cleanXml = doc.ToString();
  339. // var serializer = new XmlSerializer(typeof(EnvelopeNoNs));
  340. // using var reader = new StringReader(cleanXml);
  341. // return (EnvelopeNoNs)serializer.Deserialize(reader)!;
  342. //}
  343. }