@@ -19,7 +19,11 @@ package category
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "strconv"
22
23
24
+ xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
25
+ "github.com/hermsi1337/go-magento2/pkg/magento2/api"
26
+ "github.com/hermsi1337/go-magento2/pkg/magento2/categories"
23
27
"github.com/pkg/errors"
24
28
"k8s.io/apimachinery/pkg/types"
25
29
ctrl "sigs.k8s.io/controller-runtime"
@@ -47,10 +51,26 @@ const (
47
51
)
48
52
49
53
// A NoOpService does nothing.
50
- type NoOpService struct {}
54
+ type MagentoService struct {
55
+ client * api.Client
56
+ }
51
57
52
58
var (
53
- newNoOpService = func (_ []byte ) (interface {}, error ) { return & NoOpService {}, nil }
59
+ newMagentoService = func (creds []byte , scheme string , hostname string ) (* MagentoService , error ) {
60
+ storeConfig := & api.StoreConfig {
61
+ Scheme : scheme ,
62
+ HostName : hostname ,
63
+ StoreCode : "default" ,
64
+ }
65
+ // Create a new Magento API client
66
+ c , err := api .NewAPIClientFromIntegration (storeConfig , string (creds ))
67
+ if err != nil {
68
+ return nil , err
69
+ }
70
+ return & MagentoService {
71
+ client : c ,
72
+ }, nil
73
+ }
54
74
)
55
75
56
76
// Setup adds a controller that reconciles Category managed resources.
@@ -67,7 +87,7 @@ func Setup(mgr ctrl.Manager, o controller.Options) error {
67
87
managed .WithExternalConnecter (& connector {
68
88
kube : mgr .GetClient (),
69
89
usage : resource .NewProviderConfigUsageTracker (mgr .GetClient (), & apisv1alpha1.ProviderConfigUsage {}),
70
- newServiceFn : newNoOpService }),
90
+ newServiceFn : newMagentoService }),
71
91
managed .WithLogger (o .Logger .WithValues ("controller" , name )),
72
92
managed .WithPollInterval (o .PollInterval ),
73
93
managed .WithRecorder (event .NewAPIRecorder (mgr .GetEventRecorderFor (name ))),
@@ -86,7 +106,7 @@ func Setup(mgr ctrl.Manager, o controller.Options) error {
86
106
type connector struct {
87
107
kube client.Client
88
108
usage resource.Tracker
89
- newServiceFn func (creds []byte ) (interface {} , error )
109
+ newServiceFn func (creds []byte , scheme string , hostname string ) (* MagentoService , error )
90
110
}
91
111
92
112
// Connect typically produces an ExternalClient by:
@@ -115,7 +135,7 @@ func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.E
115
135
return nil , errors .Wrap (err , errGetCreds )
116
136
}
117
137
118
- svc , err := c .newServiceFn (data )
138
+ svc , err := c .newServiceFn (data , pc . Spec . Scheme , pc . Spec . HostName )
119
139
if err != nil {
120
140
return nil , errors .Wrap (err , errNewClient )
121
141
}
@@ -128,7 +148,7 @@ func (c *connector) Connect(ctx context.Context, mg resource.Managed) (managed.E
128
148
type external struct {
129
149
// A 'client' used to connect to the external resource API. In practice this
130
150
// would be something like an AWS SDK client.
131
- service interface {}
151
+ service * MagentoService
132
152
}
133
153
134
154
func (c * external ) Observe (ctx context.Context , mg resource.Managed ) (managed.ExternalObservation , error ) {
@@ -137,6 +157,16 @@ func (c *external) Observe(ctx context.Context, mg resource.Managed) (managed.Ex
137
157
return managed.ExternalObservation {}, errors .New (errNotCategory )
138
158
}
139
159
160
+ _ , err := categories .GetCategoryByName (cr .Spec .ForProvider .Name , c .service .client )
161
+ if err != nil {
162
+ return managed.ExternalObservation {
163
+ ResourceExists : false ,
164
+ }, err
165
+ }
166
+
167
+ if cr .Status .AtProvider .Status == "Ready" {
168
+ cr .Status .SetConditions (xpv1 .Available ())
169
+ }
140
170
// These fmt statements should be removed in the real implementation.
141
171
fmt .Printf ("Observing: %+v" , cr )
142
172
@@ -164,12 +194,20 @@ func (c *external) Create(ctx context.Context, mg resource.Managed) (managed.Ext
164
194
}
165
195
166
196
fmt .Printf ("Creating: %+v" , cr )
197
+ _ , err := categories .CreateCategory (& categories.Category {
198
+ Name : cr .Spec .ForProvider .Name ,
199
+ IsActive : true ,
200
+ }, c .service .client )
201
+ if err != nil {
202
+ return managed.ExternalCreation {}, err
203
+ }
204
+ cr .Status .AtProvider .Status = "Ready"
167
205
168
206
return managed.ExternalCreation {
169
207
// Optionally return any details that may be required to connect to the
170
208
// external resource. These will be stored as the connection secret.
171
209
ConnectionDetails : managed.ConnectionDetails {},
172
- }, nil
210
+ }, err
173
211
}
174
212
175
213
func (c * external ) Update (ctx context.Context , mg resource.Managed ) (managed.ExternalUpdate , error ) {
@@ -178,6 +216,15 @@ func (c *external) Update(ctx context.Context, mg resource.Managed) (managed.Ext
178
216
return managed.ExternalUpdate {}, errors .New (errNotCategory )
179
217
}
180
218
219
+ mCategory , err := categories .GetCategoryByName (cr .Spec .ForProvider .Name , c .service .client )
220
+ if err != nil {
221
+ fmt .Printf ("Failed to retrieve category: %v\n " , err )
222
+ }
223
+ url := fmt .Sprintf ("/categories/%s" , strconv .Itoa (mCategory .Category .ID ))
224
+ _ , err = c .service .client .HTTPClient .R ().Put (url )
225
+ if err != nil {
226
+ fmt .Printf ("Failed to update category: %v\n " , err )
227
+ }
181
228
fmt .Printf ("Updating: %+v" , cr )
182
229
183
230
return managed.ExternalUpdate {
@@ -192,7 +239,16 @@ func (c *external) Delete(ctx context.Context, mg resource.Managed) error {
192
239
if ! ok {
193
240
return errors .New (errNotCategory )
194
241
}
195
-
242
+ mCategory , err := categories .GetCategoryByName (cr .Spec .ForProvider .Name , c .service .client )
243
+ if err != nil {
244
+ fmt .Printf ("Failed to retrieve category: %v\n " , err )
245
+ }
246
+ url := fmt .Sprintf ("/categories/%s" , strconv .Itoa (mCategory .Category .ID ))
247
+ _ , err = c .service .client .HTTPClient .R ().Delete (url )
248
+ if err != nil {
249
+ fmt .Printf ("Failed to delete category: %v\n " , err )
250
+ return err
251
+ }
196
252
fmt .Printf ("Deleting: %+v" , cr )
197
253
198
254
return nil
0 commit comments