Eric Bower
·
2025-04-04
memory.go
1package pgsdb
2
3import (
4 "fmt"
5 "log/slog"
6 "time"
7
8 "github.com/google/uuid"
9 "github.com/picosh/pico/pkg/db"
10 "github.com/picosh/utils"
11)
12
13type MemoryDB struct {
14 Logger *slog.Logger
15 Users []*db.User
16 Projects []*db.Project
17 Pubkeys []*db.PublicKey
18 Feature *db.FeatureFlag
19}
20
21var _ PgsDB = (*MemoryDB)(nil)
22
23func NewDBMemory(logger *slog.Logger) *MemoryDB {
24 d := &MemoryDB{
25 Logger: logger,
26 }
27 d.Logger.Info("connecting to our in-memory database. All data created during runtime will be lost on exit.")
28 return d
29}
30
31func (me *MemoryDB) SetupTestData() {
32 user := &db.User{
33 ID: uuid.NewString(),
34 Name: "testusr",
35 }
36 me.Users = append(me.Users, user)
37 feature := db.NewFeatureFlag(
38 user.ID,
39 "plus",
40 uint64(25*utils.MB),
41 int64(10*utils.MB),
42 int64(5*utils.KB),
43 )
44 expiresAt := time.Now().Add(time.Hour * 24)
45 feature.ExpiresAt = &expiresAt
46 me.Feature = feature
47}
48
49var errNotImpl = fmt.Errorf("not implemented")
50
51func (me *MemoryDB) FindUsers() ([]*db.User, error) {
52 users := []*db.User{}
53 return users, errNotImpl
54}
55
56func (me *MemoryDB) FindUserByPubkey(key string) (*db.User, error) {
57 for _, pk := range me.Pubkeys {
58 if pk.Key == key {
59 return me.FindUser(pk.UserID)
60 }
61 }
62 return nil, fmt.Errorf("user not found")
63}
64
65func (me *MemoryDB) FindUser(userID string) (*db.User, error) {
66 for _, user := range me.Users {
67 if user.ID == userID {
68 return user, nil
69 }
70 }
71 return nil, fmt.Errorf("user not found")
72}
73
74func (me *MemoryDB) FindUserByName(name string) (*db.User, error) {
75 for _, user := range me.Users {
76 if user.Name == name {
77 return user, nil
78 }
79 }
80 return nil, fmt.Errorf("user not found")
81}
82
83func (me *MemoryDB) FindFeature(userID, name string) (*db.FeatureFlag, error) {
84 return me.Feature, nil
85}
86
87func (me *MemoryDB) Close() error {
88 return nil
89}
90
91func (me *MemoryDB) FindTotalSizeForUser(userID string) (int, error) {
92 return 0, errNotImpl
93}
94
95func (me *MemoryDB) InsertProject(userID, name, projectDir string) (string, error) {
96 id := uuid.NewString()
97 now := time.Now()
98 me.Projects = append(me.Projects, &db.Project{
99 ID: id,
100 UserID: userID,
101 Name: name,
102 ProjectDir: projectDir,
103 CreatedAt: &now,
104 UpdatedAt: &now,
105 })
106 return id, nil
107}
108
109func (me *MemoryDB) UpdateProject(userID, name string) error {
110 project, err := me.FindProjectByName(userID, name)
111 if err != nil {
112 return err
113 }
114
115 now := time.Now()
116 project.UpdatedAt = &now
117
118 return nil
119}
120
121func (me *MemoryDB) UpsertProject(userID, projectName, projectDir string) (*db.Project, error) {
122 project, err := me.FindProjectByName(userID, projectName)
123 if err == nil {
124 // this just updates the `createdAt` timestamp, useful for book-keeping
125 err = me.UpdateProject(userID, projectName)
126 if err != nil {
127 me.Logger.Error("could not update project", "err", err)
128 return nil, err
129 }
130 return project, nil
131 }
132
133 _, err = me.InsertProject(userID, projectName, projectName)
134 if err != nil {
135 me.Logger.Error("could not create project", "err", err)
136 return nil, err
137 }
138 return me.FindProjectByName(userID, projectName)
139}
140
141func (me *MemoryDB) LinkToProject(userID, projectID, projectDir string, commit bool) error {
142 return errNotImpl
143}
144
145func (me *MemoryDB) RemoveProject(projectID string) error {
146 return errNotImpl
147}
148
149func (me *MemoryDB) FindProjectByName(userID, name string) (*db.Project, error) {
150 for _, project := range me.Projects {
151 if project.UserID != userID {
152 continue
153 }
154
155 if project.Name != name {
156 continue
157 }
158
159 return project, nil
160 }
161 return nil, fmt.Errorf("project not found by name %s", name)
162}
163
164func (me *MemoryDB) FindProjectLinks(userID, name string) ([]*db.Project, error) {
165 return []*db.Project{}, errNotImpl
166}
167
168func (me *MemoryDB) FindProjectsByPrefix(userID, prefix string) ([]*db.Project, error) {
169 return []*db.Project{}, errNotImpl
170}
171
172func (me *MemoryDB) FindProjectsByUser(userID string) ([]*db.Project, error) {
173 pjs := []*db.Project{}
174 for _, project := range me.Projects {
175 if project.UserID != userID {
176 continue
177 }
178 pjs = append(pjs, project)
179 }
180 return pjs, nil
181}
182
183func (me *MemoryDB) FindProjects(userID string) ([]*db.Project, error) {
184 return []*db.Project{}, errNotImpl
185}
186
187func (me *MemoryDB) UpdateProjectAcl(userID, name string, acl db.ProjectAcl) error {
188 return errNotImpl
189}