Banco de Dados de Documentos do IRIS (DocDB)
O Banco de Dados de Documentos do InterSystems IRIS (DocDB) oferece uma abordagem flexível e dinâmica de gestão dos dados de bancos de dados. O DocDB abraça o poder do JSON (JavaScript Object Notation), fornecendo um ambiente sem esquema para armazenar e recuperar dados.
É uma ferramenta poderosa que permite aos desenvolvedores ignorar um monte de código boilerplate na interação com aplicativos existentes, serialização, paginação e integração. O fluxo perfeito do DocDB com os serviços e as operações de Interoperability Rest possibilita um grande salto na produção e no gerenciamento de APIs.
Confira a documentação completa do DocDB aqui. No contexto deste artigo, mostrarei um caso de uso em que o DocDB é uma combinação perfeita.
Organizações que usam produtos da InterSystems como IRIS, Interoperability, TrakCare... geram constantemente requisitos novos e ágeis para o compartilhamento de dados com outros sistemas para consumo. A InterSystems oferece o adaptador JSON integrado para permitir que as classes persistentes sejam serializáveis em JSON no nível do registro. No entanto, reescrever seu aplicativo para estender o adaptador JSON não é uma tarefa fácil, e seus dados de interesse serão gerenciados sempre no nível do registro diretamente das classes do seu aplicativo. É aí que entra o DocDB, porque você pode criar consultas no código do seu aplicativo e despejá-las no DocDB como JSON, prontas para serem enviadas a apps para consumidores.
Aqui está um snippet executando qualquer procedimento armazenado do IRIS padrão de maneira genérica e salvando a saída como registros no formato json.
//presumindo que os parâmetros existem como P1,P2,...Pn no contextoset queryData=$lb("queryclassname:queryname",<no of parameters>)
set queryString=$lg(queryData,1)
set paramCount=$lg(queryData,2)
set args=$lb()
for ix=1:1:paramCount{
set var="P"_ix
XECUTE ("(in,out) SET out=$g(in)", @var, .y)
set$li(args,ix)=$s(y'="":""""_y_"""",1:""""_"""")
}
set resultSet=##class(%ResultSet).%New(queryString)
XECUTE ("(in,out) set out=in.%Execute("_$lts(args)_")",resultSet,.scx)
set sc=scx
If$$$ISERR(sc) $$$ThrowStatus(sc)
set columnNo=resultSet.GetColumnCount()
<span class="hljs-keyword">While</span> resultSet.<span class="hljs-built_in">%Next</span>(.sc) {
<span class="hljs-keyword">If</span> <span class="hljs-built_in">$$$ISERR</span>(sc) <span class="hljs-built_in">$$$ThrowStatus</span>(sc)
<span class="hljs-keyword">set</span> row={}
<span class="hljs-keyword">for</span> iz=<span class="hljs-number">1</span>:<span class="hljs-number">1</span>:columnNo{
<span class="hljs-keyword">set</span> columnName=resultSet.GetColumnName(iz)
<span class="hljs-keyword">do</span> row.<span class="hljs-built_in">%Set</span>(columnName,resultSet.GetDataByName(columnName))
}
<span class="hljs-keyword">set</span> sc=<span class="hljs-built_in">..AddRecordToReportResult</span>(ID,row)
<span class="hljs-keyword">If</span> <span class="hljs-built_in">$$$ISERR</span>(sc) <span class="hljs-built_in">$$$ThrowStatus</span>(sc)
}</code></pre>
ClassMethod AddRecordToReportResult(doc As%DynamicObject)As%Status {
set sc=$$$OKtry {
if (##class(%DocDB.Database).xNExists("PreparedReportDB")){
set db=##class(%DocDB.Database).%GetDatabase("PreparedReportDB")
} else {
set db= ##class(%DocDB.Database).%CreateDatabase("PreparedReportDB")
}
set nwRecord=db.%SaveDocument(doc)
do nwRecord.%Save(0)
k nwRecord
}catch err{
set sc=$$$ADDSC(sc,$$$ERROR("5001",err.DisplayString()))
}
return sc
}
É isso. Seus dados, sejam quais forem, estão prontos para serem expostos a apps para consumidores.
Considerando o caso de uso de monitoramento de integrações, suas consultas verificarão o status da sua produção de interoperabilidade da InterSystems, os erros, alertas...
E os dados serão salvos em um DocDB em intervalos.
Class ProdEye.DataTask Extends%SYS.Task.Definition
{
Property IntervalMinutes As%Integer [ InitialExpression = 5 ];
Method OnTask() As%Status
{
try {
set packageName=$P($classname(),".",1)
<span class="hljs-keyword">set</span> targetDocument={}
<span class="hljs-keyword">set</span> ZeroTimeStamp= <span class="hljs-built_in">$$HorologAddSecs</span><span class="hljs-symbol">^EnsUtil</span>(<span class="hljs-built_in">$ztimestamp</span>,-(<span class="hljs-built_in">..IntervalMinutes</span>*<span class="hljs-number">60</span>))
<span class="hljs-keyword">set</span> targetDocument.TimeOfQuery=<span class="hljs-keyword">##class</span>(Ens.DataType.UTC).timeUTC()
<span class="hljs-keyword">set</span> targetDocument.TimeOfQueryIdx=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"getDateTimeUTCIdx"</span>)
<span class="hljs-keyword">do</span> <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetNameSpaceList"</span>)
<span class="hljs-keyword">k</span> prodArray
<span class="hljs-keyword">do</span> <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetProductionsList"</span>,.prodArray)
<span class="hljs-keyword">set</span> productionObjectList=[]
<span class="hljs-keyword">set</span> currNameSpace=<span class="hljs-string">""</span>
<span class="hljs-keyword">for</span> {
<span class="hljs-keyword">set</span> currNameSpace=<span class="hljs-built_in">$O</span>(prodArray(currNameSpace))
<span class="hljs-keyword">quit</span>:currNameSpace=<span class="hljs-string">""</span>
<span class="hljs-keyword">set</span> currProd=<span class="hljs-string">""</span>
<span class="hljs-keyword">for</span> {
<span class="hljs-keyword">set</span> currProd=<span class="hljs-built_in">$O</span>(prodArray(currNameSpace,currProd))
<span class="hljs-keyword">quit</span>:currProd=<span class="hljs-string">""</span>
<span class="hljs-keyword">set</span> newProdData=<span class="hljs-built_in">$g</span>(prodArray(currNameSpace,currProd))
<span class="hljs-keyword">set</span> newProd=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Production"</span>,<span class="hljs-string">"%New"</span>,currProd,<span class="hljs-built_in">$lg</span>(newProdData,<span class="hljs-number">1</span>),<span class="hljs-built_in">$lg</span>(newProdData,<span class="hljs-number">2</span>))
<span class="hljs-keyword">k</span> compArray
<span class="hljs-keyword">do</span> <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentListByProd"</span>,.compArray,currProd,currNameSpace)
<span class="hljs-keyword">set</span> components=<span class="hljs-string">""</span>
<span class="hljs-keyword">set</span> currComp=<span class="hljs-string">""</span>
<span class="hljs-keyword">for</span> {
<span class="hljs-keyword">set</span> currComp=<span class="hljs-built_in">$O</span>(compArray(currProd,currComp))
<span class="hljs-keyword">quit</span>:currComp=<span class="hljs-string">""</span>
<span class="hljs-keyword">set</span> newComp=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.ProductionConfigItem"</span>,<span class="hljs-string">"%New"</span>,currComp,<span class="hljs-built_in">$g</span>(compArray(currProd,currComp)))
<span class="hljs-keyword">set</span> compId=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentId"</span>,currComp,currProd,currNameSpace)
<span class="hljs-keyword">set</span> newComp.Type= <span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentType"</span>,compId,currNameSpace)
<span class="hljs-keyword">set</span> newComp.QueueSize=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentQueueData"</span>,currComp,currNameSpace)
<span class="hljs-keyword">set</span> MessageStats=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentMessageCountAndAvg"</span>,currComp,ZeroTimeStamp,currNameSpace)
<span class="hljs-keyword">set</span>:<span class="hljs-built_in">$lv</span>(MessageStats) newComp.MessageCount=<span class="hljs-built_in">$lg</span>(MessageStats,<span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span>:<span class="hljs-built_in">$lv</span>(MessageStats) newComp.MessageAVGProcessingMilliseconds=<span class="hljs-built_in">$lg</span>(MessageStats,<span class="hljs-number">2</span>)
<span class="hljs-keyword">set</span> newComp.JobsStatus=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.JobStatus"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentJobs"</span>,currComp,currNameSpace))
<span class="hljs-keyword">set</span> newComp.Errors=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Log"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentErrors"</span>,currComp,ZeroTimeStamp,currNameSpace))
<span class="hljs-keyword">set</span> newComp.Warnings=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Log"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentWarnings"</span>,currComp,ZeroTimeStamp,currNameSpace))
<span class="hljs-keyword">set</span> newComp.Alerts=<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Data.Log"</span>,<span class="hljs-string">"BuildPropertyFromList"</span>,<span class="hljs-built_in">$classmethod</span>(packageName_<span class="hljs-string">".Query"</span>,<span class="hljs-string">"GetComponentAlerts"</span>,currComp,ZeroTimeStamp,currNameSpace))
<span class="hljs-keyword">do</span> newProd.Components.Insert(newComp)
}
<span class="hljs-keyword">set</span> newProdJSONStr=<span class="hljs-string">""</span>
<span class="hljs-keyword">do</span> newProd.<span class="hljs-built_in">%JSONExportToString</span>(.newProdJSONStr)
<span class="hljs-keyword">set</span> newProdJSON={}.<span class="hljs-built_in">%FromJSON</span>(newProdJSONStr)
<span class="hljs-keyword">do</span>:newProdJSON'=<span class="hljs-string">""</span> productionObjectList.<span class="hljs-built_in">%Push</span>(newProdJSON)
}
}
<span class="hljs-keyword">do</span> targetDocument.<span class="hljs-built_in">%Set</span>(<span class="hljs-string">"ProductionList"</span>,productionObjectList)
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).xNExists(packageName_<span class="hljs-string">".DB.ProdEyeDocument"</span>)){
<span class="hljs-keyword">set</span> db=<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).<span class="hljs-built_in">%GetDatabase</span>(packageName_<span class="hljs-string">".DB.ProdEyeDocument"</span>)
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">set</span> db= <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).<span class="hljs-built_in">%CreateDatabase</span>(<span class="hljs-string">"ProdEye.DB.ProdEyeDocument"</span>)
<span class="hljs-keyword">do</span> db.<span class="hljs-built_in">%CreateProperty</span>(<span class="hljs-string">"TimeOfQueryIdx"</span>,<span class="hljs-string">"%Integer"</span>,<span class="hljs-string">"$.TimeOFQueryIdx"</span>,<span class="hljs-number">0</span>)
}
<span class="hljs-keyword">set</span> nwRecord=db.<span class="hljs-built_in">%SaveDocument</span>(targetDocument)
<span class="hljs-keyword">if</span> <span class="hljs-built_in">$$$ISERR</span>(nwRecord){<span class="hljs-built_in">$$$ThrowStatus</span>(nwRecord)}
<span class="hljs-keyword">set</span> nwRecord.ProfileName=<span class="hljs-built_in">$get</span>(<span class="hljs-symbol">^ProdEyeProfileName</span>(<span class="hljs-number">0</span>))
<span class="hljs-keyword">set</span> nwRecord.TimeOfQueryIdx=targetDocument.TimeOfQueryIdx
<span class="hljs-keyword">do</span> nwRecord.<span class="hljs-built_in">%Save</span>()
<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
} <span class="hljs-keyword">catch</span> error {
<span class="hljs-keyword">do</span> BACK<span class="hljs-symbol">^%ETN</span>
<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$ERROR</span>(<span class="hljs-string">"5001"</span>,error.AsStatus())
}
}
}
agora, qualquer aplicativo externo para consumidores pode buscar os dados para verificar o status da produção, alertas, erros e avisos usando um serviço REST simples da InterSystems conforme a seguir
Include Ensemble
Class ProdEye.Prod.ProdEyeRest Extends EnsLib.REST.Service
{
Property PageSize As%Integer [ InitialExpression = 10 ];Property TokenValidationURL As%String;Parameter SETTINGS = "PageSize,TokenValidationURL";
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<Route Url="/getdata" Method="POST" Call="GetData"/>
</Routes>
}
Method GetData(pInput As%Library.AbstractStream, Output poutput As%Stream) As%Status
{
quit:'$IsObject(pInput) $$$OKquit:(pInput.SizeGet()=0) $$$OKset paramsObj={}.%FromJSON(pInput.Read())
set cutoff=paramsObj.cutoff
set authorisation=paramsObj.Authorisation
set profilename=paramsObj.profilename
<span class="hljs-built_in">$$$TRACE</span>(<span class="hljs-built_in">..Adapter</span>.IOAddr_<span class="hljs-string">" Profile "</span>_profilename_<span class="hljs-string">" cutoff parameter: "</span>_paramsObj.<span class="hljs-built_in">%ToJSON</span>())
<span class="hljs-keyword">if</span> ('<span class="hljs-built_in">..Authorise</span>(authorisation,<span class="hljs-built_in">..TokenValidationURL</span>)){
<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(<span class="hljs-string">"{""Error"":""Invalid Credentials""}"</span>)
<span class="hljs-keyword">do</span> <span class="hljs-built_in">..ReportHttpStatusCode</span>(<span class="hljs-number">403</span>)
<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
}
<span class="hljs-keyword">if</span> ('<span class="hljs-built_in">..ValidateCutoff</span>(cutoff)){
<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(<span class="hljs-string">"{""Error"":""Invalid Request Parameters""}"</span>)
<span class="hljs-keyword">do</span> <span class="hljs-built_in">..ReportHttpStatusCode</span>(<span class="hljs-number">400</span>)
<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
}
<span class="hljs-keyword">try</span>{
<span class="hljs-keyword">set</span> packageName=<span class="hljs-built_in">$P</span>(<span class="hljs-built_in">$classname</span>(),<span class="hljs-string">"."</span>,<span class="hljs-number">1</span>)
<span class="hljs-keyword">SET</span> db = <span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%DocDB.Database</span>).<span class="hljs-built_in">%GetDatabase</span>(packageName_<span class="hljs-string">".DB.ProdEyeDocument"</span>)
<span class="hljs-keyword">set</span> restriction=[]
<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"TimeOfQueryIdx"</span>)
<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(cutoff)
<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">">"</span>)
<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"ProfileName"</span>)
<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(profilename)
<span class="hljs-keyword">do</span> restriction.<span class="hljs-built_in">%Push</span>(<span class="hljs-string">"="</span>)
<span class="hljs-keyword">SET</span> result = db.<span class="hljs-built_in">%FindDocuments</span>(restriction)
<span class="hljs-keyword">if</span> ((<span class="hljs-built_in">$IsObject</span>(result))&&(<span class="hljs-built_in">$Isobject</span>(result.content))){
<span class="hljs-keyword">set</span> resultPage={}
<span class="hljs-keyword">set</span> resultPage.Next=<span class="hljs-number">0</span>
<span class="hljs-keyword">set</span> resultList=[]
<span class="hljs-keyword">set</span> iter=result.content.<span class="hljs-built_in">%GetIterator</span>()
<span class="hljs-keyword">for</span> dx=<span class="hljs-number">1</span>:<span class="hljs-number">1</span>:<span class="hljs-built_in">..PageSize</span>{
<span class="hljs-keyword">set</span> resultItem=iter.<span class="hljs-built_in">%GetNext</span>(.key,.resultItemvalue)
<span class="hljs-keyword">if</span> <span class="hljs-built_in">$IsObject</span>(resultItemvalue){
<span class="hljs-keyword">set</span> resultItemvalue={}.<span class="hljs-built_in">%FromJSON</span>(resultItemvalue.<span class="hljs-built_in">%Doc</span>)
<span class="hljs-keyword">do</span> resultList.<span class="hljs-built_in">%Push</span>(resultItemvalue)
<span class="hljs-keyword">set</span>:dx><span class="hljs-number">1</span> resultPage.Next=resultItemvalue.TimeOfQueryIdx
}
}
<span class="hljs-keyword">set</span> resultPage.content=resultList
<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(resultPage.<span class="hljs-built_in">%ToJSON</span>())
}<span class="hljs-keyword">else</span> {
<span class="hljs-keyword">Throw</span> <span class="hljs-built_in">$$$ERROR</span>(<span class="hljs-string">"5001"</span>,<span class="hljs-string">"Error During Processing Data"</span>)
}
} <span class="hljs-keyword">catch</span> error {
<span class="hljs-keyword">do</span> poutput.<span class="hljs-keyword">Write</span>(<span class="hljs-string">"{""Error"":""Error During Processing Data : """</span>_error.AsSystemError()_<span class="hljs-string">""" ""}"</span>)
<span class="hljs-keyword">do</span> <span class="hljs-built_in">..ReportHttpStatusCode</span>(<span class="hljs-number">500</span>)
}
<span class="hljs-keyword">return</span> <span class="hljs-built_in">$$$OK</span>
}
ClassMethod ValidateCutoff(val As%String) As%Boolean
{
set sc=1quit:+val<=00quit:$l(+val)<50set valdt=$E(val,1,5)","$E(val,6,10)
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">set</span> date=<span class="hljs-built_in">$zdt</span>(valdt)
}<span class="hljs-keyword">catch</span> err{
<span class="hljs-keyword">set</span> sc=<span class="hljs-number">0</span>
}
<span class="hljs-keyword">return</span> sc
}
ClassMethod Authorise(val As%String, TokenValidationURL As%String) As%Boolean
{
quit:$g(val)=""0if (TokenValidationURL=""){
set type=$P(val," ",1)
set type=$zstrip($zstrip(type,"*c"),"<=>w")
quit:$ZCVT(type,"L")'="basic"0set userpass=$P(val," ",2)
set userpassDecoded=$system.Encryption.Base64Decode(userpass)
<span class="hljs-keyword">set</span> user=<span class="hljs-built_in">$P</span>(userpassDecoded,<span class="hljs-string">":"</span>,<span class="hljs-number">1</span>)
<span class="hljs-keyword">set</span> user=<span class="hljs-built_in">$zstrip</span>(<span class="hljs-built_in">$zstrip</span>(user,<span class="hljs-string">"*c"</span>),<span class="hljs-string">"<=>w"</span>)
<span class="hljs-keyword">set</span> pass=<span class="hljs-built_in">$P</span>(userpassDecoded,<span class="hljs-string">":"</span>,<span class="hljs-number">2</span>)
<span class="hljs-keyword">set</span> pass=<span class="hljs-built_in">$zstrip</span>(<span class="hljs-built_in">$zstrip</span>(pass,<span class="hljs-string">"*c"</span>),<span class="hljs-string">"<=>w"</span>)
<span class="hljs-keyword">set</span> prodeyeUser=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeUser"</span>,<span class="hljs-string">"Username"</span>)
<span class="hljs-keyword">set</span> prodeyePass=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeUser"</span>,<span class="hljs-string">"Password"</span>)
<span class="hljs-keyword">return</span> ((prodeyeUser=user)&&(prodeyePass=pass))
}<span class="hljs-keyword">elseif</span>(TokenValidationURL'=<span class="hljs-string">""</span>){
<span class="hljs-keyword">set</span> prodeyeAuthUser=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeAuthUser"</span>,<span class="hljs-string">"Username"</span>)
<span class="hljs-keyword">set</span> prodeyeAuthPass=<span class="hljs-keyword">##class</span>(Ens.Config.Credentials).GetValue(<span class="hljs-string">"ProdEyeAuthUser"</span>,<span class="hljs-string">"Password"</span>)
<span class="hljs-keyword">set</span> tokenVerificationRequest=<span class="hljs-keyword">##class</span>(<span class="hljs-built_in">%Net.HttpRequest</span>).<span class="hljs-built_in">%New</span>()
<span class="hljs-keyword">do</span> tokenVerificationRequest.SetHeader(<span class="hljs-string">"content-type"</span>,<span class="hljs-string">"application/json"</span>)
<span class="hljs-keyword">do</span> tokenVerificationRequest.SetHeader(<span class="hljs-string">"Authorisation"</span>,<span class="hljs-string">"BASIC "</span>_<span class="hljs-built_in">$system</span>.Encryption.Base64Encode(prodeyeAuthUser_<span class="hljs-string">":"</span>_prodeyeAuthPass))
<span class="hljs-keyword">set</span> token=<span class="hljs-built_in">$P</span>(val,<span class="hljs-string">" "</span>,<span class="hljs-number">2</span>)
<span class="hljs-keyword">set</span> data={}
<span class="hljs-keyword">set</span> data.Token=token
<span class="hljs-keyword">do</span> tokenVerificationRequest.EntityBody.<span class="hljs-keyword">Write</span>(data.<span class="hljs-built_in">%ToJSON</span>())
<span class="hljs-keyword">do</span> tokenVerificationRequest.Post(TokenValidationURL)
<span class="hljs-keyword">set</span> response=tokenVerificationRequest.HttpResponse
<span class="hljs-keyword">if</span> (<span class="hljs-built_in">$IsObject</span>(response) && <span class="hljs-built_in">$IsObject</span>(response.Data) && response.StatusCode=<span class="hljs-number">200</span> ){
<span class="hljs-keyword">set</span> message=<span class="hljs-string">""</span> <span class="hljs-keyword">while</span> 'response.Data.AtEnd {<span class="hljs-keyword">set</span> message=message_response.Data.<span class="hljs-keyword">Read</span>(,.tSC) <span class="hljs-keyword">if</span> 'tSC <span class="hljs-keyword">quit</span>}
<span class="hljs-keyword">set</span> responseMessage={}.<span class="hljs-built_in">%FromJSON</span>(message)
<span class="hljs-keyword">if</span> (responseMessage.<span class="hljs-built_in">%IsDefined</span>(<span class="hljs-string">"IsValid"</span>) && (responseMessage.IsValid=<span class="hljs-string">"1"</span>)){
<span class="hljs-keyword">return</span> <span class="hljs-number">1</span>
}<span class="hljs-keyword">else</span>{
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>
}
}<span class="hljs-keyword">else</span>{
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>
}
}
}
}
Um exemplo real de um aplicativo de consumo do caso de uso acima está disponível aqui no Open Exchange. É um aplicativo móvel desenvolvido em Dart para o framework Flutter.
Além disso, o DocDB expõe a API direta sobre todas as tabelas de documentos, descritas em detalhes aqui
A vantagem da funcionalidade do DocDB é tornar o desenvolvimento de APIs para compartilhamento de informações entre sistemas orientado pelo foco do caso de uso, rastreando e padronizando toda a serialização, staging e integração de dados ao mesmo tempo.