igar/storage/entry.go

113 lines
2.2 KiB
Go

package storage
import (
"fmt"
"io"
"mime"
"mime/multipart"
"os"
"os/exec"
"strings"
"time"
"github.com/google/uuid"
)
type (
Entry struct {
Date JSTime `json:"date"`
Description string `json:"description"`
Post string `json:"post"`
Likes int `json:"likes"`
Tags []string `json:"tags"`
Media []Media `json:"media"`
Prev *Entry `json:"-"`
Next *Entry `json:"-"`
// Users []string
}
)
func (entry Entry) Count() map[string]int {
count := make(map[string]int)
for _, media := range entry.Media {
count[media.Type] += 1
}
return count
}
func (entry Entry) Len() int { return len(entry.Media) }
func (entry *Entry) GeneratePostID() {
entry.Post = strings.Replace(uuid.New().String(), "-", "", -1)
}
func (entry *Entry) AddMedia(file *multipart.FileHeader) (err error) {
src, err := file.Open()
if err != nil {
return
}
defer src.Close()
name := strings.Replace(uuid.New().String(), "-", "", -1)
extension, err := mime.ExtensionsByType(file.Header.Get("Content-Type"))
if err == nil {
name = fmt.Sprintf("%s%s", name, extension[0])
}
media := Media{
Type: "GraphImage",
File: name,
}
// TODO ruta relativa
postdir := fmt.Sprintf("/var/lib/igar/%s", entry.Post)
filepath := fmt.Sprintf("%s/%s", postdir, media.File)
os.MkdirAll(postdir, os.ModePerm)
dst, err := os.Create(filepath)
if err != nil {
return
}
defer dst.Close()
if _, err = io.Copy(dst, src); err != nil {
return
}
if err = exec.Command("node", "thumbs/make_thumb.js", postdir).Run(); err != nil {
// TODO fichero copiado no usado (limpieza?)
return
}
entry.Media = append(entry.Media, media)
return
}
func (entry *Entry) RemoveFiles() error {
// Beware of removing the root directory!
if entry.Post != "" {
path := fmt.Sprintf("/var/lib/igar/%s", entry.Post)
return os.RemoveAll(path)
}
// TODO return nil if not found?
return nil
}
func NewEntry(desc string, date string) (entry *Entry) {
var entryTime time.Time
if date != "" {
entryTime, _ = time.Parse(jsTimeLite, date)
} else {
entryTime = time.Now()
}
entry = &Entry{
Description: desc,
Date: JSTime(entryTime),
}
entry.GeneratePostID()
return
}