1 package services
2
3 import (
4 "context"
5 "database/sql"
6 "encoding/json"
7
8 sqlerr "edge-infra.dev/pkg/edge/api/apierror/sql"
9 "edge-infra.dev/pkg/edge/api/graph/model"
10 sqlquery "edge-infra.dev/pkg/edge/api/sql"
11 "edge-infra.dev/pkg/edge/api/utils"
12 chariotClientApi "edge-infra.dev/pkg/edge/chariot/client"
13 )
14
15 type CapabilityService interface {
16
17 CreateCapability(ctx context.Context, capability model.CapabilityInput) (*model.Capability, error)
18 UpdateCapability(ctx context.Context, capability *model.CapabilityUpdateInput) error
19
20
21 AddCapability(ctx context.Context, capMapping *model.CapabilityBannerMappingInput) error
22 RemoveCapability(ctx context.Context, capMapping *model.CapabilityBannerMappingInput) error
23 ListCapabilities(ctx context.Context) ([]*model.Capability, error)
24
25 ListCapabilitiesByBanner(ctx context.Context, bannerID *string) ([]*model.Capability, error)
26 }
27
28 type capabilityService struct {
29 SQLDB *sql.DB
30 BannerService BannerService
31 ChariotService ChariotService
32 ForemanID string
33 }
34
35 func (s *capabilityService) CreateCapability(ctx context.Context, capability model.CapabilityInput) (*model.Capability, error) {
36 if _, err := s.SQLDB.ExecContext(ctx, sqlquery.CapabilityInsertQuery, capability.Name, capability.Description); err != nil {
37 return nil, err
38 }
39
40 var capa model.Capability
41 row := s.SQLDB.QueryRowContext(ctx, sqlquery.CapabilitytGetByNameQuery, capability.Name)
42 if err := row.Scan(&capa.UUID, &capa.Name, &capa.Description); err != nil {
43 return nil, err
44 }
45 return &capa, nil
46 }
47
48 func (s *capabilityService) UpdateCapability(ctx context.Context, capability *model.CapabilityUpdateInput) error {
49 _, err := s.SQLDB.ExecContext(ctx, sqlquery.CapabilityUpdateQuery, capability.Name, capability.Description)
50 if err != nil {
51 return err
52 }
53 return nil
54 }
55
56
57 func (s *capabilityService) AddCapability(ctx context.Context, mapping *model.CapabilityBannerMappingInput) error {
58
59 if _, err := s.SQLDB.ExecContext(ctx, sqlquery.AddCapabilityMappyingQuery, mapping.Capabilityid, mapping.BannerEdgeID); err != nil {
60 return err
61 }
62
63
64
65 banner, err := s.BannerService.GetBannerCRByID(ctx, mapping.BannerEdgeID)
66 if err != nil {
67 return err
68 }
69 path, err := s.BannerService.GetBannerInfraBucketPath(ctx)
70 if err != nil {
71 return err
72 }
73
74 bannerRequestByte, errs := json.Marshal(banner)
75 if errs != nil {
76 return errs
77 }
78 bannerRequestBase64 := utils.ToBase64(bannerRequestByte)
79
80 msg := chariotClientApi.
81 NewChariotMessage().
82 SetOperation(chariotClientApi.Create).
83 SetOwner(ComponentOwner).
84 SetBanner(s.ForemanID).
85 SetCluster(path).
86 AddObject(bannerRequestBase64)
87 attrs := make(map[string]string)
88
89 return s.ChariotService.InvokeChariotPubsub(ctx, msg, attrs)
90 }
91
92 func (s *capabilityService) RemoveCapability(ctx context.Context, mapping *model.CapabilityBannerMappingInput) error {
93 if _, err := s.SQLDB.ExecContext(ctx, sqlquery.RemoveCapabilityMappingQuery, mapping.Capabilityid, mapping.BannerEdgeID); err != nil {
94 return err
95 }
96 return nil
97 }
98
99 func (s *capabilityService) ListCapabilities(ctx context.Context) ([]*model.Capability, error) {
100 rows, err := s.SQLDB.QueryContext(ctx, sqlquery.ListCapabilitiesQuery)
101 if err != nil {
102 return nil, err
103 }
104 capabilities := []*model.Capability{}
105 defer rows.Close()
106 for rows.Next() {
107 var capability model.Capability
108 if err = rows.Scan(&capability.UUID, &capability.Name, &capability.Description); err != nil {
109 return nil, err
110 }
111 capabilities = append(capabilities, &capability)
112 }
113 if err := rows.Err(); err != nil {
114 return nil, sqlerr.Wrap(err)
115 }
116 return capabilities, nil
117 }
118
119 func (s *capabilityService) ListCapabilitiesByBanner(ctx context.Context, bannerID *string) ([]*model.Capability, error) {
120 rows, err := s.SQLDB.QueryContext(ctx, sqlquery.ListCapabilitiesByBannerQuery, bannerID)
121 if err != nil {
122 return nil, err
123 }
124 capabilities := []*model.Capability{}
125 defer rows.Close()
126 for rows.Next() {
127 var capability model.Capability
128 if err = rows.Scan(&capability.UUID, &capability.Name, &capability.Description); err != nil {
129 return nil, err
130 }
131 capabilities = append(capabilities, &capability)
132 }
133 if err := rows.Err(); err != nil {
134 return nil, sqlerr.Wrap(err)
135 }
136 return capabilities, nil
137 }
138
139 func NewCapabilityService(sqlDB *sql.DB, bannerService BannerService, chariotService ChariotService, foremanID string) CapabilityService {
140 return &capabilityService{
141 SQLDB: sqlDB,
142 BannerService: bannerService,
143 ChariotService: chariotService,
144 ForemanID: foremanID,
145 }
146 }
147
View as plain text