package attachment import ( "io" "os" "path/filepath" ) type AttachmentManager struct { attachmentsDir string } func NewAttachmentManager() *AttachmentManager { return &AttachmentManager{ attachmentsDir: filepath.Join(os.Getenv("HOME"), ".config", "pop", "attachments"), } } func (m *AttachmentManager) Download(attachmentID, name, destPath string) error { if err := os.MkdirAll(m.attachmentsDir, 0755); err != nil { return err } srcPath := filepath.Join(m.attachmentsDir, attachmentID) dest := filepath.Join(destPath, name) if err := os.MkdirAll(filepath.Dir(dest), 0755); err != nil { return err } data, err := os.ReadFile(srcPath) if err != nil { return err } return os.WriteFile(dest, data, 0644) } func (m *AttachmentManager) Upload(attachmentID, name string, reader io.Reader) error { if err := os.MkdirAll(m.attachmentsDir, 0755); err != nil { return err } path := filepath.Join(m.attachmentsDir, attachmentID) data, err := io.ReadAll(reader) if err != nil { return err } return os.WriteFile(path, data, 0644) } func (m *AttachmentManager) Get(attachmentID string) ([]byte, error) { path := filepath.Join(m.attachmentsDir, attachmentID) return os.ReadFile(path) } func (m *AttachmentManager) Delete(attachmentID string) error { path := filepath.Join(m.attachmentsDir, attachmentID) return os.Remove(path) } func (m *AttachmentManager) List() ([]string, error) { entries, err := os.ReadDir(m.attachmentsDir) if err != nil { if os.IsNotExist(err) { return []string{}, nil } return nil, err } ids := make([]string, len(entries)) for i, entry := range entries { ids[i] = entry.Name() } return ids, nil }