Skip to content

Commit f5a914b

Browse files
committed
fix(api): pass database instance to Server struct for owner redirect handlers
Signed-off-by: djach7 <djachimo@redhat.com>
1 parent 102d25d commit f5a914b

4 files changed

Lines changed: 89 additions & 5 deletions

File tree

api/handlers/rvinfo.go

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,17 @@ func RvInfoHandler() http.HandlerFunc {
3535
// GetOwnerRedirect implements the rvInfo GET endpoint (OpenAPI interface method)
3636
func (s *Server) GetOwnerRedirect(w http.ResponseWriter, r *http.Request) {
3737
slog.Debug("Fetching rvInfo")
38-
rvInfoJSON, err := db.FetchRvInfoJSON()
38+
39+
var rvInfoJSON []byte
40+
var err error
41+
42+
// Use struct database if available, otherwise fall back to global db
43+
if s.db != nil {
44+
rvInfoJSON, err = s.db.FetchRvInfoJSON()
45+
} else {
46+
rvInfoJSON, err = db.FetchRvInfoJSON()
47+
}
48+
3949
if err != nil {
4050
if errors.Is(err, gorm.ErrRecordNotFound) {
4151
slog.Error("No rvInfo found")
@@ -53,12 +63,29 @@ func (s *Server) GetOwnerRedirect(w http.ResponseWriter, r *http.Request) {
5363

5464
// PostOwnerRedirect implements the rvInfo POST endpoint (OpenAPI interface method)
5565
func (s *Server) PostOwnerRedirect(w http.ResponseWriter, r *http.Request) {
66+
slog.Debug("PostOwnerRedirect: Starting handler")
67+
5668
rvInfo, ok := ReadRequestBody(w, r)
5769
if !ok {
70+
slog.Error("PostOwnerRedirect: Failed to read request body")
5871
return
5972
}
73+
74+
slog.Debug("PostOwnerRedirect: Read request body", "size", len(rvInfo))
75+
76+
// Use struct database if available, otherwise fall back to global db
77+
var err error
78+
if s.db != nil {
79+
slog.Debug("PostOwnerRedirect: Using struct database")
80+
err = s.db.InsertRvInfo(rvInfo)
81+
} else {
82+
slog.Debug("PostOwnerRedirect: Using global database (fallback)")
83+
err = db.InsertRvInfo(rvInfo)
84+
}
85+
86+
slog.Debug("PostOwnerRedirect: Insert operation completed", "error", err)
6087

61-
if err := db.InsertRvInfo(rvInfo); err != nil {
88+
if err != nil {
6289
if HandleDBError(w, r, "rvInfo", err) {
6390
return
6491
}
@@ -77,6 +104,8 @@ func (s *Server) PostOwnerRedirect(w http.ResponseWriter, r *http.Request) {
77104
w.Header().Set("Content-Type", ContentTypeJSON)
78105
w.WriteHeader(http.StatusCreated)
79106
w.Write(rvInfo)
107+
108+
slog.Debug("PostOwnerRedirect: Successfully completed, response sent")
80109
}
81110

82111
// PutOwnerRedirect implements the rvInfo PUT endpoint (OpenAPI interface method)
@@ -86,7 +115,15 @@ func (s *Server) PutOwnerRedirect(w http.ResponseWriter, r *http.Request) {
86115
return
87116
}
88117

89-
if err := db.UpdateRvInfo(rvInfo); err != nil {
118+
// Use struct database if available, otherwise fall back to global db
119+
var err error
120+
if s.db != nil {
121+
err = s.db.UpdateRvInfo(rvInfo)
122+
} else {
123+
err = db.UpdateRvInfo(rvInfo)
124+
}
125+
126+
if err != nil {
90127
if errors.Is(err, gorm.ErrRecordNotFound) {
91128
slog.Error("rvInfo does not exist, cannot update")
92129
WriteErrorResponse(w, r, http.StatusNotFound, "rvInfo does not exist", "No rvInfo found to update", "rvInfo does not exist")

api/handlers/vouchers.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ import (
3232
type Server struct {
3333
ownerPKeys []crypto.PublicKey
3434
to2Server *fdo.TO2Server
35+
db *db.State
3536
}
3637

3738
// NewServer creates a new Server instance
38-
func NewServer(ownerPKeys []crypto.PublicKey, to2Server *fdo.TO2Server) *Server {
39+
func NewServer(ownerPKeys []crypto.PublicKey, to2Server *fdo.TO2Server, database *db.State) *Server {
3940
return &Server{
4041
ownerPKeys: ownerPKeys,
4142
to2Server: to2Server,
43+
db: database,
4244
}
4345
}
4446

cmd/owner.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func serveOwner(config *OwnerServerConfig) error {
321321
}
322322

323323
// Create OpenAPI server instance
324-
apiServer := handlers.NewServer([]crypto.PublicKey{state.ownerKey.Public()}, to2Server)
324+
apiServer := handlers.NewServer([]crypto.PublicKey{state.ownerKey.Public()}, to2Server, state.DB)
325325

326326
// Create the main HTTP handler with chi router for API endpoints
327327
mainHandler := http.NewServeMux()

internal/db/state.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"gorm.io/driver/postgres"
1818
"gorm.io/driver/sqlite"
1919
"gorm.io/gorm"
20+
"gorm.io/gorm/clause"
2021
)
2122

2223
// State implements all FDO server state persistence interfaces using GORM
@@ -98,6 +99,50 @@ func (s *State) Close() error {
9899
return sqlDB.Close()
99100
}
100101

102+
// FetchRvInfoJSON reads the rvinfo JSON from the database
103+
func (s *State) FetchRvInfoJSON() ([]byte, error) {
104+
var rvInfo RvInfo
105+
if err := s.DB.Where("id = ?", 1).First(&rvInfo).Error; err != nil {
106+
return nil, err
107+
}
108+
return rvInfo.Value, nil
109+
}
110+
111+
// InsertRvInfo inserts new rvinfo JSON into the database
112+
func (s *State) InsertRvInfo(data []byte) error {
113+
// check the data can be parsed into [][]protocol.RvInstruction
114+
if _, err := parseHumanReadableRvJSON(data); err != nil {
115+
return fmt.Errorf("%w: %v", ErrInvalidRvInfo, err)
116+
}
117+
118+
rvInfo := RvInfo{
119+
ID: 1,
120+
Value: data,
121+
}
122+
tx := s.DB.Clauses(clause.OnConflict{DoNothing: true}).Create(&rvInfo)
123+
if tx.Error != nil {
124+
return tx.Error
125+
}
126+
if tx.RowsAffected == 0 {
127+
return gorm.ErrDuplicatedKey
128+
}
129+
return nil
130+
}
131+
132+
// UpdateRvInfo updates existing rvinfo JSON in the database
133+
func (s *State) UpdateRvInfo(data []byte) error {
134+
// check the data can be parsed into [][]protocol.RvInstruction
135+
if _, err := parseHumanReadableRvJSON(data); err != nil {
136+
return fmt.Errorf("%w: %v", ErrInvalidRvInfo, err)
137+
}
138+
139+
rvInfo := RvInfo{
140+
ID: 1,
141+
Value: data,
142+
}
143+
return s.DB.Save(&rvInfo).Error
144+
}
145+
101146
// Compile-time check for interface implementation correctness
102147
var _ interface {
103148
protocol.TokenService

0 commit comments

Comments
 (0)