Skip to content

Commit 03cca4e

Browse files
refactor: Abstracts rec storage
1 parent f2a929a commit 03cca4e

File tree

3 files changed

+100
-53
lines changed

3 files changed

+100
-53
lines changed

recController.go

Lines changed: 12 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,35 +6,22 @@ import (
66
"net/http"
77

88
"github.com/google/uuid"
9-
"gorm.io/datatypes"
10-
"gorm.io/gorm"
119
)
1210

1311
type recController struct {
14-
db *gorm.DB
12+
store recStore
1513
}
1614

1715
// GET /recs
1816
func (recController recController) getRecs(w http.ResponseWriter, r *http.Request) {
19-
var sqlResult []rec
20-
db := recController.db
21-
tag := r.URL.Query().Get("tag")
22-
if tag != "" {
23-
db = db.Where(datatypes.JSONQuery("tags").HasKey(tag))
24-
}
25-
err := db.Order("dis").Find(&sqlResult).Error
17+
recs, err := recController.store.readRecs(r.URL.Query().Get("tag"))
2618
if err != nil {
2719
log.Printf("SQL Error: %s", err)
2820
w.WriteHeader(http.StatusInternalServerError)
2921
return
3022
}
3123

32-
httpResult := []apiRec{}
33-
for _, sqlRow := range sqlResult {
34-
httpResult = append(httpResult, apiRec(sqlRow))
35-
}
36-
37-
httpJson, err := json.Marshal(httpResult)
24+
httpJson, err := json.Marshal(recs)
3825
if err != nil {
3926
log.Printf("Cannot encode response JSON: %s", err)
4027
w.WriteHeader(http.StatusBadRequest)
@@ -56,11 +43,9 @@ func (recController recController) postRecs(w http.ResponseWriter, r *http.Reque
5643
return
5744
}
5845

59-
rec := rec(apiRec)
60-
61-
err = recController.db.Create(&rec).Error
46+
err = recController.store.createRec(apiRec)
6247
if err != nil {
63-
log.Printf("SQL Error: %s", err)
48+
log.Printf("Storage Error: %s", err)
6449
w.WriteHeader(http.StatusInternalServerError)
6550
return
6651
}
@@ -78,19 +63,13 @@ func (recController recController) postRecs(w http.ResponseWriter, r *http.Reque
7863

7964
// GET /recs/tag/:tag
8065
func (recController recController) getRecsByTag(w http.ResponseWriter, r *http.Request) {
81-
var recs []rec
82-
err := recController.db.Where(datatypes.JSONQuery("tags").HasKey("siteMeter")).Order("dis").Find(&recs).Error
66+
apiRecs, err := recController.store.readRecs("siteMeter")
8367
if err != nil {
84-
log.Printf("SQL Error: %s", err)
68+
log.Printf("Storage Error: %s", err)
8569
w.WriteHeader(http.StatusInternalServerError)
8670
return
8771
}
8872

89-
apiRecs := []apiRec{}
90-
for _, rec := range recs {
91-
apiRecs = append(apiRecs, apiRec(rec))
92-
}
93-
9473
httpJson, err := json.Marshal(apiRecs)
9574
if err != nil {
9675
log.Printf("Cannot encode response JSON")
@@ -111,16 +90,13 @@ func (recController recController) getRec(w http.ResponseWriter, r *http.Request
11190
w.WriteHeader(http.StatusNotFound)
11291
return
11392
}
114-
var rec rec
115-
err = recController.db.First(&rec, "id = ?", id).Error
93+
apiRec, err := recController.store.readRec(id)
11694
if err != nil {
117-
log.Printf("SQL Error: %s", err)
95+
log.Printf("Storage Error: %s", err)
11896
w.WriteHeader(http.StatusInternalServerError)
11997
return
12098
}
12199

122-
apiRec := apiRec(rec)
123-
124100
httpJson, err := json.Marshal(apiRec)
125101
if err != nil {
126102
log.Printf("Cannot encode response JSON")
@@ -150,25 +126,9 @@ func (recController recController) putRec(w http.ResponseWriter, r *http.Request
150126
w.WriteHeader(http.StatusBadRequest)
151127
return
152128
}
153-
154-
var rec rec
155-
err = recController.db.First(&rec, id).Error
156-
if err != nil {
157-
log.Printf("No rec with ID: %s", id)
158-
w.WriteHeader(http.StatusBadRequest)
159-
return
160-
}
161-
162-
if apiRec.Dis != nil {
163-
rec.Dis = apiRec.Dis
164-
}
165-
if apiRec.Unit != nil {
166-
rec.Unit = apiRec.Unit
167-
}
168-
169-
err = recController.db.Save(&rec).Error
129+
err = recController.store.updateRec(id, apiRec)
170130
if err != nil {
171-
log.Printf("Unable to update: %s", err)
131+
log.Printf("Storage Error: %s", id)
172132
w.WriteHeader(http.StatusBadRequest)
173133
return
174134
}
@@ -186,7 +146,7 @@ func (recController recController) deleteRec(w http.ResponseWriter, r *http.Requ
186146
return
187147
}
188148

189-
err = recController.db.Delete(&rec{}, id).Error
149+
err = recController.store.deleteRec(id)
190150
if err != nil {
191151
log.Printf("Unable to delete: %s", err)
192152
w.WriteHeader(http.StatusBadRequest)

recStore.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package main
2+
3+
import (
4+
"github.com/google/uuid"
5+
"gorm.io/datatypes"
6+
"gorm.io/gorm"
7+
)
8+
9+
type recStore interface {
10+
readRecs(string) ([]apiRec, error)
11+
readRec(uuid.UUID) (*apiRec, error)
12+
createRec(apiRec) error
13+
updateRec(uuid.UUID, apiRec) error
14+
deleteRec(uuid.UUID) error
15+
}
16+
17+
// gormHistoryStore stores point historical values in a GORM database.
18+
type gormRecStore struct {
19+
db *gorm.DB
20+
}
21+
22+
func newGormRecStore(db *gorm.DB) gormRecStore {
23+
return gormRecStore{db: db}
24+
}
25+
26+
func (s gormRecStore) readRecs(
27+
tag string,
28+
) ([]apiRec, error) {
29+
var sqlResult []rec
30+
db := s.db
31+
if tag != "" {
32+
db = db.Where(datatypes.JSONQuery("tags").HasKey(tag))
33+
}
34+
err := db.Order("dis").Find(&sqlResult).Error
35+
if err != nil {
36+
return []apiRec{}, err
37+
}
38+
39+
result := []apiRec{}
40+
for _, sqlRow := range sqlResult {
41+
result = append(result, apiRec(sqlRow))
42+
}
43+
return result, nil
44+
}
45+
46+
func (s gormRecStore) readRec(
47+
id uuid.UUID,
48+
) (*apiRec, error) {
49+
var rec rec
50+
err := s.db.First(&rec, "id = ?", id).Error
51+
if err != nil {
52+
return nil, err
53+
}
54+
apiRec := apiRec(rec)
55+
return &apiRec, nil
56+
}
57+
58+
func (s gormRecStore) createRec(
59+
apiRec apiRec,
60+
) error {
61+
rec := rec(apiRec)
62+
return s.db.Create(&rec).Error
63+
}
64+
65+
func (s gormRecStore) updateRec(
66+
id uuid.UUID,
67+
apiRec apiRec,
68+
) error {
69+
var rec rec
70+
err := s.db.First(&rec, id).Error
71+
if err != nil {
72+
return err
73+
}
74+
75+
if apiRec.Dis != nil {
76+
rec.Dis = apiRec.Dis
77+
}
78+
if apiRec.Unit != nil {
79+
rec.Unit = apiRec.Unit
80+
}
81+
82+
return s.db.Save(&rec).Error
83+
}
84+
85+
func (s gormRecStore) deleteRec(id uuid.UUID) error {
86+
return s.db.Delete(&rec{}, id).Error
87+
}

server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func NewServer(serverConfig ServerConfig) (*http.ServeMux, error) {
4545
tokenAuth.HandleFunc("DELETE /his/{pointId}", hisController.deleteHis) // Deprecated
4646
server.Handle("/his/", tokenAuthMiddleware(serverConfig.jwtSecret, tokenAuth))
4747

48-
recController := recController{db: serverConfig.db}
48+
recController := recController{store: newGormRecStore(serverConfig.db)}
4949
tokenAuth.HandleFunc("GET /recs", recController.getRecs)
5050
tokenAuth.HandleFunc("POST /recs", recController.postRecs)
5151
server.Handle("/recs", tokenAuthMiddleware(serverConfig.jwtSecret, tokenAuth))

0 commit comments

Comments
 (0)