Skip to content

Commit 62ddabb

Browse files
committed
feat(api,cli): Save and Delete methods
1 parent edbcc49 commit 62ddabb

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

api/store/pg/utils.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,74 @@
11
package pg
22

33
import (
4+
"context"
45
"database/sql"
6+
"fmt"
57
"io"
8+
"reflect"
9+
"time"
610

711
"github.com/shellhub-io/shellhub/api/store"
12+
log "github.com/sirupsen/logrus"
813
)
914

15+
func (pg *pg) Save(ctx context.Context, models ...any) error {
16+
for _, m := range models {
17+
if err := setUpdatedAt(m); err != nil {
18+
log.Warnf("failed to set UpdatedAt: %v", err)
19+
}
20+
21+
if _, err := pg.driver.NewUpdate().Model(ptr(m)).WherePK().Exec(ctx); err != nil {
22+
return fromSqlError(err)
23+
}
24+
}
25+
26+
return nil
27+
}
28+
29+
func (pg *pg) Delete(ctx context.Context, models ...any) error {
30+
for _, m := range models {
31+
if _, err := pg.driver.NewDelete().Model(ptr(m)).WherePK().Exec(ctx); err != nil {
32+
return fromSqlError(err)
33+
}
34+
}
35+
36+
return nil
37+
}
38+
39+
func setUpdatedAt(model any) error {
40+
value := reflect.ValueOf(model)
41+
if value.Kind() == reflect.Ptr {
42+
value = value.Elem()
43+
}
44+
45+
if value.Kind() != reflect.Struct {
46+
return nil
47+
}
48+
49+
updatedField := value.FieldByName("UpdatedAt")
50+
if updatedField.IsValid() && updatedField.CanSet() {
51+
if updatedField.Type() == reflect.TypeOf(time.Time{}) {
52+
updatedField.Set(reflect.ValueOf(time.Now().UTC()))
53+
return nil
54+
}
55+
return fmt.Errorf("UpdatedAt field is not of type time.Time")
56+
}
57+
58+
return nil
59+
}
60+
61+
func ptr(arg any) any {
62+
argPtr := arg
63+
if val := reflect.ValueOf(argPtr); val.Kind() != reflect.Ptr {
64+
newPtr := reflect.New(val.Type())
65+
newPtr.Elem().Set(val)
66+
argPtr = newPtr.Interface()
67+
}
68+
69+
return argPtr
70+
}
71+
1072
func fromSqlError(err error) error {
1173
switch {
1274
case err == nil:

api/store/store.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package store
22

3+
import "context"
4+
35
//go:generate mockery --name Store --filename store.go
46
type Store interface {
57
TagsStore
@@ -17,4 +19,10 @@ type Store interface {
1719
SystemStore
1820

1921
Options() QueryOptions
22+
23+
// Save saves a model or a list of models. It returns an error if any.
24+
Save(ctx context.Context, models ...any) error
25+
26+
// Delete deletes a model or a list of models. It returns an error if any.
27+
Delete(ctx context.Context, models ...any) error
2028
}

0 commit comments

Comments
 (0)