Split all script data access methods (#197)

* Split all script data access methods

* More cleanup

* Fix Typo
This commit is contained in:
Steve Faulkner
2020-09-15 13:31:30 -05:00
committed by GitHub
parent d6a4924710
commit 03b19fc875
24 changed files with 591 additions and 1159 deletions

View File

@@ -1,15 +1,14 @@
import * as Constants from "../../Common/Constants";
import * as ko from "knockout";
import * as monaco from "monaco-editor";
import Q from "q";
import DiscardIcon from "../../../images/discard.svg";
import SaveIcon from "../../../images/save-cosmos.svg";
import * as Constants from "../../Common/Constants";
import editable from "../../Common/EditableUtility";
import * as DataModels from "../../Contracts/DataModels";
import * as ViewModels from "../../Contracts/ViewModels";
import TabsBase from "./TabsBase";
import editable from "../../Common/EditableUtility";
import * as monaco from "monaco-editor";
import SaveIcon from "../../../images/save-cosmos.svg";
import DiscardIcon from "../../../images/discard.svg";
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
import TabsBase from "./TabsBase";
export default abstract class ScriptTabBase extends TabsBase implements ViewModels.WaitsForTemplate {
public ariaLabel: ko.Observable<string>;
@@ -30,7 +29,8 @@ export default abstract class ScriptTabBase extends TabsBase implements ViewMode
public formIsValid: ko.Computed<boolean>;
public formIsDirty: ko.Computed<boolean>;
public isNew: ko.Observable<boolean>;
public resource: ko.Observable<DataModels.Script>;
// TODO: Remove any. The SDK types for all the script.body are slightly incorrect which makes this REALLY hard to type correct.
public resource: ko.Observable<any>;
public isTemplateReady: ko.Observable<boolean>;
protected _partitionKey: DataModels.PartitionKey;
@@ -194,8 +194,8 @@ export default abstract class ScriptTabBase extends TabsBase implements ViewMode
});
}
public abstract onSaveClick: () => Q.Promise<any>;
public abstract onUpdateClick: () => Q.Promise<any>;
public abstract onSaveClick: () => Promise<any>;
public abstract onUpdateClick: () => Promise<any>;
public onDiscard = (): Q.Promise<any> => {
this.setBaselines();
@@ -206,14 +206,14 @@ export default abstract class ScriptTabBase extends TabsBase implements ViewMode
return Q();
};
public onSaveOrUpdateClick(): Q.Promise<any> {
public onSaveOrUpdateClick(): Promise<any> {
if (this.saveButton.visible()) {
return this.onSaveClick();
} else if (this.updateButton.visible()) {
return this.onUpdateClick();
}
return Q();
return undefined;
}
protected getTabsButtons(): CommandButtonComponentProps[] {

View File

@@ -1,17 +1,18 @@
import { Resource, StoredProcedureDefinition } from "@azure/cosmos";
import * as ko from "knockout";
import * as _ from "underscore";
import Q from "q";
import * as _ from "underscore";
import ExecuteQueryIcon from "../../../images/ExecuteQuery.svg";
import * as Constants from "../../Common/Constants";
import * as DataModels from "../../Contracts/DataModels";
import { createStoredProcedure } from "../../Common/dataAccess/createStoredProcedure";
import { updateStoredProcedure } from "../../Common/dataAccess/updateStoredProcedure";
import editable from "../../Common/EditableUtility";
import * as ViewModels from "../../Contracts/ViewModels";
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
import editable from "../../Common/EditableUtility";
import ScriptTabBase from "./ScriptTabBase";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import ExecuteQueryIcon from "../../../images/ExecuteQuery.svg";
import StoredProcedure from "../Tree/StoredProcedure";
import { createStoredProcedure, updateStoredProcedure } from "../../Common/DocumentClientUtilityBase";
import { CommandButtonComponentProps } from "../Controls/CommandButton/CommandButtonComponent";
import StoredProcedure from "../Tree/StoredProcedure";
import ScriptTabBase from "./ScriptTabBase";
enum ToggleState {
Result = "result",
@@ -24,7 +25,6 @@ export default class StoredProcedureTab extends ScriptTabBase {
public executeResultsEditorId: string;
public executeLogsEditorId: string;
public toggleState: ko.Observable<ToggleState>;
public originalSprocBody: ViewModels.Editable<string>;
public resultsData: ko.Observable<string>;
public logsData: ko.Observable<string>;
@@ -54,13 +54,11 @@ export default class StoredProcedureTab extends ScriptTabBase {
this.buildCommandBarOptions();
}
public onSaveClick = (): Q.Promise<DataModels.StoredProcedure> => {
const resource: DataModels.StoredProcedure = <DataModels.StoredProcedure>{
public onSaveClick = (): Promise<StoredProcedureDefinition & Resource> => {
return this._createStoredProcedure({
id: this.id(),
body: this.editorContent()
};
return this._createStoredProcedure(resource);
});
};
public onDiscard = (): Q.Promise<any> => {
@@ -72,8 +70,8 @@ export default class StoredProcedureTab extends ScriptTabBase {
return Q();
};
public onUpdateClick = (): Q.Promise<any> => {
const data: DataModels.StoredProcedure = this._getResource();
public onUpdateClick = (): Promise<any> => {
const data = this._getResource();
this.isExecutionError(false);
this.isExecuting(true);
@@ -83,18 +81,18 @@ export default class StoredProcedureTab extends ScriptTabBase {
dataExplorerArea: Constants.Areas.Tab,
tabTitle: this.tabTitle()
});
return updateStoredProcedure(this.collection, data)
return updateStoredProcedure(this.collection.databaseId, this.collection.id(), data)
.then(
(updatedResource: DataModels.StoredProcedure) => {
updatedResource => {
this.resource(updatedResource);
this.tabTitle(updatedResource.id);
this.node.id(updatedResource.id);
this.node.body(updatedResource.body);
this.node.body(updatedResource.body as string);
this.setBaselines();
const editorModel = this.editor() && this.editor().getModel();
editorModel && editorModel.setValue(updatedResource.body);
this.editorContent.setBaseline(updatedResource.body);
editorModel && editorModel.setValue(updatedResource.body as string);
this.editorContent.setBaseline(updatedResource.body as string);
TelemetryProcessor.traceSuccess(
Action.UpdateStoredProcedure,
{
@@ -220,18 +218,14 @@ export default class StoredProcedureTab extends ScriptTabBase {
});
}
private _getResource(): DataModels.StoredProcedure {
const resource: DataModels.StoredProcedure = <DataModels.StoredProcedure>{
_rid: this.resource()._rid,
_self: this.resource()._self,
private _getResource() {
return {
id: this.id(),
body: this.editorContent()
};
return resource;
}
private _createStoredProcedure(resource: DataModels.StoredProcedure): Q.Promise<DataModels.StoredProcedure> {
private _createStoredProcedure(resource: StoredProcedureDefinition): Promise<StoredProcedureDefinition & Resource> {
this.isExecutionError(false);
this.isExecuting(true);
const startKey: number = TelemetryProcessor.traceStart(Action.CreateStoredProcedure, {
@@ -241,7 +235,7 @@ export default class StoredProcedureTab extends ScriptTabBase {
tabTitle: this.tabTitle()
});
return createStoredProcedure(this.collection, resource)
return createStoredProcedure(this.collection.databaseId, this.collection.id(), resource)
.then(
createdResource => {
this.tabTitle(createdResource.id);
@@ -256,8 +250,8 @@ export default class StoredProcedureTab extends ScriptTabBase {
this.setBaselines();
const editorModel = this.editor() && this.editor().getModel();
editorModel && editorModel.setValue(createdResource.body);
this.editorContent.setBaseline(createdResource.body);
editorModel && editorModel.setValue(createdResource.body as string);
this.editorContent.setBaseline(createdResource.body as string);
this.node = this.collection.createStoredProcedureNode(createdResource);
TelemetryProcessor.traceSuccess(
Action.CreateStoredProcedure,
@@ -284,7 +278,7 @@ export default class StoredProcedureTab extends ScriptTabBase {
},
startKey
);
return Q.reject(createError);
return Promise.reject(createError);
}
)
.finally(() => this.isExecuting(false));

View File

@@ -1,13 +1,13 @@
import Q from "q";
import { Resource, TriggerDefinition, TriggerOperation, TriggerType } from "@azure/cosmos";
import * as Constants from "../../Common/Constants";
import * as DataModels from "../../Contracts/DataModels";
import { createTrigger } from "../../Common/dataAccess/createTrigger";
import { updateTrigger } from "../../Common/dataAccess/updateTrigger";
import editable from "../../Common/EditableUtility";
import * as ViewModels from "../../Contracts/ViewModels";
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
import ScriptTabBase from "./ScriptTabBase";
import editable from "../../Common/EditableUtility";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import Trigger from "../Tree/Trigger";
import { createTrigger, updateTrigger } from "../../Common/DocumentClientUtilityBase";
import ScriptTabBase from "./ScriptTabBase";
export default class TriggerTab extends ScriptTabBase {
public collection: ViewModels.Collection;
@@ -27,13 +27,17 @@ export default class TriggerTab extends ScriptTabBase {
super.buildCommandBarOptions();
}
public onSaveClick = (): Q.Promise<DataModels.Trigger> => {
const data: DataModels.Trigger = this._getResource();
return this._createTrigger(data);
public onSaveClick = (): Promise<TriggerDefinition & Resource> => {
return this._createTrigger({
id: this.id(),
body: this.editorContent(),
triggerOperation: this.triggerOperation() as TriggerOperation,
triggerType: this.triggerType() as TriggerType
});
};
public onUpdateClick = (): Q.Promise<any> => {
const data: DataModels.Trigger = this._getResource();
public onUpdateClick = (): Promise<any> => {
const data = this._getResource();
this.isExecutionError(false);
this.isExecuting(true);
const startKey: number = TelemetryProcessor.traceStart(Action.UpdateTrigger, {
@@ -42,14 +46,19 @@ export default class TriggerTab extends ScriptTabBase {
tabTitle: this.tabTitle()
});
return updateTrigger(this.collection, data)
return updateTrigger(this.collection.databaseId, this.collection.id(), {
id: this.id(),
body: this.editorContent(),
triggerOperation: this.triggerOperation() as TriggerOperation,
triggerType: this.triggerType() as TriggerType
})
.then(
(createdResource: DataModels.Trigger) => {
createdResource => {
this.resource(createdResource);
this.tabTitle(createdResource.id);
this.node.id(createdResource.id);
this.node.body(createdResource.body);
this.node.body(createdResource.body as string);
this.node.triggerType(createdResource.triggerOperation);
this.node.triggerOperation(createdResource.triggerOperation);
TelemetryProcessor.traceSuccess(
@@ -66,8 +75,8 @@ export default class TriggerTab extends ScriptTabBase {
this.setBaselines();
const editorModel = this.editor().getModel();
editorModel.setValue(createdResource.body);
this.editorContent.setBaseline(createdResource.body);
editorModel.setValue(createdResource.body as string);
this.editorContent.setBaseline(createdResource.body as string);
},
(createError: any) => {
this.isExecutionError(true);
@@ -89,7 +98,7 @@ export default class TriggerTab extends ScriptTabBase {
public setBaselines() {
super.setBaselines();
const resource = <DataModels.Trigger>this.resource();
const resource = this.resource();
this.triggerOperation.setBaseline(resource.triggerOperation);
this.triggerType.setBaseline(resource.triggerType);
}
@@ -109,7 +118,7 @@ export default class TriggerTab extends ScriptTabBase {
}
}
private _createTrigger(resource: DataModels.Trigger): Q.Promise<DataModels.Trigger> {
private _createTrigger(resource: TriggerDefinition): Promise<TriggerDefinition & Resource> {
this.isExecutionError(false);
this.isExecuting(true);
const startKey: number = TelemetryProcessor.traceStart(Action.CreateTrigger, {
@@ -119,9 +128,9 @@ export default class TriggerTab extends ScriptTabBase {
tabTitle: this.tabTitle()
});
return createTrigger(this.collection, resource)
return createTrigger(this.collection.databaseId, this.collection.id(), resource)
.then(
(createdResource: DataModels.Trigger) => {
createdResource => {
this.tabTitle(createdResource.id);
this.isNew(false);
this.resource(createdResource);
@@ -134,8 +143,8 @@ export default class TriggerTab extends ScriptTabBase {
this.setBaselines();
const editorModel = this.editor().getModel();
editorModel.setValue(createdResource.body);
this.editorContent.setBaseline(createdResource.body);
editorModel.setValue(createdResource.body as string);
this.editorContent.setBaseline(createdResource.body as string);
this.node = this.collection.createTriggerNode(createdResource);
TelemetryProcessor.traceSuccess(
@@ -163,22 +172,18 @@ export default class TriggerTab extends ScriptTabBase {
},
startKey
);
return Q.reject(createError);
return Promise.reject(createError);
}
)
.finally(() => this.isExecuting(false));
}
private _getResource(): DataModels.Trigger {
const resource: DataModels.Trigger = <DataModels.Trigger>{
_rid: this.resource()._rid,
_self: this.resource()._self,
private _getResource() {
return {
id: this.id(),
body: this.editorContent(),
triggerOperation: this.triggerOperation(),
triggerType: this.triggerType()
};
return resource;
}
}

View File

@@ -1,12 +1,12 @@
import Q from "q";
import { Resource, UserDefinedFunctionDefinition } from "@azure/cosmos";
import * as Constants from "../../Common/Constants";
import * as DataModels from "../../Contracts/DataModels";
import { createUserDefinedFunction } from "../../Common/dataAccess/createUserDefinedFunction";
import { updateUserDefinedFunction } from "../../Common/dataAccess/updateUserDefinedFunction";
import * as ViewModels from "../../Contracts/ViewModels";
import { Action } from "../../Shared/Telemetry/TelemetryConstants";
import ScriptTabBase from "./ScriptTabBase";
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import UserDefinedFunction from "../Tree/UserDefinedFunction";
import { createUserDefinedFunction, updateUserDefinedFunction } from "../../Common/DocumentClientUtilityBase";
import ScriptTabBase from "./ScriptTabBase";
export default class UserDefinedFunctionTab extends ScriptTabBase {
public collection: ViewModels.Collection;
@@ -19,13 +19,13 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
super.buildCommandBarOptions();
}
public onSaveClick = (): Q.Promise<DataModels.UserDefinedFunction> => {
const data: DataModels.UserDefinedFunction = this._getResource();
public onSaveClick = (): Promise<UserDefinedFunctionDefinition & Resource> => {
const data = this._getResource();
return this._createUserDefinedFunction(data);
};
public onUpdateClick = (): Q.Promise<any> => {
const data: DataModels.UserDefinedFunction = this._getResource();
public onUpdateClick = (): Promise<any> => {
const data = this._getResource();
this.isExecutionError(false);
this.isExecuting(true);
const startKey: number = TelemetryProcessor.traceStart(Action.UpdateUDF, {
@@ -35,14 +35,14 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
tabTitle: this.tabTitle()
});
return updateUserDefinedFunction(this.collection, data)
return updateUserDefinedFunction(this.collection.databaseId, this.collection.id(), data)
.then(
(createdResource: DataModels.UserDefinedFunction) => {
createdResource => {
this.resource(createdResource);
this.tabTitle(createdResource.id);
this.node.id(createdResource.id);
this.node.body(createdResource.body);
this.node.body(createdResource.body as string);
TelemetryProcessor.traceSuccess(
Action.UpdateUDF,
{
@@ -57,8 +57,8 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
this.setBaselines();
const editorModel = this.editor().getModel();
editorModel.setValue(createdResource.body);
this.editorContent.setBaseline(createdResource.body);
editorModel.setValue(createdResource.body as string);
this.editorContent.setBaseline(createdResource.body as string);
},
(createError: any) => {
this.isExecutionError(true);
@@ -93,8 +93,8 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
}
private _createUserDefinedFunction(
resource: DataModels.UserDefinedFunction
): Q.Promise<DataModels.UserDefinedFunction> {
resource: UserDefinedFunctionDefinition
): Promise<UserDefinedFunctionDefinition & Resource> {
this.isExecutionError(false);
this.isExecuting(true);
const startKey: number = TelemetryProcessor.traceStart(Action.CreateUDF, {
@@ -104,9 +104,9 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
tabTitle: this.tabTitle()
});
return createUserDefinedFunction(this.collection, resource)
return createUserDefinedFunction(this.collection.databaseId, this.collection.id(), resource)
.then(
(createdResource: DataModels.UserDefinedFunction) => {
createdResource => {
this.tabTitle(createdResource.id);
this.isNew(false);
this.resource(createdResource);
@@ -118,8 +118,8 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
this.setBaselines();
const editorModel = this.editor().getModel();
editorModel.setValue(createdResource.body);
this.editorContent.setBaseline(createdResource.body);
editorModel.setValue(createdResource.body as string);
this.editorContent.setBaseline(createdResource.body as string);
this.node = this.collection.createUserDefinedFunctionNode(createdResource);
TelemetryProcessor.traceSuccess(
@@ -147,14 +147,14 @@ export default class UserDefinedFunctionTab extends ScriptTabBase {
},
startKey
);
return Q.reject(createError);
return Promise.reject(createError);
}
)
.finally(() => this.isExecuting(false));
}
private _getResource() {
const resource: DataModels.UserDefinedFunction = <DataModels.UserDefinedFunction>{
const resource = {
_rid: this.resource()._rid,
_self: this.resource()._self,
id: this.id(),