124 lines
2.6 KiB
Go
124 lines
2.6 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
"git.coopgo.io/coopgo-platform/saved-search/data/types"
|
|
)
|
|
|
|
// MockStorage implements Storage interface for testing
|
|
type MockStorage struct {
|
|
mu sync.RWMutex
|
|
data map[string]*types.SavedSearch
|
|
counter int
|
|
}
|
|
|
|
// NewMockStorage creates a new mock storage instance
|
|
func NewMockStorage() *MockStorage {
|
|
return &MockStorage{
|
|
data: make(map[string]*types.SavedSearch),
|
|
}
|
|
}
|
|
|
|
func (m *MockStorage) CreateSavedSearch(ctx context.Context, search types.SavedSearch) error {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
now := time.Now()
|
|
search.CreatedAt = now
|
|
search.UpdatedAt = now
|
|
|
|
m.data[search.ID] = &search
|
|
m.counter++
|
|
|
|
return nil
|
|
}
|
|
|
|
func (m *MockStorage) GetSavedSearch(ctx context.Context, id string) (*types.SavedSearch, error) {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
search, exists := m.data[id]
|
|
if !exists {
|
|
return nil, fmt.Errorf("saved search not found")
|
|
}
|
|
|
|
// Return a copy to avoid mutation issues
|
|
searchCopy := *search
|
|
return &searchCopy, nil
|
|
}
|
|
|
|
func (m *MockStorage) GetSavedSearchesByOwner(ctx context.Context, ownerID string) ([]*types.SavedSearch, error) {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
var searches []*types.SavedSearch
|
|
for _, search := range m.data {
|
|
if search.OwnerID == ownerID {
|
|
searchCopy := *search
|
|
searches = append(searches, &searchCopy)
|
|
}
|
|
}
|
|
|
|
return searches, nil
|
|
}
|
|
|
|
func (m *MockStorage) UpdateSavedSearch(ctx context.Context, search types.SavedSearch) error {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
existing, exists := m.data[search.ID]
|
|
if !exists {
|
|
return fmt.Errorf("saved search not found")
|
|
}
|
|
|
|
search.CreatedAt = existing.CreatedAt // Preserve creation time
|
|
search.UpdatedAt = time.Now()
|
|
m.data[search.ID] = &search
|
|
|
|
return nil
|
|
}
|
|
|
|
func (m *MockStorage) DeleteSavedSearch(ctx context.Context, id string) error {
|
|
m.mu.Lock()
|
|
defer m.mu.Unlock()
|
|
|
|
if _, exists := m.data[id]; !exists {
|
|
return fmt.Errorf("saved search not found")
|
|
}
|
|
|
|
delete(m.data, id)
|
|
return nil
|
|
}
|
|
|
|
func (m *MockStorage) ListSavedSearches(ctx context.Context, ownerID string, limit, offset int) ([]*types.SavedSearch, int64, error) {
|
|
m.mu.RLock()
|
|
defer m.mu.RUnlock()
|
|
|
|
var allSearches []*types.SavedSearch
|
|
for _, search := range m.data {
|
|
if ownerID == "" || search.OwnerID == ownerID {
|
|
searchCopy := *search
|
|
allSearches = append(allSearches, &searchCopy)
|
|
}
|
|
}
|
|
|
|
total := int64(len(allSearches))
|
|
|
|
// Apply pagination
|
|
start := offset
|
|
end := offset + limit
|
|
|
|
if start > len(allSearches) {
|
|
return []*types.SavedSearch{}, total, nil
|
|
}
|
|
|
|
if end > len(allSearches) {
|
|
end = len(allSearches)
|
|
}
|
|
|
|
return allSearches[start:end], total, nil
|
|
} |