Implement Board CRUD API: Add, Edit, Delete with authorization check

This commit is contained in:
backuppc
2025-12-02 17:33:39 +09:00
parent ee08dc2e8c
commit 1aad3ee2bf
5 changed files with 319 additions and 16 deletions

View File

@@ -154,5 +154,150 @@ namespace Project.Web
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 게시판 추가
/// </summary>
public string Board_Add(int bidx, string header, string cate, string title, string contents)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
var cmd = new SqlCommand(@"
INSERT INTO Board (bidx, header, cate, title, contents, wuid, wdate, gcode)
VALUES (@bidx, @header, @cate, @title, @contents, @wuid, GETDATE(), @gcode);
SELECT SCOPE_IDENTITY();", conn);
cmd.Parameters.Add("@bidx", SqlDbType.Int).Value = bidx;
cmd.Parameters.Add("@header", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(header) ? (object)DBNull.Value : header;
cmd.Parameters.Add("@cate", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(cate) ? (object)DBNull.Value : cate;
cmd.Parameters.Add("@title", SqlDbType.NVarChar).Value = title;
cmd.Parameters.Add("@contents", SqlDbType.NVarChar).Value = contents;
cmd.Parameters.Add("@wuid", SqlDbType.VarChar).Value = info.Login.no;
cmd.Parameters.Add("@gcode", SqlDbType.VarChar).Value = info.Login.gcode;
var newIdx = Convert.ToInt32(cmd.ExecuteScalar());
return JsonConvert.SerializeObject(new { Success = true, Message = "등록되었습니다.", Data = new { idx = newIdx } });
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 게시판 수정
/// </summary>
public string Board_Edit(int idx, string header, string cate, string title, string contents)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
// 권한 확인: 작성자 본인이거나 레벨 9 이상만 수정 가능
var checkCmd = new SqlCommand("SELECT wuid FROM Board WHERE idx = @idx", conn);
checkCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var originalWuid = checkCmd.ExecuteScalar()?.ToString();
if (originalWuid != info.Login.no && info.Login.level < 9)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "수정 권한이 없습니다." });
}
var cmd = new SqlCommand(@"
UPDATE Board
SET header = @header, cate = @cate, title = @title, contents = @contents
WHERE idx = @idx", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
cmd.Parameters.Add("@header", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(header) ? (object)DBNull.Value : header;
cmd.Parameters.Add("@cate", SqlDbType.NVarChar).Value = string.IsNullOrEmpty(cate) ? (object)DBNull.Value : cate;
cmd.Parameters.Add("@title", SqlDbType.NVarChar).Value = title;
cmd.Parameters.Add("@contents", SqlDbType.NVarChar).Value = contents;
var affected = cmd.ExecuteNonQuery();
if (affected > 0)
{
return JsonConvert.SerializeObject(new { Success = true, Message = "수정되었습니다." });
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "수정할 데이터를 찾을 수 없습니다." });
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
/// <summary>
/// 게시판 삭제
/// </summary>
public string Board_Delete(int idx)
{
try
{
if (string.IsNullOrEmpty(info.Login.no) || string.IsNullOrEmpty(info.Login.gcode))
{
return JsonConvert.SerializeObject(new { Success = false, Message = "로그인이 필요합니다." });
}
var connStr = Project.Properties.Settings.Default.CS;
using (var conn = new SqlConnection(connStr))
{
conn.Open();
// 권한 확인: 작성자 본인이거나 레벨 9 이상만 삭제 가능
var checkCmd = new SqlCommand("SELECT wuid FROM Board WHERE idx = @idx", conn);
checkCmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var originalWuid = checkCmd.ExecuteScalar()?.ToString();
if (originalWuid != info.Login.no && info.Login.level < 9)
{
return JsonConvert.SerializeObject(new { Success = false, Message = "삭제 권한이 없습니다." });
}
var cmd = new SqlCommand("DELETE FROM Board WHERE idx = @idx", conn);
cmd.Parameters.Add("@idx", SqlDbType.Int).Value = idx;
var affected = cmd.ExecuteNonQuery();
if (affected > 0)
{
return JsonConvert.SerializeObject(new { Success = true, Message = "삭제되었습니다." });
}
else
{
return JsonConvert.SerializeObject(new { Success = false, Message = "삭제할 데이터를 찾을 수 없습니다." });
}
}
}
catch (Exception ex)
{
return JsonConvert.SerializeObject(new { Success = false, Message = ex.Message });
}
}
}
}

View File

@@ -917,6 +917,41 @@ namespace Project.Web
}
break;
case "BOARD_ADD":
{
int bidx = json.bidx ?? 5;
string header = json.header ?? "";
string cate = json.cate ?? "";
string title = json.title ?? "";
string contents = json.contents ?? "";
string result = _bridge.Board_Add(bidx, header, cate, title, contents);
var response = new { type = "BOARD_ADDED", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "BOARD_EDIT":
{
int idx = json.idx ?? 0;
string header = json.header ?? "";
string cate = json.cate ?? "";
string title = json.title ?? "";
string contents = json.contents ?? "";
string result = _bridge.Board_Edit(idx, header, cate, title, contents);
var response = new { type = "BOARD_EDITED", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
case "BOARD_DELETE":
{
int idx = json.idx ?? 0;
string result = _bridge.Board_Delete(idx);
var response = new { type = "BOARD_DELETED", data = JsonConvert.DeserializeObject(result) };
await Send(socket, JsonConvert.SerializeObject(response));
}
break;
// ===== Mail API (메일 발신 내역) =====
case "MAIL_GET_LIST":
{