d_sms_service/APT.MicroApi/APT.PF.WebApi/Controllers/Api/DataChannelController.cs
2024-10-28 13:45:58 +08:00

230 lines
11 KiB
C#

using APT.BaseData.Domain.Entities;
using APT.Infrastructure.Core;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.IServices.FM;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal;
using APT.BaseData.Domain.ApiModel;
using APT.BaseData.Domain.Enums;
using Microsoft.EntityFrameworkCore.Internal;
using System.Linq;
using IdentityModel;
using System.Data.Common;
using APT.Utility;
namespace APT.PF.WebApiControllers.Api.PF
{
/// <summary>
/// 系统日志
/// </summary>
[Route("api/PF/DataChannel")]
public partial class DataChannelController : AuthorizeApiController<T_PF_DATA_CHANNEL>
{
/// <summary>
/// 联合添加
/// </summary>
/// <param name="data">
/// 实体
/// </param>
/// <returns></returns>
[HttpPost, Route("JoinAdd")]
public JsonActionResult<bool> JoinAdd([FromBody] T_PF_DATA_CHANNEL data)
{
return base.SafeExecute(() =>
{
var extConnConfigService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IExtConnConfigService>();
var connParam = extConnConfigService.GetConfigParam(data.ORG_ID ?? Guid.Empty, "D001");
if (connParam == null)
this.ThrowError("20002");
var conn = connParam["Conn"];
if (string.IsNullOrEmpty(conn))
this.ThrowError("20002");
var dbConn = this.InitDbConnection(DataBaseType.Postgresql, conn);
var clientEnable = data.ENABLE_STATUS == (int)(FMEnableStatusEnum.) ? true : false;
var sql = $"SELECT \"Id\", \"Enabled\", \"ClientId\", \"ClientName\" FROM public.\"Clients\" where \"ClientId\"='{data.APP_ID}'";
bool isUpdate;
int clientId;
QueryClient(dbConn, sql, out isUpdate, out clientId);
var commitSql = "";
var addScop = "";
var deleteScop = "";
var commitSecret = "";
var newClient = !isUpdate;
//insert client数据
if (!isUpdate)
{
var insertSql = $"INSERT INTO \"Clients\"(\"Enabled\",\"ClientId\",\"ClientName\",\"ProtocolType\"," + //ok
$"\"RequireClientSecret\",\"AllowRememberConsent\",\"AlwaysIncludeUserClaimsInIdToken\"," +//ok
$"\"RequirePkce\",\"AllowPlainTextPkce\",\"AllowAccessTokensViaBrowser\"," +//ok
$"\"BackChannelLogoutSessionRequired\",\"AllowOfflineAccess\",\"IdentityTokenLifetime\"," +//ok
$"\"AccessTokenLifetime\",\"AuthorizationCodeLifetime\",\"ConsentLifetime\"," +//ok
$"\"AbsoluteRefreshTokenLifetime\",\"SlidingRefreshTokenLifetime\",\"RefreshTokenUsage\"," +//ok
$"\"UpdateAccessTokenClaimsOnRefresh\",\"RefreshTokenExpiration\",\"AccessTokenType\"," +//ok
$"\"EnableLocalLogin\",\"IncludeJwtId\",\"AlwaysSendClientClaims\"," +//ok
$"\"ClientClaimsPrefix\",\"PairWiseSubjectSalt\",\"DeviceCodeLifetime\"," +//ok
$"\"NonEditable\",\"RequireConsent\",\"FrontChannelLogoutSessionRequired\",\"Created\")" +//ok
$" VALUES ({clientEnable},'{data.APP_ID}','{data.NAME}','oidc'," +
$"true,true,false," +
$"false,false,false," +
$"true,true,300," +
$"{data.LIFE_TIME},300,null," +
$"2592000,1296000,1," +
$"false,1,0," +
$"true,false,false," +
$"'client_',null,300," +
$"false,true,true,'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')";
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, insertSql, null, false);
QueryClient(dbConn, sql, out isUpdate, out clientId);
}
commitSql = $"update \"Clients\" set \"Enabled\"={clientEnable},\"ClientId\"='{data.APP_ID}'," +
$"\"AccessTokenLifetime\"={data.LIFE_TIME}, \"ClientName\"='{data.NAME}' where \"Id\"='{clientId}'";
var clientScops = data.Nav_ClientScopes;
data.Nav_ClientScopes = null;
var filter = new BaseFilter();
filter.IgnoreOrgRule = true;
//查询scops
deleteScop = $"DELETE FROM \"ClientScopes\" WHERE \"ClientId\"='{clientId}'";
if (clientScops != null && clientScops.Any(i => !i.IS_DELETED))
{
var sopesIds = clientScops.Select(i => i.SCOPE_ID).ToArray();
var scopes = this.GetEntities<T_PF_SCOPES>(x => sopesIds.Contains(x.ID), filter);
addScop = "INSERT INTO \"ClientScopes\"(\"ClientId\",\"Scope\") VALUES ";
foreach (var s in clientScops.Where(i => !i.IS_DELETED))
{
s.DATA_CHANNEL_ID = data.ID;
var scop = scopes.FirstOrDefault(i => i.ID == s.SCOPE_ID);
addScop += $"( '{clientId}','{scop.NAME}'),";
}
addScop = addScop.Trim(',');
}
//
var clientGrantSql = "";
if (!newClient)
{
commitSecret = $"update \"ClientSecrets\" set \"Value\"='{data.SECURITY_KEY.ToSha256()}' where \"ClientId\"='{clientId}'";
}
else
{
commitSecret = $"INSERT INTO \"ClientSecrets\"(\"Value\",\"Type\",\"Created\",\"ClientId\") " +
$"VALUES('{data.SECURITY_KEY.ToSha256()}','SharedSecret','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}','{clientId}')";
clientGrantSql = $"INSERT INTO \"ClientGrantTypes\"(\"GrantType\",\"ClientId\") " +
$"VALUES('client_credentials','{clientId}')";
}
//数据库操作
//1.client表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, commitSql, null, false);
//2.scop表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, deleteScop, null, false);
if (!string.IsNullOrEmpty(addScop))
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, addScop, null, false);
//3.Secret表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, commitSecret, null, false);
//4.grantType表
if (newClient)
{
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, clientGrantSql, null, true);
}
//5.内部数据
this.UnifiedCommit(() =>
{
this.UpdateEntityNoCommit(data);
this.BantchSaveEntityNoCommit(clientScops);
});
return true;
});
}
/// <summary>
/// 联合添加
/// </summary>
/// <param name="data">
/// 实体
/// </param>
/// <returns></returns>
[HttpGet, Route("JobDelete")]
public JsonActionResult<bool> JobDelete(string id)
{
return base.SafeExecute(() =>
{
var data = this.GetEntity<T_PF_DATA_CHANNEL>(id);
if (data == null)
this.ThrowError("20002");
var extConnConfigService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IExtConnConfigService>();
var connParam = extConnConfigService.GetConfigParam(data.ORG_ID ?? Guid.Empty, "D001");
if (connParam == null)
this.ThrowError("20002");
var conn = connParam["Conn"];
if (string.IsNullOrEmpty(conn))
this.ThrowError("20002");
var dbConn = this.InitDbConnection(DataBaseType.Postgresql, conn);
var clientEnable = data.ENABLE_STATUS == (int)(FMEnableStatusEnum.) ? true : false;
var sql = $"SELECT \"Id\", \"Enabled\", \"ClientId\", \"ClientName\" FROM public.\"Clients\" where \"ClientId\"='{data.APP_ID}'";
bool isUpdate;
int clientId;
QueryClient(dbConn, sql, out isUpdate, out clientId);
if (isUpdate)
{
var commitSql = $"delete from \"Clients\" where \"Id\"='{clientId}'";
//查询scops
var deleteScops = $"DELETE FROM \"ClientScopes\" WHERE \"ClientId\"='{clientId}'";
var commitSecret = $"delete from \"ClientSecrets\" where \"ClientId\"='{clientId}'";
var clientGrantSql = $"delete from \"ClientGrantTypes\" where \"ClientId\"='{clientId}'";
//2.scop表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, deleteScops, null, false);
//3.Secret表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, commitSecret, null, false);
//4.grantType表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, clientGrantSql, null, false);
//1.client表
this.ExecuteNonQueryByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, commitSql, null, true);
}
//4.内部数据
this.UnifiedCommit(() =>
{
this.DeleteEntityNoCommit<T_PF_CLIENT_SCOPES>(i => i.DATA_CHANNEL_ID == data.ID);
this.DeleteEntityNoCommit<T_PF_DATA_CHANNEL>(id);
});
return true;
});
}
private void QueryClient(DbConnection dbConn, string sql, out bool isUpdate, out int clientId)
{
var update = false;
var id = 0;
this.ExecuteReaderPageByConn(DataBaseType.Postgresql, dbConn, System.Data.CommandType.Text, sql,
null, 0, 1, (reader) =>
{
while (reader.Read())
{
update = true;
id = Convert.ToInt32(reader.GetValue(0));
}
}, false);
isUpdate = update;
clientId = id;
}
}
}