244 lines
9.0 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|