Skip to content

Commit 6d45dc9

Browse files
authored
Merge pull request #930 from shopware/fix/pull-update-extension-metadata
fix(account): update extension label and description on info pull
2 parents 8081809 + af38857 commit 6d45dc9

7 files changed

Lines changed: 288 additions & 18 deletions

File tree

cmd/account/account_producer_extension_info_pull.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,17 @@ var accountCompanyProducerExtensionInfoPullCmd = &cobra.Command{
123123
englishMetaTitle := ""
124124
germanMetaDescription := ""
125125
englishMetaDescription := ""
126+
germanLabel := ""
127+
englishLabel := ""
128+
germanShortDescription := ""
129+
englishShortDescription := ""
126130

127131
for _, info := range storeExt.Infos {
128132
language := info.Locale.Name[0:2]
129133

130134
if language == "de" {
135+
germanLabel = info.Name
136+
germanShortDescription = info.ShortDescription
131137
germanDescription = "file:src/Resources/store/description.de.html"
132138
germanInstallationManual = "file:src/Resources/store/installation_manual.de.html"
133139
germanMetaTitle = info.MetaTitle
@@ -160,6 +166,8 @@ var accountCompanyProducerExtensionInfoPullCmd = &cobra.Command{
160166
faqDE = append(faqDE, extension.ConfigStoreFaq{Question: element.Question, Answer: element.Answer, Position: element.Position})
161167
}
162168
} else {
169+
englishLabel = info.Name
170+
englishShortDescription = info.ShortDescription
163171
englishDescription = "file:src/Resources/store/description.en.html"
164172
englishInstallationManual = "file:src/Resources/store/installation_manual.en.html"
165173
englishMetaTitle = info.MetaTitle
@@ -195,6 +203,22 @@ var accountCompanyProducerExtensionInfoPullCmd = &cobra.Command{
195203
}
196204
}
197205

206+
if germanLabel != "" || englishLabel != "" || germanShortDescription != "" || englishShortDescription != "" {
207+
err = zipExt.UpdateMetaData(&extension.ExtensionMetadata{
208+
Label: extension.ExtensionTranslated{
209+
German: germanLabel,
210+
English: englishLabel,
211+
},
212+
Description: extension.ExtensionTranslated{
213+
German: germanShortDescription,
214+
English: englishShortDescription,
215+
},
216+
})
217+
if err != nil {
218+
return fmt.Errorf("cannot update extension metadata: %w", err)
219+
}
220+
}
221+
198222
extType := "extension"
199223

200224
if storeExt.ProductType != nil {

internal/extension/app.go

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,22 +136,87 @@ func (a App) GetIconPath() string {
136136
return filepath.Join(a.GetRootDir(), iconPath)
137137
}
138138

139-
func (a App) GetMetaData() *extensionMetadata {
139+
func (a App) GetMetaData() *ExtensionMetadata {
140140
german := []string{"de-DE", "de"}
141141
english := []string{"en-GB", "en-US", "en", ""}
142142

143-
return &extensionMetadata{
144-
Label: extensionTranslated{
143+
return &ExtensionMetadata{
144+
Label: ExtensionTranslated{
145145
German: a.manifest.Meta.Label.GetValueByLanguage(german),
146146
English: a.manifest.Meta.Label.GetValueByLanguage(english),
147147
},
148-
Description: extensionTranslated{
148+
Description: ExtensionTranslated{
149149
German: a.manifest.Meta.Description.GetValueByLanguage(german),
150150
English: a.manifest.Meta.Description.GetValueByLanguage(english),
151151
},
152152
}
153153
}
154154

155+
func (a App) UpdateMetaData(metadata *ExtensionMetadata) error {
156+
manifestFile := fmt.Sprintf("%s/manifest.xml", a.path)
157+
158+
manifestBytes, err := os.ReadFile(manifestFile)
159+
if err != nil {
160+
return fmt.Errorf("could not read manifest.xml: %w", err)
161+
}
162+
163+
var manifest Manifest
164+
if err := xml.Unmarshal(manifestBytes, &manifest); err != nil {
165+
return fmt.Errorf("could not parse manifest.xml: %w", err)
166+
}
167+
168+
manifest.Meta.Label = updateTranslatableString(manifest.Meta.Label, metadata.Label)
169+
manifest.Meta.Description = updateTranslatableString(manifest.Meta.Description, metadata.Description)
170+
171+
newXml, err := xml.MarshalIndent(manifest, "", " ")
172+
if err != nil {
173+
return fmt.Errorf("could not marshal manifest.xml: %w", err)
174+
}
175+
176+
newXml = append([]byte(xml.Header), newXml...)
177+
178+
if err := os.WriteFile(manifestFile, newXml, os.ModePerm); err != nil {
179+
return fmt.Errorf("could not write manifest.xml: %w", err)
180+
}
181+
182+
return nil
183+
}
184+
185+
func updateTranslatableString(existing TranslatableString, translated ExtensionTranslated) TranslatableString {
186+
translations := []struct {
187+
lang string
188+
value string
189+
}{
190+
{"en-GB", translated.English},
191+
{"de-DE", translated.German},
192+
}
193+
194+
matched := make(map[string]bool)
195+
196+
for i, entry := range existing {
197+
for _, t := range translations {
198+
if t.value == "" {
199+
continue
200+
}
201+
if entry.Lang == t.lang || (entry.Lang == "" && t.lang == "en-GB") {
202+
existing[i].Value = t.value
203+
matched[t.lang] = true
204+
}
205+
}
206+
}
207+
208+
for _, t := range translations {
209+
if t.value != "" && !matched[t.lang] {
210+
existing = append(existing, struct {
211+
Value string `xml:",chardata"`
212+
Lang string `xml:"lang,attr,omitempty"`
213+
}{Value: t.value, Lang: t.lang})
214+
}
215+
}
216+
217+
return existing
218+
}
219+
155220
func (a App) Validate(_ context.Context, check validation.Check) {
156221
validateTheme(a, check)
157222

internal/extension/bundle.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,19 +146,23 @@ func (p ShopwareBundle) GetIconPath() string {
146146
return ""
147147
}
148148

149-
func (p ShopwareBundle) GetMetaData() *extensionMetadata {
150-
return &extensionMetadata{
151-
Label: extensionTranslated{
149+
func (p ShopwareBundle) GetMetaData() *ExtensionMetadata {
150+
return &ExtensionMetadata{
151+
Label: ExtensionTranslated{
152152
German: "FALLBACK",
153153
English: "FALLBACK",
154154
},
155-
Description: extensionTranslated{
155+
Description: ExtensionTranslated{
156156
German: "FALLBACK",
157157
English: "FALLBACK",
158158
},
159159
}
160160
}
161161

162+
func (p ShopwareBundle) UpdateMetaData(_ *ExtensionMetadata) error {
163+
return nil
164+
}
165+
162166
func (p ShopwareBundle) Validate(c context.Context, check validation.Check) {
163167
// ShopwareBundle validation is currently empty but signature updated to match interface
164168
}

internal/extension/extension_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,11 @@ func (m *mockExtension) GetChangelog() (*ExtensionChangelog, error) {
8484
return &ExtensionChangelog{}, nil
8585
}
8686

87-
func (m *mockExtension) GetMetaData() *extensionMetadata {
87+
func (m *mockExtension) GetMetaData() *ExtensionMetadata {
88+
return nil
89+
}
90+
91+
func (m *mockExtension) UpdateMetaData(_ *ExtensionMetadata) error {
8892
return nil
8993
}
9094

internal/extension/platform.go

Lines changed: 73 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -160,20 +160,89 @@ func (p PlatformPlugin) GetPath() string {
160160
return p.path
161161
}
162162

163-
func (p PlatformPlugin) GetMetaData() *extensionMetadata {
164-
return &extensionMetadata{
163+
func (p PlatformPlugin) GetMetaData() *ExtensionMetadata {
164+
return &ExtensionMetadata{
165165
Name: p.Composer.Name,
166-
Label: extensionTranslated{
166+
Label: ExtensionTranslated{
167167
German: p.Composer.Extra.Label["de-DE"],
168168
English: p.Composer.Extra.Label["en-GB"],
169169
},
170-
Description: extensionTranslated{
170+
Description: ExtensionTranslated{
171171
German: p.Composer.Extra.Description["de-DE"],
172172
English: p.Composer.Extra.Description["en-GB"],
173173
},
174174
}
175175
}
176176

177+
func (p PlatformPlugin) UpdateMetaData(metadata *ExtensionMetadata) error {
178+
composerJsonFile := fmt.Sprintf("%s/composer.json", p.path)
179+
180+
composerJson, err := os.ReadFile(composerJsonFile)
181+
if err != nil {
182+
return fmt.Errorf("could not read composer.json: %w", err)
183+
}
184+
185+
var composerJsonStruct map[string]interface{}
186+
if err := json.Unmarshal(composerJson, &composerJsonStruct); err != nil {
187+
return fmt.Errorf("could not unmarshal composer.json: %w", err)
188+
}
189+
190+
extra, ok := composerJsonStruct["extra"].(map[string]interface{})
191+
if !ok {
192+
extra = make(map[string]interface{})
193+
composerJsonStruct["extra"] = extra
194+
}
195+
196+
changed := false
197+
198+
if metadata.Label.German != "" || metadata.Label.English != "" {
199+
label, ok := extra["label"].(map[string]interface{})
200+
if !ok {
201+
label = make(map[string]interface{})
202+
}
203+
if metadata.Label.German != "" {
204+
label["de-DE"] = metadata.Label.German
205+
}
206+
if metadata.Label.English != "" {
207+
label["en-GB"] = metadata.Label.English
208+
}
209+
extra["label"] = label
210+
changed = true
211+
}
212+
213+
if metadata.Description.German != "" || metadata.Description.English != "" {
214+
description, ok := extra["description"].(map[string]interface{})
215+
if !ok {
216+
description = make(map[string]interface{})
217+
}
218+
if metadata.Description.German != "" {
219+
description["de-DE"] = metadata.Description.German
220+
}
221+
if metadata.Description.English != "" {
222+
description["en-GB"] = metadata.Description.English
223+
}
224+
extra["description"] = description
225+
changed = true
226+
}
227+
228+
if !changed {
229+
return nil
230+
}
231+
232+
newComposerJson, err := json.MarshalIndent(composerJsonStruct, "", " ")
233+
if err != nil {
234+
return fmt.Errorf("could not marshal composer.json: %w", err)
235+
}
236+
237+
newComposerJson = append(newComposerJson, '\n')
238+
239+
if err := os.WriteFile(composerJsonFile, newComposerJson, os.ModePerm); err != nil {
240+
return fmt.Errorf("could not write composer.json: %w", err)
241+
}
242+
243+
return nil
244+
}
245+
177246
func (p PlatformPlugin) GetIconPath() string {
178247
pluginIcon := p.Composer.Extra.PluginIcon
179248

internal/extension/root.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func GetExtensionByZip(ctx context.Context, filePath string) (Extension, error)
8383
return GetExtensionByFolder(ctx, fmt.Sprintf("%s/%s", dir, extName))
8484
}
8585

86-
type extensionTranslated struct {
86+
type ExtensionTranslated struct {
8787
German string `json:"german"`
8888
English string `json:"english"`
8989
}
@@ -94,10 +94,10 @@ type ExtensionChangelog struct {
9494
Changelogs map[string]string
9595
}
9696

97-
type extensionMetadata struct {
97+
type ExtensionMetadata struct {
9898
Name string
99-
Label extensionTranslated
100-
Description extensionTranslated
99+
Label ExtensionTranslated
100+
Description ExtensionTranslated
101101
}
102102

103103
type Extension interface {
@@ -118,7 +118,8 @@ type Extension interface {
118118
GetType() string
119119
GetPath() string
120120
GetChangelog() (*ExtensionChangelog, error)
121-
GetMetaData() *extensionMetadata
121+
GetMetaData() *ExtensionMetadata
122+
UpdateMetaData(*ExtensionMetadata) error
122123
GetExtensionConfig() *Config
123124
Validate(context.Context, validation.Check)
124125
}

0 commit comments

Comments
 (0)