/
local.go
122 lines (98 loc) · 2.09 KB
/
local.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package local
import (
"encoding/json"
"errors"
"os"
"sync"
"github.com/bazuker/backend-bootstrap/pkg/db"
)
// DB represents a filesystem database suitable for local tests.
type DB struct {
storage *localStorage
mx sync.Mutex
cfg Config
}
type localStorage struct {
Users []db.User
}
type Config struct {
Filename string
}
func New(cfg Config) (*DB, error) {
database := &DB{
storage: &localStorage{
Users: []db.User{},
},
cfg: cfg,
mx: sync.Mutex{},
}
if _, err := os.Stat(cfg.Filename); err == nil {
if err := database.loadStorage(); err != nil {
return nil, err
}
} else {
if err := database.saveStorage(); err != nil {
return nil, err
}
}
return database, nil
}
func (d *DB) CreateUser(user *db.User) error {
d.mx.Lock()
defer d.mx.Unlock()
d.storage.Users = append(d.storage.Users, *user)
return d.saveStorage()
}
func (d *DB) UpdateUserPhotoURL(userID, photoURL string) error {
d.mx.Lock()
defer d.mx.Unlock()
userIndex := -1
for i := range d.storage.Users {
if d.storage.Users[i].ID == userID {
userIndex = i
break
}
}
if userIndex < 0 {
return db.ErrNotFound
}
d.storage.Users[userIndex].PhotoURL = photoURL
return d.saveStorage()
}
func (d *DB) GetUserByID(id string) (db.User, error) {
if id == "" {
return db.User{}, errors.New("missing id")
}
d.mx.Lock()
defer d.mx.Unlock()
for i := range d.storage.Users {
if d.storage.Users[i].ID == id {
return d.storage.Users[i], nil
}
}
return db.User{}, db.ErrNotFound
}
func (d *DB) GetUserByEmail(email string) (db.User, error) {
if email == "" {
return db.User{}, errors.New("missing email")
}
d.mx.Lock()
defer d.mx.Unlock()
for i := range d.storage.Users {
if d.storage.Users[i].Email == email {
return d.storage.Users[i], nil
}
}
return db.User{}, db.ErrNotFound
}
func (d *DB) saveStorage() error {
data, _ := json.Marshal(d.storage)
return os.WriteFile(d.cfg.Filename, data, os.ModePerm)
}
func (d *DB) loadStorage() error {
data, err := os.ReadFile(d.cfg.Filename)
if err != nil {
return err
}
return json.Unmarshal(data, d.storage)
}