From f561a238a665dfb8b0134941eca1913ee7670309 Mon Sep 17 00:00:00 2001
From: Gustavo Bazan <gus.bazan@hey.com>
Date: Thu, 20 Mar 2025 14:52:06 +0000
Subject: [PATCH] poc: flatten

---
 tools/cli/Makefile                            |  2 +-
 tools/cli/internal/cli/flatten/flatten.go     | 46 +++++++++++++++++++
 .../cli/internal/cli/root/openapi/builder.go  |  5 +-
 tools/cli/internal/openapi/openapi.go         |  1 +
 tools/postman/scripts/upload-collection.sh    | 18 ++++++--
 5 files changed, 65 insertions(+), 7 deletions(-)
 create mode 100644 tools/cli/internal/cli/flatten/flatten.go

diff --git a/tools/cli/Makefile b/tools/cli/Makefile
index 768e41363c..1b769c121a 100644
--- a/tools/cli/Makefile
+++ b/tools/cli/Makefile
@@ -1,6 +1,6 @@
 # A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
 
-GOLANGCI_VERSION=v1.64.5
+GOLANGCI_VERSION=v1.64.7
 SOURCE_FILES?=./cmd
 BINARY_NAME=foascli
 VERSION=v0.0.1
diff --git a/tools/cli/internal/cli/flatten/flatten.go b/tools/cli/internal/cli/flatten/flatten.go
new file mode 100644
index 0000000000..de382a8e36
--- /dev/null
+++ b/tools/cli/internal/cli/flatten/flatten.go
@@ -0,0 +1,46 @@
+package flatten
+
+import (
+	"fmt"
+	"github.com/getkin/kin-openapi/openapi3"
+	"github.com/mongodb/openapi/tools/cli/internal/cli/flag"
+	"github.com/mongodb/openapi/tools/cli/internal/cli/usage"
+	"github.com/spf13/cobra"
+	"github.com/tufin/oasdiff/flatten/allof"
+	"gopkg.in/yaml.v3"
+)
+
+func Builder() *cobra.Command {
+	var spec string
+
+	cmd := &cobra.Command{
+		Use:   "flatten -s <spec>",
+		Short: "Flatten the spec.",
+		Args:  cobra.NoArgs,
+
+		RunE: func(_ *cobra.Command, _ []string) error {
+			loader := openapi3.NewLoader()
+			loader.IsExternalRefsAllowed = true
+			specInfo, err := loader.LoadFromFile(spec)
+			//spec, err := load.NewSpecInfo(loader, spec, load.WithFlattenAllOf())
+			//loader := openapi.NewOpenAPI3()
+			//specInfo, err := loader.CreateOpenAPISpecFromPath(spec)
+			//if err != nil {
+			//	return err
+			//}
+			result, err := allof.MergeSpec(specInfo)
+			if err != nil {
+				return err
+			}
+			yamlData, err := yaml.Marshal(result)
+			fmt.Print(string(yamlData))
+			return nil
+		},
+	}
+
+	cmd.Flags().StringVarP(&spec, flag.Spec, flag.SpecShort, "-", usage.Spec)
+
+	_ = cmd.MarkFlagRequired(flag.Spec)
+
+	return cmd
+}
diff --git a/tools/cli/internal/cli/root/openapi/builder.go b/tools/cli/internal/cli/root/openapi/builder.go
index fe81ade583..33bb9c16af 100644
--- a/tools/cli/internal/cli/root/openapi/builder.go
+++ b/tools/cli/internal/cli/root/openapi/builder.go
@@ -16,17 +16,17 @@ package openapi
 
 import (
 	"fmt"
-	"runtime"
-
 	"github.com/mongodb/openapi/tools/cli/internal/cli/breakingchanges"
 	"github.com/mongodb/openapi/tools/cli/internal/cli/changelog"
 	"github.com/mongodb/openapi/tools/cli/internal/cli/filter"
+	"github.com/mongodb/openapi/tools/cli/internal/cli/flatten"
 	"github.com/mongodb/openapi/tools/cli/internal/cli/merge"
 	"github.com/mongodb/openapi/tools/cli/internal/cli/split"
 	"github.com/mongodb/openapi/tools/cli/internal/cli/sunset"
 	"github.com/mongodb/openapi/tools/cli/internal/cli/versions"
 	"github.com/mongodb/openapi/tools/cli/internal/version"
 	"github.com/spf13/cobra"
+	"runtime"
 )
 
 const (
@@ -63,6 +63,7 @@ func Builder() *cobra.Command {
 		breakingchanges.Builder(),
 		sunset.Builder(),
 		filter.Builder(),
+		flatten.Builder(),
 	)
 	return rootCmd
 }
diff --git a/tools/cli/internal/openapi/openapi.go b/tools/cli/internal/openapi/openapi.go
index 4002c46e5e..9c3dc86783 100644
--- a/tools/cli/internal/openapi/openapi.go
+++ b/tools/cli/internal/openapi/openapi.go
@@ -35,6 +35,7 @@ type Spec struct {
 	Components   *openapi3.Components          `json:"components,omitempty" yaml:"components,omitempty"`
 	ExternalDocs *openapi3.ExternalDocs        `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
 }
+
 type Parser interface {
 	CreateOpenAPISpecFromPath(string) (*load.SpecInfo, error)
 }
diff --git a/tools/postman/scripts/upload-collection.sh b/tools/postman/scripts/upload-collection.sh
index f913e7596e..00908f7344 100755
--- a/tools/postman/scripts/upload-collection.sh
+++ b/tools/postman/scripts/upload-collection.sh
@@ -28,10 +28,11 @@ pushd "${OPENAPI_FOLDER}"
 current_collection_name="⭐MongoDB Atlas Administration API ${current_api_revision}"
 
 echo "Fetching list of current collections"
-echo "curl -o ${COLLECTIONS_LIST_FILE} 
+echo "curl -o ${COLLECTIONS_LIST_FILE}
      --location 'https://api.getpostman.com/collections?workspace=${WORKSPACE_ID}'
      --header 'X-API-Key: **********'"
-curl --show-error --fail --silent -o "${COLLECTIONS_LIST_FILE}" \
+curl --show-error \
+     --fail --silent -o "${COLLECTIONS_LIST_FILE}" \
      --location "https://api.getpostman.com/collections?workspace=${WORKSPACE_ID}" \
      --header "X-API-Key: ${POSTMAN_API_KEY}"
 
@@ -63,7 +64,11 @@ if [  "$collection_exists" = "false" ]; then
      --header 'Content-Type: application/json'
      --header 'X-API-Key: **********'
      --data ${collection_transformed_path}"
-  curl --show-error --fail --retry 5 --retry-all-errors --silent \
+  curl --show-error \
+       --fail \
+       --retry 5 \
+       --retry-all-errors \
+       --silent \
        --location "https://api.getpostman.com/collections?workspace=${WORKSPACE_ID}" \
        --header "Content-Type: application/json" \
        --header "X-API-Key: ${POSTMAN_API_KEY}" \
@@ -80,7 +85,12 @@ else
      --header 'X-API-Key: **********'
      --data ${collection_transformed_path}"
 
-  curl --show-error --fail --retry 5 --retry-all-errors --silent --request PUT \
+  curl --show-error \
+       --fail \
+       --retry 5 \
+       --retry-all-errors \
+       --silent \
+       --request PUT \
        --location "https://api.getpostman.com/collections/${collection_id}" \
        --header "Content-Type: application/json" \
        --header "X-API-Key: ${POSTMAN_API_KEY}" \