aboutsummaryrefslogtreecommitdiff
path: root/database
diff options
context:
space:
mode:
Diffstat (limited to 'database')
-rw-r--r--database/images.go10
-rw-r--r--database/posts.go33
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
+}