80 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package database
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"fmt"
 | 
						|
	"sync"
 | 
						|
 | 
						|
	"git.yetaga.in/alazyreader/library/media"
 | 
						|
)
 | 
						|
 | 
						|
type Memory struct {
 | 
						|
	lock  sync.Mutex
 | 
						|
	shelf []media.Book
 | 
						|
}
 | 
						|
 | 
						|
func (m *Memory) GetAllBooks(_ context.Context) ([]media.Book, error) {
 | 
						|
	m.lock.Lock()
 | 
						|
	defer m.lock.Unlock()
 | 
						|
 | 
						|
	if m.shelf == nil {
 | 
						|
		m.shelf = []media.Book{}
 | 
						|
	}
 | 
						|
 | 
						|
	return m.shelf, nil
 | 
						|
}
 | 
						|
 | 
						|
func (m *Memory) AddBook(_ context.Context, b *media.Book) error {
 | 
						|
	m.lock.Lock()
 | 
						|
	defer m.lock.Unlock()
 | 
						|
 | 
						|
	if m.shelf == nil {
 | 
						|
		m.shelf = []media.Book{}
 | 
						|
	}
 | 
						|
 | 
						|
	m.shelf = append(m.shelf, *b)
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
func (m *Memory) UpdateBook(_ context.Context, old, new *media.Book) error {
 | 
						|
	m.lock.Lock()
 | 
						|
	defer m.lock.Unlock()
 | 
						|
 | 
						|
	if m.shelf == nil {
 | 
						|
		m.shelf = []media.Book{}
 | 
						|
		return fmt.Errorf("book does not exist")
 | 
						|
	}
 | 
						|
 | 
						|
	if old.ID != new.ID {
 | 
						|
		return fmt.Errorf("cannot change book ID")
 | 
						|
	}
 | 
						|
 | 
						|
	for i := range m.shelf {
 | 
						|
		if m.shelf[i].ID == old.ID {
 | 
						|
			m.shelf[i] = *new
 | 
						|
			return nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return fmt.Errorf("book does not exist")
 | 
						|
}
 | 
						|
 | 
						|
func (m *Memory) DeleteBook(_ context.Context, b *media.Book) error {
 | 
						|
	m.lock.Lock()
 | 
						|
	defer m.lock.Unlock()
 | 
						|
 | 
						|
	if m.shelf == nil {
 | 
						|
		m.shelf = []media.Book{}
 | 
						|
		return fmt.Errorf("book does not exist")
 | 
						|
	}
 | 
						|
 | 
						|
	for i := range m.shelf {
 | 
						|
		if m.shelf[i].ID == b.ID {
 | 
						|
			// reorder slice to remove book quickly
 | 
						|
			m.shelf[i] = m.shelf[len(m.shelf)-1]
 | 
						|
			m.shelf = m.shelf[:len(m.shelf)-1]
 | 
						|
			return nil
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return fmt.Errorf("book does not exist")
 | 
						|
}
 |