repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

pico / pkg / apps / pgs / db
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}