...
Para uma melhor explicação do assunto, montamos um exemplo para o endpoint que cria os atalhos de execução e evoluímos para receber um JsonArray de atalhos para serem criados;
Como era o código
...
- Esta preparado somente para JsonObject
...
:
Expandir |
---|
title | Clique para visualizar o conteúdo |
---|
|
Bloco de código |
---|
language | vb |
---|
title | Codigo original |
---|
| /*------------------------------------------------------------------------------
Purpose: Inclui um atalho Local
Notes:
------------------------------------------------------------------------------*/
PROCEDURE upsertLocalShortcut:
DEFINE INPUT PARAMETER jsonInput AS JsonObject NO-UNDO.
DEFINE INPUT PARAMETER isUpdate AS LOGICAL NO-UNDO.
DEFINE VARIABLE idxShortcut AS INTEGER NO-UNDO.
DEFINE VARIABLE payload AS JsonObject NO-UNDO.
ASSIGN payload = jsonInput:GetJsonObject("payload").
/* Valida os campos obrigatorios */
RUN validateLocalRequiredFields IN THIS-PROCEDURE (INPUT payload).
IF NOT VALID-HANDLE(hExecutionShortcutRepository) THEN
RUN btb/properties/infrastructure/domain/ExecutionShortcutRepository.p PERSISTENT SET hExecutionShortcutRepository.
ASSIGN idxShortcut = getIdxShortcut(jsonInput, isUpdate).
/* Validacoes somente para update */
IF isUpdate THEN DO:
/* Valida se existe o registro no banco de dados */
RUN validateIndex IN THIS-PROCEDURE (INPUT idxShortcut).
/* Valida o tipo do atalho se foi alterado */
RUN validateTypeShortcut IN THIS-PROCEDURE (INPUT idxShortcut, INPUT {&LOCAL_ACCESS}).
END.
/* Valida a descricao do atalho */
RUN validateDescriptionShortcut IN THIS-PROCEDURE ( INPUT idxShortcut,
INPUT JsonAPIUtils:getPropertyJsonObject(payload, "description") ).
RUN setDefaultShortcut IN THIS-PROCEDURE ( INPUT idxShortcut,
INPUT JsonAPIUtils:getPropertyJsonObject(payload, "description") ).
RUN upsertLocalShortcut IN hExecutionShortcutRepository (INPUT payload, INPUT STRING(idxShortcut)).
FINALLY:
DELETE PROCEDURE hExecutionShortcutRepository NO-ERROR.
END FINALLY.
END PROCEDURE.
|
|
Como ficou apos a implementação da técnica
...
- Esta preparado tanto para JsonObject quanto para JsonArray
...
:
Expandir |
---|
title | Clique para visualizar o conteúdo |
---|
|
Bloco de código |
---|
language | vb |
---|
title | Codigo originalAlterado |
---|
| /*------------------------------------------------------------------------------
Purpose: Inclui um atalho Local
Notes:
------------------------------------------------------------------------------*/
PROCEDURE upsertLocalShortcut:
DEFINE INPUT PARAMETER jsonInput AS JsonObject NO-UNDO.
DEFINE INPUT PARAMETER isUpdate AS LOGICAL NO-UNDO.
DEFINE VARIABLE idxShortcut AS INTEGER NO-UNDO.
DEFINE VARIABLE payload AS JsonObject NO-UNDO.
DEFINE VARIABLE payloadArray AS JsonArray NO-UNDO.
DEFINE VARIABLE iCountPayload AS INTEGER NO-UNDO.
DEFINE VARIABLE iPayloadLength AS INTEGER NO-UNDO.
ASSIGN iPayloadLength = CAST(jsonInput:getJSONArray("payload"), "JSONArray"):LENGTH NO-ERROR.
payloadArray = NEW JsonArray().
ASSIGN payloadArray = jsonInput:getJSONArray("payload") NO-ERROR.
IF payloadArray:LENGTH = 0 THEN do: // caso o tamanho seja zero
payload = CAST(jsonInput:getJSONObject("payload"), "JSONObject") NO-ERROR. //atribui object
payloadArray:ADD(payload). //adiciona ao array
END.
iPayloadLength = payloadArray:LENGTH.
DO iCountPayload = 1 TO iPayloadLength:
ASSIGN payload = payloadArray:getJSONObject(iCountPayload) NO-ERROR.
/* Valida os campos obrigatorios */
RUN validateLocalRequiredFields IN THIS-PROCEDURE (INPUT payload).
IF NOT VALID-HANDLE(hExecutionShortcutRepository) THEN
RUN btb/properties/infrastructure/domain/ExecutionShortcutRepository.p PERSISTENT SET hExecutionShortcutRepository.
ASSIGN idxShortcut = getIdxShortcut(jsonInput, isUpdate).
/* Validacoes somente para update */
IF isUpdate THEN DO:
/* Valida se existe o registro no banco de dados */
RUN validateIndex IN THIS-PROCEDURE (INPUT idxShortcut).
/* Valida o tipo do atalho se foi alterado */
RUN validateTypeShortcut IN THIS-PROCEDURE (INPUT idxShortcut, INPUT {&LOCAL_ACCESS}).
END.
/* Valida a descricao do atalho */
RUN validateDescriptionShortcut IN THIS-PROCEDURE ( INPUT idxShortcut,
INPUT JsonAPIUtils:getPropertyJsonObject(payload, "description") ).
RUN setDefaultShortcut IN THIS-PROCEDURE ( INPUT idxShortcut,
INPUT JsonAPIUtils:getPropertyJsonObject(payload, "description") ).
RUN upsertLocalShortcut IN hExecutionShortcutRepository (INPUT payload, INPUT STRING(idxShortcut)).
END.
FINALLY:
DELETE PROCEDURE hExecutionShortcutRepository NO-ERROR.
END FINALLY.
END PROCEDURE.
|
|
A técnica utilizada e documentada
...
Expandir |
---|
title | Clique para visualizar o conteúdo |
---|
|
Bloco de código |
---|
language | vb |
---|
title | Codigo originalTecnica |
---|
| //Opção 1:
DEFINE VARIABLE payloadArray AS JsonArray NO-UNDO.
DEFINE VARIABLE iCountPayload AS INTEGER NO-UNDO.
DEFINE VARIABLE iPayloadLength AS INTEGER NO-UNDO.
ASSIGN iPayloadLength = CAST(jsonInput:getJSONArray("payload"), "JSONArray"):LENGTH NO-ERROR. // Pega o tamanho do Array o NO-ERROR é para não estourar erro caso venha um object
payloadArray = NEW JsonArray(). // Cria um JsonArray vazio para receber o array de objetos vindo do payload
ASSIGN payloadArray = jsonInput:getJSONArray("payload") NO-ERROR. // Pega o array de objetos e transforma no JsonArray
IF payloadArray:LENGTH = 0 THEN do: // caso o tamanho seja zero, significa que é um object
payload = CAST(jsonInput:getJSONObject("payload"), "JSONObject") NO-ERROR. //Se entrou nesta condição significa que é um array
payloadArray:ADD(payload). //adiciona o object ao array
END.
iPayloadLength = payloadArray:LENGTH. //Efetua novamente a leitura do object caso o mesmo seja um
DO iCountPayload = 1 TO iPayloadLength: // Bloco de repetição para varrer o object ate o ultimo object do array
ASSIGN payload = payloadArray:getJSONObject(iCountPayload) NO-ERROR. // A cada execução um object do array é executado
//Aqui seu trecho de codigo e validações
END. // Fim do bloco de repetição
//Fim Opção 1.
//Opção 2
DEFINE VARIABLE payloadArray AS JsonArray NO-UNDO.
DEFINE VARIABLE iCountPayload AS INTEGER NO-UNDO.
DEFINE VARIABLE iPayloadLength AS INTEGER NO-UNDO.
ASSIGN iPayloadLength = CAST(jsonInput:getJSONArray("payload"), "JSONArray"):LENGTH NO-ERROR. // Conta o tamanho do payload para identificar se é um object ou array / NO-ERROR para manter a compatibilidade com object /Cast para ler o json e contar o tamanho do payload (Se é array ou object)
IF iPayloadLength >= 1 THEN // Se for maior que zero significa que é um array
ASSIGN payloadArray = jsonInput:getJSONArray("payload"). //Adiciona o payload array em um objeto array
ELSE
ASSIGN payload = jsonInput:GetJsonObject("payload") //Adiciona um object(payload) em um object somente com o payload
iPayloadLength = 1. // Como é um object, alimentamos o tamanho do array para passar no bloco abaixo
DO iCountPayload = 1 TO iPayloadLength:
ASSIGN payload = payloadArray:getJSONObject(iCountPayload) NO-ERROR. //Transfere para o object cada object do array e efetua a execução / NO-ERROR para manter compatilidade de código para JsonArray e jsonObject
/* Valida os campos obrigatorios */ //Trecho de codigo com as devidas validações ou instruções
END.//Fim do bloco de repetição
//Fim Opção 2
|
|