/
buildCommand.go
145 lines (127 loc) · 4.59 KB
/
buildCommand.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"path"
"path/filepath"
"net/http"
"github.com/Adaptech/les/pkg/eml"
"github.com/Adaptech/les/pkg/eml/generate"
"github.com/Adaptech/les/pkg/utils"
"github.com/ghodss/yaml"
"encoding/json"
"strings"
)
const latestReleaseUrl = "https://api.github.com/repos/Adaptech/les-node-template/releases/latest"
func getLatestReleaseInfoFromGithub() (tagName string, browserDownloadUrl string) {
tagName = ""
browserDownloadUrl = ""
metadata := map[string]interface{} {}
if res, err := http.Get(latestReleaseUrl); err != nil {
log.Printf("Error downloading latest release metadata: %s", err.Error())
return
} else if jsonMetadata, err := ioutil.ReadAll(res.Body); err != nil {
log.Printf("Error reading latest release metadata: %s", err.Error())
return
} else if err := json.Unmarshal(jsonMetadata, &metadata); err != nil {
log.Printf("Error parsing latest release metadata: %s", err.Error())
return
}
var ok bool
tagName, ok = metadata["tag_name"].(string)
if !ok {
log.Println("Error parsing latest release metadata: tag_name is not a string.")
return
}
assets, ok := metadata["assets"].([]interface{})
if !ok {
log.Println("Error parsing latest release metadata: assets is not an array.")
return
}
if len(assets) < 1 {
log.Println("Error parsing latest release metadata: assets is empty.")
return
}
asset, ok := assets[0].(map[string]interface{})
if !ok {
log.Println("Error parsing latest release metadata: asset[0] is not an object.")
}
browserDownloadUrl, ok = asset["browser_download_url"].(string)
if !ok {
log.Println("Error parsing latest release metadata: browser_download_url is not a string.")
return
}
return
}
func ensureTemplateExists(templateDir string, lang string) {
langTemplateDir := path.Join(templateDir, lang)
fmt.Println("Checking for latest template version on github...")
tagName, latestTemplateUrl := getLatestReleaseInfoFromGithub()
var latestTemplateName string
if tagName == "" || latestTemplateUrl == "" {
fmt.Println("Looking for latest template version locally...")
latestTemplateNameBytes, err := ioutil.ReadFile(path.Join(langTemplateDir, ".latest"))
if err != nil {
log.Fatalf("Error reading local latest metadata: %s", err.Error())
}
latestTemplateName = string(latestTemplateNameBytes)
} else {
latestTemplateName = strings.Replace(tagName, "release-", "les-node-template-", 1)
}
fmt.Println("Latest template version:", latestTemplateName)
latestTemplateDir := path.Join(langTemplateDir, latestTemplateName)
if _, err := os.Stat(latestTemplateDir); err == nil {
return
}
fmt.Println(lang, "template", latestTemplateName, "missing locally, downloading from server...")
if res, err := http.Get(latestTemplateUrl); err != nil {
log.Fatalf("Error downloading template: %s", err.Error())
} else if err := utils.Untar(langTemplateDir, res.Body); err != nil {
log.Fatalf("Error extracting archive: %s", err.Error())
}
if err := ioutil.WriteFile(path.Join(langTemplateDir, ".latest"), []byte(latestTemplateName), 0644); err != nil {
log.Fatalf("Error creating .latest file: %s", err.Error())
}
}
func writeSwaggerJSONFile(markup eml.Solution, buildDir string) {
swaggerYAML := generate.OpenAPISpec(markup)
err := ioutil.WriteFile(filepath.Join(buildDir, "swagger.yaml"), []byte(swaggerYAML), 0644)
if err != nil {
log.Fatalf("writeSwaggerJSONFile WriteFile: Error writing swagger.json - %v", err)
}
swaggerJSON, err := yaml.YAMLToJSON([]byte(swaggerYAML))
if err != nil {
log.Fatalf("writeSwaggerJSONFile YAMLToJSON: %v", err)
}
err = ioutil.WriteFile(filepath.Join(buildDir, "swagger.json"), []byte(swaggerJSON), 0644)
if err != nil {
log.Fatalf("writeSwaggerJSONFile WriteFile: Error writing swagger.json - %v", err)
}
}
func buildAPIFrom(inputFile string) error {
fileContent, err := ReadFile(inputFile)
if err != nil {
return err
}
markup := eml.Solution{}
markup.LoadYAML(fileContent)
espdirectory, err := getDirectories()
if err != nil {
log.Fatal(err)
}
buildDir := espdirectory.build
_ = os.MkdirAll(buildDir, os.ModePerm)
templateDir := espdirectory.template
_ = os.MkdirAll(buildDir, os.ModePerm)
ensureTemplateExists(templateDir, "nodejs")
generate.NodeAPI(markup, buildDir, templateDir)
writeSwaggerJSONFile(markup, buildDir)
fmt.Println("Source Code:\t./" + buildDir)
fmt.Println("URI:\t\thttp://localhost:3001/api/v1")
fmt.Println("Eventstore DB:\thttp://localhost:2113 (username 'admin', password 'changeit')")
fmt.Println("API Docs:\thttp://localhost:3001/api-docs")
fmt.Printf("Start API:\tcd api && npm install && docker-compose up -d\n")
return nil
}