Magento 2 Rest Api as JSON - magento2

i need to return the response of custom web api as JSON.
i need it to be like this:
{
"data": [
{
"id": "1",
"name": "Tiger Nixon",
"position": "System Architect",
"salary": "$320,800",
"start_date": "2011/04/25",
"office": "Edinburgh",
"extn": "5421"
},
{
"id": "2",
"name": "Garrett Winters",
"position": "Accountant",
"salary": "$170,750",
"start_date": "2011/07/25",
"office": "Tokyo",
"extn": "8422"
}
]
}
however, my module is coming out as
[
{
"id": "1",
"name": "Tiger Nixon",
"position": "System Architect",
"salary": "$320,800",
"start_date": "2011/04/25",
"office": "Edinburgh",
"extn": "5421"
},
{
"id": "2",
"name": "Garrett Winters",
"position": "Accountant",
"salary": "$170,750",
"start_date": "2011/07/25",
"office": "Tokyo",
"extn": "8422"
}
]
My Interface is as follows:
<?php
namespace Mag\Rest\Api;
interface OrdersManagementInterface
{
/**
* GET for Stock api
* #param mixed $items
* #return string
*/
public function getOrders();
}
My model is as follows:
<?php
namespace Mag\Rest\Model;
class OrdersManagement
{
public function __construct(
) {
}
/**
* {#inheritdoc}
*/
public function getOrders()
{
//... sql code to get data goes here
$results = $this->connection->fetchAll($sql);
return $response ;
}
}
any idea on how to be able to format the output of the rest api ?

Related

Swagger Codegen OneOf generating incorrectly

I am generating a JavaClient using an OpenAPISpec document. I have used swagger-codegen 3.0 to generate the code. The OpenAPISpec version is 3.0.1.
Below is the OpenAPI snippet I am facing problems with:
"RequestWithInsuranceInfo": {
"type": "object",
"description": "This request schema will produce a response containing an out of pocket estimate for the given service using the patient's insurance information.",
"additionalProperties": false,
"properties": {
"insuranceInfo": {
"$ref": "#/components/schemas/InsuranceInfo"
},
"service": {
"type": "object",
"additionalProperties": false,
"description": "Schema to use when the patient's benefit info is not given in the request.",
"properties": {
"codes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ServiceCode"
}
},
"provider": {
"$ref": "#/components/schemas/Provider"
},
"costs": {
"$ref": "#/components/schemas/ServiceCosts"
}
},
"required": [
"codes",
"provider",
"costs"
]
}
}
},
"InsuranceInfo": {
"description": "Information about the payer, plan, and members.",
"additionalProperties": false,
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"title": "Option 1: Patient Is Policy Holder",
"description": "Schema to use when the patient the primary on the insurance plan.",
"properties": {
"payer": {
"$ref": "#/components/schemas/Payer"
},
"policyHolderInfo": {
"$ref": "#/components/schemas/PolicyHolderInfo"
}
},
"required": [
"payer",
"policyHolderInfo"
]
},
{
"type": "object",
"additionalProperties": false,
"title": "Option 2: Patient Is Dependent",
"description": "Schema to use when the patient is a dependent on the insurance plan.",
"properties": {
"payer": {
"$ref": "#/components/schemas/Payer"
},
"dependentMemberInfo": {
"$ref": "#/components/schemas/DependentMemberInfo"
},
"policyHolderInfo": {
"$ref": "#/components/schemas/PolicyHolderInfo"
}
},
"required": [
"payer",
"dependentMemberInfo",
"policyHolderInfo"
]
}
]
},
Below is the code which gets generated:
public class InsuranceInfo implements OneOfInsuranceInfo {
#Override
public boolean equals(java.lang.Object o) {..}
#Override
public int hashCode() {..}
#Override
public String toString() {..}
private String toIndentedString(java.lang.Object o) {..}
}
public interface OneOfInsuranceInfo {
}
public class RequestWithInsuranceInfo implements OneOfRequest {
#SerializedName("insuranceInfo")
private InsuranceInfo insuranceInfo = null;
#SerializedName("service")
private RequestWithInsuranceInfoService service = null;
..
}
public class Payer {
#SerializedName("id")
private String id = null;
..
}
public class PolicyHolderInfo {
#SerializedName("memberId")
private String memberId = null;
#SerializedName("firstName")
private String firstName = null;
#SerializedName("lastName")
private String lastName = null;
#SerializedName("dateOfBirth")
private LocalDate dateOfBirth = null;
..
}
public class DependentMemberInfo {
#SerializedName("memberId")
private String memberId = null;
#SerializedName("firstName")
private String firstName = null;
#SerializedName("lastName")
private String lastName = null;
#SerializedName("dateOfBirth")
private LocalDate dateOfBirth = null;
..
}
As shown, the InsuranceInfo object implements the OneOfInsuranceInfo interface but has no variables. Payer, PolicyHolderInfo and dependentMemberInfo class are generated but they are not linked to the InsuranceInfo class anyhow. How do I populate the InsuranceInfo class?
The issue is probably that the InsuranceInfo schema
"InsuranceInfo": {
"description": "Information about the payer, plan, and members.",
"additionalProperties": false,
"oneOf": [
{ ... },
{ ... }
]
}
effectively disallows ALL properties. This is because additionalProperties: false only knows about the properties defined directly alongside it and has no visibility into oneOf subschemas.
To resolve the issue, you can rewrite the InsuranceInfo schema without oneOf, as follows. This schema is basically "Option 2" from the original schema, except the dependentMemberInfo property is defined as optional.
"InsuranceInfo": {
"description": "Information about the payer, plan, and members.",
"additionalProperties": false,
"type": "object",
"required": [
"payer",
"policyHolderInfo"
],
"properties": {
"payer": {
"$ref": "#/components/schemas/Payer"
},
"dependentMemberInfo": {
"$ref": "#/components/schemas/DependentMemberInfo"
},
"policyHolderInfo": {
"$ref": "#/components/schemas/PolicyHolderInfo"
}
}
}

How to document complex objects in Apache Camel OpenAPI documentation using camel-openapi-java instead of camel-swagger-java component?

I am working on trying to correctly document our rest endpoints. As an example to get this working I created a sample "Healthcheck getStatus()" endpoint which is returning an object called "EndpointStatus" which has 3 fields (class is below). I was able to get this object documenting correctly and using the camel-swagger-java component and the below rest configuration / definition;
restConfiguration()
.apiContextPath(apiContextPath)
.apiProperty("api.title", "Camel Service").apiProperty("api.version", "1.0.0")
// and enable CORS
.apiProperty("cors", "true");
rest()
.path("/healthcheck")
.description("Health Check REST service")
.get("getStatus/{endpointName}")
.param()
.name("endpointName")
.type(RestParamType.path)
.allowableValues(
Stream.of(EndpointName.values())
.map(EndpointName::name)
.collect(Collectors.toList()))
.required(true)
.endParam()
.description("Get Camel Status")
.id("getStatus")
.outType(EndpointStatus.class)
.bindingMode(RestBindingMode.auto)
.responseMessage().code(200).message("Returns an EndpointStatus object representing state of a camel endpoint").endResponseMessage()
.to(CAMEL_STATUS_URI);
Here are the annotations I used on this class:
#ApiModel(description = "Endpoint Status Model")
public class EndpointStatus {
private boolean isAvailable;
private EndpointName name;
private long timestamp;
#ApiModelProperty(value = "Is the endpoint available", required = true)
public boolean isAvailable() {
return isAvailable;
}
public void setAvailable(boolean available) {
isAvailable = available;
}
#ApiModelProperty(value = "The name of the endpoint", required = true)
public EndpointName getName() {
return name;
}
public void setName(EndpointName name) {
this.name = name;
}
#ApiModelProperty(value = "The timestamp the endpoint was checked", required = true)
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}
Along with the generated swagger documentation:
{
"swagger": "2.0",
"info": {
"version": "1.0.0",
"title": "Camel Service"
},
"host": "localhost:9000",
"tags": [
{
"name": "healthcheck",
"description": "Health Check REST service"
}
],
"schemes": [
"http"
],
"paths": {
"/healthcheck/getStatus/{endpointName}": {
"get": {
"tags": [
"healthcheck"
],
"summary": "Get Camel Status",
"operationId": "getStatus",
"parameters": [
{
"name": "endpointName",
"in": "path",
"required": true,
"type": "string",
"enum": [
"ENDPOINTA",
"ENDPOINTB"
]
}
],
"responses": {
"200": {
"description": "Returns an EndpointStatus object representing state of a camel endpoint",
"schema": {
"$ref": "#/definitions/EndpointStatus"
}
}
}
}
}
},
"definitions": {
"EndpointStatus": {
"type": "object",
"required": [
"available",
"name",
"timestamp"
],
"properties": {
"name": {
"type": "string",
"description": "The name of the endpoint",
"enum": [
"ENDPOINTA",
"ENDPOINTB"
]
},
"timestamp": {
"type": "integer",
"format": "int64",
"description": "The timestamp the endpoint was checked"
},
"available": {
"type": "boolean",
"description": "Is the endpoint available"
}
},
"description": "Endpoint Status Model"
}
}
}
However, when trying to move to use camel-openapi-java which supports OpenAPI Specification v3 with the same setup I am getting EndpointStatus without any fields / descriptions in my documentation.
{
"openapi": "3.0.2",
"info": {
"title": "SurePath Camel Service",
"version": "1.0.0"
},
"servers": [
{
"url": ""
}
],
"paths": {
"/healthcheck/getStatus/{endpointName}": {
"get": {
"tags": [
"healthcheck"
],
"parameters": [
{
"name": "endpointName",
"schema": {
"enum": [
"ENDPOINTA",
"ENDPOINTB"
],
"type": "string"
},
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "Returns an EndpointStatus object representing state of a camel endpoint"
}
},
"operationId": "getStatus",
"summary": "Get Camel Status",
"x-camelContextId": "camel-1",
"x-routeId": "getStatus"
}
},
"/healthcheck/isAvailable": {
"get": {
"tags": [
"healthcheck"
],
"responses": {
"200": {
"description": "Returns status code 200 when Camel is available"
}
},
"operationId": "verb1",
"summary": "Is Camel Available",
"x-camelContextId": "camel-1",
"x-routeId": "route4"
}
}
},
"components": {
"schemas": {
"EndpointStatus": {
"type": "EndpointStatus",
"x-className": {
"format": "com.sample.bean.EndpointStatus",
"type": "string"
}
}
}
},
"tags": [
{
"name": "healthcheck",
"description": "Health Check REST service"
}
]
}
I have tried adding this into my responseMessage and it is still not documenting correctly;
responseMessage().code(200).responseModel(EndpointStatus.class).message("Returns an EndpointStatus object representing state of a camel endpoint").endResponseMessage()
Do I need different annotations / RestDefinition config to get this EndpointStatus class appearing correctly in the OpenAPI documentation?
This looks to be an issue at the moment with the camel-openapi-java component; waiting for a resolution from this jira https://issues.apache.org/jira/browse/CAMEL-15158

Error when deploying a new contract to Azure Blockchain Workbench

When I try to deploy a sample contract to the Azure Blockchain Workbench:
The ContractUpdated call in function dispose of contract Contract has a parameter 'Only the contract owner can dispose of the contract.' which is a function name not defined in the set of functions for the workflow.
The text is actually a message in a require statement and has nothing to do with functions in workflows.
This is my contract:
pragma solidity ^0.4.24;
contract WorkbenchBase {
event WorkbenchContractCreated(string applicationName, string workflowName, address originatingAddress);
event WorkbenchContractUpdated(string applicationName, string workflowName, string action, address originatingAddress);
string internal ApplicationName;
string internal WorkflowName;
constructor(string memory applicationName, string memory workflowName) internal
{
ApplicationName = applicationName;
WorkflowName = workflowName;
}
function ContractCreated() internal
{
emit WorkbenchContractCreated(ApplicationName, WorkflowName, msg.sender);
}
function ContractUpdated(string memory action) internal
{
emit WorkbenchContractUpdated(ApplicationName, WorkflowName, action, msg.sender);
}
}
contract Contract is WorkbenchBase("Contract", "Contract")
{
enum StateType
{
New,
Disposed
}
address public owner;
StateType public state;
constructor() public
{
owner = msg.sender;
state = StateType.New;
ContractCreated();
}
function destroy() public
{
require(msg.sender == owner, "Only the contract owner can destroy the contract.");
selfdestruct(owner);
}
function dispose() public
{
require(msg.sender == owner, "Only the contract owner can dispose of the contract.");
state = StateType.Disposed;
ContractUpdated('dispose');
}
}
And this is my JSON file:
{
"Id": 1,
"ApplicationName": "Contract",
"DisplayName": "Contract",
"Description": "",
"ApplicationRoles": [
{
"Name": "Representative"
}
],
"Workflows": [
{
"Id": 1,
"Name": "Contract",
"DisplayName": "Contract",
"Initiators": [
"Representative"
],
"StartState": "New",
"Properties": [
{
"Id": 1,
"Name": "state",
"DisplayName": "State",
"Description": "Holds the state.",
"Type": {
"Name": "state"
}
},
{
"Id": 2,
"Name": "owner",
"DisplayName": "Owner",
"Description": "Holds the address of the owner of the contract.",
"Type": {
"Name": "address"
}
}
],
"Constructor": {
"Parameters": []
},
"Functions": [
{
"Id": "1",
"Name": "dispose",
"DisplayName": "Dispose",
"Description": "Disposes the contract.",
"Parameters": []
},
],
"States": [
{
"Id": 1,
"Name": "New",
"DisplayName": "New",
"PercentComplete": 0,
"Value": "New",
"Style": "Success",
"Transitions": [
{
"AllowedRoles": [
"Representative"
],
"AllowedInstanceRoles": [],
"Description": "Disposes the contract.",
"Function": "dispose",
"NextStates": [
"Disposed"
],
"DisplayName": "Dispose"
}
]
},
{
"Id": 100,
"Name": "Disposed",
"DisplayName": "Disposed",
"PercentComplete": 100,
"Value": "Disposed",
"Style": "Failure",
"Transitions": []
}
]
}
]
}
Is this a bug in Azure Blockchain Workbench or am I doing something wrong?

Symfony 2: findAll method return null value for mongDB field

I'm using synfony 2 with mongoDB
I have the following document in my collection
{
"_id": {
"$oid": "577d40967e6ad1cc1b3c9869"
},
"type": "5520A",
"numserie": "9375031",
"desig": "CCCCC",
"const": "FFFF",
"code": "XXX/E/002",
"calis": [
{
"type": "TENSION CONTINUE",
"cali": [
{
"val": "330",
"unit": "mV"
}, {
"val": "3.3",
"unit": "V"
}]
},
{
"type": "Courant continu",
"cali": [{
"val": "330",
"unit": "µA"
}, {
"val": "3.3",
"unit": "mA"
}]
}]
}
in my document entity I used collection annotation for the field "calis":
/**
* #MongoDB\Field(type="collection")
*/
protected $calis;
when I execute $list = $repository->findAll(); in my controller
I get Null value for the field "calis" (["calis":protected]=> NULL) which is not empty !!
Trying to understand the problem, I made a new method in the repository with the following code:
public function getList() {
$m = new \MongoClient();
$db = $m->selectDB('mymngdb');
$collection = new \MongoCollection($db, 'Mycollec');
$cursor = $collection->find();
foreach ($cursor as $doc) {
echo '<pre>';
var_dump($doc);
echo '</pre>';
}
}
and I get all the fields correctly !!

RestFB parsing many objects into one incorrectly

My restFB code results in writing on one App to my ArrayList. I need the arraylist to fill out properly with the number of appIds return in JSON. Any insights?
Here is my code:
public List<String> fetchAppIdsForUser() {
Connection<FacebookApp> appList = getClient().fetchConnection("me/applications/developer", FacebookApp.class);
List<String> appIds = new ArrayList<String> ();
for (List<FacebookApp> appListTwo : appList) {
for (FacebookApp app : appListTwo) {
appIds.add(app.getAppId());
}
}
return appIds;
}
And here is what is returned in JSON:
{
"data": [
{
"name": "x",
"namespace": "x",
"id": "x"
},
{
"name": "xx",
"namespace": "xx",
"id": "xx"
},
{
"name": "xxx",
"namespace": "xxxx",
"id": "xxxxx"
},
{
"name": "xxxx",
"namespace": "xxxxx",
"id": "xxxxx"
}
],
"paging": {
"next": "https://graph.facebook.com/xxxxx/applications?type=developer&format=json&access_token=XXXXXXXX"
}
}
I solved it using the following:
public List<String> fetchAppIdsForUser() {
Connection<FacebookApp> appList = getClient().fetchConnection("me/applications/developer", FacebookApp.class);
List<FacebookApp> list = appList.getData();
ArrayList<String> appNames = new ArrayList<String>();
for (FacebookApp app: list) {
appNames.add(app.getName());
}
return appNames;
}