Skip to content

Commit 070caae

Browse files
authored
Merge pull request #1308 from swagger-api/ft/1224-generate-serve-client
Generate menus for codegen servers and clients
2 parents f23e253 + d387236 commit 070caae

File tree

8 files changed

+177
-81
lines changed

8 files changed

+177
-81
lines changed

dist/swagger-editor-bundle.js

Lines changed: 72 additions & 70 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-editor-bundle.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-editor.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-editor.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/swagger-editor.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@
5151
"react-file-download": "^0.3.2",
5252
"react-redux": "^4.x.x",
5353
"redux": "^3.x.x",
54-
"swagger-ui": "^3.0.7"
54+
"swagger-client": "^3.0.7",
55+
"swagger-ui": "^3.0.7",
56+
"whatwg-fetch": "^2.0.3"
5557
},
5658
"devDependencies": {
5759
"autoprefixer": "6.6.1",

src/plugins/topbar/topbar.jsx

Lines changed: 78 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,43 @@
11
import React, { PropTypes } from "react"
2+
import Swagger from "swagger-client"
3+
import "whatwg-fetch"
24
import DropdownMenu from "react-dd-menu"
35
import Modal from "boron/DropModal"
46
import downloadFile from "react-file-download"
57
import YAML from "js-yaml"
68
import beautifyJson from "json-beautify"
79

8-
import "./topbar.less"
910
import "react-dd-menu/dist/react-dd-menu.css"
11+
import "./topbar.less"
1012
import Logo from "./logo_small.png"
1113

1214
export default class Topbar extends React.Component {
1315
constructor(props, context) {
1416
super(props, context)
1517

16-
this.state = {}
18+
Swagger("http://generator.swagger.io/api/swagger.json", {
19+
requestInterceptor: (req) => {
20+
req.headers["Accept"] = "application/json"
21+
req.headers["content-type"] = "application/json"
22+
}
23+
})
24+
.then(client => {
25+
this.setState({ swaggerClient: client })
26+
client.apis.clients.clientOptions()
27+
.then(res => {
28+
this.setState({ clients: res.body })
29+
})
30+
client.apis.servers.serverOptions()
31+
.then(res => {
32+
this.setState({ servers: res.body })
33+
})
34+
})
35+
36+
this.state = {
37+
swaggerClient: null,
38+
clients: [],
39+
servers: []
40+
}
1741
}
1842

1943
// Menu actions
@@ -71,6 +95,50 @@ export default class Topbar extends React.Component {
7195
this.props.specActions.updateSpec(yamlContent)
7296
}
7397

98+
downloadGeneratedFile = (type, name) => {
99+
let { specSelectors } = this.props
100+
let swaggerClient = this.state.swaggerClient
101+
if(!swaggerClient) {
102+
// Swagger client isn't ready yet.
103+
return
104+
}
105+
if(type === "server") {
106+
swaggerClient.apis.servers.generateServerForLanguage({
107+
framework : name,
108+
body: JSON.stringify({
109+
spec: specSelectors.specResolved()
110+
}),
111+
headers: JSON.stringify({
112+
Accept: "application/json"
113+
})
114+
})
115+
.then(res => handleResponse(res))
116+
}
117+
118+
if(type === "client") {
119+
swaggerClient.apis.clients.generateClient({
120+
language : name,
121+
body: JSON.stringify({
122+
spec: specSelectors.specResolved()
123+
})
124+
})
125+
.then(res => handleResponse(res))
126+
}
127+
128+
function handleResponse(res) {
129+
if(!res.ok) {
130+
return console.error(res)
131+
}
132+
133+
fetch(res.body.link)
134+
.then(res => res.blob())
135+
.then(res => {
136+
downloadFile(res, `${name}-${type}-generated.zip`)
137+
})
138+
}
139+
140+
}
141+
74142
// Helpers
75143

76144
showModal = () => {
@@ -114,6 +182,14 @@ export default class Topbar extends React.Component {
114182
<DropdownMenu {...makeMenuOptions("Edit")}>
115183
<li><button type="button" onClick={this.convertToYaml}>Convert to YAML</button></li>
116184
</DropdownMenu>
185+
<DropdownMenu className="long" {...makeMenuOptions("Generate Server")}>
186+
{ this.state.servers
187+
.map(serv => <li><button type="button" onClick={this.downloadGeneratedFile.bind(null, "server", serv)}>{serv}</button></li>) }
188+
</DropdownMenu>
189+
<DropdownMenu className="long" {...makeMenuOptions("Generate Client")}>
190+
{ this.state.clients
191+
.map(cli => <li><button type="button" onClick={this.downloadGeneratedFile.bind(null, "client", cli)}>{cli}</button></li>) }
192+
</DropdownMenu>
117193
</div>
118194
</div>
119195
<Modal className="swagger-ui modal" ref="modal">

src/plugins/topbar/topbar.less

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,22 @@
4141
}
4242

4343
.dd-menu {
44+
&.long {
45+
display: flex;
46+
flex-wrap: wrap;
47+
max-width:800px;
48+
.dd-menu-items {
49+
width:600px;
50+
.dd-items-left {
51+
display: flex;
52+
flex-wrap: wrap;
53+
margin: 1.7em 0 0!important;
54+
li {
55+
flex:22%;
56+
}
57+
}
58+
}
59+
}
4460

4561
.dd-menu-items {
4662
margin: 1.1em 0 0 0 !important;

0 commit comments

Comments
 (0)