tableUploads.go (4021B)
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 UploadID int64 16 17 type Upload struct { 18 ID UploadID 19 UserID UserID 20 FileName string 21 OrigFileName string 22 FileSize int64 23 Password string 24 CreatedAt time.Time 25 User User 26 } 27 28 func (u *Upload) GetHTMLLink() string { 29 escapedOrigFileName := html2.EscapeString(u.OrigFileName) 30 return `<a href="/uploads/` + u.FileName + `" rel="noopener noreferrer" target="_blank">` + escapedOrigFileName + `</a>` 31 } 32 33 func (u *Upload) GetContent() (os.FileInfo, []byte, error) { 34 filePath1 := filepath.Join(config.Global.ProjectUploadsPath.Get(), u.FileName) 35 f, err := os.Open(filePath1) 36 if err != nil { 37 return nil, nil, err 38 } 39 defer f.Close() 40 41 fileBytes, _ := io.ReadAll(f) 42 decFileBytes, err := utils.DecryptAESMaster(fileBytes) 43 if err != nil { 44 decFileBytes = fileBytes 45 } 46 fi, err := f.Stat() 47 if err != nil { 48 return nil, nil, err 49 } 50 return fi, decFileBytes, nil 51 } 52 53 func (u *Upload) Exists() bool { 54 filePath1 := filepath.Join(config.Global.ProjectUploadsPath.Get(), u.FileName) 55 return utils.FileExists(filePath1) 56 } 57 58 func (u *Upload) Delete(db *DkfDB) error { 59 if err := os.Remove(filepath.Join(config.Global.ProjectUploadsPath.Get(), u.FileName)); err != nil { 60 return err 61 } 62 if err := db.db.Delete(&u).Error; err != nil { 63 return err 64 } 65 return nil 66 } 67 68 // CreateUpload create file on disk in "uploads" folder, and save upload in database as well. 69 func (d *DkfDB) CreateUpload(fileName string, content []byte, userID UserID) (*Upload, error) { 70 return d.createUploadWithSize(fileName, content, userID, int64(len(content))) 71 } 72 73 func (d *DkfDB) CreateEncryptedUploadWithSize(fileName string, content []byte, userID UserID, size int64) (*Upload, error) { 74 encryptedContent, err := utils.EncryptAESMaster(content) 75 if err != nil { 76 return nil, err 77 } 78 return d.createUploadWithSize(fileName, encryptedContent, userID, size) 79 } 80 81 func (d *DkfDB) createUploadWithSize(fileName string, content []byte, userID UserID, size int64) (*Upload, error) { 82 newFileName := utils.MD5([]byte(utils.GenerateToken32())) 83 if err := os.WriteFile(filepath.Join(config.Global.ProjectUploadsPath.Get(), newFileName), content, 0644); err != nil { 84 return nil, err 85 } 86 upload := Upload{ 87 UserID: userID, 88 FileName: newFileName, 89 OrigFileName: fileName, 90 FileSize: size, 91 } 92 if err := d.db.Create(&upload).Error; err != nil { 93 logrus.Error(err) 94 } 95 return &upload, nil 96 } 97 98 func (d *DkfDB) GetUploadByFileName(filename string) (out Upload, err error) { 99 err = d.db.First(&out, "file_name = ?", filename).Error 100 return 101 } 102 103 func (d *DkfDB) GetUploadByID(uploadID UploadID) (out Upload, err error) { 104 err = d.db.First(&out, "id = ?", uploadID).Error 105 return 106 } 107 108 func (d *DkfDB) GetUploads() (out []Upload, err error) { 109 err = d.db.Preload("User").Order("id DESC").Find(&out).Error 110 return 111 } 112 113 func (d *DkfDB) GetUserUploads(userID UserID) (out []Upload, err error) { 114 err = d.db.Order("id DESC").Find(&out, "user_id = ?", userID).Error 115 return 116 } 117 118 func (d *DkfDB) GetUserTotalUploadSize(userID UserID) int64 { 119 var out struct{ TotalSize int64 } 120 if err := d.db.Raw(`SELECT SUM(file_size) as total_size FROM uploads WHERE user_id = ?`, userID).Scan(&out).Error; err != nil { 121 logrus.Error(err) 122 } 123 return out.TotalSize 124 } 125 126 func (d *DkfDB) DeleteOldUploads() { 127 if err := d.db.Exec(`DELETE FROM uploads WHERE created_at < date('now', '-1 Day')`).Error; err != nil { 128 logrus.Error(err.Error()) 129 } 130 entries, err := os.ReadDir(config.Global.ProjectUploadsPath.Get()) 131 if err != nil { 132 logrus.Error(err.Error()) 133 return 134 } 135 now := time.Now() 136 for _, entry := range entries { 137 info, err := entry.Info() 138 if err != nil { 139 continue 140 } 141 if diff := now.Sub(info.ModTime()); diff > 24*time.Hour { 142 if err := os.Remove(filepath.Join(config.Global.ProjectUploadsPath.Get(), info.Name())); err != nil { 143 logrus.Error(err.Error()) 144 } 145 } 146 } 147 }