feat: complete mindspace conversation packages
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user