From d9e1ec2fe41de05efc36d3e35d7e339a55c3f76e Mon Sep 17 00:00:00 2001 From: Soner Sayakci Date: Wed, 1 May 2024 17:43:34 +0200 Subject: [PATCH] fix: store upload, due new apis --- account-api/producer_extension.go | 109 ++++++++++-------- .../account_producer_extension_upload.go | 43 ++++--- 2 files changed, 89 insertions(+), 63 deletions(-) diff --git a/account-api/producer_extension.go b/account-api/producer_extension.go index a1557e6c..a36399d1 100644 --- a/account-api/producer_extension.go +++ b/account-api/producer_extension.go @@ -18,11 +18,10 @@ import ( type SoftwareVersionList []SoftwareVersion type ExtensionBinary struct { - Id int `json:"id"` - Name string `json:"name"` - RemoteLink string `json:"remoteLink"` - Version string `json:"version"` - Status struct { + Id int `json:"id"` + Name string `json:"name"` + Version string `json:"version"` + Status struct { Id int `json:"id"` Name string `json:"name"` Description string `json:"description"` @@ -36,24 +35,36 @@ type ExtensionBinary struct { } `json:"locale"` Text string `json:"text"` } `json:"changelogs"` - CreationDate string `json:"creationDate"` - LastChangeDate string `json:"lastChangeDate"` - Archives []struct { - Id int `json:"id"` - RemoteLink string `json:"remoteLink"` - ShopwareMajorVersion interface{} `json:"shopwareMajorVersion"` - IoncubeEncrypted bool `json:"ioncubeEncrypted"` - ManifestRemoteLink interface{} `json:"manifestRemoteLink"` - } `json:"archives"` - IonCubeEncrypted bool `json:"ionCubeEncrypted"` - LicenseCheckRequired bool `json:"licenseCheckRequired"` - HasActiveCodeReviewWarnings bool `json:"hasActiveCodeReviewWarnings"` + CreationDate string `json:"creationDate"` + LastChangeDate string `json:"lastChangeDate"` + IonCubeEncrypted bool `json:"ionCubeEncrypted"` + LicenseCheckRequired bool `json:"licenseCheckRequired"` + HasActiveCodeReviewWarnings bool `json:"hasActiveCodeReviewWarnings"` +} + +type ExtensionUpdate struct { + Id int + SoftwareVersions []string `json:"softwareVersions"` + IonCubeEncrypted bool `json:"ionCubeEncrypted"` + LicenseCheckRequired bool `json:"licenseCheckRequired"` + Changelogs []ExtensionUpdateChangelog `json:"changelogs"` +} + +type ExtensionUpdateChangelog struct { + Locale string `json:"locale"` + Text string `json:"text"` +} + +type ExtensionCreate struct { + SoftwareVersions []string `json:"softwareVersions"` + Changelogs []ExtensionUpdateChangelog `json:"changelogs"` + Version string `json:"version"` } func (e ProducerEndpoint) GetExtensionBinaries(ctx context.Context, extensionId int) ([]*ExtensionBinary, error) { errorFormat := "GetExtensionBinaries: %v" - r, err := e.c.NewAuthenticatedRequest(ctx, "GET", fmt.Sprintf("%s/plugins/%d/binaries", ApiUrl, extensionId), nil) + r, err := e.c.NewAuthenticatedRequest(ctx, "GET", fmt.Sprintf("%s/producers/%d/plugins/%d/binaries", ApiUrl, e.producerId, extensionId), nil) if err != nil { return nil, fmt.Errorf(errorFormat, err) } @@ -71,15 +82,15 @@ func (e ProducerEndpoint) GetExtensionBinaries(ctx context.Context, extensionId return binaries, nil } -func (e ProducerEndpoint) UpdateExtensionBinaryInfo(ctx context.Context, extensionId int, binary ExtensionBinary) error { +func (e ProducerEndpoint) UpdateExtensionBinaryInfo(ctx context.Context, extensionId int, update ExtensionUpdate) error { errorFormat := "UpdateExtensionBinaryInfo: %v" - content, err := json.Marshal(binary) + content, err := json.Marshal(update) if err != nil { return fmt.Errorf(errorFormat, err) } - r, err := e.c.NewAuthenticatedRequest(ctx, "PUT", fmt.Sprintf("%s/plugins/%d/binaries/%d", ApiUrl, extensionId, binary.Id), bytes.NewReader(content)) + r, err := e.c.NewAuthenticatedRequest(ctx, "PUT", fmt.Sprintf("%s/producers/%d/plugins/%d/binaries/%d", ApiUrl, e.producerId, extensionId, update.Id), bytes.NewReader(content)) if err != nil { return fmt.Errorf(errorFormat, err) } @@ -89,51 +100,30 @@ func (e ProducerEndpoint) UpdateExtensionBinaryInfo(ctx context.Context, extensi return err } -func (e ProducerEndpoint) CreateExtensionBinaryFile(ctx context.Context, extensionId int, zipPath string) (*ExtensionBinary, error) { - errorFormat := "CreateExtensionBinaryFile: %v" - - var b bytes.Buffer - w := multipart.NewWriter(&b) - - fileWritter, err := w.CreateFormFile("file", filepath.Base(zipPath)) - if err != nil { - return nil, fmt.Errorf(errorFormat, err) - } - - zipFile, err := os.Open(zipPath) - if err != nil { - return nil, fmt.Errorf(errorFormat, err) - } - - _, err = io.Copy(fileWritter, zipFile) - if err != nil { - return nil, fmt.Errorf(errorFormat, err) - } +func (e ProducerEndpoint) CreateExtensionBinary(ctx context.Context, extensionId int, create ExtensionCreate) (*ExtensionBinary, error) { + errorFormat := "CreateExtensionBinary: %v" - err = w.Close() + createPayload, err := json.Marshal(create) if err != nil { return nil, fmt.Errorf(errorFormat, err) } - r, err := e.c.NewAuthenticatedRequest(ctx, "POST", fmt.Sprintf("%s/plugins/%d/binaries", ApiUrl, extensionId), &b) + r, err := e.c.NewAuthenticatedRequest(ctx, "POST", fmt.Sprintf("%s/producers/%d/plugins/%d/binaries", ApiUrl, e.producerId, extensionId), bytes.NewReader(createPayload)) if err != nil { return nil, fmt.Errorf(errorFormat, err) } - r.Header.Set("content-type", w.FormDataContentType()) - content, err := e.c.doRequest(r) if err != nil { return nil, fmt.Errorf(errorFormat, err) } - // For some reasons this API responses a array of binaries - var binary []*ExtensionBinary + var binary *ExtensionBinary if err := json.Unmarshal(content, &binary); err != nil { return nil, fmt.Errorf(errorFormat, err) } - return binary[0], nil + return binary, nil } func (e ProducerEndpoint) UpdateExtensionBinaryFile(ctx context.Context, extensionId, binaryId int, zipPath string) error { @@ -161,7 +151,7 @@ func (e ProducerEndpoint) UpdateExtensionBinaryFile(ctx context.Context, extensi return fmt.Errorf(errorFormat, err) } - r, err := e.c.NewAuthenticatedRequest(ctx, "POST", fmt.Sprintf("%s/plugins/%d/binaries/%d/file", ApiUrl, extensionId, binaryId), &b) + r, err := e.c.NewAuthenticatedRequest(ctx, "POST", fmt.Sprintf("%s/producers/%d/plugins/%d/binaries/%d/file", ApiUrl, e.producerId, extensionId, binaryId), &b) if err != nil { return fmt.Errorf(errorFormat, err) } @@ -428,3 +418,24 @@ func (list SoftwareVersionList) FilterOnVersion(constriant *version.Constraints) return newList } + +func (list SoftwareVersionList) FilterOnVersionStringList(constriant *version.Constraints) []string { + newList := make([]string, 0) + + for _, swVersion := range list { + if !swVersion.Selectable { + continue + } + + v, err := version.NewVersion(swVersion.Name) + if err != nil { + continue + } + + if constriant.Check(v) { + newList = append(newList, swVersion.Name) + } + } + + return newList +} diff --git a/cmd/account/account_producer_extension_upload.go b/cmd/account/account_producer_extension_upload.go index 312ca1e8..34040238 100644 --- a/cmd/account/account_producer_extension_upload.go +++ b/cmd/account/account_producer_extension_upload.go @@ -61,15 +61,6 @@ var accountCompanyProducerExtensionUploadCmd = &cobra.Command{ } } - if foundBinary == nil { - foundBinary, err = p.CreateExtensionBinaryFile(cmd.Context(), ext.Id, path) - if err != nil { - return fmt.Errorf("create extension binary: %w", err) - } - } else { - logging.FromContext(cmd.Context()).Infof("Found a zip with version %s already. Updating it", zipVersion) - } - changelog, err := zipExt.GetChangelog() if err != nil { return err @@ -85,12 +76,36 @@ var accountCompanyProducerExtensionUploadCmd = &cobra.Command{ return err } - foundBinary.Version = zipVersion.String() - foundBinary.Changelogs[0].Text = changelog.German - foundBinary.Changelogs[1].Text = changelog.English - foundBinary.CompatibleSoftwareVersions = avaiableVersions.FilterOnVersion(constraint) + if foundBinary == nil { + create := account_api.ExtensionCreate{ + Version: zipVersion.String(), + SoftwareVersions: avaiableVersions.FilterOnVersionStringList(constraint), + Changelogs: []account_api.ExtensionUpdateChangelog{ + {Locale: "de_DE", Text: changelog.German}, + {Locale: "en_GB", Text: changelog.English}, + }, + } + + foundBinary, err = p.CreateExtensionBinary(cmd.Context(), ext.Id, create) + if err != nil { + return fmt.Errorf("create extension binary: %w", err) + } + + logging.FromContext(cmd.Context()).Infof("Created new binary with version %s", zipVersion) + } else { + logging.FromContext(cmd.Context()).Infof("Found a zip with version %s already. Updating it", zipVersion) + } + + update := account_api.ExtensionUpdate{ + Id: foundBinary.Id, + SoftwareVersions: avaiableVersions.FilterOnVersionStringList(constraint), + Changelogs: []account_api.ExtensionUpdateChangelog{ + {Locale: "de_DE", Text: changelog.German}, + {Locale: "en_GB", Text: changelog.English}, + }, + } - err = p.UpdateExtensionBinaryInfo(cmd.Context(), ext.Id, *foundBinary) + err = p.UpdateExtensionBinaryInfo(cmd.Context(), ext.Id, update) if err != nil { return err }