docs: update documentation for real-time privacy policy and remove server cache
This commit is contained in:
parent
41d3f4db7c
commit
f459585cec
2
agent.md
2
agent.md
|
|
@ -91,7 +91,7 @@
|
||||||
- `GET /api/health`: 서버 및 MongoDB 설정 여부 확인.
|
- `GET /api/health`: 서버 및 MongoDB 설정 여부 확인.
|
||||||
- `POST /api/visitors/check`: 현재 브라우저 방문자를 체크하고 유니크 방문자 수를 반환.
|
- `POST /api/visitors/check`: 현재 브라우저 방문자를 체크하고 유니크 방문자 수를 반환.
|
||||||
- `GET /api/visitors/stats`: 전체 유니크 방문자 수 조회.
|
- `GET /api/visitors/stats`: 전체 유니크 방문자 수 조회.
|
||||||
- `GET /api/about`: 서버 시작 시 캐시한 개발자정보와 개인정보처리방침 Markdown 조회.
|
- `GET /api/about`: 데이터베이스에서 실시간으로 개발자정보와 개인정보처리방침 Markdown 조회 (캐시 없이 즉시 반영).
|
||||||
- `GET /api/death-stats/today`: 오늘의 종족별 전투 사망 통계 조회.
|
- `GET /api/death-stats/today`: 오늘의 종족별 전투 사망 통계 조회.
|
||||||
- `POST /api/death-stats/today`: 종료된 전투의 종족별 사망 수를 오늘 집계에 누적.
|
- `POST /api/death-stats/today`: 종료된 전투의 종족별 사망 수를 오늘 집계에 누적.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,8 @@
|
||||||
- `MongoClient`를 한 번 생성한 뒤 재사용하여 MongoDB 커넥션 풀을 유지합니다.
|
- `MongoClient`를 한 번 생성한 뒤 재사용하여 MongoDB 커넥션 풀을 유지합니다.
|
||||||
- 종료 시 `closeMongoConnection()`으로 커넥션을 닫습니다.
|
- 종료 시 `closeMongoConnection()`으로 커넥션을 닫습니다.
|
||||||
- **`server/about.js`**:
|
- **`server/about.js`**:
|
||||||
- About 개발자정보와 개인정보처리방침 Markdown을 DB 기본 문서로 시드하고, 서버 메모리에 캐시합니다.
|
- About 개발자정보와 개인정보처리방침 Markdown을 DB 기본 문서로 시드합니다.
|
||||||
|
- 실시간 반영을 위해 메모리 캐시를 사용하지 않고, 요청 시마다 DB에서 최신 데이터를 조회합니다.
|
||||||
- **`server/dailyMetrics.js`**:
|
- **`server/dailyMetrics.js`**:
|
||||||
- `GET /api/daily-metrics/today`: `ANALYTICS_TIME_ZONE` 기준 오늘의 운영 지표를 반환합니다.
|
- `GET /api/daily-metrics/today`: `ANALYTICS_TIME_ZONE` 기준 오늘의 운영 지표를 반환합니다.
|
||||||
- `POST /api/daily-metrics/match-started`: 사용자가 실제 전투를 시작했을 때 `totalMatchStarts`를 누적합니다.
|
- `POST /api/daily-metrics/match-started`: 사용자가 실제 전투를 시작했을 때 `totalMatchStarts`를 누적합니다.
|
||||||
|
|
@ -77,7 +78,7 @@
|
||||||
## 4. About 콘텐츠
|
## 4. About 콘텐츠
|
||||||
|
|
||||||
- **`server/about.js`**:
|
- **`server/about.js`**:
|
||||||
- 서버 시작 시 `MONGODB_ABOUT_COLLECTION` 컬렉션(기본값 `about_content`)에 `developer-info`, `privacy-policy` 기본 문서를 upsert합니다.
|
- 서버 시작 시 `MONGODB_ABOUT_COLLECTION` 컬렉션(기본값 `about_content`)에 `developer-info`, `privacy-policy` 기본 문서를 upsert합니다. 이때 기존 데이터가 있으면 덮어씌우지 않고 유지합니다.
|
||||||
- 개발자 정보 기본값은 `alias: horoli`, `email: sunha321@gmail.com`, `github: https://github.com/Horoli`입니다.
|
- 개발자 정보 기본값은 `alias: horoli`, `email: sunha321@gmail.com`, `github: https://github.com/Horoli`입니다.
|
||||||
- 개인정보처리방침은 `privacy-policy.markdown` 문자열 필드에 Markdown 원문으로 저장합니다. 기본값은 빈 문자열이며, 운영자가 DB에서 직접 작성/수정합니다.
|
- 개인정보처리방침은 `privacy-policy.markdown` 문자열 필드에 Markdown 원문으로 저장합니다. 운영자가 DB에서 직접 작성/수정하면 유저가 About 다이얼로그를 열 때 실시간으로 반영됩니다.
|
||||||
- 서버가 MongoDB 연결에 성공하면 About 콘텐츠를 메모리에 캐시합니다. 브라우저 표시를 위해 `GET /api/about` 읽기 전용 API만 제공하며, 수정 API는 만들지 않습니다.
|
- 실시간 조회를 위해 서버 메모리에 캐시하지 않으며, `GET /api/about` 읽기 전용 API를 통해 항상 최신 데이터를 제공합니다.
|
||||||
|
|
|
||||||
|
|
@ -40,27 +40,27 @@ const DEFAULT_PRIVACY_POLICY_MARKDOWN = `
|
||||||
**시행일자**: 2026년 5월 23일
|
**시행일자**: 2026년 5월 23일
|
||||||
`;
|
`;
|
||||||
|
|
||||||
let aboutCache;
|
|
||||||
let aboutIndexesReady;
|
let aboutIndexesReady;
|
||||||
let aboutWarmupPromise;
|
let aboutWarmupPromise;
|
||||||
|
|
||||||
export async function aboutRoutes(fastify) {
|
export async function aboutRoutes(fastify) {
|
||||||
fastify.get("/about", async () => getAboutContent());
|
fastify.get("/about", async () => getAboutContent());
|
||||||
fastify.get("/about/", async () => getAboutContent());
|
fastify.get("/about/", async () => getAboutContent());
|
||||||
|
|
||||||
|
// 관리용: 초기 데이터 보장 및 인덱스 생성을 위한 명시적 호출용 (필요시)
|
||||||
|
fastify.post("/about/warmup", async (request, reply) => {
|
||||||
|
await warmAboutContent();
|
||||||
|
return { success: true };
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function warmAboutContent() {
|
export async function warmAboutContent() {
|
||||||
if (!hasMongoConfig()) {
|
if (!hasMongoConfig()) {
|
||||||
aboutCache = formatAboutContent();
|
return formatAboutContent();
|
||||||
return aboutCache;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aboutWarmupPromise) {
|
if (!aboutWarmupPromise) {
|
||||||
aboutWarmupPromise = loadAboutContent()
|
aboutWarmupPromise = loadAboutContent()
|
||||||
.then((content) => {
|
|
||||||
aboutCache = content;
|
|
||||||
return content;
|
|
||||||
})
|
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
aboutWarmupPromise = undefined;
|
aboutWarmupPromise = undefined;
|
||||||
});
|
});
|
||||||
|
|
@ -70,15 +70,13 @@ export async function warmAboutContent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getAboutContent() {
|
async function getAboutContent() {
|
||||||
if (aboutCache) {
|
// 실시간 반영을 위해 캐시를 사용하지 않고 매번 DB에서 로드
|
||||||
return aboutCache;
|
return loadAboutContent();
|
||||||
}
|
|
||||||
|
|
||||||
return warmAboutContent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function loadAboutContent() {
|
async function loadAboutContent() {
|
||||||
const collection = await getAboutCollection();
|
const collection = await getAboutCollection();
|
||||||
|
// 서버 시작 시나 첫 호출 시 기본값 보장 (이미 있으면 유지됨)
|
||||||
await ensureAboutDefaults(collection);
|
await ensureAboutDefaults(collection);
|
||||||
|
|
||||||
const [developerInfo, privacyPolicy] = await Promise.all([
|
const [developerInfo, privacyPolicy] = await Promise.all([
|
||||||
|
|
|
||||||
6
todo.md
6
todo.md
|
|
@ -172,4 +172,10 @@
|
||||||
- `index.html`에 이모지 데이터 URI를 활용한 파비콘 설정을 추가하여 404 오류 해결.
|
- `index.html`에 이모지 데이터 URI를 활용한 파비콘 설정을 추가하여 404 오류 해결.
|
||||||
- `src/ui/aboutDialog.js`의 Markdown 렌더러를 고도화하여 Bold, Italic, Code, Blockquote 등 핵심 문법 지원.
|
- `src/ui/aboutDialog.js`의 Markdown 렌더러를 고도화하여 Bold, Italic, Code, Blockquote 등 핵심 문법 지원.
|
||||||
|
|
||||||
|
27. 개인정보처리방침 DB 연동 로직 개선 및 실시간 조회 적용 (완료)
|
||||||
|
- **조치 사항**:
|
||||||
|
- `server/about.js`의 `ensureAboutDefaults` 로직을 수정하여, DB에 이미 데이터가 있는 경우 기본값으로 덮어씌우지 않고 기존 데이터를 보존하도록 `$setOnInsert` 적용.
|
||||||
|
- 유저가 About 다이얼로그를 열 때마다 DB에서 최신 데이터를 가져오도록 서버 메모리 캐시 로직을 제거.
|
||||||
|
- 기본 개인정보처리방침 마크다운의 공고/시행 일자를 최신화.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue