feat: complete mindspace conversation packages

This commit is contained in:
john
2026-07-02 23:46:05 +08:00
parent b084f6d23c
commit b258004dad
31 changed files with 1990 additions and 118 deletions
+98
View File
@@ -759,6 +759,103 @@ export function createAssetService(pool, options = {}) {
}
};
const claimUploadArtifactsForConversation = async (userId, { sessionId, messageId } = {}) => {
const normalizedSessionId = String(sessionId ?? '').trim();
const normalizedMessageId = String(messageId ?? '').trim();
if (!normalizedSessionId || !normalizedMessageId) return { claimedCount: 0 };
const conn = await pool.getConnection();
try {
await conn.beginTransaction();
const [rows] = await conn.query(
`SELECT
u.*,
a.id AS asset_id,
a.mime_type AS asset_mime_type,
a.original_filename AS asset_original_filename,
a.display_name AS asset_display_name,
a.size_bytes AS asset_size_bytes,
a.updated_at AS asset_updated_at,
v.storage_key AS asset_storage_key,
c.category_code
FROM h5_upload_sessions u
JOIN h5_assets a
ON a.id = u.completed_asset_id AND a.user_id = u.user_id
LEFT JOIN h5_asset_versions v
ON v.id = a.current_version_id AND v.asset_id = a.id
LEFT JOIN h5_space_categories c
ON c.id = a.category_id
WHERE u.user_id = ?
AND u.source_message_id = ?
AND u.status = 'completed'
AND (u.source_session_id IS NULL OR u.source_session_id = '')
LIMIT 20
FOR UPDATE`,
[userId, normalizedMessageId],
);
if (rows.length === 0) {
await conn.commit();
return { claimedCount: 0 };
}
await conn.query(
`UPDATE h5_upload_sessions
SET source_session_id = ?
WHERE user_id = ?
AND source_message_id = ?
AND status = 'completed'
AND (source_session_id IS NULL OR source_session_id = '')`,
[normalizedSessionId, userId, normalizedMessageId],
);
await conn.commit();
const now = Date.now();
let claimedCount = 0;
for (const row of rows) {
const upload = {
...row,
source_session_id: normalizedSessionId,
source_message_id: normalizedMessageId,
detected_mime_type: row.asset_mime_type,
actual_size: row.asset_size_bytes,
};
const asset = {
id: row.asset_id,
user_id: userId,
categoryCode: row.category_code,
mimeType: row.asset_mime_type,
filename: row.asset_original_filename,
displayName: row.asset_display_name,
sizeBytes: asNumber(row.asset_size_bytes),
updatedAt: asNumber(row.asset_updated_at),
};
const artifact = await registerUploadArtifactForConversation({
registry: conversationPackageRegistry,
userId,
upload,
asset,
assetId: row.asset_id,
storageKey: row.asset_storage_key,
canonicalUrl: publicUrlForAsset({
id: row.asset_id,
user_id: userId,
category_code: row.category_code,
mime_type: row.asset_mime_type,
storage_key: row.asset_storage_key,
original_filename: row.asset_original_filename,
}),
now,
});
if (artifact) claimedCount += 1;
}
return { claimedCount };
} catch (error) {
await conn.rollback();
throw error;
} finally {
conn.release();
}
};
const cancelUpload = async (userId, uploadId) => {
const conn = await pool.getConnection();
let storageKey;
@@ -1278,6 +1375,7 @@ export function createAssetService(pool, options = {}) {
createUpload,
writeUploadContent,
completeUpload,
claimUploadArtifactsForConversation,
cancelUpload,
createChatAsset,
listAssets,