Finished app activation with search engine

This commit is contained in:
frikky
2020-05-24 08:57:26 +02:00
parent 62bc6708c1
commit eb59c0cea6
5 changed files with 83 additions and 62 deletions
+1
View File
@@ -361,6 +361,7 @@ func generateYaml(swagger *openapi3.Swagger, newmd5 string) (WorkflowApp, []stri
api.Tested = false api.Tested = false
api.PrivateID = newmd5 api.PrivateID = newmd5
api.Generated = true api.Generated = true
api.Activated = true
// Setting up security schemes // Setting up security schemes
extraParameters := []WorkflowAppActionParameter{} extraParameters := []WorkflowAppActionParameter{}
+17 -33
View File
@@ -5194,24 +5194,21 @@ func handleSwaggerValidation(body []byte) (ParsedOpenApi, error) {
if strings.HasPrefix(version.Swagger, "3.") || strings.HasPrefix(version.OpenAPI, "3.") { if strings.HasPrefix(version.Swagger, "3.") || strings.HasPrefix(version.OpenAPI, "3.") {
//log.Println("Handling v3 API") //log.Println("Handling v3 API")
_, err := openapi3.NewSwaggerLoader().LoadSwaggerFromData(body) swaggerv3, err := openapi3.NewSwaggerLoader().LoadSwaggerFromData(body)
if err != nil { if err != nil {
return ParsedOpenApi{}, err return ParsedOpenApi{}, err
} }
hasher := md5.New() swaggerdata, err = json.Marshal(swaggerv3)
hasher.Write(body) if err != nil {
idstring = hex.EncodeToString(hasher.Sum(nil)) log.Printf("Failed unmarshaling v3 data: %s", err)
return ParsedOpenApi{}, err
//log.Printf("Swagger v3 validation success with ID %s!", idstring)
//log.Printf("Paths: %d", len(swagger.Paths))
if !isJson {
//log.Printf("FIXME: NEED TO TRANSFORM FROM YAML TO JSON for %s", idstring)
} }
//return nil hasher := md5.New()
//return ParsedOpenApi{}, err hasher.Write(swaggerdata)
idstring = hex.EncodeToString(hasher.Sum(nil))
} else { //strings.HasPrefix(version.Swagger, "2.") || strings.HasPrefix(version.OpenAPI, "2.") { } else { //strings.HasPrefix(version.Swagger, "2.") || strings.HasPrefix(version.OpenAPI, "2.") {
// Convert // Convert
//log.Println("Handling v2 API") //log.Println("Handling v2 API")
@@ -5245,24 +5242,19 @@ func handleSwaggerValidation(body []byte) (ParsedOpenApi, error) {
hasher := md5.New() hasher := md5.New()
hasher.Write(swaggerdata) hasher.Write(swaggerdata)
idstring = hex.EncodeToString(hasher.Sum(nil)) idstring = hex.EncodeToString(hasher.Sum(nil))
if !isJson {
//log.Printf("FIXME: NEED TO TRANSFORM FROM YAML TO JSON for %s?", idstring)
}
//log.Printf("Swagger v2 -> v3 validation success with ID %s!", idstring)
ctx := context.Background()
err = setOpenApiDatastore(ctx, idstring, parsed)
if err != nil {
log.Printf("Failed uploading openapi2 to datastore: %s", err)
return ParsedOpenApi{}, err
}
} }
if len(swaggerdata) > 0 { if len(swaggerdata) > 0 {
body = swaggerdata body = swaggerdata
} }
//parsed := ParsedOpenApi{}
if !isJson {
//yaml.l
log.Printf("Parsing from YAML to json!")
body = swaggerdata
}
// Parsing it to swagger 3 // Parsing it to swagger 3
parsed = ParsedOpenApi{ parsed = ParsedOpenApi{
ID: idstring, ID: idstring,
@@ -5695,14 +5687,6 @@ func verifySwagger(resp http.ResponseWriter, request *http.Request) {
return return
} }
log.Println(len(user.PrivateApps))
c, err := request.Cookie("session_token")
if err == nil {
//log.Printf("Should've deleted cache for %s with token %s", user.Username, c.Value)
//err = memcache.Delete(request.Context(), c.Value)
//err = memcache.Delete(request.Context(), user.ApiKey)
}
parsed := ParsedOpenApi{ parsed := ParsedOpenApi{
ID: api.ID, ID: api.ID,
Body: string(body), Body: string(body),
@@ -5836,7 +5820,7 @@ func runInit(ctx context.Context) {
if err != nil { if err != nil {
log.Printf("Failed loading repo %s into memory: %s", err) log.Printf("Failed loading repo %s into memory: %s", err)
} else { } else {
log.Printf("Finished getting data.. Now looking for updates") log.Printf("Finished git clone. Looking for updates to the repo.")
dir, err := fs.ReadDir("") dir, err := fs.ReadDir("")
if err != nil { if err != nil {
log.Printf("Failed reading folder: %s", err) log.Printf("Failed reading folder: %s", err)
+15 -1
View File
@@ -2704,7 +2704,6 @@ func getWorkflowAppConfig(resp http.ResponseWriter, request *http.Request) {
} }
location := strings.Split(request.URL.String(), "/") location := strings.Split(request.URL.String(), "/")
log.Printf("%#v", location)
var fileId string var fileId string
if location[1] == "api" { if location[1] == "api" {
if len(location) <= 4 { if len(location) <= 4 {
@@ -2732,14 +2731,22 @@ func getWorkflowAppConfig(resp http.ResponseWriter, request *http.Request) {
return return
} }
log.Printf("Getting app %s", fileId)
parsedApi, err := getOpenApiDatastore(ctx, fileId) parsedApi, err := getOpenApiDatastore(ctx, fileId)
if err != nil { if err != nil {
log.Printf("OpenApi doesn't exist for: %s - err: %s", fileId, err)
resp.WriteHeader(401) resp.WriteHeader(401)
resp.Write([]byte(`{"success": false}`)) resp.Write([]byte(`{"success": false}`))
return return
} }
//log.Printf("Parsed API: %#v", parsedApi)
if len(parsedApi.ID) > 0 {
parsedApi.Success = true parsedApi.Success = true
} else {
parsedApi.Success = false
}
data, err := json.Marshal(parsedApi) data, err := json.Marshal(parsedApi)
if err != nil { if err != nil {
resp.WriteHeader(422) resp.WriteHeader(422)
@@ -3393,6 +3400,13 @@ func iterateOpenApiGithub(fs billy.Filesystem, dir []os.FileInfo, extra string,
continue continue
} else { } else {
log.Printf("Added %s:%s to the database from OpenAPI repo", api.Name, api.AppVersion) log.Printf("Added %s:%s to the database from OpenAPI repo", api.Name, api.AppVersion)
// Set OpenAPI datastore
err = setOpenApiDatastore(ctx, parsedOpenApi.ID, parsedOpenApi)
if err != nil {
log.Printf("Failed uploading openapi to datastore in loop: %s", err)
continue
}
} }
} else { } else {
//log.Printf("Skipped upload of %s (%s)", api.Name, api.ID) //log.Printf("Skipped upload of %s (%s)", api.Name, api.ID)
+17 -5
View File
@@ -81,7 +81,7 @@ const AppCreator = (props) => {
const [actionsModalOpen, setActionsModalOpen] = useState(false); const [actionsModalOpen, setActionsModalOpen] = useState(false);
const [authenticationOption, setAuthenticationOption] = useState(authenticationOptions[0]); const [authenticationOption, setAuthenticationOption] = useState(authenticationOptions[0]);
const [parameterName, setParameterName] = useState(""); const [parameterName, setParameterName] = useState("");
const [parameterLocation, setParameterLocation] = useState(apikeySelection[0]); const [parameterLocation, setParameterLocation] = useState(apikeySelection.length > 0 ? apikeySelection[0] : "");
const [urlPath, setUrlPath] = useState(""); const [urlPath, setUrlPath] = useState("");
//const [urlPathQueries, setUrlPathQueries] = useState([{"name": "test", "required": false}]); //const [urlPathQueries, setUrlPathQueries] = useState([{"name": "test", "required": false}]);
const [urlPathQueries, setUrlPathQueries] = useState([]); const [urlPathQueries, setUrlPathQueries] = useState([]);
@@ -161,7 +161,7 @@ const AppCreator = (props) => {
.then((responseJson) => { .then((responseJson) => {
setIsAppLoaded(true) setIsAppLoaded(true)
if (!responseJson.success) { if (!responseJson.success) {
alert.error("Failed to verify") alert.error("Failed to get the app")
} else { } else {
const data = JSON.parse(responseJson.body) const data = JSON.parse(responseJson.body)
console.log("LOADED IMAGE: ", data.image) console.log("LOADED IMAGE: ", data.image)
@@ -264,8 +264,11 @@ const AppCreator = (props) => {
} else if (value.type === "apiKey") { } else if (value.type === "apiKey") {
setAuthenticationOption("API key") setAuthenticationOption("API key")
setParameterName(value.name) setParameterName(value.name)
value.in = value.in.charAt(0).toUpperCase() + value.in.slice(1);
setParameterLocation(value.in) setParameterLocation(value.in)
if (!apikeySelection.includes(value.in)) { if (!apikeySelection.includes(value.in)) {
console.log("APIKEY SELECT: ", apikeySelection)
alert.error("Might be error in setting up API key authentication") alert.error("Might be error in setting up API key authentication")
} }
break break
@@ -593,6 +596,9 @@ const AppCreator = (props) => {
setActions(actions) setActions(actions)
} }
console.log("Option: ", authenticationOption)
console.log("Location: ", parameterLocation)
console.log("Name: ", parameterName)
const apiKey = authenticationOption === "API key" ? const apiKey = authenticationOption === "API key" ?
<div> <div>
<h4>API key</h4> <h4>API key</h4>
@@ -605,6 +611,7 @@ const AppCreator = (props) => {
id="standard-required" id="standard-required"
margin="normal" margin="normal"
variant="outlined" variant="outlined"
defaultValue={parameterName}
helperText={<div style={{color:"white", marginBottom: "2px",}}>Can't be empty. Can't contain any of the following characters: !#$%&'^+-._~|]+$</div>} helperText={<div style={{color:"white", marginBottom: "2px",}}>Can't be empty. Can't contain any of the following characters: !#$%&'^+-._~|]+$</div>}
onChange={e => setParameterName(e.target.value)} onChange={e => setParameterName(e.target.value)}
InputProps={{ InputProps={{
@@ -629,12 +636,17 @@ const AppCreator = (props) => {
id: 'outlined-age-simple', id: 'outlined-age-simple',
}} }}
> >
> {apikeySelection.map(data => {
{apikeySelection.map(data => ( if (data === undefined) {
return null
}
return (
<MenuItem style={{backgroundColor: inputColor, color: "white"}} value={data}> <MenuItem style={{backgroundColor: inputColor, color: "white"}} value={data}>
{data} {data}
</MenuItem> </MenuItem>
))} )}
)}
</Select> </Select>
<Divider style={{marginBottom: "10px", marginTop: "30px", height: "1px", width: "100%", backgroundColor: "grey"}}/> <Divider style={{marginBottom: "10px", marginTop: "30px", height: "1px", width: "100%", backgroundColor: "grey"}}/>
</div> </div>
+25 -15
View File
@@ -262,7 +262,7 @@ const Apps = (props) => {
const dividerColor = "rgb(225, 228, 232)" const dividerColor = "rgb(225, 228, 232)"
const uploadViewPaperStyle = { const uploadViewPaperStyle = {
minWidth: "100%", minWidth: "100%",
maxWidth: "100%", maxWidth: 662.5,
color: "white", color: "white",
backgroundColor: surfaceColor, backgroundColor: surfaceColor,
display: "flex", display: "flex",
@@ -285,9 +285,10 @@ const Apps = (props) => {
var description = selectedApp.description var description = selectedApp.description
const url = "/apps/edit/"+selectedApp.id const editUrl = "/apps/edit/"+selectedApp.id
const activateUrl = "/apps/new?id="+selectedApp.id
var editButton = selectedApp.activated && selectedApp.private_id !== undefined && selectedApp.private_id.length > 0 && selectedApp.generated ? var editButton = selectedApp.activated && selectedApp.private_id !== undefined && selectedApp.private_id.length > 0 && selectedApp.generated ?
<Link to={url} style={{textDecoration: "none"}}> <Link to={editUrl} style={{textDecoration: "none"}}>
<Button <Button
variant="outlined" variant="outlined"
component="label" component="label"
@@ -298,9 +299,9 @@ const Apps = (props) => {
</Button></Link> : null </Button></Link> : null
var activateButton = selectedApp.generated && !selectedApp.activated ? var activateButton = selectedApp.generated && !selectedApp.activated ?
<Link to={url} style={{textDecoration: "none"}}> <Link to={activateUrl} style={{textDecoration: "none"}}>
<Button <Button
variant="outlined" variant="contained"
component="label" component="label"
color="primary" color="primary"
style={{marginTop: "10px"}} style={{marginTop: "10px"}}
@@ -308,8 +309,7 @@ const Apps = (props) => {
Activate App Activate App
</Button></Link> : null </Button></Link> : null
var deleteButton = ((selectedApp.private_id !== undefined && selectedApp.private_id.length > 0 && selectedApp.generated) || (selectedApp.downloaded != undefined && selectedApp.downloaded == true)) && activateButton === null ?
var deleteButton = (selectedApp.private_id !== undefined && selectedApp.private_id.length > 0 && selectedApp.generated) || (selectedApp.downloaded != undefined && selectedApp.downloaded == true) ?
<Button <Button
variant="outlined" variant="outlined"
component="label" component="label"
@@ -322,16 +322,30 @@ const Apps = (props) => {
Delete app Delete app
</Button> : null </Button> : null
var imageline = selectedApp.large_image === undefined || selectedApp.large_image.length === 0 ?
<img alt={selectedApp.title} style={{width: 100, height: 100}} />
:
<img alt={selectedApp.title} src={selectedApp.large_image} style={{width: 100, height: 100, maxWidth: "100%"}} />
//fetch(globalUrl+"/api/v1/get_openapi/"+urlParams.get("id"), { //fetch(globalUrl+"/api/v1/get_openapi/"+urlParams.get("id"), {
var baseInfo = newAppname.length > 0 ? var baseInfo = newAppname.length > 0 ?
<div> <div>
<div style={{display: "flex"}}>
<div style={{marginRight: 15, marginTop: 10}}>
{imageline}
</div>
<div style={{maxWidth: "75%", overflow: "hidden"}}>
<h2>{newAppname}</h2> <h2>{newAppname}</h2>
<p>{description}</p> <p>{description}</p>
</div>
</div>
{activateButton}
{editButton}
{deleteButton}
<Divider style={{marginBottom: "10px", marginTop: "10px", backgroundColor: dividerColor}}/> <Divider style={{marginBottom: "10px", marginTop: "10px", backgroundColor: dividerColor}}/>
{selectedApp.link.length > 0 ? <p>URL: {selectedApp.link}</p> : null} {selectedApp.link.length > 0 ? <p><b>URL:</b> {selectedApp.link}</p> : null}
<p>ID: {selectedApp.id}</p> <p><b>ID:</b> {selectedApp.id}</p>
{selectedApp.privateId !== undefined && selectedApp.privateId.length > 0 ? <p>PrivateID: {selectedApp.privateId}</p> : null} {selectedApp.privateId !== undefined && selectedApp.privateId.length > 0 ? <p><b>PrivateID:</b> {selectedApp.privateId}</p> : null}
<div style={{marginTop: 15, marginBottom: 15}}> <div style={{marginTop: 15, marginBottom: 15}}>
<b>Actions</b> <b>Actions</b>
@@ -387,10 +401,6 @@ const Apps = (props) => {
})} })}
</div> </div>
: null} : null}
{activateButton}
{editButton}
{deleteButton}
</div> </div>
: :
null null
@@ -490,7 +500,7 @@ const Apps = (props) => {
setLoadAppsModalOpen(true) setLoadAppsModalOpen(true)
}} }}
> >
Download from URL Download more apps
</Button> </Button>
</div> </div>
<TextField <TextField