Interactive/pkg/services/attachments.go

128 lines
3.0 KiB
Go
Raw Normal View History

2024-02-04 10:40:20 +00:00
package services
import (
2024-03-10 10:38:42 +00:00
"mime/multipart"
"net/http"
2024-03-24 10:31:36 +00:00
"os"
"path/filepath"
2024-03-10 10:38:42 +00:00
"strings"
2024-03-20 12:57:21 +00:00
"git.solsynth.dev/hydrogen/interactive/pkg/database"
"git.solsynth.dev/hydrogen/interactive/pkg/models"
2024-02-04 10:40:20 +00:00
"github.com/google/uuid"
2024-03-24 10:31:36 +00:00
"github.com/spf13/viper"
2024-02-04 10:40:20 +00:00
)
2024-03-24 11:01:18 +00:00
func GetAttachmentByID(id uint) (models.Attachment, error) {
2024-03-24 10:31:36 +00:00
var attachment models.Attachment
if err := database.C.Where(models.Attachment{
2024-03-24 11:01:18 +00:00
BaseModel: models.BaseModel{ID: id},
2024-03-24 10:31:36 +00:00
}).First(&attachment).Error; err != nil {
return attachment, err
}
return attachment, nil
}
2024-03-24 11:01:18 +00:00
func GetAttachmentByUUID(fileId string) (models.Attachment, error) {
var attachment models.Attachment
if err := database.C.Where(models.Attachment{
FileID: fileId,
}).First(&attachment).Error; err != nil {
return attachment, err
2024-02-04 10:40:20 +00:00
}
2024-03-24 11:01:18 +00:00
return attachment, nil
}
2024-02-04 10:40:20 +00:00
2024-03-24 11:01:18 +00:00
func GetAttachmentByHashcode(hashcode string) (models.Attachment, error) {
var attachment models.Attachment
if err := database.C.Where(models.Attachment{
Hashcode: hashcode,
}).First(&attachment).Error; err != nil {
2024-02-04 10:40:20 +00:00
return attachment, err
}
2024-03-24 11:01:18 +00:00
return attachment, nil
}
2024-02-04 10:40:20 +00:00
2024-03-24 11:01:18 +00:00
func NewAttachment(user models.Account, header *multipart.FileHeader, hashcode string) (models.Attachment, error) {
var attachment models.Attachment
existsAttachment, err := GetAttachmentByHashcode(hashcode)
2024-02-04 10:40:20 +00:00
if err != nil {
2024-03-24 11:01:18 +00:00
// Upload the new file
attachment = models.Attachment{
FileID: uuid.NewString(),
Filesize: header.Size,
Filename: header.Filename,
Hashcode: hashcode,
Mimetype: "unknown/unknown",
Type: models.AttachmentOthers,
AuthorID: user.ID,
}
// Open file
file, err := header.Open()
if err != nil {
return attachment, err
}
defer file.Close()
// Detect mimetype
fileHeader := make([]byte, 512)
_, err = file.Read(fileHeader)
if err != nil {
return attachment, err
}
attachment.Mimetype = http.DetectContentType(fileHeader)
switch strings.Split(attachment.Mimetype, "/")[0] {
case "image":
attachment.Type = models.AttachmentPhoto
case "video":
attachment.Type = models.AttachmentVideo
case "audio":
attachment.Type = models.AttachmentAudio
default:
attachment.Type = models.AttachmentOthers
}
} else {
// Instant upload, build link with the exists file
attachment = models.Attachment{
FileID: existsAttachment.FileID,
Filesize: header.Size,
Filename: header.Filename,
Hashcode: hashcode,
Mimetype: existsAttachment.Mimetype,
Type: existsAttachment.Type,
AuthorID: user.ID,
}
2024-03-10 10:38:42 +00:00
}
2024-02-04 10:40:20 +00:00
// Save into database
err = database.C.Save(&attachment).Error
return attachment, err
}
2024-03-24 10:31:36 +00:00
func DeleteAttachment(item models.Attachment) error {
2024-03-24 11:01:18 +00:00
var dupeCount int64
if err := database.C.
Where(&models.Attachment{Hashcode: item.Hashcode}).
Model(&models.Attachment{}).
Count(&dupeCount).Error; err != nil {
dupeCount = -1
}
2024-03-24 10:31:36 +00:00
if err := database.C.Delete(&item).Error; err != nil {
return err
2024-03-24 11:01:18 +00:00
}
if dupeCount != -1 && dupeCount <= 1 {
// Safe for deletion the physics file
2024-03-24 10:31:36 +00:00
basepath := viper.GetString("content")
fullpath := filepath.Join(basepath, item.FileID)
os.Remove(fullpath)
}
return nil
}