230 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			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;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |