Initial commit: 교육 프로젝트 배포
This commit is contained in:
@@ -0,0 +1,239 @@
|
||||
<?php
|
||||
//=========================
|
||||
// [마이페이지][북마크 토글]
|
||||
// - 저장한 콘텐츠 체크 / 체크해제 처리
|
||||
// - 체크해제 시 실제 delete 하지 않고 is_active 값을 0으로 update
|
||||
// - 체크 시 is_active 값을 1로 update 또는 신규 insert
|
||||
//=========================
|
||||
|
||||
require_once __DIR__ . '/../bbs/db_conn.php';
|
||||
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 세션 시작
|
||||
// TODO: 실제 로그인 세션 연동 후 교체
|
||||
// ---------------------------------------------------------
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
$memberId = $_SESSION['member_id'] ?? '';
|
||||
$sysCompCode = $_SESSION['sys_comp_code'] ?? '';
|
||||
|
||||
// 테스트용 임시값
|
||||
// $memberId = 'U001';
|
||||
// $sysCompCode = 'COMP01';
|
||||
|
||||
/**
|
||||
* JSON 응답 출력 후 종료
|
||||
*/
|
||||
function response_json(array $data): void
|
||||
{
|
||||
echo json_encode($data, JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
|
||||
try {
|
||||
$pdo = db_conn();
|
||||
$pdo->exec("SET NAMES 'utf8mb4'");
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 1. 요청 JSON 읽기
|
||||
// - 프런트에서 fetch + JSON body로 전달
|
||||
// ---------------------------------------------------------
|
||||
$raw = file_get_contents('php://input');
|
||||
$req = json_decode($raw, true);
|
||||
|
||||
$contentId = trim((string)($req['content_id'] ?? ''));
|
||||
$isChecked = trim((string)($req['is_checked'] ?? ''));
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 2. 기본 유효성 검사
|
||||
// ---------------------------------------------------------
|
||||
if ($memberId === '' || $sysCompCode === '') {
|
||||
response_json([
|
||||
'success' => false,
|
||||
'message' => '로그인 정보가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
if ($contentId === '') {
|
||||
response_json([
|
||||
'success' => false,
|
||||
'message' => 'content_id가 없습니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 3. 체크값 정규화
|
||||
// - 현재 운영 중 프런트는 Y/N을 보낼 수 있고,
|
||||
// 향후 1/0으로 바뀔 가능성도 있으므로 둘 다 허용
|
||||
// - 최종적으로 DB 저장용 is_active 값은 '1' / '0' 으로 맞춘다.
|
||||
// ---------------------------------------------------------
|
||||
if ($isChecked === 'Y' || $isChecked === '1') {
|
||||
$activeValue = '1';
|
||||
} elseif ($isChecked === 'N' || $isChecked === '0') {
|
||||
$activeValue = '0';
|
||||
} else {
|
||||
response_json([
|
||||
'success' => false,
|
||||
'message' => '유효하지 않은 요청입니다.'
|
||||
]);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 4. 기존 북마크 이력 존재 여부 확인
|
||||
// - member_id + sys_comp_code + content_id 조합 기준
|
||||
// ---------------------------------------------------------
|
||||
$stmtCheck = $pdo->prepare("
|
||||
SELECT COUNT(*) AS cnt
|
||||
FROM edu_content_wishlist
|
||||
WHERE member_id = :member_id
|
||||
AND sys_comp_code = :sys_comp_code
|
||||
AND content_id = :content_id
|
||||
");
|
||||
$stmtCheck->execute([
|
||||
':member_id' => $memberId,
|
||||
':sys_comp_code' => $sysCompCode,
|
||||
':content_id' => $contentId,
|
||||
]);
|
||||
|
||||
$exists = (int)$stmtCheck->fetchColumn();
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 5. INSERT / UPDATE 처리
|
||||
//
|
||||
// [기존 row 있음]
|
||||
// - is_active만 update
|
||||
// - updated_at 갱신
|
||||
// - 체크(활성화) 시 favorited_at도 NOW()로 갱신
|
||||
//
|
||||
// [기존 row 없음]
|
||||
// - 신규 insert
|
||||
// - created_at / updated_at 저장
|
||||
// - 체크 상태가 1이면 favorited_at도 NOW() 저장
|
||||
//
|
||||
// ※ 실제 delete 하지 않고 soft delete 방식 유지
|
||||
// ---------------------------------------------------------
|
||||
if ($exists > 0) {
|
||||
if ($activeValue === '1') {
|
||||
// 체크 ON
|
||||
$stmtUpdate = $pdo->prepare("
|
||||
UPDATE edu_content_wishlist
|
||||
SET is_active = :is_active,
|
||||
favorited_at = NOW(),
|
||||
updated_at = NOW()
|
||||
WHERE member_id = :member_id
|
||||
AND sys_comp_code = :sys_comp_code
|
||||
AND content_id = :content_id
|
||||
");
|
||||
} else {
|
||||
// 체크 OFF
|
||||
$stmtUpdate = $pdo->prepare("
|
||||
UPDATE edu_content_wishlist
|
||||
SET is_active = :is_active,
|
||||
updated_at = NOW()
|
||||
WHERE member_id = :member_id
|
||||
AND sys_comp_code = :sys_comp_code
|
||||
AND content_id = :content_id
|
||||
");
|
||||
}
|
||||
|
||||
$stmtUpdate->execute([
|
||||
':is_active' => $activeValue,
|
||||
':member_id' => $memberId,
|
||||
':sys_comp_code' => $sysCompCode,
|
||||
':content_id' => $contentId,
|
||||
]);
|
||||
|
||||
} else {
|
||||
if ($activeValue === '1') {
|
||||
// 신규 체크 ON insert
|
||||
$stmtInsert = $pdo->prepare("
|
||||
INSERT INTO edu_content_wishlist (
|
||||
member_id,
|
||||
sys_comp_code,
|
||||
content_id,
|
||||
is_active,
|
||||
favorited_at,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
:member_id,
|
||||
:sys_comp_code,
|
||||
:content_id,
|
||||
:is_active,
|
||||
NOW(),
|
||||
NOW(),
|
||||
NOW()
|
||||
)
|
||||
");
|
||||
} else {
|
||||
// 신규 체크 OFF 요청이 들어온 경우도 예외 없이 기록은 남김
|
||||
// (운영상 불필요하다면 이 분기는 막아도 됨)
|
||||
$stmtInsert = $pdo->prepare("
|
||||
INSERT INTO edu_content_wishlist (
|
||||
member_id,
|
||||
sys_comp_code,
|
||||
content_id,
|
||||
is_active,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES (
|
||||
:member_id,
|
||||
:sys_comp_code,
|
||||
:content_id,
|
||||
:is_active,
|
||||
NOW(),
|
||||
NOW()
|
||||
)
|
||||
");
|
||||
}
|
||||
|
||||
$stmtInsert->execute([
|
||||
':member_id' => $memberId,
|
||||
':sys_comp_code' => $sysCompCode,
|
||||
':content_id' => $contentId,
|
||||
':is_active' => $activeValue,
|
||||
]);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 6. saved 탭 카운트만 재계산
|
||||
// - 북마크 토글은 saved 상태만 변경하므로
|
||||
// watching / completed 카운트는 여기서 건드리지 않는다.
|
||||
// ---------------------------------------------------------
|
||||
$stmtSavedCount = $pdo->prepare("
|
||||
SELECT COUNT(*)
|
||||
FROM edu_content_wishlist cw
|
||||
WHERE cw.member_id = :saved_member_id
|
||||
AND cw.sys_comp_code = :saved_sys_comp_code
|
||||
AND cw.is_active = '1'
|
||||
");
|
||||
$stmtSavedCount->execute([
|
||||
':saved_member_id' => $memberId,
|
||||
':saved_sys_comp_code' => $sysCompCode,
|
||||
]);
|
||||
|
||||
$savedCount = (int)$stmtSavedCount->fetchColumn();
|
||||
|
||||
// ---------------------------------------------------------
|
||||
// 7. 성공 응답 반환
|
||||
// ---------------------------------------------------------
|
||||
response_json([
|
||||
'success' => true,
|
||||
'content_id' => $contentId,
|
||||
'is_checked' => $activeValue,
|
||||
'counts' => [
|
||||
'saved' => $savedCount,
|
||||
]
|
||||
]);
|
||||
|
||||
} catch (Throwable $e) {
|
||||
response_json([
|
||||
'success' => false,
|
||||
'message' => '북마크 처리 중 오류가 발생했습니다.',
|
||||
'error' => $e->getMessage(),
|
||||
]);
|
||||
}
|
||||
Reference in New Issue
Block a user