Fix Drive video upload to Shopify

- Detect video mime types in MediaService to set correct resource ('VIDEO') and mediaContentType.

- Add fileSize to stagedUploadsCreate payload as required by Shopify for videos.

- Add safety check for missing upload targets to prevent crashes.

- Implement getSize in MockDriveService.

- Add unit test in MediaService.test.ts to verify correct resource and fileSize handling for video uploads.

- Update mock in mediaManager.integration.test.ts to support getSize().
This commit is contained in:
Ben Miller
2025-12-29 01:17:06 -07:00
parent e5ce154175
commit 19b3d5de2b
4 changed files with 59 additions and 2 deletions

View File

@ -277,7 +277,8 @@ export class MediaService {
return {
filename: f.getName(),
mimeType: f.getMimeType(),
resource: "IMAGE",
resource: f.getMimeType().startsWith('video/') ? "VIDEO" : "IMAGE",
fileSize: f.getSize().toString(),
httpMethod: "POST",
file: f,
originalItem: item
@ -290,14 +291,26 @@ export class MediaService {
filename: u.filename,
mimeType: u.mimeType,
resource: u.resource,
fileSize: u.fileSize,
httpMethod: u.httpMethod
}))
const stagedResp = shopifySvc.stagedUploadsCreate(stagedInput)
if (stagedResp.userErrors && stagedResp.userErrors.length > 0) {
console.error("[MediaService] stagedUploadsCreate Errors:", JSON.stringify(stagedResp.userErrors))
logs.push(`- Upload preparation failed: ${stagedResp.userErrors.map(e => e.message).join(', ')}`)
}
const targets = stagedResp.stagedTargets
const mediaToCreate = []
uploads.forEach((u, i) => {
const target = targets[i]
if (!target || !target.url) {
logs.push(`- Failed to get upload target for ${u.filename}: Invalid target`)
console.warn(`[MediaService] Missing target URL for ${u.filename}. Target:`, JSON.stringify(target))
return
}
const payload = {}
target.parameters.forEach((p: any) => payload[p.name] = p.value)
payload['file'] = u.file.getBlob()
@ -305,7 +318,7 @@ export class MediaService {
mediaToCreate.push({
originalSource: target.resourceUrl,
alt: u.filename,
mediaContentType: "IMAGE"
mediaContentType: u.resource
})
})