chore: test deploy snapshot

This commit is contained in:
2026-05-27 16:35:12 +09:00
parent e8a628ac34
commit 10805d242e
7 changed files with 1032 additions and 72 deletions

View File

@@ -50,6 +50,7 @@ import {
hasPendingAttentionVerificationRequest,
} from '../services/chat-room-service.js';
import {
archiveChatShareTokenRoomMap,
ensureDefaultChatShareTokenRoomMap,
getChatShareTokenRoomMap,
resolveChatShareTokenRoomSessionIds,
@@ -1142,12 +1143,13 @@ async function buildChatShareSnapshot(
}
const childRequestIdsByParentRequestId = buildChildRequestIdsByParentRequestId(requests);
const isManagedShareRoomPlaceholder =
tokenPayload.kind === 'request-bundle' && normalizedSessionId.startsWith(MANAGED_CHAT_SHARE_SESSION_PREFIX) && !targetRequestFromStore;
const isManagedShareRoomSession =
tokenPayload.kind === 'request-bundle' && normalizedSessionId.startsWith(MANAGED_CHAT_SHARE_SESSION_PREFIX);
const isManagedShareRoomPlaceholder = isManagedShareRoomSession && !targetRequestFromStore;
const rootRequestId = isManagedShareRoomPlaceholder
? targetRequestId
: resolveShareRootRequestId(targetRequestId, requestMap, tokenPayload.kind);
const scopeRequestIds = isManagedShareRoomPlaceholder
const scopeRequestIds = isManagedShareRoomSession
? requests.map((request) => request.requestId.trim()).filter(Boolean)
: collectShareScopeRequestIds(rootRequestId, childRequestIdsByParentRequestId);
const scopeRequestIdSet = new Set(scopeRequestIds);
@@ -2524,6 +2526,101 @@ export async function registerChatRoutes(app: FastifyInstance) {
};
});
app.delete(`${CHAT_SHARE_ROUTE_PREFIX}/:token/rooms/:sessionId`, async (request, reply) => {
const params = z.object({
token: z.string().trim().min(1).max(16000),
sessionId: z.string().trim().min(1).max(120),
}).parse(request.params ?? {});
const managedContext = await resolveManagedChatShareContext(params.token);
const tokenPayload = resolveChatSharePayloadFromManagedResource(managedContext.managedResource) ?? parseChatShareToken(params.token);
if (!tokenPayload) {
return reply.code(404).send({
message: '공유 링크가 유효하지 않습니다.',
});
}
if (tokenPayload.kind === 'prompt') {
return reply.code(400).send({
message: 'prompt 공유 링크에서는 채팅방을 삭제할 수 없습니다.',
});
}
const unavailableMessage = resolveManagedShareUnavailableMessage(managedContext.managedResource);
if (unavailableMessage) {
return reply.code(403).send({
message: unavailableMessage,
});
}
if (!(await ensureManagedShareAccessPin(request, reply, managedContext.sharePath))) {
return;
}
if (!managedContext.managedResource || managedContext.managedResource.token.resourceType !== 'chat-share') {
return reply.code(404).send({
message: '공유 채팅방 정보를 찾을 수 없습니다.',
});
}
if (!managedContext.managedResource.token.permissions.includes('manage')) {
return reply.code(403).send({
message: '이 공유 링크에는 채팅방을 삭제할 권한이 없습니다.',
});
}
if (!hasManagedShareAllowedApp(managedContext.managedResource, 'chat-room-settings')) {
return reply.code(403).send({
message: '이 공유 링크에는 채팅방 설정 앱 권한이 없습니다.',
});
}
const resolvedRoomContext = await resolveActiveManagedShareRoom({
managedResource: managedContext.managedResource,
tokenPayload,
requestedSessionId: params.sessionId,
});
if (!resolvedRoomContext.requestedRoomMatched || !resolvedRoomContext.activeRoom) {
return reply.code(403).send({
message: '이 공유 링크에서 접근할 수 없는 채팅방입니다.',
});
}
if (resolvedRoomContext.rooms.length <= 1) {
return reply.code(400).send({
message: '마지막 채팅방은 삭제할 수 없습니다.',
});
}
getActiveChatService()?.forgetSession(params.sessionId);
chatRuntimeService.clearSession(params.sessionId);
const deleted = await deleteChatConversation(params.sessionId);
const archived = await archiveChatShareTokenRoomMap(managedContext.managedResource.token.id, params.sessionId);
if (!deleted || !archived.archived) {
return reply.code(404).send({
message: '삭제할 채팅방을 찾을 수 없습니다.',
});
}
if (managedContext.managedResource) {
await recordSharedResourceTokenUsage(managedContext.managedResource.token.id, {
actorLabel: 'share-manager',
summary: '공유 채팅방을 삭제했습니다.',
detail: params.sessionId,
});
}
return {
ok: true,
deleted: true,
deletedSessionId: params.sessionId,
nextRoomSessionId: archived.nextDefaultRoom?.sessionId ?? null,
};
});
app.post(`${CHAT_SHARE_ROUTE_PREFIX}/:token/messages`, async (request, reply) => {
const params = z.object({
token: z.string().trim().min(1).max(16000),