dkforest

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

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 }