From deae5063d3ad5b2c5087af6e538c84896369fdea Mon Sep 17 00:00:00 2001 From: Dale du Preez Date: Wed, 20 Sep 2017 15:33:03 -0400 Subject: [PATCH 1/6] Major clean-up of code - Rename toJSON() to toJSONObject() - Code formatting and consistency changes - Refactor population utilities - General code cleanup --- WidgetsDirect/Data/PopulateWidgets.cls | 251 +++++++++---------- WidgetsDirect/REST/Dispatch.cls | 305 +++++++++++++---------- WidgetsDirect/REST/Widget.cls | 278 ++++++++++++--------- WidgetsDirect/UnitTest/Abstract.cls | 30 +-- WidgetsDirect/UnitTest/Transaction.cls | 18 +- WidgetsDirect/UnitTest/Widget/ToJson.cls | 6 +- WidgetsDirect/User/WWWidget.cls | 34 ++- WidgetsDirect/User/Widget.cls | 39 +-- WidgetsDirect/User/WidgetAccessory.cls | 20 +- WidgetsDirect/Util/Build.cls | 16 +- 10 files changed, 526 insertions(+), 471 deletions(-) diff --git a/WidgetsDirect/Data/PopulateWidgets.cls b/WidgetsDirect/Data/PopulateWidgets.cls index 70bf83d..042a9e0 100644 --- a/WidgetsDirect/Data/PopulateWidgets.cls +++ b/WidgetsDirect/Data/PopulateWidgets.cls @@ -5,168 +5,147 @@ Class Data.PopulateWidgets Extends %RegisteredObject /// Run all population methods ClassMethod Populate() As %Status { - set sc=$$$OK - set sc=$$$ADDSC(sc,##class(Data.PopulateWidgets).CreateWidgets()) - set sc=$$$ADDSC(sc,##class(Data.PopulateWidgets).PopulateAccessories()) - set sc=$$$ADDSC(sc,##class(Data.PopulateWidgets).PopulateLinks()) - set sc=$$$ADDSC(sc,##class(Data.PopulateWidgets).CreateWWWidgets()) + set sc = $$$OK + set sc = $$$ADDSC(sc,##class(Data.PopulateWidgets).CreateWidgets()) + set sc = $$$ADDSC(sc,##class(Data.PopulateWidgets).PopulateAccessories()) + set sc = $$$ADDSC(sc,##class(Data.PopulateWidgets).PopulateLinks()) + set sc = $$$ADDSC(sc,##class(Data.PopulateWidgets).CreateWWWidgets()) quit sc } ClassMethod CreateWidgets() As %Status { + set tSC = $$$OK + set tSC = $$$ADDSC(tSC,..CreateWidget("Waterproof Widget", 10.99, 10, "This widget is waterproof to a depth of 100m for up to 7 hours")) + set tSC = $$$ADDSC(tSC,..CreateWidget("Motorbike Widget", 110.99, 7, "This widget attaches to all Japanese motorbikes")) + set tSC = $$$ADDSC(tSC,..CreateWidget("Woodland Widget", 7.99, 17, "This widget can identify plant and tree species")) + set tSC = $$$ADDSC(tSC,..CreateWidget("Racing Widget", 1000.98, 100, "This widget records lap time and average speed")) + set tSC = $$$ADDSC(tSC,..CreateWidget("Music Widget", 1.99, 107, "This widget can autotune all brass and string instruments")) + set tSC = $$$ADDSC(tSC,..CreateWidget("Microscope Widget", 8.99, 84, "This widget can magnify to 1000x")) - set widgetObj = ##class(User.Widget).%New() - set widgetObj.Name = "Waterproof Widget" - set widgetObj.Description = "This widget is waterproof to a depth of 100m for up to 7 hours" - set widgetObj.Price = 10.99 - set widgetObj.Quantity = 10 - do widgetObj.%Save() - - set widgetObj = ##class(User.Widget).%New() - set widgetObj.Name = "Motorbike Widget" - set widgetObj.Description = "This widget attaches to all Japanese motorbikes" - set widgetObj.Price = 110.99 - set widgetObj.Quantity = 7 - do widgetObj.%Save() - - set widgetObj = ##class(User.Widget).%New() - set widgetObj.Name = "Woodland Widget" - set widgetObj.Description = "This widget can identify plant and tree species" - set widgetObj.Price = 7.99 - set widgetObj.Quantity = 17 - do widgetObj.%Save() - - set widgetObj = ##class(User.Widget).%New() - set widgetObj.Name = "Racing Widget" - set widgetObj.Description = "This widget record lap time and average speed" - set widgetObj.Price = 1000.98 - set widgetObj.Quantity = 100 - do widgetObj.%Save() - - set widgetObj = ##class(User.Widget).%New() - set widgetObj.Name = "Music Widget" - set widgetObj.Description = "This widget can autotune all brass and string instruments" - set widgetObj.Price = 1.99 - set widgetObj.Quantity = 107 - do widgetObj.%Save() - set widgetObj = ##class(User.Widget).%New() - set widgetObj.Name = "Microscope Widget" - set widgetObj.Description = "This widget can magnify to 1000x" - set widgetObj.Price = 8.99 - set widgetObj.Quantity = 84 - do widgetObj.%Save() - - QUIT $$$OK + quit tSC } ClassMethod PopulateAccessories() { - - s acc = ##class(User.WidgetAccessory).%New() - s acc.Name = "Flotation Aid" - s acc.Description = "This accessory helps the widget to float" - s acc.Price = 18.54 - s acc.Quantity = 10 - s acc.FirstManufactured = $H-1235 - s acc.InProduction =1 - s acc.Import =1 - s acc.SKU ="AE235B6FB" - w acc.%Save() - - s acc = ##class(User.WidgetAccessory).%New() - s acc.Name = "Flight Aid" - s acc.Description = "This accessory helps the widget to fly" - s acc.Price = 180.54 - s acc.Quantity = 87 - s acc.FirstManufactured = $H-300 - s acc.InProduction =1 - s acc.Import =1 - s acc.SKU ="AE2388DBB" - w acc.%Save() - - s acc = ##class(User.WidgetAccessory).%New() - s acc.Name = "Slip Cover" - s acc.Description = "This accessory protects the widget from scratches" - s acc.Price = 7.24 - s acc.Quantity = 100 - s acc.FirstManufactured = $H-10 - s acc.InProduction =1 - s acc.Import =1 - s acc.SKU ="AE2377800" - w acc.%Save() - QUIT $$$OK + set tSC = $$$OK + + set tSC = $$$ADDSC(tSC,..CreateAccessory("Flotation Aid", 18.54, 10, $horolog-1235, 1, 1, "AE235B6FB", "This accessory helps the widget to float")) + set tSC = $$$ADDSC(tSC,..CreateAccessory("Flight Aid", 180.54, 87, $horolog-300, 1, 1, "AE2388DBB", "This accessory helps the widget to fly")) + set tSC = $$$ADDSC(tSC,..CreateAccessory("Slip Cover", 7.24, 100, $horolog-10, 1, 1, "AE2377800", "This accessory protects the widget from scratches")) + + quit tSC } -ClassMethod PopulateLinks() +ClassMethod PopulateLinks() As %Status { + set tSC = $$$OK - s link = ##class(User.WidgetAccessoryLink).%New() - d link.WidgetSetObjectId(1) - d link.AccessorySetObjectId(1) - w link.%Save() + set tSC = $$$ADDSC(tSC,..PopulateLink(1,1)) + set tSC = $$$ADDSC(tSC,..PopulateLink(1,2)) + set tSC = $$$ADDSC(tSC,..PopulateLink(1,3)) + set tSC = $$$ADDSC(tSC,..PopulateLink(2,2)) + set tSC = $$$ADDSC(tSC,..PopulateLink(3,1)) + set tSC = $$$ADDSC(tSC,..PopulateLink(5,3)) - s link = ##class(User.WidgetAccessoryLink).%New() - d link.WidgetSetObjectId(1) - d link.AccessorySetObjectId(2) - w link.%Save() + quit tSC +} - s link = ##class(User.WidgetAccessoryLink).%New() - d link.WidgetSetObjectId(1) - d link.AccessorySetObjectId(3) - w link.%Save() +ClassMethod CreateWWWidgets() As %Status +{ + set tSC = $$$OK - s link = ##class(User.WidgetAccessoryLink).%New() - d link.WidgetSetObjectId(2) - d link.AccessorySetObjectId(2) - w link.%Save() - + set tSC = $$$ADDSC(tSC,..CreateWWWidget("Widget of Power", 40.99, 40, "50011001104", "HQ", "This widget provides 110V60 or 230V50")) + set tSC = $$$ADDSC(tSC,..CreateWWWidget("Widget of Speed", 140.99, 87, "50011001105", "HQ", "This widget can travel at 143mph")) + set tSC = $$$ADDSC(tSC,..CreateWWWidget("Widget of Light", 50.99, 54, "50011001106", "HQ", "This widget can provide 10000 Candlepower")) - s link = ##class(User.WidgetAccessoryLink).%New() - d link.WidgetSetObjectId(3) - d link.AccessorySetObjectId(1) - w link.%Save() - - s link = ##class(User.WidgetAccessoryLink).%New() - d link.WidgetSetObjectId(5) - d link.AccessorySetObjectId(3) - w link.%Save() - QUIT $$$OK + quit tSC } -ClassMethod CreateWWWidgets() As %Status +ClassMethod CreateWidget( + Name As %String, + Price As %Currency, + Quantity As %Integer, + Description As %String +) As %Status { + set widgetObj = ##class(User.Widget).%New() + set widgetObj.Name = Name + set widgetObj.Price = Price + set widgetObj.Quantity = Quantity + set widgetObj.Description = Description + quit widgetObj.%Save() +} + +ClassMethod CreateAccessory( + Name As %String, + Price As %Currency, + Quantity As %Integer, + FirstManufactured As %Date, + InProduction As %Boolean, + Import As %Boolean, + SKU As %String, + Description As %String +) As %Status +{ + set accessory = ##class(User.WidgetAccessory).%New() + set accessory.Name = Name + set accessory.Price = Price + set accessory.Quantity = Quantity + set accessory.FirstManufactured = FirstManufactured + set accessory.InProduction = InProduction + set accessory.Import = Import + set accessory.SKU = SKU + set accessory.Description = Description - set widgetObj = ##class(User.WWWidget).%New() - set widgetObj.WidgetName = "Widget of Power" - set widgetObj.Summary = "This widget provides 110V60 or 230V50" - set widgetObj.Cost = 40.99 - set widgetObj.StockLevel = 40 - set widgetObj.Barcode = "50011001104" - set widgetObj.Location = "HQ" - do widgetObj.%Save() - - set widgetObj = ##class(User.WWWidget).%New() - set widgetObj.WidgetName = "Widget of Speed" - set widgetObj.Summary = "This widget can travel at 143mph" - set widgetObj.Cost = 140.99 - set widgetObj.StockLevel = 87 - set widgetObj.Barcode = "50011001105" - set widgetObj.Location = "HQ" - do widgetObj.%Save() + quit accessory.%Save() +} + +ClassMethod PopulateLink( + WidgetId As %Integer, + AccessoryId As %Integer +) As %Status +{ + set accessoryLink = ##class(User.WidgetAccessoryLink).%New() + if '##class(User.Widget).%ExistsId(WidgetId) { + quit $$$ERROR($$$LoadObjectNotFound,"User.Widget",WidgetId) + } + if '##class(User.WidgetAccessory).%ExistsId(AccessoryId) { + quit $$$ERROR($$$LoadObjectNotFound,"User.WidgetAccessory",AccessoryId) + } + set tSC = accessoryLink.WidgetSetObjectId(WidgetId) + if $$$ISERR(tSC) { + quit tSC + } + set tSC = accessoryLink.AccessorySetObjectId(AccessoryId) + if $$$ISERR(tSC) { + quit tSC + } - set widgetObj = ##class(User.WWWidget).%New() - set widgetObj.WidgetName = "Widget of Light" - set widgetObj.Summary = "This widget can provide 10000 Candlepower" - set widgetObj.Cost = 50.99 - set widgetObj.StockLevel = 54 - set widgetObj.Barcode = "50011001106" - set widgetObj.Location = "HQ" - do widgetObj.%Save() + quit accessoryLink.%Save() +} + + +ClassMethod CreateWWWidget( + Name As %String, + Cost As %Currency, + StockLevel As %Integer, + Barcode As %String, + Location As %String, + Summary As %String +) As %Status +{ + set widgetObj = ##class(User.WWWidget).%New() + set widgetObj.WidgetName = Name + set widgetObj.Cost = Cost + set widgetObj.StockLevel = StockLevel + set widgetObj.Barcode = Barcode + set widgetObj.Location = Location + set widgetObj.Summary = Summary - QUIT $$$OK + quit widgetObj.%Save() } } diff --git a/WidgetsDirect/REST/Dispatch.cls b/WidgetsDirect/REST/Dispatch.cls index 54ea9e0..5c11790 100644 --- a/WidgetsDirect/REST/Dispatch.cls +++ b/WidgetsDirect/REST/Dispatch.cls @@ -4,184 +4,221 @@ Class REST.Dispatch Extends %CSP.REST XData UrlMap [ XMLNamespace = "http://www.widgetsdirect.com/urlmap" ] { - - - + + - - - + + + + } ClassMethod HelloWorld(Name As %String = "") As %Status { - Set %response.ContentType="application/json" + set %response.ContentType = "application/json" - SET retObj = {} - SET retMessage = "Welcome to Widgets Direct "_Name - SET retObj.Message = retMessage + set retObj = {} + set retMessage = "Welcome to Widgets Direct "_Name + set retObj.Message = retMessage + write retObj.%ToJSON() - WRITE retObj.%ToJSON() - QUIT $$$OK + quit $$$OK } ClassMethod version() As %Status { - Set %response.ContentType="application/json" + set %response.ContentType = "application/json" - SET retObj = {} - SET retMessage = $zv_":"_$zdt($h,3)_##class(%PopulateUtils).City() - SET retObj.Message = retMessage + set retObj = {} + set retMessage = $zversion_":"_$zdatetime($horolog,3)_##class(%PopulateUtils).City() + set retObj.Message = retMessage - - WRITE retObj.%ToJSON() - QUIT $$$OK + write retObj.%ToJSON() + + quit $$$OK } ClassMethod GetAllWidgets() As %Status { - Set %response.ContentType="application/json" - - SET retObj = {} - SET widgetAry = [] - &SQL(DECLARE WidgetCurs CURSOR FOR - SELECT - %Id - INTO :Id - FROM SQLUser.Widget - where Deleted <> 1 or Deleted is null - ) + set %response.ContentType = "application/json" + + set retObj = {} + set tSC = $$$OK + set widgetAry = [] + + &SQL(DECLARE WidgetCursor CURSOR FOR + SELECT + %Id + INTO :WidgetId + FROM SQLUser.Widget + WHERE Deleted <> 1 OR Deleted is null + ) - &SQL(OPEN WidgetCurs) - - For { &SQL(FETCH WidgetCurs) - Quit:SQLCODE - set widgetObj = ##class(User.Widget).%OpenId(Id) - do widgetAry.%Push(widgetObj.toJSON(1)) - } - &SQL(CLOSE WidgetCurs) + &SQL(OPEN WidgetCursor) + + for { + &SQL(FETCH WidgetCursor) + quit:SQLCODE + set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) + if $$$ISERR(tSC) { + quit + } + do widgetAry.%Push(widgetObj.toJSONObject(1)) + } + if (SQLCODE && (SQLCODE '= 100)) { + set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) + // delay quit until after we close the cursor + } + &SQL(CLOSE WidgetCursor) + if $$$ISERR(tSC) { + quit tSC + } // let's get the WWWidgets - &SQL(DECLARE WWWidgetCurs CURSOR FOR - SELECT - %Id - INTO :Id - FROM SQLUser.WWWidget - ) - - &SQL(OPEN WWWidgetCurs) - - For { &SQL(FETCH WWWidgetCurs) - Quit:SQLCODE - set widgetObj = ##class(User.WWWidget).%OpenId(Id) - do widgetAry.%Push(widgetObj.toJSON(1)) - } - &SQL(CLOSE WWWidgetCurs) - SET retObj.Widgets = widgetAry - - WRITE retObj.%ToJSON() - QUIT $$$OK + &SQL(DECLARE WWWidgetCursor CURSOR FOR + SELECT + %Id + INTO :WWWidgetId + FROM SQLUser.WWWidget + ) + + &SQL(OPEN WWWidgetCursor) + + for { + &SQL(FETCH WWWidgetCursor) + quit:SQLCODE + set widgetObj = ##class(User.WWWidget).%OpenId(WWWidgetId,,.tSC) + if $$$ISERR(tSC) { + quit + } + do widgetAry.%Push(widgetObj.toJSONObject(1)) + } + if (SQLCODE && (SQLCODE '= 100)) { + set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) + // delay quit until after we close the cursor + } + &SQL(CLOSE WWWidgetCursor) + if $$$ISERR(tSC) { + quit tSC + } + + set retObj.Widgets = widgetAry + + write retObj.%ToJSON() + + quit $$$OK } ClassMethod GetWidgetById(WidgetId As %Integer) As %Status { - Set %response.ContentType="application/json" + set %response.ContentType = "application/json" set tSC = $$$OK - SET retObj = {} - SET widgetAry = [] - - // Safely retrieve object - Kill %objlasterror - set widgetObj = ##class(User.Widget).%OpenId(WidgetId) - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - If $$$ISERR(tSC) { Quit tSC } - // Set output to JSON representation of object - SET retObj.Widget = widgetObj.toJSON(1) - - WRITE retObj.%ToJSON() - QUIT tSC + set retObj = {} + + if '##class(User.Widget).%ExistsId(WidgetId) { + set %response.Status = ..#HTTP404NOTFOUND + } + else { + set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) + if $$$ISERR(tSC) { + quit tSC + } + // Set output to JSON representation of object + set retObj.Widget = widgetObj.toJSONObject(1) + } + + write retObj.%ToJSON() + + quit tSC } ClassMethod AddNewWidget() As %Status { - Set %response.ContentType="application/json" - - SET retObj = {} - - Kill %objlasterror - set widgetObj = ##class(User.Widget).%New() - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - Set updateJSON = %request.Content.Read() - - Set tSC = widgetObj.fromJSON(updateJSON) - - - If $$$ISERR(tSC) { Quit tSC } - - WRITE widgetObj.toJSON().%ToJSON() - QUIT $$$OK + set %response.ContentType = "application/json" + + set widgetObj = ##class(User.Widget).%New() + set updateJSON = %request.Content.Read($$$MaxLocalLength) + + set tSC = widgetObj.fromJSON(updateJSON) + if $$$ISERR(tSC) { + quit tSC + } + + write widgetObj.toJSONObject().%ToJSON() + + quit tSC } -ClassMethod UpdateWidgetById(widgetid As %Integer) As %Status +ClassMethod UpdateWidgetById(WidgetId As %String) As %Status { - Set %response.ContentType="application/json" + set %response.ContentType = "application/json" - SET retObj = {} + set retObj = {} + + set widgetClass = "User.Widget" + set internalWidgetId = WidgetId + if ($extract(WidgetId,1) = "W") { + set widgetClass = "User.WWWidget" + set internalWidgetId = $extract(WidgetId,2,*) + } + + if '$classmethod(widgetClass,"%ExistsId",internalWidgetId) { + set %response.Status = ..#HTTP404NOTFOUND + } + else { + set widgetObj = $classmethod(widgetClass,"%OpenId",internalWidgetId,,.tSC) + if $$$ISERR(tSC) { + quit tSC + } + + set updateJSON = %request.Content.Read($$$MaxLocalLength) - Kill %objlasterror - if ($e(widgetid)="W"){ - set widgetObj = ##class(User.WWWidget).%OpenId($e(widgetid,2,*)) + set tSC = widgetObj.fromJSON(updateJSON) + if $$$ISERR(tSC) { + quit tSC } - else{ - set widgetObj = ##class(User.Widget).%OpenId(widgetid) + + set retObj = widgetObj.toJSONObject() } - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - Set updateJSON = %request.Content.Read() - - Set tSC = widgetObj.fromJSON(updateJSON) - - - If $$$ISERR(tSC) { Quit tSC } - - WRITE widgetObj.toJSON().%ToJSON() - QUIT $$$OK + + write retObj.%ToJSON() + + quit $$$OK } -ClassMethod DeleteWidgetById(widgetid As %Integer) As %Status +ClassMethod DeleteWidgetById(WidgetId As %Integer) As %Status { - Set %response.ContentType="application/json" - - SET retObj = {} - - Kill %objlasterror - set widgetObj = ##class(User.Widget).%OpenId(widgetid) - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - - - set widgetObj.Deleted=1 - set tSC = widgetObj.%Save() - - If $$$ISERR(tSC) { Quit tSC } - - WRITE widgetObj.toJSON().%ToJSON() - QUIT $$$OK + set %response.ContentType = "application/json" + + set retObj = {} + set tSC = $$$OK + + if '##class(User.Widget).%ExistsId(WidgetId) { + set %response.Status = ..#HTTP404NOTFOUND + } + else { + set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) + if $$$ISERR(tSC) { + quit tSC + } + + set widgetObj.Deleted = 1 + set tSC = widgetObj.%Save() + if $$$ISERR(tSC) { + quit tSC + } + + set retObj = widgetObj.toJSONObject() + } + + write retObj.%ToJSON() + + quit tSC } } diff --git a/WidgetsDirect/REST/Widget.cls b/WidgetsDirect/REST/Widget.cls index 4a01b4c..527dd22 100644 --- a/WidgetsDirect/REST/Widget.cls +++ b/WidgetsDirect/REST/Widget.cls @@ -5,154 +5,190 @@ Class REST.Widget Extends %CSP.REST XData UrlMap [ XMLNamespace = "http://www.widgetsdirect.com/urlmap" ] { - - - - - + + + + + } ClassMethod GetAllWidgets() As %Status { - Set %response.ContentType="application/json" - - SET retObj = {} - SET widgetAry = [] - &SQL(DECLARE WidgetCurs CURSOR FOR - SELECT - %Id - INTO :Id - FROM SQLUser.Widget - where Deleted <> 1 or Deleted is null - ) - - &SQL(OPEN WidgetCurs) - - For { &SQL(FETCH WidgetCurs) - Quit:SQLCODE - set widgetObj = ##class(User.Widget).%OpenId(Id) - do widgetAry.%Push(widgetObj.toJSON(1)) - } - &SQL(CLOSE WidgetCurs) + set %response.ContentType = "application/json" + + set retObj = {} + set widgetAry = [] + set tSC = $$$OK + &SQL(DECLARE WidgetCursor CURSOR FOR + SELECT + %Id + INTO :WidgetId + FROM SQLUser.Widget + WHERE Deleted <> 1 OR Deleted is null + ) + + &SQL(OPEN WidgetCursor) + + for { + &SQL(FETCH WidgetCursor) + quit:SQLCODE + set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) + if $$$ISERR(tSC) { + quit + } + do widgetAry.%Push(widgetObj.toJSONObject(1)) + } + if (SQLCODE && (SQLCODE '= 100)) { + set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) + // delay quit until after we close the cursor + } + &SQL(CLOSE WidgetCursor) + if $$$ISERR(tSC) { + quit tSC + } // let's get the WWWidgets - &SQL(DECLARE WWWidgetCurs CURSOR FOR - SELECT - %Id - INTO :Id - FROM SQLUser.WWWidget - ) - - &SQL(OPEN WWWidgetCurs) - - For { &SQL(FETCH WWWidgetCurs) - Quit:SQLCODE - set widgetObj = ##class(User.WWWidget).%OpenId(Id) - do widgetAry.%Push(widgetObj.toJSON(1)) - } - &SQL(CLOSE WWWidgetCurs) - SET retObj.Widgets = widgetAry - - WRITE retObj.%ToJSON() - QUIT $$$OK + &SQL(DECLARE WWWidgetCursor CURSOR FOR + SELECT + %Id + INTO :WWWidgetId + FROM SQLUser.WWWidget + ) + + &SQL(OPEN WWWidgetCursor) + + for { + &SQL(FETCH WWWidgetCursor) + quit:SQLCODE + set widgetObj = ##class(User.WWWidget).%OpenId(WWWidgetId,,.tSC) + if $$$ISERR(tSC) { + quit + } + do widgetAry.%Push(widgetObj.toJSONObject(1)) + } + if (SQLCODE && (SQLCODE '= 100)) { + set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) + // delay quit until after we close the cursor + } + &SQL(CLOSE WWWidgetCursor) + if $$$ISERR(tSC) { + quit tSC + } + + set retObj.Widgets = widgetAry + + write retObj.%ToJSON() + + quit tSC } ClassMethod GetWidgetById(WidgetId As %Integer) As %Status { - Set %response.ContentType="application/json" + set %response.ContentType = "application/json" set tSC = $$$OK - SET retObj = {} - SET widgetAry = [] - - // Safely retrieve object - Kill %objlasterror - set widgetObj = ##class(User.Widget).%OpenId(WidgetId) - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - If $$$ISERR(tSC) { Quit tSC } - // Set output to JSON representation of object - SET retObj.Widget = widgetObj.toJSON(1) - - WRITE retObj.%ToJSON() - QUIT tSC + set retObj = {} + + if '##class(User.Widget).%ExistsId(WidgetId) { + set %response.Status = ..#HTTP404NOTFOUND + } + else { + set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) + if $$$ISERR(tSC) { + quit tSC + } + // Set output to JSON representation of object + set retObj.Widget = widgetObj.toJSONObject(1) + } + + write retObj.%ToJSON() + + quit tSC } ClassMethod AddNewWidget() As %Status { - Set %response.ContentType="application/json" - - SET retObj = {} - - Kill %objlasterror - set widgetObj = ##class(User.Widget).%New() - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - Set updateJSON = %request.Content.Read() - - Set tSC = widgetObj.fromJSON(updateJSON) - - - If $$$ISERR(tSC) { Quit tSC } - - WRITE widgetObj.toJSON().%ToJSON() - QUIT $$$OK + set %response.ContentType = "application/json" + + set widgetObj = ##class(User.Widget).%New() + set updateJSON = %request.Content.Read($$$MaxLocalLength) + + set tSC = widgetObj.fromJSON(updateJSON) + if $$$ISERR(tSC) { + quit tSC + } + + write widgetObj.toJSONObject().%ToJSON() + + quit tSC } -ClassMethod UpdateWidgetById(widgetid As %Integer) As %Status +ClassMethod UpdateWidgetById(WidgetId As %String) As %Status { - Set %response.ContentType="application/json" + set %response.ContentType = "application/json" - SET retObj = {} + set retObj = {} + set tSC = $$$OK + + set widgetClass = "User.Widget" + set internalWidgetId = WidgetId + if ($extract(WidgetId,1) = "W") { + set widgetClass = "User.WWWidget" + set internalWidgetId = $extract(WidgetId,2,*) + } - Kill %objlasterror - if ($e(widgetid)="W"){ - set widgetObj = ##class(User.WWWidget).%OpenId($e(widgetid,2,*)) + if '$classmethod(widgetClass,"%ExistsId",internalWidgetId) { + set %response.Status = ..#HTTP404NOTFOUND + } + else { + set widgetObj = $classmethod(widgetClass,"%OpenId",internalWidgetId,,.tSC) + if $$$ISERR(tSC) { + quit tSC + } + + set updateJSON = %request.Content.Read($$$MaxLocalLength) + + set tSC = widgetObj.fromJSON(updateJSON) + if $$$ISERR(tSC) { + quit tSC } - else{ - set widgetObj = ##class(User.Widget).%OpenId(widgetid) + + set retObj = widgetObj.toJSONObject() } - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - Set updateJSON = %request.Content.Read() - - Set tSC = widgetObj.fromJSON(updateJSON) - - - If $$$ISERR(tSC) { Quit tSC } - - WRITE widgetObj.toJSON().%ToJSON() - QUIT $$$OK + + write retObj.%ToJSON() + + quit tSC } -ClassMethod DeleteWidgetById(widgetid As %Integer) As %Status +ClassMethod DeleteWidgetById(WidgetId As %Integer) As %Status { - Set %response.ContentType="application/json" - - SET retObj = {} - - Kill %objlasterror - set widgetObj = ##class(User.Widget).%OpenId(widgetid) - If '$IsObject(widgetObj) { - // Object with this ID does not exist - If $Data(%objlasterror) { Set tSC=%objlasterror } - } - - - set widgetObj.Deleted=1 - set tSC = widgetObj.%Save() - - If $$$ISERR(tSC) { Quit tSC } - - WRITE widgetObj.toJSON().%ToJSON() - QUIT $$$OK + set %response.ContentType = "application/json" + + set retObj = {} + set tSC = $$$OK + + if '##class(User.Widget).%ExistsId(WidgetId) { + set %response.Status = ..#HTTP404NOTFOUND + } + else { + set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) + if $$$ISERR(tSC) { + quit tSC + } + set widgetObj.Deleted = 1 + set tSC = widgetObj.%Save() + if $$$ISERR(tSC) { + quit tSC + } + + set retObj = widgetObj.toJSONObject() + } + + write retObj.%ToJSON() + + quit tSC } } diff --git a/WidgetsDirect/UnitTest/Abstract.cls b/WidgetsDirect/UnitTest/Abstract.cls index 5479f98..878ddfc 100755 --- a/WidgetsDirect/UnitTest/Abstract.cls +++ b/WidgetsDirect/UnitTest/Abstract.cls @@ -8,49 +8,49 @@ Class UnitTest.Abstract Extends (%UnitTest.TestCase, %CSP.Page) /// Your test title Parameter TITLE As %String; -/// default maximum global accesses for a single row based method call -/// can overide per class or pur explicitly in each method call +/// default maximum global accesses for a single row based method call +/// can overide per class or put explicitly in each method call Parameter GlobalsMaxMethod = 100; -/// default maximum global accesses for a query -/// can overide per class or pur explicitly in each method call +/// default maximum global accesses for a query +/// can overide per class or put explicitly in each method call Parameter GlobalsMaxQuery = 1000; -/// Use evaluation methods to test performance +/// Use evaluation methods to test performance Property PerformanceTest As %Boolean [ InitialExpression = {..UsePerformanceTest()} ]; -/// This method is used to display a test page. +/// This method is used to display a test page. ClassMethod OnPage() As %Status [ ServerOnly = 1 ] { lock - do ##class(UnitTest.Formatter).Run(..%ClassName(1)) + do ##class(UnitTest.Formatter).Run($classname($this)) quit $$$OK } -/// Run this specific test (in debug mode) +/// Run this specific test (in debug mode) ClassMethod Run(qualifiers As %String = "") As %Status [ ProcedureBlock = 1 ] { - set sc=##class(UnitTest.Manager).RunTest(..%ClassName(1),"/recursive=0"_qualifiers) + set sc=##class(UnitTest.Manager).RunTest($classname($this),"/recursive=0"_qualifiers) quit sc } -/// Run this test and all its children +/// Run this test and all its children ClassMethod RunRecursive(qualifiers As %String = "") As %Status [ ProcedureBlock = 1 ] { - set sc=##class(UnitTest.Manager).RunTest(..%ClassName(1),"/recursive=1"_qualifiers) + set sc=##class(UnitTest.Manager).RunTest($classname($this),"/recursive=1"_qualifiers) quit sc } -/// Execute expression using current object's context +/// Execute expression using current object's context Method Execute(expr) As %String { new %result xecute "s %result="_expr quit %result } -/// Log execution HTML result. Now it is stored as a log message. +/// Log execution HTML result. Now it is stored as a log message. Method LogResult(result) { set oldDisplay=..Manager.Display @@ -59,13 +59,13 @@ Method LogResult(result) set ..Manager.Display=oldDisplay quit } + /// Get last test result instance id, dateTime, status, duration and HTML /// All this information is stored in ^UnitTest.Result - ClassMethod GetLastResult(ByRef dateTime, ByRef status, ByRef duration, ByRef html, ByRef suite) As %String [ ProcedureBlock = 1 ] { set (dateTime,status,duration,html,suite)="" - set name=..%ClassName(1) + set name=$classname($this) &SQL(SELECT Duration, TestSuite->TestInstance, TestSuite->Name, TestSuite->TestInstance->DateTime INTO :qDuration, :qInstance, :qSuite, :qDateTime FROM %IGNOREINDICES %UnitTest_Result.TestCase.idxName %UnitTest_Result.TestCase diff --git a/WidgetsDirect/UnitTest/Transaction.cls b/WidgetsDirect/UnitTest/Transaction.cls index a9b062a..0121342 100755 --- a/WidgetsDirect/UnitTest/Transaction.cls +++ b/WidgetsDirect/UnitTest/Transaction.cls @@ -6,32 +6,34 @@ Class UnitTest.Transaction Extends UnitTest.Abstract Method OnBeforeAllTests() As %Status { tstart - if ..Manager.Debug set %debug=1 + if ..Manager.Debug { + set %debug = 1 + } quit $$$OK } Method OnAfterAllTests() As %Status { - set Status=$$$OK + set status = $$$OK trollback // Kill newly created ID counter globals // ^||FactoryKill is populated by UnitTest.Factory - set i="" + set i = "" for { - set i=$order(^||FactoryKill(i)) + set i = $order(^||FactoryKill(i)) quit:i="" - set %d(0)=$list(^||FactoryKill(i),2) - try{ + set %d(0) = $list(^||FactoryKill(i),2) + try { xecute "kill "_$list(^||FactoryKill(i),1) } catch ex { - set Status = $$$ADDSC(Status, ex.AsStatus()) + set status = $$$ADDSC(status, ex.AsStatus()) } } kill ^||FactoryKill - quit Status + quit status } } \ No newline at end of file diff --git a/WidgetsDirect/UnitTest/Widget/ToJson.cls b/WidgetsDirect/UnitTest/Widget/ToJson.cls index d573aad..b19b3ec 100755 --- a/WidgetsDirect/UnitTest/Widget/ToJson.cls +++ b/WidgetsDirect/UnitTest/Widget/ToJson.cls @@ -2,9 +2,9 @@ Class UnitTest.Widget.ToJson Extends UnitTest.Transaction { Method TestSingleWidget() As %Status { - set widgetId=##class(UnitTest.Factory).Add("User.Widget",$lb($lb("Name","Widget1"))) - set Widget=##class(User.Widget).%OpenId(widgetId) - set WidgetJson=Widget.toJSON().%ToJSON() + set widgetId = ##class(UnitTest.Factory).Add("User.Widget",$lb($lb("Name","Widget1"))) + set Widget = ##class(User.Widget).%OpenId(widgetId) + set WidgetJson=Widget.toJSONObject().%ToJSON() do $$$AssertTrue(WidgetJson["""Name"":""Widget1""","Widget JSON contains widget name") quit $$$OK } diff --git a/WidgetsDirect/User/WWWidget.cls b/WidgetsDirect/User/WWWidget.cls index d5f044f..5bebfba 100644 --- a/WidgetsDirect/User/WWWidget.cls +++ b/WidgetsDirect/User/WWWidget.cls @@ -14,7 +14,7 @@ Property Barcode As %String; Property Location As %String; -Method toJSON(traverseRelationships As %Boolean = 0) As %String +Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { set jsonReturn = {} @@ -29,27 +29,25 @@ Method toJSON(traverseRelationships As %Boolean = 0) As %String quit jsonReturn } -Method fromJSON(json As %String) As %String +Method fromJSON(json As %String) As %Status { - set jsonObj = {}.%FromJSON(json) + set jsonObj = ##class(%Library.DynamicObject).%FromJSON(json) set propsIterator = jsonObj.%GetIterator() - While (propsIterator.%GetNext(.key,.value)) { - if (key="Name"){ - set ..WidgetName=value - } elseif (key="Description"){ - set ..Summary=value - } elseif (key="Price"){ - set ..Cost=value - } elseif (key="Quantity"){ - set ..StockLevel=value - } elseif ((key="Barcode")||(key="Location")){ - Set $PROPERTY($this, key) = value - } - - - } + while (propsIterator.%GetNext(.key,.value)) { + if (key="Name"){ + set ..WidgetName=value + } elseif (key="Description"){ + set ..Summary=value + } elseif (key="Price"){ + set ..Cost=value + } elseif (key="Quantity"){ + set ..StockLevel=value + } elseif ((key="Barcode")||(key="Location")){ + set $PROPERTY($this, key) = value + } + } quit ..%Save() } diff --git a/WidgetsDirect/User/Widget.cls b/WidgetsDirect/User/Widget.cls index 60f7492..cb46870 100644 --- a/WidgetsDirect/User/Widget.cls +++ b/WidgetsDirect/User/Widget.cls @@ -14,7 +14,7 @@ Property Deleted as %Boolean; Relationship Accessories As User.WidgetAccessoryLink [ Cardinality = many, Inverse = Widget ]; -Method toJSON(traverseRelationships As %Boolean = 0) As %String +Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { set jsonReturn = {} @@ -24,32 +24,33 @@ Method toJSON(traverseRelationships As %Boolean = 0) As %String set jsonReturn.Price = ..Price set jsonReturn.Quantity = ..Quantity - if traverseRelationships { - set accessorykey = "" - set accessoryList = [] - Do { - set accLink = ..Accessories.GetNext(.accessorykey) - If (accLink '= "") { do accessoryList.%Push(accLink.Accessory.toJSON()) } - } While (accessorykey '= "") - set jsonReturn.Accessories = accessoryList + set accessoryKey = "" + set accessoryList = [] + do { + set accLink = ..Accessories.GetNext(.accessoryKey) + if $isobject(accLink) && $isobject(accLink.Accessory) { + do accessoryList.%Push(accLink.Accessory.toJSONObject()) + } + } while (accessoryKey '= "") + set jsonReturn.Accessories = accessoryList } quit jsonReturn } -Method fromJSON(json As %String) As %String +Method fromJSON(json As %String) As %Status { - set jsonObj = {}.%FromJSON(json) - - set propsIterator = jsonObj.%GetIterator() - While (propsIterator.%GetNext(.key,.value)) { - if ((key="Name")||(key="Description")||(key="Price")||(key="Quantity")){ - Set $PROPERTY($this, key) = value - } - } - + set jsonObj = ##class(%Library.DynamicObject).%FromJSON(json) + + set propsIterator = jsonObj.%GetIterator() + while (propsIterator.%GetNext(.key,.value)) { + if ((key="Name")||(key="Description")||(key="Price")||(key="Quantity")) { + set $PROPERTY($this, key) = value + } + } + quit ..%Save() } diff --git a/WidgetsDirect/User/WidgetAccessory.cls b/WidgetsDirect/User/WidgetAccessory.cls index ccad3ed..6c43c3e 100644 --- a/WidgetsDirect/User/WidgetAccessory.cls +++ b/WidgetsDirect/User/WidgetAccessory.cls @@ -20,7 +20,7 @@ Property SKU As %String; Relationship Widgets As User.WidgetAccessoryLink [ Cardinality = many, Inverse = Accessory ]; -Method toJSON(traverseRelationships As %Boolean = 0) As %String +Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { set jsonReturn = {} @@ -29,19 +29,21 @@ Method toJSON(traverseRelationships As %Boolean = 0) As %String set jsonReturn.Description = ..Description set jsonReturn.Price = ..Price set jsonReturn.Quantity = ..Quantity - set jsonReturn.FirstManufactured = $zd(..FirstManufactured,4) + set jsonReturn.FirstManufactured = $zdate(..FirstManufactured,4) set jsonReturn.InProduction = ..InProduction set jsonReturn.Import = ..Import set jsonReturn.SKU = ..SKU if traverseRelationships { - set widgetkey = "" - set widgetList = [] - Do { - set widgetLink = ..Widgets.GetNext(.widgetkey) - If (widgetLink '= "") { do widgetList.%Push(widgetLink.Widget.toJSON()) } - } While (widgetkey '= "") - set jsonReturn.Widgets = widgetList + set widgetKey = "" + set widgetList = [] + do { + set widgetLink = ..Widgets.GetNext(.widgetKey) + if $isobject(widgetLink) && $isobject(widgetLink.Widget) { + do widgetList.%Push(widgetLink.Widget.toJSONObject()) + } + } while (widgetKey '= "") + set jsonReturn.Widgets = widgetList } quit jsonReturn diff --git a/WidgetsDirect/Util/Build.cls b/WidgetsDirect/Util/Build.cls index 395f285..bae6b15 100644 --- a/WidgetsDirect/Util/Build.cls +++ b/WidgetsDirect/Util/Build.cls @@ -2,7 +2,7 @@ Class Util.Build { /// This is a build manifest. Here we describe build steps in XML format. -XData BuildManifest +XData BuildManifest [ XMLNamespace = INSTALLER ] { @@ -47,16 +47,16 @@ XData BuildManifest } /// This method is called to pass parameters into generated build method -ClassMethod Build(pNameSpace As %String = "BUILD", pSrcDir As %String = "C:\source\", pDbDir) As %Status +ClassMethod Build(pNameSpace As %String = "BUILD", pSrcDir As %String = "C:\source\", pDatabaseDir As %String) As %Status { - set vars("NAMESPACE")=$g(pNameSpace) - set vars("SRCDIR")=##class(%File).NormalizeDirectory($g(pSrcDir)) - set vars("DBDIR")=$g(pDbDir,vars("SRCDIR")_"db") + set vars("NAMESPACE") = $get(pNameSpace) + set vars("SRCDIR") = ##class(%File).NormalizeDirectory($get(pSrcDir)) + set vars("DBDIR") = $get(pDatabaseDir,vars("SRCDIR")_"db") - Set pLogLevel=3 - Set sc=..RunBuildManifest(.vars, .pLogLevel) + set logLevel = 3 + set sc = ..RunBuildManifest(.vars, logLevel) - Quit sc + quit sc } /// This is a standard %Installer method generator whose code is generated by XGL. From 98d8489d53333907a4a2a3e2764f7e09d3935797 Mon Sep 17 00:00:00 2001 From: Dale du Preez Date: Wed, 20 Sep 2017 16:57:23 -0400 Subject: [PATCH 2/6] Fixes based on comments from Bill Sherman - Whitespace cleanup - Fix some typos --- WidgetsDirect/UnitTest/Abstract.cls | 4 +-- WidgetsDirect/User/WWWidget.cls | 42 ++++++++++++++--------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/WidgetsDirect/UnitTest/Abstract.cls b/WidgetsDirect/UnitTest/Abstract.cls index 878ddfc..8c5e5c4 100755 --- a/WidgetsDirect/UnitTest/Abstract.cls +++ b/WidgetsDirect/UnitTest/Abstract.cls @@ -10,11 +10,11 @@ Class UnitTest.Abstract Extends (%UnitTest.TestCase, %CSP.Page) Parameter TITLE As %String; /// default maximum global accesses for a single row based method call -/// can overide per class or put explicitly in each method call +/// can override per class or put explicitly in each method call Parameter GlobalsMaxMethod = 100; /// default maximum global accesses for a query -/// can overide per class or put explicitly in each method call +/// can override per class or put explicitly in each method call Parameter GlobalsMaxQuery = 1000; /// Use evaluation methods to test performance diff --git a/WidgetsDirect/User/WWWidget.cls b/WidgetsDirect/User/WWWidget.cls index 5bebfba..5ce3e46 100644 --- a/WidgetsDirect/User/WWWidget.cls +++ b/WidgetsDirect/User/WWWidget.cls @@ -17,14 +17,14 @@ Property Location As %String; Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { - set jsonReturn = {} - set jsonReturn.Id = "W"_..%Id() - set jsonReturn.Name = ..WidgetName - set jsonReturn.Description = ..Summary - set jsonReturn.Price = ..Cost - set jsonReturn.Quantity = ..StockLevel - set jsonReturn.Barcode = ..Barcode - set jsonReturn.Location = ..Location + set jsonReturn = {} + set jsonReturn.Id = "W"_..%Id() + set jsonReturn.Name = ..WidgetName + set jsonReturn.Description = ..Summary + set jsonReturn.Price = ..Cost + set jsonReturn.Quantity = ..StockLevel + set jsonReturn.Barcode = ..Barcode + set jsonReturn.Location = ..Location quit jsonReturn } @@ -33,22 +33,22 @@ Method fromJSON(json As %String) As %Status { set jsonObj = ##class(%Library.DynamicObject).%FromJSON(json) - - set propsIterator = jsonObj.%GetIterator() - while (propsIterator.%GetNext(.key,.value)) { - if (key="Name"){ - set ..WidgetName=value - } elseif (key="Description"){ - set ..Summary=value - } elseif (key="Price"){ - set ..Cost=value - } elseif (key="Quantity"){ - set ..StockLevel=value - } elseif ((key="Barcode")||(key="Location")){ + + set propsIterator = jsonObj.%GetIterator() + while (propsIterator.%GetNext(.key,.value)) { + if (key = "Name") { + set ..WidgetName = value + } elseif (key = "Description") { + set ..Summary = value + } elseif (key = "Price") { + set ..Cost = value + } elseif (key = "Quantity") { + set ..StockLevel = value + } elseif ((key = "Barcode") || (key = "Location")) { set $PROPERTY($this, key) = value } } - + quit ..%Save() } From 1444f6c47ef1b02c933fc6f05d866e443ec8669b Mon Sep 17 00:00:00 2001 From: Dale du Preez Date: Wed, 20 Sep 2017 17:08:01 -0400 Subject: [PATCH 3/6] Use (SQLCODE < 0) for SQL checks --- WidgetsDirect/REST/Widget.cls | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WidgetsDirect/REST/Widget.cls b/WidgetsDirect/REST/Widget.cls index 527dd22..259e3ed 100644 --- a/WidgetsDirect/REST/Widget.cls +++ b/WidgetsDirect/REST/Widget.cls @@ -39,7 +39,7 @@ ClassMethod GetAllWidgets() As %Status } do widgetAry.%Push(widgetObj.toJSONObject(1)) } - if (SQLCODE && (SQLCODE '= 100)) { + if (SQLCODE < 0) { set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) // delay quit until after we close the cursor } @@ -67,7 +67,7 @@ ClassMethod GetAllWidgets() As %Status } do widgetAry.%Push(widgetObj.toJSONObject(1)) } - if (SQLCODE && (SQLCODE '= 100)) { + if (SQLCODE < 0) { set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) // delay quit until after we close the cursor } From 655923963233292b2e41f4db0f04f18ea5ce9dc9 Mon Sep 17 00:00:00 2001 From: Dale du Preez Date: Wed, 20 Sep 2017 17:13:20 -0400 Subject: [PATCH 4/6] Rename toJSONObject() to toDynamicObject() --- WidgetsDirect/REST/Dispatch.cls | 12 ++++++------ WidgetsDirect/REST/Widget.cls | 12 ++++++------ WidgetsDirect/UnitTest/Widget/ToJson.cls | 2 +- WidgetsDirect/User/WWWidget.cls | 2 +- WidgetsDirect/User/Widget.cls | 4 ++-- WidgetsDirect/User/WidgetAccessory.cls | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/WidgetsDirect/REST/Dispatch.cls b/WidgetsDirect/REST/Dispatch.cls index 5c11790..cb834bf 100644 --- a/WidgetsDirect/REST/Dispatch.cls +++ b/WidgetsDirect/REST/Dispatch.cls @@ -67,7 +67,7 @@ ClassMethod GetAllWidgets() As %Status if $$$ISERR(tSC) { quit } - do widgetAry.%Push(widgetObj.toJSONObject(1)) + do widgetAry.%Push(widgetObj.toDynamicObject(1)) } if (SQLCODE && (SQLCODE '= 100)) { set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) @@ -95,7 +95,7 @@ ClassMethod GetAllWidgets() As %Status if $$$ISERR(tSC) { quit } - do widgetAry.%Push(widgetObj.toJSONObject(1)) + do widgetAry.%Push(widgetObj.toDynamicObject(1)) } if (SQLCODE && (SQLCODE '= 100)) { set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) @@ -129,7 +129,7 @@ ClassMethod GetWidgetById(WidgetId As %Integer) As %Status quit tSC } // Set output to JSON representation of object - set retObj.Widget = widgetObj.toJSONObject(1) + set retObj.Widget = widgetObj.toDynamicObject(1) } write retObj.%ToJSON() @@ -149,7 +149,7 @@ ClassMethod AddNewWidget() As %Status quit tSC } - write widgetObj.toJSONObject().%ToJSON() + write widgetObj.toDynamicObject().%ToJSON() quit tSC } @@ -183,7 +183,7 @@ ClassMethod UpdateWidgetById(WidgetId As %String) As %Status quit tSC } - set retObj = widgetObj.toJSONObject() + set retObj = widgetObj.toDynamicObject() } write retObj.%ToJSON() @@ -213,7 +213,7 @@ ClassMethod DeleteWidgetById(WidgetId As %Integer) As %Status quit tSC } - set retObj = widgetObj.toJSONObject() + set retObj = widgetObj.toDynamicObject() } write retObj.%ToJSON() diff --git a/WidgetsDirect/REST/Widget.cls b/WidgetsDirect/REST/Widget.cls index 259e3ed..3449484 100644 --- a/WidgetsDirect/REST/Widget.cls +++ b/WidgetsDirect/REST/Widget.cls @@ -37,7 +37,7 @@ ClassMethod GetAllWidgets() As %Status if $$$ISERR(tSC) { quit } - do widgetAry.%Push(widgetObj.toJSONObject(1)) + do widgetAry.%Push(widgetObj.toDynamicObject(1)) } if (SQLCODE < 0) { set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) @@ -65,7 +65,7 @@ ClassMethod GetAllWidgets() As %Status if $$$ISERR(tSC) { quit } - do widgetAry.%Push(widgetObj.toJSONObject(1)) + do widgetAry.%Push(widgetObj.toDynamicObject(1)) } if (SQLCODE < 0) { set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) @@ -99,7 +99,7 @@ ClassMethod GetWidgetById(WidgetId As %Integer) As %Status quit tSC } // Set output to JSON representation of object - set retObj.Widget = widgetObj.toJSONObject(1) + set retObj.Widget = widgetObj.toDynamicObject(1) } write retObj.%ToJSON() @@ -119,7 +119,7 @@ ClassMethod AddNewWidget() As %Status quit tSC } - write widgetObj.toJSONObject().%ToJSON() + write widgetObj.toDynamicObject().%ToJSON() quit tSC } @@ -154,7 +154,7 @@ ClassMethod UpdateWidgetById(WidgetId As %String) As %Status quit tSC } - set retObj = widgetObj.toJSONObject() + set retObj = widgetObj.toDynamicObject() } write retObj.%ToJSON() @@ -183,7 +183,7 @@ ClassMethod DeleteWidgetById(WidgetId As %Integer) As %Status quit tSC } - set retObj = widgetObj.toJSONObject() + set retObj = widgetObj.toDynamicObject() } write retObj.%ToJSON() diff --git a/WidgetsDirect/UnitTest/Widget/ToJson.cls b/WidgetsDirect/UnitTest/Widget/ToJson.cls index b19b3ec..7727a74 100755 --- a/WidgetsDirect/UnitTest/Widget/ToJson.cls +++ b/WidgetsDirect/UnitTest/Widget/ToJson.cls @@ -4,7 +4,7 @@ Class UnitTest.Widget.ToJson Extends UnitTest.Transaction Method TestSingleWidget() As %Status { set widgetId = ##class(UnitTest.Factory).Add("User.Widget",$lb($lb("Name","Widget1"))) set Widget = ##class(User.Widget).%OpenId(widgetId) - set WidgetJson=Widget.toJSONObject().%ToJSON() + set WidgetJson=Widget.toDynamicObject().%ToJSON() do $$$AssertTrue(WidgetJson["""Name"":""Widget1""","Widget JSON contains widget name") quit $$$OK } diff --git a/WidgetsDirect/User/WWWidget.cls b/WidgetsDirect/User/WWWidget.cls index 5ce3e46..1716aa8 100644 --- a/WidgetsDirect/User/WWWidget.cls +++ b/WidgetsDirect/User/WWWidget.cls @@ -14,7 +14,7 @@ Property Barcode As %String; Property Location As %String; -Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject +Method toDynamicObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { set jsonReturn = {} diff --git a/WidgetsDirect/User/Widget.cls b/WidgetsDirect/User/Widget.cls index cb46870..4bd9346 100644 --- a/WidgetsDirect/User/Widget.cls +++ b/WidgetsDirect/User/Widget.cls @@ -14,7 +14,7 @@ Property Deleted as %Boolean; Relationship Accessories As User.WidgetAccessoryLink [ Cardinality = many, Inverse = Widget ]; -Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject +Method toDynamicObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { set jsonReturn = {} @@ -30,7 +30,7 @@ Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicOb do { set accLink = ..Accessories.GetNext(.accessoryKey) if $isobject(accLink) && $isobject(accLink.Accessory) { - do accessoryList.%Push(accLink.Accessory.toJSONObject()) + do accessoryList.%Push(accLink.Accessory.toDynamicObject()) } } while (accessoryKey '= "") set jsonReturn.Accessories = accessoryList diff --git a/WidgetsDirect/User/WidgetAccessory.cls b/WidgetsDirect/User/WidgetAccessory.cls index 6c43c3e..08ee927 100644 --- a/WidgetsDirect/User/WidgetAccessory.cls +++ b/WidgetsDirect/User/WidgetAccessory.cls @@ -20,7 +20,7 @@ Property SKU As %String; Relationship Widgets As User.WidgetAccessoryLink [ Cardinality = many, Inverse = Accessory ]; -Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject +Method toDynamicObject(traverseRelationships As %Boolean = 0) As %Library.DynamicObject { set jsonReturn = {} @@ -40,7 +40,7 @@ Method toJSONObject(traverseRelationships As %Boolean = 0) As %Library.DynamicOb do { set widgetLink = ..Widgets.GetNext(.widgetKey) if $isobject(widgetLink) && $isobject(widgetLink.Widget) { - do widgetList.%Push(widgetLink.Widget.toJSONObject()) + do widgetList.%Push(widgetLink.Widget.toDynamicObject()) } } while (widgetKey '= "") set jsonReturn.Widgets = widgetList From 7acc18bc58bd74245240d9033840b638556d1861 Mon Sep 17 00:00:00 2001 From: Dale du Preez Date: Wed, 20 Sep 2017 17:14:27 -0400 Subject: [PATCH 5/6] Fix XMLNamespace for URL maps --- WidgetsDirect/REST/Dispatch.cls | 2 +- WidgetsDirect/REST/Widget.cls | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/WidgetsDirect/REST/Dispatch.cls b/WidgetsDirect/REST/Dispatch.cls index cb834bf..e319405 100644 --- a/WidgetsDirect/REST/Dispatch.cls +++ b/WidgetsDirect/REST/Dispatch.cls @@ -2,7 +2,7 @@ Class REST.Dispatch Extends %CSP.REST { -XData UrlMap [ XMLNamespace = "http://www.widgetsdirect.com/urlmap" ] +XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { diff --git a/WidgetsDirect/REST/Widget.cls b/WidgetsDirect/REST/Widget.cls index 3449484..6ffef88 100644 --- a/WidgetsDirect/REST/Widget.cls +++ b/WidgetsDirect/REST/Widget.cls @@ -2,7 +2,7 @@ Class REST.Widget Extends %CSP.REST { -XData UrlMap [ XMLNamespace = "http://www.widgetsdirect.com/urlmap" ] +XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { From 43d1ce998938bbecfdf899e1138296e8a29a2210 Mon Sep 17 00:00:00 2001 From: Dale du Preez Date: Wed, 20 Sep 2017 20:58:41 -0400 Subject: [PATCH 6/6] Refactor widget methods in REST.Dispatch to call APIs in REST.Widget --- WidgetsDirect/REST/Dispatch.cls | 168 ++------------------------------ 1 file changed, 9 insertions(+), 159 deletions(-) diff --git a/WidgetsDirect/REST/Dispatch.cls b/WidgetsDirect/REST/Dispatch.cls index e319405..966049b 100644 --- a/WidgetsDirect/REST/Dispatch.cls +++ b/WidgetsDirect/REST/Dispatch.cls @@ -5,6 +5,10 @@ Class REST.Dispatch Extends %CSP.REST XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { + @@ -44,181 +48,27 @@ ClassMethod version() As %Status ClassMethod GetAllWidgets() As %Status { - set %response.ContentType = "application/json" - - set retObj = {} - set tSC = $$$OK - set widgetAry = [] - - &SQL(DECLARE WidgetCursor CURSOR FOR - SELECT - %Id - INTO :WidgetId - FROM SQLUser.Widget - WHERE Deleted <> 1 OR Deleted is null - ) - - &SQL(OPEN WidgetCursor) - - for { - &SQL(FETCH WidgetCursor) - quit:SQLCODE - set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) - if $$$ISERR(tSC) { - quit - } - do widgetAry.%Push(widgetObj.toDynamicObject(1)) - } - if (SQLCODE && (SQLCODE '= 100)) { - set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) - // delay quit until after we close the cursor - } - &SQL(CLOSE WidgetCursor) - if $$$ISERR(tSC) { - quit tSC - } - - // let's get the WWWidgets - &SQL(DECLARE WWWidgetCursor CURSOR FOR - SELECT - %Id - INTO :WWWidgetId - FROM SQLUser.WWWidget - ) - - &SQL(OPEN WWWidgetCursor) - - for { - &SQL(FETCH WWWidgetCursor) - quit:SQLCODE - set widgetObj = ##class(User.WWWidget).%OpenId(WWWidgetId,,.tSC) - if $$$ISERR(tSC) { - quit - } - do widgetAry.%Push(widgetObj.toDynamicObject(1)) - } - if (SQLCODE && (SQLCODE '= 100)) { - set tSC = $$$ERROR($$$SQLCode,SQLCODE,%msg) - // delay quit until after we close the cursor - } - &SQL(CLOSE WWWidgetCursor) - if $$$ISERR(tSC) { - quit tSC - } - - set retObj.Widgets = widgetAry - - write retObj.%ToJSON() - - quit $$$OK + quit ##class(REST.Widget).GetAllWidgets() } ClassMethod GetWidgetById(WidgetId As %Integer) As %Status { - set %response.ContentType = "application/json" - - set tSC = $$$OK - set retObj = {} - - if '##class(User.Widget).%ExistsId(WidgetId) { - set %response.Status = ..#HTTP404NOTFOUND - } - else { - set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) - if $$$ISERR(tSC) { - quit tSC - } - // Set output to JSON representation of object - set retObj.Widget = widgetObj.toDynamicObject(1) - } - - write retObj.%ToJSON() - - quit tSC + quit ##class(REST.Widget).GetWidgetById(WidgetId) } ClassMethod AddNewWidget() As %Status { - set %response.ContentType = "application/json" - - set widgetObj = ##class(User.Widget).%New() - set updateJSON = %request.Content.Read($$$MaxLocalLength) - - set tSC = widgetObj.fromJSON(updateJSON) - if $$$ISERR(tSC) { - quit tSC - } - - write widgetObj.toDynamicObject().%ToJSON() - - quit tSC + quit ##class(REST.Widget).AddNewWidget() } ClassMethod UpdateWidgetById(WidgetId As %String) As %Status { - set %response.ContentType = "application/json" - - set retObj = {} - - set widgetClass = "User.Widget" - set internalWidgetId = WidgetId - if ($extract(WidgetId,1) = "W") { - set widgetClass = "User.WWWidget" - set internalWidgetId = $extract(WidgetId,2,*) - } - - if '$classmethod(widgetClass,"%ExistsId",internalWidgetId) { - set %response.Status = ..#HTTP404NOTFOUND - } - else { - set widgetObj = $classmethod(widgetClass,"%OpenId",internalWidgetId,,.tSC) - if $$$ISERR(tSC) { - quit tSC - } - - set updateJSON = %request.Content.Read($$$MaxLocalLength) - - set tSC = widgetObj.fromJSON(updateJSON) - if $$$ISERR(tSC) { - quit tSC - } - - set retObj = widgetObj.toDynamicObject() - } - - write retObj.%ToJSON() - - quit $$$OK + quit ##class(REST.Widget).UpdateWidgetById(WidgetId) } ClassMethod DeleteWidgetById(WidgetId As %Integer) As %Status { - set %response.ContentType = "application/json" - - set retObj = {} - set tSC = $$$OK - - if '##class(User.Widget).%ExistsId(WidgetId) { - set %response.Status = ..#HTTP404NOTFOUND - } - else { - set widgetObj = ##class(User.Widget).%OpenId(WidgetId,,.tSC) - if $$$ISERR(tSC) { - quit tSC - } - - set widgetObj.Deleted = 1 - set tSC = widgetObj.%Save() - if $$$ISERR(tSC) { - quit tSC - } - - set retObj = widgetObj.toDynamicObject() - } - - write retObj.%ToJSON() - - quit tSC + quit ##class(REST.Widget).DeleteWidgetById(WidgetId) } }