dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

tableMemes.go (2990B)


      1 package database
      2 
      3 import (
      4 	"dkforest/pkg/config"
      5 	"dkforest/pkg/utils"
      6 	html2 "html"
      7 	"io"
      8 	"os"
      9 	"path/filepath"
     10 	"time"
     11 
     12 	"github.com/sirupsen/logrus"
     13 )
     14 
     15 type MemeID int64
     16 
     17 type Meme struct {
     18 	ID           MemeID
     19 	Slug         string
     20 	FileName     string
     21 	OrigFileName string
     22 	FileSize     int64
     23 	CreatedAt    time.Time
     24 }
     25 
     26 func (u *Meme) DoSave(db *DkfDB) {
     27 	if err := db.db.Save(u).Error; err != nil {
     28 		logrus.Error(err)
     29 	}
     30 }
     31 
     32 func (u *Meme) GetHTMLLink() string {
     33 	escapedOrigFileName := html2.EscapeString(u.OrigFileName)
     34 	return `<a href="/memes/` + u.FileName + `" rel="noopener noreferrer" target="_blank">` + escapedOrigFileName + `</a>`
     35 }
     36 
     37 func (u *Meme) GetContent() (os.FileInfo, []byte, error) {
     38 	filePath1 := filepath.Join(config.Global.ProjectMemesPath.Get(), u.FileName)
     39 	f, err := os.Open(filePath1)
     40 	if err != nil {
     41 		return nil, nil, err
     42 	}
     43 	defer f.Close()
     44 
     45 	fileBytes, _ := io.ReadAll(f)
     46 	decFileBytes, err := utils.DecryptAESMaster(fileBytes)
     47 	if err != nil {
     48 		decFileBytes = fileBytes
     49 	}
     50 	fi, err := f.Stat()
     51 	if err != nil {
     52 		return nil, nil, err
     53 	}
     54 	return fi, decFileBytes, nil
     55 }
     56 
     57 func (u *Meme) Exists() bool {
     58 	filePath1 := filepath.Join(config.Global.ProjectMemesPath.Get(), u.FileName)
     59 	return utils.FileExists(filePath1)
     60 }
     61 
     62 func (u *Meme) Delete(db *DkfDB) error {
     63 	if err := os.Remove(filepath.Join(config.Global.ProjectMemesPath.Get(), u.FileName)); err != nil {
     64 		return err
     65 	}
     66 	if err := db.db.Delete(&u).Error; err != nil {
     67 		return err
     68 	}
     69 	return nil
     70 }
     71 
     72 // CreateMeme create file on disk in "memes" folder, and save meme in database as well.
     73 func (d *DkfDB) CreateMeme(fileName string, content []byte) (*Meme, error) {
     74 	return d.createMemeWithSize(fileName, content, int64(len(content)))
     75 }
     76 
     77 func (d *DkfDB) CreateEncryptedMemeWithSize(fileName string, content []byte, size int64) (*Meme, error) {
     78 	encryptedContent, err := utils.EncryptAESMaster(content)
     79 	if err != nil {
     80 		return nil, err
     81 	}
     82 	return d.createMemeWithSize(fileName, encryptedContent, size)
     83 }
     84 
     85 func (d *DkfDB) createMemeWithSize(fileName string, content []byte, size int64) (*Meme, error) {
     86 	newFileName := utils.MD5([]byte(utils.GenerateToken32()))
     87 	if err := os.WriteFile(filepath.Join(config.Global.ProjectMemesPath.Get(), newFileName), content, 0644); err != nil {
     88 		return nil, err
     89 	}
     90 	meme := Meme{
     91 		FileName:     newFileName,
     92 		OrigFileName: fileName,
     93 		FileSize:     size,
     94 	}
     95 	if err := d.db.Create(&meme).Error; err != nil {
     96 		logrus.Error(err)
     97 	}
     98 	return &meme, nil
     99 }
    100 
    101 func (d *DkfDB) GetMemeByFileName(filename string) (out Meme, err error) {
    102 	err = d.db.First(&out, "file_name = ?", filename).Error
    103 	return
    104 }
    105 
    106 func (d *DkfDB) GetMemeBySlug(slug string) (out Meme, err error) {
    107 	err = d.db.First(&out, "slug = ?", slug).Error
    108 	return
    109 }
    110 
    111 func (d *DkfDB) GetMemeByID(memeID MemeID) (out Meme, err error) {
    112 	err = d.db.First(&out, "id = ?", memeID).Error
    113 	return
    114 }
    115 
    116 func (d *DkfDB) GetMemes() (out []Meme, err error) {
    117 	err = d.db.Order("id DESC").Find(&out).Error
    118 	return
    119 }