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

133 lines
5.2 KiB

using Application.Domain.Entities;
using Infrastructure.Data;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
namespace IoTCenter.Api.Controllers
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
[ApiController]
public class ProjectController : ControllerBase
{
private readonly ILogger<ProjectController> logger;
private readonly IConfiguration _cfg;
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(
ILogger<ProjectController> logger,
IConfiguration cfg,
IRepository<Organ> organRepo,
IRepository<User> userRepo,
IRepository<OrganUser> organUserRepo,
IRepository<Role> roleRepo,
IRepository<UserRole> userRoleRepo)
{
this.logger = logger;
this._cfg = cfg;
this._organRepo = organRepo;
this._userRepo = userRepo;
this._organUserRepo = organUserRepo;
this._roleRepo = roleRepo;
this._userRoleRepo = userRoleRepo;
}
[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);
}
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,
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();
}
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)),
});
}
}
}