mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-27 12:51:41 +00:00
Initial Move from Azure DevOps to GitHub
This commit is contained in:
28
src/workers/upload/definitions.ts
Normal file
28
src/workers/upload/definitions.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { DatabaseAccount } from "../../Contracts/DataModels";
|
||||
import { PlatformType } from "../../PlatformType";
|
||||
|
||||
export interface StartUploadMessageParams {
|
||||
files: FileList;
|
||||
documentClientParams: DocumentClientParams;
|
||||
}
|
||||
|
||||
export interface DocumentClientParams {
|
||||
databaseId: string;
|
||||
containerId: string;
|
||||
masterKey: string;
|
||||
endpoint: string;
|
||||
accessToken: string;
|
||||
platform: PlatformType;
|
||||
databaseAccount: DatabaseAccount;
|
||||
}
|
||||
|
||||
export interface UploadDetailsRecord {
|
||||
fileName: string;
|
||||
numSucceeded: number;
|
||||
numFailed: number;
|
||||
errors: string[];
|
||||
}
|
||||
|
||||
export interface UploadDetails {
|
||||
data: UploadDetailsRecord[];
|
||||
}
|
||||
139
src/workers/upload/index.ts
Normal file
139
src/workers/upload/index.ts
Normal file
@@ -0,0 +1,139 @@
|
||||
import "babel-polyfill";
|
||||
import { DocumentClientParams, UploadDetailsRecord, UploadDetails } from "./definitions";
|
||||
import { CosmosClient } from "../../Common/CosmosClient";
|
||||
|
||||
let numUploadsSuccessful = 0;
|
||||
let numUploadsFailed = 0;
|
||||
let numDocuments = 0;
|
||||
let numFiles = 0;
|
||||
let numFilesProcessed = 0;
|
||||
let fileUploadDetails: { [key: string]: UploadDetailsRecord } = {};
|
||||
let databaseId: string;
|
||||
let containerId: string;
|
||||
|
||||
onerror = (event: ProgressEvent) => {
|
||||
postMessage(
|
||||
{
|
||||
numUploadsSuccessful: numUploadsSuccessful,
|
||||
numUploadsFailed: numUploadsFailed,
|
||||
uploadDetails: transformDetailsMap(fileUploadDetails),
|
||||
// TODO: Typescript complains about event.error below
|
||||
runtimeError: (event as any).error.message
|
||||
},
|
||||
undefined
|
||||
);
|
||||
};
|
||||
|
||||
onmessage = (event: MessageEvent) => {
|
||||
const files: FileList = event.data.files;
|
||||
const clientParams: DocumentClientParams = event.data.documentClientParams;
|
||||
containerId = clientParams.containerId;
|
||||
databaseId = clientParams.databaseId;
|
||||
CosmosClient.masterKey(clientParams.masterKey);
|
||||
CosmosClient.endpoint(clientParams.endpoint);
|
||||
CosmosClient.accessToken(clientParams.accessToken);
|
||||
CosmosClient.databaseAccount(clientParams.databaseAccount);
|
||||
self.dataExplorerPlatform = clientParams.platform;
|
||||
console.log(event);
|
||||
if (!!files && files.length > 0) {
|
||||
numFiles = files.length;
|
||||
for (let i = 0; i < numFiles; i++) {
|
||||
fileUploadDetails[files[i].name] = {
|
||||
fileName: files[i].name,
|
||||
numSucceeded: 0,
|
||||
numFailed: 0,
|
||||
errors: []
|
||||
};
|
||||
uploadFile(files[i]);
|
||||
}
|
||||
} else {
|
||||
postMessage(
|
||||
{
|
||||
runtimeError: "No files specified"
|
||||
},
|
||||
undefined
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
function uploadFile(file: File): void {
|
||||
const reader = new FileReader();
|
||||
reader.onload = (evt: any): void => {
|
||||
numFilesProcessed++;
|
||||
const fileData: string = evt.target.result;
|
||||
createDocumentsFromFile(file.name, fileData);
|
||||
};
|
||||
|
||||
reader.onerror = (evt: ProgressEvent): void => {
|
||||
numFilesProcessed++;
|
||||
// TODO: Typescript complains about event.error below
|
||||
recordUploadDetailErrorForFile(file.name, (evt as any).error.message);
|
||||
transmitResultIfUploadComplete();
|
||||
};
|
||||
|
||||
reader.readAsText(file);
|
||||
}
|
||||
|
||||
function createDocumentsFromFile(fileName: string, documentContent: string): void {
|
||||
try {
|
||||
const content = JSON.parse(documentContent);
|
||||
const triggerCreateDocument: (documentContent: any) => void = (documentContent: any) => {
|
||||
CosmosClient.client()
|
||||
.database(databaseId)
|
||||
.container(containerId)
|
||||
.items.create(documentContent)
|
||||
.then(savedDoc => {
|
||||
fileUploadDetails[fileName].numSucceeded++;
|
||||
numUploadsSuccessful++;
|
||||
})
|
||||
.catch(error => {
|
||||
console.log(error);
|
||||
recordUploadDetailErrorForFile(fileName, JSON.stringify(error));
|
||||
numUploadsFailed++;
|
||||
})
|
||||
.finally(() => {
|
||||
transmitResultIfUploadComplete();
|
||||
});
|
||||
};
|
||||
|
||||
if (Array.isArray(content)) {
|
||||
numDocuments = numDocuments + content.length;
|
||||
for (let i = 0; i < content.length; i++) {
|
||||
triggerCreateDocument(content[i]);
|
||||
}
|
||||
} else {
|
||||
numDocuments = numDocuments + 1;
|
||||
triggerCreateDocument(content);
|
||||
}
|
||||
} catch (e) {
|
||||
recordUploadDetailErrorForFile(fileName, e.message);
|
||||
transmitResultIfUploadComplete();
|
||||
}
|
||||
}
|
||||
|
||||
function transmitResultIfUploadComplete(): void {
|
||||
if (numFilesProcessed === numFiles && numUploadsFailed + numUploadsSuccessful === numDocuments) {
|
||||
postMessage(
|
||||
{
|
||||
numUploadsSuccessful: numUploadsSuccessful,
|
||||
numUploadsFailed: numUploadsFailed,
|
||||
uploadDetails: transformDetailsMap(fileUploadDetails)
|
||||
},
|
||||
undefined
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function recordUploadDetailErrorForFile(fileName: string, error: any): void {
|
||||
fileUploadDetails[fileName].errors.push(error);
|
||||
fileUploadDetails[fileName].numFailed++;
|
||||
}
|
||||
|
||||
function transformDetailsMap(map: any): UploadDetails {
|
||||
let transformedResult: UploadDetailsRecord[] = [];
|
||||
Object.keys(map).forEach((key: string) => {
|
||||
transformedResult.push(map[key]);
|
||||
});
|
||||
|
||||
return { data: transformedResult };
|
||||
}
|
||||
Reference in New Issue
Block a user