Finished app activation with search engine
This commit is contained in:
@@ -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
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
parsedApi.Success = true
|
//log.Printf("Parsed API: %#v", parsedApi)
|
||||||
|
if len(parsedApi.ID) > 0 {
|
||||||
|
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)
|
||||||
|
|||||||
+22
-10
@@ -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)
|
||||||
@@ -263,9 +263,12 @@ const AppCreator = (props) => {
|
|||||||
break
|
break
|
||||||
} 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={{
|
||||||
@@ -628,13 +635,18 @@ const AppCreator = (props) => {
|
|||||||
name: 'age',
|
name: 'age',
|
||||||
id: 'outlined-age-simple',
|
id: 'outlined-age-simple',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
>
|
{apikeySelection.map(data => {
|
||||||
{apikeySelection.map(data => (
|
if (data === undefined) {
|
||||||
<MenuItem style={{backgroundColor: inputColor, color: "white"}} value={data}>
|
return null
|
||||||
{data}
|
}
|
||||||
</MenuItem>
|
|
||||||
))}
|
return (
|
||||||
|
<MenuItem style={{backgroundColor: inputColor, color: "white"}} value={data}>
|
||||||
|
{data}
|
||||||
|
</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>
|
||||||
|
|||||||
+27
-17
@@ -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>
|
||||||
<h2>{newAppname}</h2>
|
<div style={{display: "flex"}}>
|
||||||
<p>{description}</p>
|
<div style={{marginRight: 15, marginTop: 10}}>
|
||||||
|
{imageline}
|
||||||
|
</div>
|
||||||
|
<div style={{maxWidth: "75%", overflow: "hidden"}}>
|
||||||
|
<h2>{newAppname}</h2>
|
||||||
|
<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
|
||||||
|
|||||||
Reference in New Issue
Block a user