서버 기본시스템 커밋
This commit is contained in:
parent
3ec8800dc5
commit
b78da63856
|
|
@ -0,0 +1,66 @@
|
|||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/unity
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=unity
|
||||
|
||||
### Unity ###
|
||||
# This .gitignore file should be placed at the root of your Unity project directory
|
||||
#
|
||||
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
||||
/Client/[Ll]ibrary/
|
||||
/Client/[Tt]emp/
|
||||
/Client/[Oo]bj/
|
||||
/Client/[Bb]uild/
|
||||
/Client/[Ll]ogs/
|
||||
/Client/[Uu]ser[Ss]ettings/
|
||||
|
||||
# MemoryCaptures can get excessive in size.
|
||||
# They also could contain extremely sensitive data
|
||||
/Client/[Mm]emoryCaptures/
|
||||
|
||||
# Recordings can get excessive in size
|
||||
/Client/[Rr]ecordings/
|
||||
|
||||
# Autogenerated Jetbrains Rider plugin
|
||||
/Client/[Aa]ssets/Plugins/Editor/JetBrains*
|
||||
|
||||
# Visual Studio cache directory
|
||||
.vs/
|
||||
.obj/
|
||||
|
||||
# Visual Code directory
|
||||
.vscode/
|
||||
|
||||
# Gradle cache directory
|
||||
.gradle/
|
||||
|
||||
# Autogenerated VS/MD/Consulo solution and project files
|
||||
ExportedObj/
|
||||
.consulo/
|
||||
*.csproj
|
||||
*.unityproj
|
||||
*.sln
|
||||
*.suo
|
||||
*.tmp
|
||||
*.user
|
||||
*.userprefs
|
||||
*.pidb
|
||||
*.booproj
|
||||
*.svd
|
||||
*.pdb
|
||||
*.mdb
|
||||
*.opendb
|
||||
*.VC.db
|
||||
|
||||
# Unity3D generated meta files
|
||||
*.pidb.meta
|
||||
*.pdb.meta
|
||||
*.mdb.meta
|
||||
|
||||
# Unity3D generated file on crash reports
|
||||
sysinfo.txt
|
||||
|
||||
# Builds
|
||||
*.apk
|
||||
*.aab
|
||||
*.unitypackage
|
||||
*.app
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/unity
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=unity
|
||||
|
||||
### Unity ###
|
||||
# This .gitignore file should be placed at the root of your Unity project directory
|
||||
#
|
||||
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
||||
/Server/[Ll]ibrary/
|
||||
/Server/[Tt]emp/
|
||||
/Server/[Oo]bj/
|
||||
/Server/[Bb]uild/
|
||||
/Server/[Ll]ogs/
|
||||
/Server/[Uu]ser[Ss]ettings/
|
||||
|
||||
# MemoryCaptures can get excessive in size.
|
||||
# They also could contain extremely sensitive data
|
||||
/Server/[Mm]emoryCaptures/
|
||||
|
||||
# Recordings can get excessive in size
|
||||
/Server/[Rr]ecordings/
|
||||
|
||||
# Autogenerated Jetbrains Rider plugin
|
||||
/Server/[Aa]ssets/Plugins/Editor/JetBrains*
|
||||
|
||||
# Visual Studio cache directory
|
||||
.vs/
|
||||
.obj/
|
||||
|
||||
# Visual Code directory
|
||||
.vscode/
|
||||
|
||||
# Gradle cache directory
|
||||
.gradle/
|
||||
|
||||
# Autogenerated VS/MD/Consulo solution and project files
|
||||
ExportedObj/
|
||||
.consulo/
|
||||
*.csproj
|
||||
*.unityproj
|
||||
*.sln
|
||||
*.suo
|
||||
*.tmp
|
||||
*.user
|
||||
*.userprefs
|
||||
*.pidb
|
||||
*.booproj
|
||||
*.svd
|
||||
*.pdb
|
||||
*.mdb
|
||||
*.opendb
|
||||
*.VC.db
|
||||
|
||||
# Unity3D generated meta files
|
||||
*.pidb.meta
|
||||
*.pdb.meta
|
||||
*.mdb.meta
|
||||
|
||||
# Unity3D generated file on crash reports
|
||||
sysinfo.txt
|
||||
|
||||
# Builds
|
||||
*.apk
|
||||
*.aab
|
||||
*.unitypackage
|
||||
*.app
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
using LibGit2Sharp;
|
||||
using NLog;
|
||||
using Server.System;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace Server.Git
|
||||
{
|
||||
public abstract class AbstractGit
|
||||
{
|
||||
private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger();
|
||||
public bool isRestart;
|
||||
string _repositoryPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "excel");
|
||||
|
||||
public string excel = "";
|
||||
|
||||
public string repositoryPath { get { return _repositoryPath; } }
|
||||
|
||||
/// <summary>
|
||||
/// 가장먼저 시작해야 하는 스크립트
|
||||
/// </summary>
|
||||
public void Init()
|
||||
{
|
||||
restart:
|
||||
isRestart = false;
|
||||
Pull();
|
||||
if (isRestart)
|
||||
goto restart;
|
||||
ChangeScript();
|
||||
if (isRestart)
|
||||
goto restart;
|
||||
Push();
|
||||
if (isRestart)
|
||||
goto restart;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 엑셀 불러오기, 저장, 혹은 배포 까지 작업해야하는 함수
|
||||
/// </summary>
|
||||
public abstract void ChangeScript();
|
||||
|
||||
private void Pull()
|
||||
{
|
||||
if (!Directory.Exists(_repositoryPath))
|
||||
{
|
||||
Directory.CreateDirectory(_repositoryPath);
|
||||
RepositorySet($"clone {STATICS.remoteUrl} {_repositoryPath}", null);
|
||||
|
||||
//main브렌치로 세팅
|
||||
RepositorySet("branch -m main", _repositoryPath);
|
||||
RepositorySet("branch --set-upstream-to=origin/main main", _repositoryPath);
|
||||
}
|
||||
|
||||
// pull 명령어 실행
|
||||
RepositorySet("pull", _repositoryPath);
|
||||
}
|
||||
|
||||
private static void RepositorySet(string command, string workingDirectory)
|
||||
{
|
||||
ProcessStartInfo psi = new ProcessStartInfo
|
||||
{
|
||||
FileName = "git",
|
||||
Arguments = command,
|
||||
WorkingDirectory = workingDirectory,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true
|
||||
};
|
||||
|
||||
using (Process process = new Process { StartInfo = psi })
|
||||
{
|
||||
process.Start();
|
||||
process.WaitForExit();
|
||||
|
||||
// Git 명령 실행 결과 출력
|
||||
Console.WriteLine(process.StandardOutput.ReadToEnd());
|
||||
|
||||
// 오류 메시지 출력
|
||||
Console.WriteLine(process.StandardError.ReadToEnd());
|
||||
}
|
||||
}
|
||||
|
||||
private void Push()
|
||||
{
|
||||
if(excel == "")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//json 저장
|
||||
using (StreamWriter writer = new StreamWriter(repositoryPath + "\\excel.json"))
|
||||
{
|
||||
writer.Write(excel);
|
||||
Console.WriteLine($"파일이 저장되었습니다 : {repositoryPath + "\\excel.json"}");
|
||||
}
|
||||
|
||||
|
||||
// 스테이징
|
||||
RepositorySet("add .", repositoryPath);
|
||||
|
||||
// 커밋
|
||||
RepositorySet($"commit -m \"update excel data\"", repositoryPath);
|
||||
|
||||
// 푸시
|
||||
RepositorySet("push origin main", repositoryPath);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 모든 파일리스트 반환
|
||||
/// </summary>
|
||||
/// <param name="directoryPath">검색할 폴더 경로</param>
|
||||
/// <param name="extension">확장자</param>
|
||||
/// <returns></returns>
|
||||
public List<string> GetFiles(string directoryPath, string extension)
|
||||
{
|
||||
List<string> xlsxFileList = new List<string>();
|
||||
|
||||
try
|
||||
{
|
||||
string[] files = Directory.GetFiles(directoryPath);
|
||||
|
||||
foreach (string file in files)
|
||||
{
|
||||
if (Path.GetExtension(file).Equals(".xlsx", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
xlsxFileList.Add(file);
|
||||
}
|
||||
}
|
||||
|
||||
string[] subdirectories = Directory.GetDirectories(directoryPath);
|
||||
foreach (string subdirectory in subdirectories)
|
||||
{
|
||||
//git시스템 파일은 뛰어넘기
|
||||
if (subdirectory == directoryPath + "\\.git")
|
||||
continue;
|
||||
|
||||
//제귀
|
||||
xlsxFileList.AddRange(GetFiles(subdirectory, extension));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error(ex);
|
||||
}
|
||||
|
||||
return xlsxFileList;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
using Aspose.Cells;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using NLog;
|
||||
|
||||
namespace Server.Git
|
||||
{
|
||||
public class sheet
|
||||
{
|
||||
string _name;
|
||||
public string name { get { return _name; } }
|
||||
List<string> _variable;
|
||||
public List<string> variable { get { return _variable; } }
|
||||
List<string> _type;
|
||||
public List<string> type { get { return _type; } }
|
||||
Dictionary<long, Dictionary<string, object>> _dicViewer;
|
||||
public Dictionary<long, Dictionary<string, object>> dicViewer { get { return _dicViewer; } }
|
||||
|
||||
public sheet(string name, List<string> variable, List<string> type, Dictionary<long, Dictionary<string, object>> dicViewer)
|
||||
{
|
||||
this._name = name;
|
||||
this._variable = variable;
|
||||
this._type = type;
|
||||
this._dicViewer = dicViewer;
|
||||
}
|
||||
}
|
||||
class ExcelManager
|
||||
{
|
||||
private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
List<sheet> _sheets;
|
||||
|
||||
public List<sheet> sheets { get { return _sheets; } }
|
||||
|
||||
string _pathFile;
|
||||
public ExcelManager(string path, string file = "")
|
||||
{
|
||||
if (file == "")
|
||||
_pathFile = path;
|
||||
else
|
||||
_pathFile = path + "\\" + file;
|
||||
}
|
||||
|
||||
public bool Play()
|
||||
{
|
||||
return ExcelLoad(_pathFile);
|
||||
}
|
||||
public bool ExcelLoad(string path)//엑셀 로드
|
||||
{
|
||||
// 엑셀 파일 불러오기
|
||||
Workbook wb = new Workbook(_pathFile);
|
||||
|
||||
// 모든 워크시트 가져오기
|
||||
WorksheetCollection collection = wb.Worksheets;
|
||||
|
||||
_sheets = new List<sheet>();
|
||||
|
||||
// 모든 워크시트 반복
|
||||
try
|
||||
{
|
||||
for (int worksheetIndex = 0; worksheetIndex < collection.Count; worksheetIndex++)
|
||||
{
|
||||
//변수이름
|
||||
List<string> variable = new List<string>();
|
||||
//변수 타입
|
||||
List<string> type = new List<string>();
|
||||
Dictionary<long, Dictionary<string, object>> dicViewer = new Dictionary<long, Dictionary<string, object>>();
|
||||
|
||||
// 인덱스를 사용하여 워크시트 가져오기
|
||||
Worksheet worksheet = collection[worksheetIndex];
|
||||
|
||||
// 행과 열의 수 얻기
|
||||
int vertical = worksheet.Cells.MaxDataRow;
|
||||
int horizontal = worksheet.Cells.MaxDataColumn;
|
||||
|
||||
//변수 이름과 타입 삽입
|
||||
for (int n = 0; n <= horizontal; n++)
|
||||
{
|
||||
variable.Add((string)worksheet.Cells[0, n].Value);
|
||||
type.Add(((string)worksheet.Cells[2, n].Value).ToLower());
|
||||
}
|
||||
|
||||
bool isIndex = variable[0] == "index";
|
||||
|
||||
for (int n = 3; n <= vertical; n++)
|
||||
{
|
||||
Dictionary<string, object> dataList = new Dictionary<string, object>();
|
||||
for (int m = 0; m <= horizontal; m++)
|
||||
{
|
||||
dataList.Add(variable[m], worksheet.Cells[n, m].Value);
|
||||
}
|
||||
dicViewer.Add((int)(isIndex ? worksheet.Cells[n, 0].Value : n - 3), dataList);
|
||||
}
|
||||
sheet sheet = new sheet(worksheet.Name, variable, type, dicViewer);
|
||||
_sheets.Add(sheet);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.Error(ex);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
using Microsoft.AspNetCore.Http;
|
||||
using Npgsql;
|
||||
using Server.SQL;
|
||||
using Server.System;
|
||||
using System.Globalization;
|
||||
|
||||
namespace Server.Git
|
||||
{
|
||||
public class ExcelSQL
|
||||
{
|
||||
List<sheet> sheets;
|
||||
|
||||
public ExcelSQL(List<sheet> sheets)
|
||||
{
|
||||
this.sheets = sheets;
|
||||
}
|
||||
|
||||
public void DataUpdate()
|
||||
{
|
||||
using (NpgsqlConnection connection = new NpgsqlConnection(STATICS.EXCEL_SQL_URL))
|
||||
{
|
||||
try
|
||||
{
|
||||
// 데이터베이스 연결 열기
|
||||
connection.Open();
|
||||
|
||||
// 쿼리 작성 및 실행
|
||||
//모든 쿼리 삭제
|
||||
string query;
|
||||
string header1 = "CREATE TABLE IF NOT EXISTS excel.";
|
||||
string header2 = "INSERT INTO excel.";
|
||||
string newTableQuery;
|
||||
string tableDatas;
|
||||
#region 모든 테이블 삭제
|
||||
query = "DROP SCHEMA excel CASCADE;" +
|
||||
"CREATE SCHEMA excel AUTHORIZATION manager;";
|
||||
ExecuteNonQuery(connection, query);
|
||||
#endregion
|
||||
#region 테이블 세팅
|
||||
query = "";
|
||||
for (int n = 0; n < sheets.Count; n++)
|
||||
{
|
||||
//초기화
|
||||
newTableQuery = "";
|
||||
tableDatas = "(";
|
||||
|
||||
#region 신규 테이블 생성
|
||||
newTableQuery += header1;
|
||||
newTableQuery += sheets[n].name + "(";
|
||||
for (int m = 0; m < sheets[n].variable.Count; m++)
|
||||
{
|
||||
if (sheets[n].type[m] == "long" && sheets[n].variable[m] == "index")
|
||||
{
|
||||
newTableQuery += "index SERIAL PRIMARY KEY";
|
||||
tableDatas += "index";
|
||||
continue;
|
||||
}
|
||||
if (m != 0)
|
||||
{
|
||||
newTableQuery += ",\n";
|
||||
tableDatas += ", ";
|
||||
}
|
||||
|
||||
switch (sheets[n].type[m])
|
||||
{
|
||||
case "int":
|
||||
newTableQuery += $"{sheets[n].variable[m]} INT ";
|
||||
break;
|
||||
case "string":
|
||||
newTableQuery += $"{sheets[n].variable[m]} VARCHAR(255) ";
|
||||
break;
|
||||
case "enum":
|
||||
newTableQuery += $"{sheets[n].variable[m]} INT2 ";
|
||||
break;
|
||||
case "text":
|
||||
newTableQuery += $"{sheets[n].variable[m]} TEXT ";
|
||||
break;
|
||||
case "time":
|
||||
newTableQuery += $"{sheets[n].variable[m]} timestamp ";
|
||||
break;
|
||||
}
|
||||
tableDatas += sheets[n].variable[m];
|
||||
}
|
||||
newTableQuery += ");\n";
|
||||
tableDatas += ") VALUES ";
|
||||
bool isStart = true;
|
||||
query += newTableQuery;
|
||||
|
||||
#endregion
|
||||
#region 신규 테이블 데이터 올리기
|
||||
|
||||
query += header2;
|
||||
query += sheets[n].name;
|
||||
query += tableDatas;
|
||||
foreach(KeyValuePair<long, Dictionary<string, object>> pair in sheets[n].dicViewer)
|
||||
{
|
||||
if (isStart)
|
||||
{
|
||||
isStart = !isStart;
|
||||
}
|
||||
else
|
||||
{
|
||||
query += ", ";
|
||||
}
|
||||
query += "(";
|
||||
for (int m = 0; m < sheets[n].variable.Count; m++)
|
||||
{
|
||||
switch (sheets[n].type[m])
|
||||
{
|
||||
case "int":
|
||||
case "enum":
|
||||
query += $"{pair.Value[sheets[n].variable[m]]}";
|
||||
break;
|
||||
case "string":
|
||||
case "text":
|
||||
query += $"'{pair.Value[sheets[n].variable[m]]}'";
|
||||
break;
|
||||
case "time":
|
||||
query += $"'{((DateTime)pair.Value[sheets[n].variable[m]]).ToString("yyyy-MM-dd HH:mm:ss")}'";
|
||||
break;
|
||||
}
|
||||
if(m != sheets[n].variable.Count -1)
|
||||
{
|
||||
query += ", ";
|
||||
}
|
||||
}
|
||||
query += ")";
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
ExecuteNonQuery(connection, query);
|
||||
|
||||
#endregion
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
private void ExecuteNonQuery(NpgsqlConnection connection, string query)
|
||||
{
|
||||
using (NpgsqlCommand command = new NpgsqlCommand(query, connection))
|
||||
{
|
||||
Console.WriteLine(query);
|
||||
command.ExecuteNonQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
using Newtonsoft.Json;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace Server.Git
|
||||
{
|
||||
public class XlsxToJson : AbstractGit
|
||||
{
|
||||
public override void ChangeScript()
|
||||
{
|
||||
//저장경로 : repositoryPath
|
||||
//작업할것
|
||||
//데이터 db에 업로드
|
||||
|
||||
List<string> fileList = GetFiles(repositoryPath, ".xlsx");
|
||||
|
||||
Dictionary<string, Dictionary<long, Dictionary<string, object>>> sheetList = new Dictionary<string, Dictionary<long, Dictionary<string, object>>>();
|
||||
List<sheet> sheets = null;
|
||||
for (int n = 0; n < fileList.Count; n++)
|
||||
{
|
||||
ExcelManager em = new ExcelManager(fileList[n]);
|
||||
if (em.Play())
|
||||
{
|
||||
sheets = em.sheets;
|
||||
for (int m = 0; m < sheets.Count; m++)
|
||||
{
|
||||
sheetList.Add(sheets[m].name, sheets[m].dicViewer);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("-1 : NotUpdate");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
excel = JsonConvert.SerializeObject(sheetList);
|
||||
//현재 서버는 PostgreSQL기준으로 쿼리를 생성하는 코드와 패키지가 세팅되어 있습니다 이점 참고바랍니다
|
||||
//추가로 해당 기능을 사용하려면 서버에 excel이라는 스키마가 존재하여야 합니다.
|
||||
if (sheets != null)
|
||||
{
|
||||
ExcelSQL sql = new ExcelSQL(sheets);
|
||||
sql.DataUpdate();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
|
||||
<targets>
|
||||
<target
|
||||
name="logfile"
|
||||
xsi:type="File"
|
||||
fileName="Log/${date:format=yyyy-MM-dd}.txt"
|
||||
archiveAboveSize="10485760"
|
||||
archiveNumbering="Sequence"
|
||||
archiveEvery="Day"
|
||||
maxArchiveFiles="1000"
|
||||
/>
|
||||
</targets>
|
||||
|
||||
<rules>
|
||||
<logger name="*" minlevel="Info" writeTo="logfile" />
|
||||
</rules>
|
||||
</nlog>
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
using Server.System;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
var app = builder.Build();
|
||||
|
||||
//웹서버 초기화
|
||||
ProtocolProcessor.Init();
|
||||
//깃 웹훅 초기화
|
||||
GItWebhook.Init();
|
||||
|
||||
//http용 데이터
|
||||
app.MapPost("/", ProtocolProcessor.Process);
|
||||
|
||||
//git 접근용 웹훅
|
||||
app.MapPost("/git", GItWebhook.Process);
|
||||
|
||||
//app.MapPost("/update", GItWebhook.Process);
|
||||
|
||||
app.Run();
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "https://0.0.0.0:4861",
|
||||
"sslPort": 4862
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"Server": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "https://0.0.0.0:4860",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"dotnetRunMessages": true
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using Server.System;
|
||||
|
||||
namespace Server.SQL
|
||||
{
|
||||
public class SQL<T>
|
||||
{
|
||||
string className;
|
||||
Regex regex = new Regex(STATICS.PATTERN);
|
||||
|
||||
public SQL()
|
||||
{
|
||||
className = typeof(T).Name;
|
||||
}
|
||||
|
||||
public string sqlInsert(T instance)
|
||||
{
|
||||
List<string> names = new List<string>();
|
||||
List<string> values = new List<string>();
|
||||
foreach (FieldInfo field in typeof(T).GetFields())
|
||||
{
|
||||
object value = field.GetValue(instance);
|
||||
if (value == null)
|
||||
continue;
|
||||
names.Add(field.Name);
|
||||
values.Add(value.ToString());
|
||||
}
|
||||
|
||||
StringBuilder qurry = new StringBuilder();
|
||||
|
||||
qurry.Append($"INSERT INTO {className} (");
|
||||
|
||||
int n = 0;
|
||||
int count = names.Count;
|
||||
|
||||
for(; n < count; n++)
|
||||
{
|
||||
qurry.Append(names[n]);
|
||||
if(n != count - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
|
||||
qurry.Append(") VALUES (");
|
||||
n = 0;
|
||||
for (; n < count; n++)
|
||||
{
|
||||
qurry.Append(values[n]);
|
||||
if (n != count - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
qurry.Append(");");
|
||||
|
||||
return qurry.ToString();
|
||||
}
|
||||
|
||||
public string sqlUpdate(string[] names, object[] values, string[] wnames, object[] wvalues)
|
||||
{
|
||||
StringBuilder qurry = new StringBuilder();
|
||||
qurry.Append($"UPDATE {className} SET ");
|
||||
for(int n = 0; n < names.Length; n++)
|
||||
{
|
||||
qurry.Append($"{names[n]} = {values[n]}");
|
||||
if(n < names.Length - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
qurry.Append(" WHERE ");
|
||||
for (int n = 0; n < wnames.Length; n++)
|
||||
{
|
||||
qurry.Append($"{wnames[n]} = {wvalues[n]}");
|
||||
if (n < wnames.Length - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
return qurry.ToString();
|
||||
}
|
||||
|
||||
public string sqlSelect(string[] names, string[] wnames, object[] wvalues)
|
||||
{
|
||||
StringBuilder qurry = new StringBuilder();
|
||||
|
||||
if(names == null)
|
||||
{
|
||||
qurry.Append($"SELECT * FROM {className} ");
|
||||
}
|
||||
else
|
||||
{
|
||||
qurry.Append("SELECT ");
|
||||
for(int n = 0; n < names.Length; n++)
|
||||
{
|
||||
qurry.Append(names[n]);
|
||||
if (n < names.Length - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
qurry.Append($" FROM {className} ");
|
||||
}
|
||||
|
||||
qurry.Append(" WHERE ");
|
||||
for (int n = 0; n < wnames.Length; n++)
|
||||
{
|
||||
qurry.Append($"{wnames[n]} = {wvalues[n]}");
|
||||
if (n < wnames.Length - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
return qurry.ToString();
|
||||
}
|
||||
|
||||
public string sqlDelete(string[] wnames, object[] wvalues)
|
||||
{
|
||||
StringBuilder qurry = new StringBuilder();
|
||||
qurry.Append($"DELETE FROM {className}");
|
||||
|
||||
qurry.Append(" WHERE ");
|
||||
for (int n = 0; n < wnames.Length; n++)
|
||||
{
|
||||
qurry.Append($"{wnames[n]} = {wvalues[n]}");
|
||||
if (n < wnames.Length - 1)
|
||||
{
|
||||
qurry.Append(", ");
|
||||
}
|
||||
}
|
||||
return qurry.ToString();
|
||||
}
|
||||
public string Injection(string data)
|
||||
{
|
||||
return regex.Replace(data, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
namespace Server.SQL
|
||||
{
|
||||
public class User
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public string NickName { get; set; }
|
||||
public string count { get; set; }
|
||||
}
|
||||
|
||||
public class UserSQL : SQL<User>
|
||||
{
|
||||
public void userInsert(User user)
|
||||
{
|
||||
string qurry = sqlInsert(user);
|
||||
}
|
||||
}
|
||||
}
|
||||
//쿼리 전송
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
using Server.System;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Server.Service
|
||||
{
|
||||
public class AddUser : AbstractService
|
||||
{
|
||||
private AddUserReq req;
|
||||
public override string Process()
|
||||
{
|
||||
return makeResp();
|
||||
}
|
||||
|
||||
public override Protocol ProtocolValue() => Protocol.AddUser;
|
||||
|
||||
public override Req Requst(string json)
|
||||
{
|
||||
req = JsonConvert.DeserializeObject<AddUserReq>(json);
|
||||
return req;
|
||||
}
|
||||
|
||||
private string makeResp()
|
||||
{
|
||||
AddUserResp resp = new AddUserResp();
|
||||
resp.status = 200;
|
||||
return resp.ToJson();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class AddUserReq : Req
|
||||
{
|
||||
public override bool IsReceivedAllField()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class AddUserResp : Resp
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
using Server.System;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Server.Service
|
||||
{
|
||||
public class awaketest : AbstractService
|
||||
{
|
||||
private awaketestReq req;
|
||||
public override string Process()
|
||||
{
|
||||
return makeResp();
|
||||
}
|
||||
|
||||
public override Protocol ProtocolValue() => Protocol.Test;
|
||||
|
||||
public override Req Requst(string json)
|
||||
{
|
||||
req = JsonConvert.DeserializeObject<awaketestReq>(json);
|
||||
return req;
|
||||
}
|
||||
|
||||
private string makeResp()
|
||||
{
|
||||
awaketestResp resp = new awaketestResp();
|
||||
resp.status = 200;
|
||||
return resp.ToJson();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class awaketestReq : Req
|
||||
{
|
||||
public override bool IsReceivedAllField()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public class awaketestResp : Resp
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
using Newtonsoft.Json;
|
||||
|
||||
namespace Server.System
|
||||
{
|
||||
public abstract class AbstractService
|
||||
{
|
||||
public abstract Protocol ProtocolValue();
|
||||
|
||||
public abstract string Process();
|
||||
|
||||
public abstract Req Requst(string json);
|
||||
}
|
||||
|
||||
public abstract class Req
|
||||
{
|
||||
public Protocol cmd;
|
||||
|
||||
public virtual bool IsReceivedAllField()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class Resp
|
||||
{
|
||||
public int status;
|
||||
public virtual string ToJson()
|
||||
{
|
||||
return JsonConvert.SerializeObject(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
public enum Protocol
|
||||
{
|
||||
Test = 0,
|
||||
AddUser = 1,
|
||||
}
|
||||
|
||||
public enum Error
|
||||
{
|
||||
RuntimeException = -1,//서버 오류
|
||||
None = 0,//사용안함
|
||||
success = 200,//성공
|
||||
notFound = 404,//프로토콜 없음
|
||||
unknown = 500,//파라미터 오류
|
||||
crypto = 800,//암복호화 에러
|
||||
nodata = 900,//데이터가 없음
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
namespace Server.System
|
||||
{
|
||||
public class ErrorResp : Resp
|
||||
{
|
||||
public string message;
|
||||
public ErrorResp(RuntimeException ex)
|
||||
{
|
||||
this.status = (int)ex.status;
|
||||
this.message = ex.Message;
|
||||
}
|
||||
public ErrorResp()
|
||||
{
|
||||
this.status = -1;
|
||||
this.message = "Unknown Error";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class RuntimeException : Exception
|
||||
{
|
||||
public Error status;
|
||||
|
||||
public RuntimeException(string message = "", Error status = Error.RuntimeException) : base(message)
|
||||
{
|
||||
this.status = status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
using NLog;
|
||||
using Server.Git;
|
||||
|
||||
namespace Server.System
|
||||
{
|
||||
public class GItWebhook
|
||||
{
|
||||
private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
public static Thread thread;
|
||||
|
||||
private static AbstractGit git;
|
||||
|
||||
public static string Process(HttpContext context)
|
||||
{
|
||||
//TODO 아무때나 호출되지 않게 만들기
|
||||
string Response;
|
||||
try
|
||||
{
|
||||
string eaDelivery = context.Request.Headers["X-Gitea-Delivery"];
|
||||
string eaEvent = context.Request.Headers["X-Gitea-Event"];
|
||||
string eaEventType = context.Request.Headers["X-Gitea-Event-Type"];
|
||||
string eaSignature = context.Request.Headers["X-Gitea-Signature"];
|
||||
|
||||
Console.WriteLine($"X-Gitea-Delivery : {eaDelivery}");
|
||||
Console.WriteLine($"X-Gitea-Event : {eaEvent}");
|
||||
Console.WriteLine($"X-Gitea-Event-Type : {eaEventType}");
|
||||
Console.WriteLine($"X-Gitea-Signature : {eaSignature}");
|
||||
|
||||
//task를 쓰면 멈출수가 없기에 thread를 사용
|
||||
if (thread.ThreadState == ThreadState.Unstarted)
|
||||
{
|
||||
thread.Start();
|
||||
}
|
||||
else if (thread.ThreadState == ThreadState.Stopped)
|
||||
{
|
||||
thread = new Thread(git.Init);
|
||||
thread.Start();
|
||||
}
|
||||
else if (thread.ThreadState == ThreadState.WaitSleepJoin || thread.ThreadState == ThreadState.Running)
|
||||
{
|
||||
git.isRestart = true;
|
||||
}
|
||||
|
||||
|
||||
ErrorResp error = new ErrorResp();
|
||||
error.status = 200;
|
||||
error.message = "Success";
|
||||
Response = error.ToJson();
|
||||
}
|
||||
catch (RuntimeException ex)
|
||||
{
|
||||
ErrorResp error = new ErrorResp(ex);
|
||||
Response = error.ToJson();
|
||||
logger.Error("GetErrorResponse : " + Response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ErrorResp error = new ErrorResp();
|
||||
Response = error.ToJson();
|
||||
logger.Error("GetErrorResponse : " + ex.ToString());
|
||||
}
|
||||
return Response;
|
||||
|
||||
}
|
||||
|
||||
public static void Init()
|
||||
{
|
||||
git = new XlsxToJson();
|
||||
thread = new Thread(git.Init);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
namespace Server.System
|
||||
{
|
||||
public static class STATICS
|
||||
{
|
||||
#region Dev
|
||||
#if DEBUG
|
||||
public static readonly string SQL_URL = "Host=myHost;Port=myPort;Username=myUsername;Password=myPassword;Database=myDatabase;";
|
||||
public static readonly string EXCEL_SQL_URL = "Host=myHost;Port=myPort;Username=myUsername;Password=myPassword;Database=myDatabase;";
|
||||
#endif
|
||||
#endregion
|
||||
|
||||
//비공계 프로젝트의 경우 아래와같이 작성해주세요
|
||||
//"https://username:password@www.example.com/";
|
||||
public static readonly string remoteUrl = "https://username:password@www.example.com/";
|
||||
|
||||
|
||||
public static readonly string PATTERN = "[^a-zA-Z0-9가-힣 ]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
using System.Reflection;
|
||||
using NLog;
|
||||
|
||||
namespace Server.System {
|
||||
public class ProtocolProcessor {
|
||||
private static Dictionary<Protocol, AbstractService> SERVICE_DIC = new Dictionary<Protocol, AbstractService>();
|
||||
|
||||
private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger();
|
||||
|
||||
|
||||
public static void addProtocol(AbstractService abstractService) {
|
||||
if (SERVICE_DIC.ContainsKey(abstractService.ProtocolValue())) {
|
||||
logger.Error("중복된 프로토콜 : " + abstractService.ProtocolValue());
|
||||
throw new Exception("중복된 프로토콜 : " + abstractService.ProtocolValue());
|
||||
}
|
||||
|
||||
SERVICE_DIC.Add(abstractService.ProtocolValue(), abstractService);
|
||||
}
|
||||
|
||||
public static void Init() {
|
||||
// 현재 실행 중인 어셈블리를 가져옴
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
|
||||
// 'AbstractService'의 하위 클래스를 모두 찾음
|
||||
var serviceTypes = assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(AbstractService)) && !t.IsAbstract);
|
||||
|
||||
// 각 클래스의 인스턴스를 생성합니다. 생성자에서 자동으로 등록됩니다.
|
||||
foreach (var type in serviceTypes)
|
||||
addProtocol((AbstractService)Activator.CreateInstance(type));
|
||||
|
||||
logger.Info("Server Start");
|
||||
}
|
||||
|
||||
public static string Process(HttpContext context) {
|
||||
AbstractService abstractService;
|
||||
|
||||
string Response = "";
|
||||
try {
|
||||
Protocol cmd = (Protocol)int.Parse(context.Request.Headers["cmd"]);
|
||||
SERVICE_DIC.TryGetValue(cmd, out abstractService);
|
||||
if (abstractService == null)
|
||||
throw new RuntimeException("Not Found", Error.notFound);
|
||||
|
||||
string body = Request(context.Request).GetAwaiter().GetResult();
|
||||
|
||||
logger.Info("GetRequst : " + body);
|
||||
|
||||
Req req = abstractService.Requst(body);
|
||||
|
||||
if (req == null)
|
||||
throw new RuntimeException("", Error.nodata);
|
||||
else if (!req.IsReceivedAllField())
|
||||
throw new RuntimeException("Internal Server Error", Error.unknown);
|
||||
|
||||
Response = abstractService.Process();
|
||||
|
||||
logger.Info("GetResponse : " + Response);
|
||||
}
|
||||
catch (RuntimeException ex) {
|
||||
ErrorResp error = new ErrorResp(ex);
|
||||
Response = error.ToJson();
|
||||
logger.Error("GetErrorResponse : " + Response);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
ErrorResp error = new ErrorResp();
|
||||
Response = error.ToJson();
|
||||
logger.Error("GetErrorResponse : " + ex.ToString());
|
||||
}
|
||||
return Response;
|
||||
|
||||
}
|
||||
|
||||
private static async Task<string> Request(HttpRequest request) {
|
||||
using var reader = new StreamReader(request.Body);
|
||||
return await reader.ReadToEndAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Trace",
|
||||
"Microsoft.AspNetCore": "Trace"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "0.0.0.0;localhost"
|
||||
}
|
||||
Loading…
Reference in New Issue