Fixed App overwrites and bad app function names

This commit is contained in:
frikky
2020-06-01 18:55:19 +02:00
parent e11d58c239
commit 12ffc18338
6 changed files with 102 additions and 75 deletions
+30 -36
View File
@@ -510,39 +510,38 @@ func generateYaml(swagger *openapi3.Swagger, newmd5 string) (*openapi3.Swagger,
for actualPath, path := range swagger.Paths {
// FIXME: Add everything from here:
// https://godoc.org/github.com/getkin/kin-openapi/openapi3#PathItem
firstQuery := true
if path.Get != nil {
action, curCode := handleGet(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handleGet(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
if path.Connect != nil {
action, curCode := handleConnect(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handleConnect(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
if path.Head != nil {
action, curCode := handleHead(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handleHead(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
if path.Delete != nil {
action, curCode := handleDelete(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handleDelete(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
if path.Post != nil {
action, curCode := handlePost(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handlePost(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
if path.Patch != nil {
action, curCode := handlePatch(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handlePatch(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
if path.Put != nil {
action, curCode := handlePut(swagger, api, extraParameters, path, actualPath, firstQuery)
action, curCode := handlePut(swagger, api, extraParameters, path, actualPath)
api.Actions = append(api.Actions, action)
pythonFunctions = append(pythonFunctions, curCode)
}
@@ -736,7 +735,7 @@ func fixFunctionName(functionName, actualPath string) string {
return functionName
}
func handleConnect(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handleConnect(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
functionName := fixFunctionName(path.Connect.Summary, actualPath)
@@ -756,7 +755,7 @@ func handleConnect(swagger *openapi3.Swagger, api WorkflowApp, extraParameters [
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
parameters := []string{}
optionalParameters := []WorkflowAppActionParameter{}
@@ -818,11 +817,10 @@ func handleConnect(swagger *openapi3.Swagger, api WorkflowApp, extraParameters [
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
}
firstQuery = false
}
}
@@ -843,7 +841,7 @@ func handleConnect(swagger *openapi3.Swagger, api WorkflowApp, extraParameters [
return action, curCode
}
func handleGet(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handleGet(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
functionName := fixFunctionName(path.Get.Summary, actualPath)
@@ -863,7 +861,7 @@ func handleGet(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wor
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
// FIXME - remove this when authentication is properly introduced
@@ -930,11 +928,12 @@ func handleGet(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wor
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
log.Printf("NOT FIRST QUERY!: %s", baseUrl)
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
log.Printf("AFTER: %s", baseUrl)
}
firstQuery = false
}
}
@@ -955,7 +954,7 @@ func handleGet(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wor
return action, curCode
}
func handleHead(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handleHead(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
functionName := fixFunctionName(path.Head.Summary, actualPath)
@@ -975,7 +974,7 @@ func handleHead(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wo
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
parameters := []string{}
optionalParameters := []WorkflowAppActionParameter{}
@@ -1037,11 +1036,10 @@ func handleHead(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wo
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
}
firstQuery = false
}
}
@@ -1062,7 +1060,7 @@ func handleHead(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wo
return action, curCode
}
func handleDelete(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handleDelete(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
functionName := fixFunctionName(path.Delete.Summary, actualPath)
@@ -1082,7 +1080,7 @@ func handleDelete(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
parameters := []string{}
optionalParameters := []WorkflowAppActionParameter{}
@@ -1144,11 +1142,10 @@ func handleDelete(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
}
firstQuery = false
}
}
@@ -1169,7 +1166,7 @@ func handleDelete(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []
return action, curCode
}
func handlePost(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handlePost(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
//log.Printf("PATH: %s", actualPath)
functionName := fixFunctionName(path.Post.Summary, actualPath)
@@ -1192,7 +1189,7 @@ func handlePost(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wo
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
parameters := []string{}
optionalParameters := []WorkflowAppActionParameter{}
@@ -1256,11 +1253,10 @@ func handlePost(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wo
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
}
firstQuery = false
}
}
@@ -1281,7 +1277,7 @@ func handlePost(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wo
return action, curCode
}
func handlePatch(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handlePatch(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
functionName := fixFunctionName(path.Patch.Summary, actualPath)
@@ -1301,7 +1297,7 @@ func handlePatch(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []W
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
parameters := []string{}
optionalParameters := []WorkflowAppActionParameter{}
@@ -1363,11 +1359,10 @@ func handlePatch(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []W
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
}
firstQuery = false
}
}
@@ -1388,7 +1383,7 @@ func handlePatch(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []W
return action, curCode
}
func handlePut(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string, firstQuery bool) (WorkflowAppAction, string) {
func handlePut(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []WorkflowAppActionParameter, path *openapi3.PathItem, actualPath string) (WorkflowAppAction, string) {
// What to do with this, hmm
functionName := fixFunctionName(path.Put.Summary, actualPath)
@@ -1408,7 +1403,7 @@ func handlePut(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wor
// Parameters: []WorkflowAppActionParameter{},
// FIXME - add data for POST stuff
firstQuery = true
firstQuery := true
optionalQueries := []string{}
parameters := []string{}
optionalParameters := []WorkflowAppActionParameter{}
@@ -1471,11 +1466,10 @@ func handlePut(swagger *openapi3.Swagger, api WorkflowApp, extraParameters []Wor
if firstQuery {
baseUrl = fmt.Sprintf("%s?%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
} else {
baseUrl = fmt.Sprintf("%s&%s={%s}", baseUrl, param.Value.Name, param.Value.Name)
firstQuery = false
}
firstQuery = false
}
}
+22 -3
View File
@@ -1906,6 +1906,7 @@ func checkAdminLogin(resp http.ResponseWriter, request *http.Request) {
if err != nil {
resp.WriteHeader(401)
resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "%s"}`, err)))
return
}
if count == 0 {
@@ -5536,8 +5537,26 @@ func verifySwagger(resp http.ResponseWriter, request *http.Request) {
return
}
log.Printf("Functions: %d", swagger.Paths)
log.Printf("Actions: %d", len(api.Actions))
// FIXME: CHECK IF SAME NAME AS NORMAL APP
// Can't overwrite existing normal app
workflowApps, err := getAllWorkflowApps(ctx)
if err != nil {
log.Printf("Failed getting all workflow apps from database to verify: %s", err)
resp.WriteHeader(401)
resp.Write([]byte(`{"success": false, "reason": "Failed to verify existence"}`))
return
}
// Same name only?
lowerName := strings.ToLower(swagger.Info.Title)
for _, app := range workflowApps {
if app.Downloaded && !app.Generated && strings.ToLower(app.Name) == lowerName {
resp.WriteHeader(401)
resp.Write([]byte(fmt.Sprintf(`{"success": false, "reason": "Normal app with name %s already exists. Delete it first."}`, swagger.Info.Title)))
return
}
}
api.Owner = user.Id
err = dumpApi(basePath, api)
@@ -5843,7 +5862,7 @@ func init() {
log.Printf("Running INIT process")
dbclient, err = datastore.NewClient(ctx, gceProject)
if err != nil {
log.Printf("DBclient error during init: %s", err)
panic(fmt.Sprintf("DBclient error during init: %s", err))
}
go runInit(ctx)
+1 -1
View File
@@ -1355,12 +1355,12 @@ func saveWorkflow(resp http.ResponseWriter, request *http.Request) {
curapp := WorkflowApp{}
// FIXME - can this work with ONLY AppID?
for _, app := range workflowApps {
log.Printf("Name Version: %s_%s, other: %s_%s", app.Name, app.AppVersion, action.AppName, action.AppVersion)
if app.ID == action.AppID {
curapp = app
break
}
// Has to NOT be generated
//if app.Name == action.AppName && app.AppVersion == action.AppVersion {
// curapp = app
// break
+2 -2
View File
@@ -1,7 +1,7 @@
version: '3'
services:
frontend:
#build: ./frontend
build: ./frontend
image: frikky/shuffle:frontend
container_name: shuffle-frontend
hostname: shuffle-frontend
@@ -26,7 +26,7 @@ services:
volumes:
- ${DB_LOCATION}:/etc/shuffle
backend:
#build: ./backend
build: ./backend
image: frikky/shuffle:backend
container_name: shuffle-backend
hostname: ${BACKEND_HOSTNAME}
+5 -4
View File
@@ -807,12 +807,13 @@ const AngularWorkflow = (props) => {
// FIXME - check if they have value before overriding like this for no reason.
// Would save a lot of time (400~ ms -> 30ms)
//setSelectedAction({})
//console.log("ACTION: ", selectedAction)
//console.log("APP: ", selectedApp)
setSelectedAction({})
//setSelectedApp({})
//setSelectedTrigger({})
//setSelectedEdge({})
// setSelectedTriggerIndex(-1)
//setSelectedActionEnvironment({})
//setSelectedEdge({})
@@ -2635,7 +2636,7 @@ const AngularWorkflow = (props) => {
value={selectedActionName}
fullWidth
onChange={setNewSelectedAction}
style={{backgroundColor: inputColor, color: "white", height: "50px"}}
style={{backgroundColor: inputColor, color: "white", height: 50}}
SelectDisplayProps={{
style: {
marginLeft: 10,
@@ -4521,7 +4522,7 @@ const AngularWorkflow = (props) => {
<div style={{display: "flex", marginTop: 10, marginBottom: 30,}}>
<b>Actions</b>
<div>
{executionData.status !== undefined && executionData.status !== "ABORTED" && executionData.status !== "FINISHED" ? <CircularProgress style={{marginLeft: 20}}/> : null}
{executionData.status !== undefined && executionData.status !== "ABORTED" && executionData.status !== "FINISHED" && executionData.status !== "FAILURE" ? <CircularProgress style={{marginLeft: 20}}/> : null}
</div>
</div>
{executionData.results === undefined || executionData.results === null || executionData.results.length === 0 && executionData.status === "EXECUTING" ?
+18 -5
View File
@@ -43,6 +43,7 @@ const actionListStyle = {
}
const boxStyle = {
color: "white",
flex: "1",
marginLeft: "10px",
marginRight: "10px",
@@ -672,8 +673,10 @@ const AppCreator = (props) => {
})
.then((responseJson) => {
if (!responseJson.success) {
if (responseJson.reason !== undefined) {
setErrorCode(responseJson.reason)
alert.error("Failed to verify: ")
alert.error("Failed to verify: "+responseJson.reason)
}
} else {
alert.success("Successfully uploaded openapi")
if (window.location.pathname.includes("/new")) {
@@ -940,6 +943,9 @@ const AppCreator = (props) => {
const setActionField = (field, value) => {
currentAction[field] = value
setCurrentAction(currentAction)
//if (updater !== value) {
// setUpdater(value)
//}
}
const bodyInfo = actionBodyRequest.includes(currentActionMethod) ?
@@ -1114,6 +1120,7 @@ const AppCreator = (props) => {
open={actionsModalOpen}
fullWidth
onClose={() => {
console.log("CLOSED?")
setUrlPath("")
setCurrentAction({
"name": "",
@@ -1139,7 +1146,7 @@ const AppCreator = (props) => {
Name
<TextField
required
style={{flex: "1", marginTop: "5px", marginRight: "15px", backgroundColor: inputColor}}
style={{flex: "1", marginTop: 5, marginRight: 15, backgroundColor: inputColor}}
fullWidth={true}
placeholder="Name"
type="name"
@@ -1148,9 +1155,14 @@ const AppCreator = (props) => {
variant="outlined"
defaultValue={currentAction["name"]}
onChange={e => {
setActionField("name", e.target.value)
}}
onBlur={e => {
// Fix basic issues in frontend. Python functions run a-zA-Z0-9_
const regex = /[A-Z-a-z0-9 _]/g;
console.log(e.target.value)
const regex = /[A-Za-z0-9 _]/g;
const found = e.target.value.match(regex);
console.log("FOUND: ", found)
if (found !== null) {
setActionField("name", found.join(""))
}
@@ -1165,7 +1177,7 @@ const AppCreator = (props) => {
},
}}
/>
<div style={{marginTop: "10px"}}/>
<div style={{marginTop: 10}}/>
Description
<TextField
required
@@ -1336,6 +1348,7 @@ const AppCreator = (props) => {
addActionToView(errors)
setActionsModalOpen(false)
setUrlPathQueries([])
setUrlPath("")
}}>
Submit
</Button>
@@ -1570,7 +1583,7 @@ const AppCreator = (props) => {
}}>
Save
</Button>
{errorCode}
{errorCode.length > 0 ? `Error: ${errorCode}` : null}
</Paper>
</div>