2022-02-12 10:29:56 +01:00
|
|
|
package storage
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2022-02-16 23:59:19 +01:00
|
|
|
"io"
|
|
|
|
"mime"
|
|
|
|
"mime/multipart"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2022-02-12 10:29:56 +01:00
|
|
|
"strings"
|
|
|
|
"time"
|
2022-02-16 23:59:19 +01:00
|
|
|
|
|
|
|
"github.com/google/uuid"
|
2022-02-12 10:29:56 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
func (entry Entry) Count() map[string]int {
|
|
|
|
count := make(map[string]int)
|
|
|
|
for _, media := range entry.Media {
|
|
|
|
count[media.Type] += 1
|
|
|
|
}
|
|
|
|
return count
|
|
|
|
}
|
2022-02-12 10:29:56 +01:00
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
func (entry Entry) Len() int { return len(entry.Media) }
|
2022-02-12 10:29:56 +01:00
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
func (entry *Entry) GeneratePostID() {
|
|
|
|
entry.Post = strings.Replace(uuid.New().String(), "-", "", -1)
|
2022-02-12 10:29:56 +01:00
|
|
|
}
|
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
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,
|
|
|
|
}
|
2022-02-12 10:29:56 +01:00
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
// 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
|
2022-02-12 10:29:56 +01:00
|
|
|
}
|
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
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
|
2022-02-12 10:29:56 +01:00
|
|
|
}
|
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
func NewEntry(desc string, date string) (entry *Entry) {
|
|
|
|
var entryTime time.Time
|
2022-02-12 10:29:56 +01:00
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
if date != "" {
|
|
|
|
entryTime, _ = time.Parse(jsTimeLite, date)
|
|
|
|
} else {
|
|
|
|
entryTime = time.Now()
|
2022-02-12 10:29:56 +01:00
|
|
|
}
|
|
|
|
|
2022-02-16 23:59:19 +01:00
|
|
|
entry = &Entry{
|
|
|
|
Description: desc,
|
|
|
|
Date: JSTime(entryTime),
|
|
|
|
}
|
|
|
|
entry.GeneratePostID()
|
|
|
|
|
|
|
|
return
|
|
|
|
}
|