diff options
| author | Bobby <[email protected]> | 2025-07-17 18:47:30 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-07-17 18:47:30 +0530 |
| commit | 8df8cdd7e1bdefded59d073c14aa74666740be8c (patch) | |
| tree | 0af31475e1a5ffecd04a9fbce3faf5cd6bf80140 /database | |
| parent | 3c39a30a53656fa1c51afb30bb8c07f862bd39e2 (diff) | |
| download | imageboard-8df8cdd7e1bdefded59d073c14aa74666740be8c.tar.xz imageboard-8df8cdd7e1bdefded59d073c14aa74666740be8c.zip | |
tags and ratings filter in posts, uploads progress
Diffstat (limited to 'database')
| -rw-r--r-- | database/images.go | 10 | ||||
| -rw-r--r-- | database/posts.go | 33 |
2 files changed, 36 insertions, 7 deletions
diff --git a/database/images.go b/database/images.go index 35efa7b..95b5339 100644 --- a/database/images.go +++ b/database/images.go @@ -6,6 +6,8 @@ import ( "imageboard/utils/format" "imageboard/utils/transformers" "time" + + "gorm.io/gorm" ) func GetTotalPostsCount() (int64, error) { @@ -35,7 +37,7 @@ func GetTotalStorageSize() (string, error) { return format.FileSize(totalSize), nil } -func CreateImage(fileName, contentType, md5Hash, sourceURL, rating string, uploaderID uint, requiresApproval bool) (*models.Image, error) { +func CreateImageWithTx(tx *gorm.DB, fileName, contentType, md5Hash, sourceURL, rating string, uploaderID uint, requiresApproval bool) (*models.Image, error) { ratingEnum, err := transformers.ConvertStringRatingToType(rating) if err != nil { return nil, err @@ -56,14 +58,14 @@ func CreateImage(fileName, contentType, md5Hash, sourceURL, rating string, uploa IsApproved: !requiresApproval, } - if err := DB.Create(&image).Error; err != nil { + if err := tx.Create(&image).Error; err != nil { return nil, err } return &image, nil } -func CreateImageSize(imageID uint, sizeType config.ImageSizeType, width, height int, fileSize int64) (*models.ImageSize, error) { +func CreateImageSizeWithTx(tx *gorm.DB, imageID uint, sizeType config.ImageSizeType, width, height int, fileSize int64) (*models.ImageSize, error) { imageSize := models.ImageSize{ ImageID: imageID, SizeType: sizeType, @@ -72,7 +74,7 @@ func CreateImageSize(imageID uint, sizeType config.ImageSizeType, width, height FileSize: fileSize, } - if err := DB.Create(&imageSize).Error; err != nil { + if err := tx.Create(&imageSize).Error; err != nil { return nil, err } diff --git a/database/posts.go b/database/posts.go index dd2a74e..1aeaecd 100644 --- a/database/posts.go +++ b/database/posts.go @@ -1,11 +1,38 @@ package database -import "imageboard/models" +import ( + "imageboard/config" + "imageboard/models" +) -func GetPosts(limit int) ([]models.Image, error) { +func GetPosts(limit int, ratings []config.Rating, tags []string) ([]models.Image, error) { var posts []models.Image - if err := DB.Preload("Sizes").Preload("Uploader").Preload("Tags").Limit(limit).Find(&posts).Error; err != nil { + query := DB.Preload("Sizes").Preload("Uploader").Limit(limit).Order("created_at DESC") + + if len(ratings) > 0 { + query = query.Where("rating IN ?", ratings) + } + + if len(tags) > 0 { + query = query.Joins("JOIN image_tags ON images.id = image_tags.image_id"). + Joins("JOIN tags ON image_tags.tag_id = tags.id"). + Where("tags.name IN ?", tags). + Group("images.id"). + Preload("Tags") + } else { + query = query.Preload("Tags") + } + + if err := query.Find(&posts).Error; err != nil { return nil, err } return posts, nil } + +func GetPostByID(postID uint) (*models.Image, error) { + var post models.Image + if err := DB.Preload("Sizes").Preload("Uploader").Preload("Tags").First(&post, postID).Error; err != nil { + return nil, err + } + return &post, nil +} |
