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 }