using Church.Net.DAL.EF; using Church.Net.Entity; using Church.Net.Utility; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NuGet.Common; using NuGet.ProjectModel; using System; using System.IO; using System.Linq; using System.Net; using WebAPI.Logics.Interface; using WebAPI.ViewModel; using static QRCoder.PayloadGenerator; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 namespace WebAPI.Controllers { [ApiController] public class PasswordLoginController : ControllerBase { private readonly ChurchNetContext churchNetContext; private readonly ICrudLogic crudLogic; private readonly ICombinedKeyCrudLogic relationLogic; private readonly ICrudLogic domainLogic; // POST api/ public PasswordLoginController( ChurchNetContext churchNetContext, ICrudLogic crudLogic, ICombinedKeyCrudLogic relationLogic, ICrudLogic domainLogic ) { this.churchNetContext = churchNetContext; this.crudLogic = crudLogic; this.relationLogic = relationLogic; this.domainLogic = domainLogic; } [HttpPost] [Route("auth/login")] public LoginTokenViewModel Login([FromBody] RegisterViewModel value) { FamilyMember member = null; if (string.IsNullOrEmpty(value.OAuthType)) { value.Email = value.Email.Trim().ToLower(); member = crudLogic.First(f => f.Password == value.Password && f.Email.ToLower() == value.Email.ToLower()); //member = this.churchNetContext.FamilyMembers // .Where(f => f.Password == value.Password && f.Email.ToLower() == value.Email.ToLower()).FirstOrDefault(); } return ToLoginTokenViewModel(member); } [HttpPost] [Route("auth/sign-up")] [Route("auth/oauth-login")] public LoginTokenViewModel SignUp([FromBody] RegisterViewModel value) { FamilyMember member = null; string loginToken = ""; if (!string.IsNullOrEmpty(value.OAuthType)) { if (value.OAuthType == "google") { if (false == this.GetGoogleLoginInfo(ref value)) return null; } var userId = this.churchNetContext.FamilyMemberOAuths .Where(f => f.OAuthType == value.OAuthType && f.OAuthAccessToken == value.AccessToken) .Select(f => f.FamilyMemberId).FirstOrDefault(); if (string.IsNullOrEmpty(userId)) { value.Email = value.Email.Trim().ToLower(); member = this.churchNetContext.FamilyMembers .Where(m => m.Email.ToLower() == value.Email) .FirstOrDefault(); if (member == null) { member = new FamilyMember() { Id = StringHelper.Get33BaseGuid(), FirstName = value.FirstName, LastName = value.LastName, Email = value.Email, AvatarImage = value.AvatarImage, Password = StringHelper.Get33BaseGuid() }; churchNetContext.Add(member); } else { member.AvatarImage = value.AvatarImage; member.FirstName = value.FirstName; member.LastName = value.LastName; churchNetContext.Update(member); } churchNetContext.Add(new FamilyMemberOAuth() { FamilyMemberId = member.Id, OAuthType = value.OAuthType, OAuthAccessToken = value.AccessToken }); churchNetContext.SaveChanges(); } else { member = this.churchNetContext.FamilyMembers .Where(f => f.Id == userId).FirstOrDefault(); } } else { value.Email = value.Email.Trim().ToLower(); if (!this.churchNetContext.FamilyMembers .Any(f => f.Email == value.Email)) { member = new FamilyMember() { Id = StringHelper.Get33BaseGuid(), FirstName = value.FirstName, LastName = value.LastName, Email = value.Email, AvatarImage = value.AvatarImage, Password = value.Password }; churchNetContext.Add(member); churchNetContext.SaveChanges(); } } return ToLoginTokenViewModel(member); } [HttpPost] [Route("auth/request-pass")] public void RequestPassword([FromBody] RegisterViewModel value) { } [HttpPost] [Route("auth/reset-pass")] public void ResetPassword([FromBody] RegisterViewModel value) { } [HttpPost] [Route("auth/loginwithtoken")] public LoginTokenViewModel LoginWithToken([FromBody] LoginTokenViewModel value) { var memberId = TokenHelper.GetUserIdFromToken(value.Token); if (!string.IsNullOrWhiteSpace(memberId)) { var member = crudLogic.First(f => f.Id == memberId); //var member = this.churchNetContext.FamilyMembers // .Where(f => f.Id == memberId).FirstOrDefault(); return ToLoginTokenViewModel(member); } return null; } private LoginTokenViewModel ToLoginTokenViewModel(FamilyMember member) { if (member != null) { DateTime expiredTime = DateTime.Now.AddDays(30); string token = TokenHelper.GenerateToken(member.Id, expiredTime); var cellGroupId = churchNetContext.PastoralDomainMembers.Where(d => d.FamilyMemberId == member.Id).Select(d => d.PastoralDomainId).FirstOrDefault(); PastoralDomain cellGroup; if (string.IsNullOrEmpty(cellGroupId)) { cellGroup = churchNetContext.PastoralDomains.First(); relationLogic.Create(new PastoralDomainMembers(cellGroup.Id, member.Id)); } else { cellGroup = churchNetContext.PastoralDomains.Where(g=>g.Id== cellGroupId).First(); } return new LoginTokenViewModel() { MemberId = member.Id, FirstName = member.FirstName, LastName = member.LastName, AvatarImage = member.AvatarImage, Email = member.Email, Token = token, TokenExpireTime = expiredTime, Role = member.Role, CellGroup= cellGroup }; } return null; } private bool GetGoogleLoginInfo(ref RegisterViewModel model) { string uri = $"https://www.googleapis.com/oauth2/v2/userinfo?access_token={model.AccessToken}"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); var obj = JsonConvert.DeserializeObject(result); if (obj.TryGetValue("email", out JToken value)) { model.Email = ((string)value).ToLower().Trim(); model.FirstName = obj.GetValue("given_name"); model.LastName = obj.GetValue("family_name"); model.AvatarImage = obj.GetValue("picture"); model.AccessToken = obj.GetValue("id"); return true; } } } catch (Exception) { } return false; } } }