58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package model
|
|
|
|
import (
|
|
"bufio"
|
|
"io"
|
|
"os"
|
|
"path"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type AttachmentStore struct {
|
|
basePath string
|
|
}
|
|
|
|
func NewAttachmentStore(basePath string) AttachmentStore {
|
|
_, err := os.Stat(basePath)
|
|
if os.IsNotExist(err) {
|
|
os.MkdirAll(basePath, 0755)
|
|
}
|
|
|
|
return AttachmentStore{
|
|
basePath: basePath,
|
|
}
|
|
}
|
|
|
|
func (s *AttachmentStore) FetchAttachment(guid string) (io.Reader, error) {
|
|
fullPath := path.Join(s.basePath, guid)
|
|
f, err := os.Open(fullPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return bufio.NewReader(f), nil
|
|
}
|
|
|
|
func (s *AttachmentStore) StoreAttachment(filename string, reader io.Reader) (*string, error) {
|
|
// Generate GUID
|
|
guid := uuid.New().String()
|
|
|
|
fullPath := path.Join(s.basePath, guid)
|
|
f, err := os.OpenFile(fullPath, os.O_CREATE|os.O_WRONLY, 0755)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
r := bufio.NewReader(reader)
|
|
w := bufio.NewWriter(f)
|
|
_, err = w.ReadFrom(r)
|
|
|
|
return &guid, err
|
|
}
|
|
|
|
func (s *AttachmentStore) DeleteAttachment(guid string) error {
|
|
fullPath := path.Join(s.basePath, guid)
|
|
return os.Remove(fullPath)
|
|
}
|