Church.Net.API/WebAPI/Controllers/PasswordLoginController.cs
2022-09-08 08:04:32 -07:00

244 lines
9.0 KiB
C#

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<FamilyMember> crudLogic;
private readonly ICombinedKeyCrudLogic<PastoralDomainMembers> relationLogic;
private readonly ICrudLogic<PastoralDomain> domainLogic;
// POST api/<PasswordLoginController>
public PasswordLoginController(
ChurchNetContext churchNetContext,
ICrudLogic<FamilyMember> crudLogic,
ICombinedKeyCrudLogic<PastoralDomainMembers> relationLogic,
ICrudLogic<PastoralDomain> 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<JObject>(result);
if (obj.TryGetValue("email", out JToken value))
{
model.Email = ((string)value).ToLower().Trim();
model.FirstName = obj.GetValue<string>("given_name");
model.LastName = obj.GetValue<string>("family_name");
model.AvatarImage = obj.GetValue<string>("picture");
model.AccessToken = obj.GetValue<string>("id");
return true;
}
}
}
catch (Exception)
{
}
return false;
}
}
}