feat: complete mindspace conversation packages
This commit is contained in:
+143
-1
@@ -67,6 +67,33 @@ function createMockPool(state) {
|
||||
return [[]];
|
||||
}
|
||||
if (sql.includes('FROM h5_upload_sessions u') && sql.includes('FOR UPDATE')) {
|
||||
if (sql.includes('u.source_message_id = ?')) {
|
||||
const rows = state.uploads
|
||||
.filter(
|
||||
(item) =>
|
||||
item.user_id === params[0] &&
|
||||
item.source_message_id === params[1] &&
|
||||
item.status === 'completed' &&
|
||||
!item.source_session_id,
|
||||
)
|
||||
.map((upload) => {
|
||||
const asset = state.assets.find((item) => item.id === upload.completed_asset_id);
|
||||
const version = state.versions.find((item) => item.id === asset?.current_version_id);
|
||||
const category = state.categories.find((item) => item.id === asset?.category_id);
|
||||
return {
|
||||
...upload,
|
||||
asset_id: asset.id,
|
||||
asset_mime_type: asset.mime_type,
|
||||
asset_original_filename: asset.original_filename,
|
||||
asset_display_name: asset.display_name,
|
||||
asset_size_bytes: asset.size_bytes,
|
||||
asset_updated_at: asset.updated_at ?? 1,
|
||||
asset_storage_key: version.storage_key,
|
||||
category_code: category?.category_code ?? 'public',
|
||||
};
|
||||
});
|
||||
return [rows];
|
||||
}
|
||||
const upload = state.uploads.find(
|
||||
(item) => item.id === params[0] && item.user_id === params[1],
|
||||
);
|
||||
@@ -78,10 +105,12 @@ function createMockPool(state) {
|
||||
state.assets.push({
|
||||
id: params[0],
|
||||
user_id: params[1],
|
||||
category_id: params[3],
|
||||
status: params[13],
|
||||
risk_level: params[11],
|
||||
current_version_id: params[8],
|
||||
original_filename: params[6],
|
||||
display_name: params[7],
|
||||
mime_type: params[5],
|
||||
size_bytes: params[9],
|
||||
});
|
||||
@@ -102,7 +131,7 @@ function createMockPool(state) {
|
||||
space.used_bytes += params[1];
|
||||
return [[]];
|
||||
}
|
||||
if (sql.includes("status = 'completed'")) {
|
||||
if (sql.includes("SET status = 'completed'")) {
|
||||
const upload = state.uploads.find(
|
||||
(item) => item.id === params[2] && item.user_id === params[3],
|
||||
);
|
||||
@@ -111,6 +140,33 @@ function createMockPool(state) {
|
||||
return [[]];
|
||||
}
|
||||
if (sql.includes('JOIN h5_asset_versions v')) {
|
||||
if (sql.includes('u.source_message_id = ?')) {
|
||||
const rows = state.uploads
|
||||
.filter(
|
||||
(item) =>
|
||||
item.user_id === params[0] &&
|
||||
item.source_message_id === params[1] &&
|
||||
item.status === 'completed' &&
|
||||
!item.source_session_id,
|
||||
)
|
||||
.map((upload) => {
|
||||
const asset = state.assets.find((item) => item.id === upload.completed_asset_id);
|
||||
const version = state.versions.find((item) => item.id === asset?.current_version_id);
|
||||
const category = state.categories.find((item) => item.id === asset?.category_id);
|
||||
return {
|
||||
...upload,
|
||||
asset_id: asset.id,
|
||||
asset_mime_type: asset.mime_type,
|
||||
asset_original_filename: asset.original_filename,
|
||||
asset_display_name: asset.display_name,
|
||||
asset_size_bytes: asset.size_bytes,
|
||||
asset_updated_at: asset.updated_at ?? 1,
|
||||
asset_storage_key: version.storage_key,
|
||||
category_code: category?.category_code ?? 'public',
|
||||
};
|
||||
});
|
||||
return [rows];
|
||||
}
|
||||
const asset = state.assets.find(
|
||||
(item) => item.id === params[0] && item.user_id === params[1],
|
||||
);
|
||||
@@ -134,6 +190,20 @@ function createMockPool(state) {
|
||||
},
|
||||
]];
|
||||
}
|
||||
if (sql.includes('SET source_session_id = ?')) {
|
||||
state.uploads
|
||||
.filter(
|
||||
(item) =>
|
||||
item.user_id === params[1] &&
|
||||
item.source_message_id === params[2] &&
|
||||
item.status === 'completed' &&
|
||||
!item.source_session_id,
|
||||
)
|
||||
.forEach((item) => {
|
||||
item.source_session_id = params[0];
|
||||
});
|
||||
return [[]];
|
||||
}
|
||||
if (sql.includes("status IN ('reserved', 'uploaded') AND expires_at")) {
|
||||
return [state.uploads.filter((item) => item.expires_at <= params[0])];
|
||||
}
|
||||
@@ -341,6 +411,78 @@ test('registerUploadArtifactForConversation skips uploads without source session
|
||||
);
|
||||
});
|
||||
|
||||
test('claimUploadArtifactsForConversation attaches pre-session uploads to package', async () => {
|
||||
const storageRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'mindspace-assets-'));
|
||||
const calls = [];
|
||||
const state = {
|
||||
categories: [{ id: 'cat-public', user_id: 'user-1', space_id: 'space-1', category_code: 'public' }],
|
||||
spaces: [{ id: 'space-1', user_id: 'user-1', quota_bytes: 1000, used_bytes: 0, reserved_bytes: 0 }],
|
||||
uploads: [
|
||||
{
|
||||
id: 'upload-1',
|
||||
user_id: 'user-1',
|
||||
space_id: 'space-1',
|
||||
category_id: 'cat-public',
|
||||
filename: 'first.png',
|
||||
status: 'completed',
|
||||
completed_asset_id: 'asset-1',
|
||||
source_session_id: null,
|
||||
source_message_id: 'message-1',
|
||||
},
|
||||
],
|
||||
assets: [
|
||||
{
|
||||
id: 'asset-1',
|
||||
user_id: 'user-1',
|
||||
category_id: 'cat-public',
|
||||
current_version_id: 'version-1',
|
||||
original_filename: 'users/user-1/public/images/first.png',
|
||||
display_name: 'first.png',
|
||||
mime_type: 'image/png',
|
||||
size_bytes: 123,
|
||||
updated_at: 1000,
|
||||
},
|
||||
],
|
||||
versions: [
|
||||
{
|
||||
id: 'version-1',
|
||||
asset_id: 'asset-1',
|
||||
storage_key: 'users/user-1/public/images/first.png',
|
||||
scan_status: 'passed',
|
||||
},
|
||||
],
|
||||
};
|
||||
const service = createAssetService(createMockPool(state), {
|
||||
storageRoot,
|
||||
conversationPackageRegistry: {
|
||||
async ensurePackage(input) {
|
||||
calls.push(['ensurePackage', input]);
|
||||
return { id: 'cp_session-1' };
|
||||
},
|
||||
async recordArtifact(input) {
|
||||
calls.push(['recordArtifact', input]);
|
||||
return input;
|
||||
},
|
||||
async writeManifestForSession(input) {
|
||||
calls.push(['writeManifestForSession', input]);
|
||||
return {};
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const result = await service.claimUploadArtifactsForConversation('user-1', {
|
||||
sessionId: 'session-1',
|
||||
messageId: 'message-1',
|
||||
});
|
||||
|
||||
assert.equal(result.claimedCount, 1);
|
||||
assert.equal(state.uploads[0].source_session_id, 'session-1');
|
||||
assert.deepEqual(calls[0], ['ensurePackage', { userId: 'user-1', sessionId: 'session-1', now: calls[0][1].now }]);
|
||||
assert.equal(calls[1][1].artifactKind, 'input_image');
|
||||
assert.equal(calls[1][1].messageId, 'message-1');
|
||||
assert.equal(calls[1][1].assetId, 'asset-1');
|
||||
});
|
||||
|
||||
test('completeUpload publishes public images to the public temp image library', async () => {
|
||||
const storageRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'mindspace-assets-'));
|
||||
const h5Root = await fs.mkdtemp(path.join(os.tmpdir(), 'mindspace-h5-'));
|
||||
|
||||
Reference in New Issue
Block a user