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 }