You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/IoTCenter/Api/ProjectController.cs

382 lines
16 KiB

using Application.Domain.Entities;
using Infrastructure.Application.Services.Settings;
using Infrastructure.Data;
using Infrastructure.Extensions;
using IoTCenter.NeiMengWuHai;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web;
using System.Xml;
namespace IoTCenter.Api.Controllers
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
[ApiController]
public class ProjectController : ControllerBase
{
private readonly IWebHostEnvironment _env;
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<ProjectController> _logger;
private readonly IConfiguration _cfg;
private readonly ISettingService _settingService;
private readonly IRepository<Organ> _organRepo;
private readonly IRepository<User> _userRepo;
private readonly IRepository<OrganUser> _organUserRepo;
private readonly IRepository<Role> _roleRepo;
private readonly IRepository<UserRole> _userRoleRepo;
public ProjectController(
IWebHostEnvironment env,
IHttpClientFactory httpClientFactory,
ILogger<ProjectController> logger,
IConfiguration cfg,
ISettingService settingService,
IRepository<Organ> organRepo,
IRepository<User> userRepo,
IRepository<OrganUser> organUserRepo,
IRepository<Role> roleRepo,
IRepository<UserRole> userRoleRepo)
{
this._env = env;
this._httpClientFactory = httpClientFactory;
this._logger = logger;
this._cfg = cfg;
this._settingService = settingService;
this._organRepo = organRepo;
this._userRepo = userRepo;
this._organUserRepo = organUserRepo;
this._roleRepo = roleRepo;
this._userRoleRepo = userRoleRepo;
}
[AllowAnonymous]
[HttpGet]
public IActionResult CasLogin(string ticket, string home)
{
var sso = this._settingService.GetSetting("sso")?.Value ?? "http://10.255.253.190/dsssoserver";
var url = sso + "/serviceValidate?ticket=" + ticket + "&service=" + HttpUtility.UrlEncode(home);
var httpClient = this._httpClientFactory.CreateClient();
var result = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
var userName = this.NeiMengWuHai(result);
this.UpdateInternal(userName);
home += "?accessToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100));
home += "&refreshToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100));
return Redirect(home);
}
//[AllowAnonymous]
//[HttpGet]
//public IActionResult CasLogin(string ticket, string home)
//{
// var sso = this._settingService.GetSetting("sso")?.Value;
// if (_env.IsDevelopment())
// {
// sso = sso ?? "http://kpsso.kpedu.com";//debug
// home = "http://221.194.113.154:8100";//debug
// }
// var url = sso + "/serviceValidate?ticket=" + ticket + "&service=" + HttpUtility.UrlEncode(home);
// var httpClient = this._httpClientFactory.CreateClient();
// var result = httpClient.GetAsync(url).Result.Content.ReadAsStringAsync().Result;
// //string userName = TangShanKaiPing(result);
// var userName = this.NeiMengWuHai(result);
// if (_env.IsDevelopment())
// {
// home = "http://localhost:8100";//debug
// }
// home += "?accessToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100));
// home += "&refreshToken=" + Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100));
// return Redirect(home);
//}
//[AllowAnonymous]
//[HttpGet]
//public IActionResult Update(string userName, string realName, string organName, string organNumber, long timestamp, string role, string token)
//{
// if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(organName))
// {
// var message = "参数不能为空";
// this.logger.LogError(message);
// return Problem(message);
// }
// try
// {
// var query = this.Request.QueryString.ToString().RemoveParam("token").TrimStart('?').Trim();
// var token2 = $"{query},123456".Md5();
// if (token2 != token)
// {
// var message = "token无效";
// this.logger.LogError(message);
// throw new Exception(message);
// }
// var sendTime = DateTimeOffset.FromUnixTimeSeconds(timestamp);
// var seconds = (DateTime.UtcNow - sendTime).TotalSeconds;
// if (seconds > 60)
// {
// var message = $"timestamp差距{seconds}秒";
// this.logger.LogError(message);
// throw new Exception(message);
// }
// User user = UpdateOrganUser(userName, realName, organName, organNumber);
// var roles = role.Split(',');
// var userRoles = this._userRoleRepo.Table().Where(o => o.User.UserName == userName);
// if (roles.Any())
// {
// foreach (var item in roles)
// {
// var role2 = _roleRepo.Table().FirstOrDefault(o => o.Name == item);
// if (role2 == null)
// {
// role2 = new Role { Name = item };
// _roleRepo.Add(role2);
// _roleRepo.SaveChanges();
// }
// if (!userRoles.Any(o => o.Role.Name == item))
// {
// _userRoleRepo.Add(new UserRole { UserId = user.Id, RoleId = role2.Id });
// _userRoleRepo.SaveChanges();
// }
// }
// }
// }
// catch (Exception ex)
// {
// this.logger.LogError(ex.ToString());
// return Problem(ex.Message);
// }
// return Ok(new
// {
// AccessToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)),
// RefreshToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)),
// });
//}
private string NeiMengWuHai(string result)
{
this._logger.LogInformation(result);
var doc = new XmlDocument();
doc.LoadXml(result);
var userName = doc.GetElementsByTagName("cas:USER_NAME")[0].InnerText.Trim();
this.UpdateInternal(userName);
return userName;
}
public void UpdateInternal(string userName)
{
var connStr = this._cfg.GetConnectionString("mariyadb");
try
{
using var db = new BaseDbContext(connStr);
var personId = db.Set<PersonLogin>().Where(o => o.LoginName == userName).Select(o=>o.PersonId).FirstOrDefault();
var user = db.Set<Person>().FirstOrDefault(o => o.Id == personId);
this._logger.LogInformation(user.ToJson());
var organ = db.Set<Organization>().FirstOrDefault(o => o.OrganId == user.BureauId);
this._logger.LogInformation(organ.ToJson());
var roles = (from perssonRole in db.Set<PersonRole>().Where(o => o.PersonId == personId)
join role in db.Set<SystemRole>() on perssonRole.RoleId equals role.Id
select role.RoleName).Distinct().ToList();
this.Update(userName,user.Email, user.RealName, organ.Name, organ.Id.ToString(), roles);
}
catch (Exception ex)
{
this._logger.LogError( connStr + ex.ToString());
}
}
private string TangShanKaiPing(string result)
{
var doc = new XmlDocument();
doc.LoadXml(result);
var userName = doc.GetElementsByTagName("cas:USER_NAME")[0].InnerText.Trim();
var realName = doc.GetElementsByTagName("cas:REAL_NAME")[0].InnerText.Trim();
var organNumber = doc.GetElementsByTagName("cas:ORG_ID")[0].InnerText.Trim();
var organName = doc.GetElementsByTagName("cas:ORG_NAME")[0].InnerText.Trim();
UpdateOrganUser(userName, realName, organName, organNumber);
return userName;
}
private void Update(string userName,string email, string realName, string organName, string organNumber, List<string> roles)
{
//更新机构
var organ = this._organRepo.Table().FirstOrDefault(o => o.Number == organNumber);
if (organ == null)
{
organ = new Organ { Name = organName, Number = organNumber };
this._organRepo.Add(organ);
}
else
{
organ.Name = organName;
}
this._organRepo.SaveChanges();
//更新用户
var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == userName);
if (user == null)
{
user = new User
{
UserName = userName,
RealName=realName,
NickName = realName,
Email = string.IsNullOrEmpty(email)? $"{userName}@test.com":email
};
this._userRepo.Add(user);
}
else
{
user.RealName = realName;
user.NickName = realName;
user.Email = string.IsNullOrEmpty(email) ? $"{userName}@test.com" : email;
}
this._userRepo.SaveChanges();
//添加用户到机构
var organUser = this._organUserRepo.Table().FirstOrDefault(o => o.UserId == user.Id);
if (organUser == null)
{
organUser = new OrganUser { UserId = user.Id, OrganId = organ.Id };
this._organUserRepo.Add(organUser);
}
else
{
organUser.OrganId = organ.Id;
}
this._organUserRepo.SaveChanges();
//更新角色
if (roles.Any())
{
foreach (var item in roles)
{
var role2 = _roleRepo.Table().FirstOrDefault(o => o.Name == item);
if (role2 == null)
{
role2 = new Role { Name = item };
_roleRepo.Add(role2);
_roleRepo.SaveChanges();
}
var userRoles = this._userRoleRepo.Table().Where(o => o.User.UserName == userName);
if (!userRoles.Any(o => o.Role.Name == item))
{
_userRoleRepo.Add(new UserRole { UserId = user.Id, RoleId = role2.Id });
_userRoleRepo.SaveChanges();
}
}
}
}
[AllowAnonymous]
[HttpGet]
public IActionResult Update(string userName, string realName, string organName, string organNumber, long timestamp, string role, string token)
{
if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(organName))
{
var message = "参数不能为空";
this._logger.LogError(message);
return Problem(message);
}
try
{
var query = this.Request.QueryString.ToString().RemoveParam("token").TrimStart('?').Trim();
var token2 = $"{query},123456".Md5();
if (token2 != token)
{
var message = "token无效";
this._logger.LogError(message);
throw new Exception(message);
}
var sendTime = DateTimeOffset.FromUnixTimeSeconds(timestamp);
var seconds = (DateTime.UtcNow - sendTime).TotalSeconds;
if (seconds > 60)
{
var message = $"timestamp差距{seconds}秒";
this._logger.LogError(message);
throw new Exception(message);
}
this.UpdateInternal(userName);
}
catch (Exception ex)
{
this._logger.LogError(ex.ToString());
return Problem(ex.Message);
}
return Ok(new
{
AccessToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)),
RefreshToken = Request.HttpContext.GetToken(userName, _cfg, DateTime.Now.AddYears(100)),
});
}
private User UpdateOrganUser(string userName, string realName, string organName, string organNumber)
{
var organ = this._organRepo.Table().FirstOrDefault(o => o.Name == organName);
if (organ == null)
{
organ = new Organ { Name = organName, Number = organNumber };
this._organRepo.Add(organ);
}
else
{
organ.Number = organNumber;
}
this._organRepo.SaveChanges();
var user = this._userRepo.Table().FirstOrDefault(o => o.UserName == userName);
if (user == null)
{
user = new User
{
UserName = userName,
NickName = realName,
Email = $"{userName}@test.com"
};
this._userRepo.Add(user);
}
this._userRepo.SaveChanges();
var organUser = this._organUserRepo.Table().FirstOrDefault(o => o.UserId == user.Id && o.Organ.Id == organ.Id);
if (organUser == null)
{
organUser = new OrganUser { UserId = user.Id, OrganId = organ.Id };
this._organUserRepo.SaveChanges();
}
return user;
}
public IActionResult RedirectTo(string url)
{
Response.Redirect(url);
return new EmptyResult();
}
public string Test()
{
var connStr = this._cfg.GetConnectionString("mariyadb");
try
{
var personId = 15785;
using var db = new BaseDbContext(connStr);
var user = db.Set<Person>().FirstOrDefault(o => o.Id == personId);
var organ = db.Set<Organization>().FirstOrDefault(o => o.OrganId == user.BureauId);
var roles = (from perssonRole in db.Set<PersonRole>().Where(o => o.PersonId == user.Id)
join role in db.Set<SystemRole>() on perssonRole.RoleId equals role.Id
select role.RoleName).Distinct().ToList();
return connStr + user.RealName + organ.Name + roles.ToJson();
}
catch (Exception ex)
{
return connStr + ex.ToString();
}
}
}
}