aboutsummaryrefslogtreecommitdiff
path: root/repositories
diff options
context:
space:
mode:
authorBobby <[email protected]>2026-02-06 18:26:15 +0530
committerBobby <[email protected]>2026-02-06 18:26:15 +0530
commit185d84e2dbe18dca60592bb33f491c5cd3d09403 (patch)
tree49ef4e02b9e83bce48610c0a44a457927bdc78c5 /repositories
parent31b5543be4faa4f01946d532d4b5e34828b285b5 (diff)
downloadmetachan-185d84e2dbe18dca60592bb33f491c5cd3d09403.tar.xz
metachan-185d84e2dbe18dca60592bb33f491c5cd3d09403.zip
Refactor database interactions: replace direct database calls with DB variable and implement batch creation for images and producers
Diffstat (limited to 'repositories')
-rw-r--r--repositories/anime.go13
-rw-r--r--repositories/genre.go3
-rw-r--r--repositories/mapping.go7
-rw-r--r--repositories/meta.go43
-rw-r--r--repositories/producer.go24
-rw-r--r--repositories/tasks.go9
-rw-r--r--repositories/types.go8
7 files changed, 83 insertions, 24 deletions
diff --git a/repositories/anime.go b/repositories/anime.go
index 04d3ab7..b6fe0b8 100644
--- a/repositories/anime.go
+++ b/repositories/anime.go
@@ -3,7 +3,6 @@ package repositories
import (
"errors"
"fmt"
- "metachan/database"
"metachan/entities"
"metachan/enums"
"metachan/utils/logger"
@@ -21,7 +20,7 @@ func GetAnime[T idType](maptype enums.MappingType, id T) (entities.Anime, error)
return entities.Anime{}, errors.New("anime not found")
}
- result := database.DB.
+ result := DB.
Preload("Mapping").
Preload("Title").
Preload("Images").
@@ -75,12 +74,12 @@ func CreateOrUpdateAnime(anime *entities.Anime) error {
}
var existingAnime entities.Anime
- result := database.DB.Where("mal_id = ?", anime.MALID).First(&existingAnime)
+ result := DB.Where("mal_id = ?", anime.MALID).First(&existingAnime)
if result.Error == nil {
anime.ID = existingAnime.ID
}
- result = database.DB.Session(&gorm.Session{FullSaveAssociations: true}).Clauses(clause.OnConflict{
+ result = DB.Session(&gorm.Session{FullSaveAssociations: true}).Clauses(clause.OnConflict{
UpdateAll: true,
}).Save(anime)
@@ -97,11 +96,11 @@ func SaveEpisodeSkipTimes(episodeID string, skipTimes []entities.EpisodeSkipTime
return nil
}
- database.DB.Where("episode_id = ?", episodeID).Delete(&entities.EpisodeSkipTime{})
+ DB.Where("episode_id = ?", episodeID).Delete(&entities.EpisodeSkipTime{})
for i := range skipTimes {
skipTimes[i].EpisodeID = episodeID
- if err := database.DB.Create(&skipTimes[i]).Error; err != nil {
+ if err := DB.Create(&skipTimes[i]).Error; err != nil {
return fmt.Errorf("failed to save skip time: %w", err)
}
}
@@ -112,7 +111,7 @@ func SaveEpisodeSkipTimes(episodeID string, skipTimes []entities.EpisodeSkipTime
func GetAiringAnime() ([]entities.Anime, error) {
var anime []entities.Anime
- result := database.DB.
+ result := DB.
Where("airing = ?", true).
Preload("NextAiring").
Preload("Schedule").
diff --git a/repositories/genre.go b/repositories/genre.go
index ed27db4..0d95f66 100644
--- a/repositories/genre.go
+++ b/repositories/genre.go
@@ -2,7 +2,6 @@ package repositories
import (
"errors"
- "metachan/database"
"metachan/entities"
"metachan/utils/logger"
@@ -10,7 +9,7 @@ import (
)
func CreateOrUpdateGenre(genre *entities.Genre) error {
- result := database.DB.Clauses(clause.OnConflict{
+ result := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "genre_id"}},
DoUpdates: clause.AssignmentColumns([]string{"name", "url", "count"}),
}).Create(genre)
diff --git a/repositories/mapping.go b/repositories/mapping.go
index bbcda8d..145bb43 100644
--- a/repositories/mapping.go
+++ b/repositories/mapping.go
@@ -3,7 +3,6 @@ package repositories
import (
"errors"
"fmt"
- "metachan/database"
"metachan/entities"
"metachan/enums"
"metachan/utils/logger"
@@ -14,7 +13,7 @@ import (
func GetAnimeMapping[T idType](maptype enums.MappingType, id T) (entities.Mapping, error) {
var mapping entities.Mapping
- result := database.DB.Where(fmt.Sprintf("%s = ?", maptype), id).First(&mapping)
+ result := DB.Where(fmt.Sprintf("%s = ?", maptype), id).First(&mapping)
if result.Error != nil {
logger.Errorf("Mapping", "Failed to get mapping for %s with ID %v: %v", maptype, id, result.Error)
@@ -25,7 +24,7 @@ func GetAnimeMapping[T idType](maptype enums.MappingType, id T) (entities.Mappin
}
func CreateOrUpdateMapping(mapping *entities.Mapping) error {
- result := database.DB.Clauses(clause.OnConflict{
+ result := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "mal"}},
DoUpdates: clause.AssignmentColumns([]string{
"ani_db", "anilist", "anime_countdown", "anime_planet",
@@ -45,7 +44,7 @@ func CreateOrUpdateMapping(mapping *entities.Mapping) error {
func GetAllMappings() ([]entities.Mapping, error) {
var mappings []entities.Mapping
- result := database.DB.Find(&mappings)
+ result := DB.Find(&mappings)
if result.Error != nil {
logger.Errorf("Mapping", "Failed to fetch all mappings: %v", result.Error)
return nil, errors.New("failed to fetch mappings")
diff --git a/repositories/meta.go b/repositories/meta.go
index 3ab4543..34487a4 100644
--- a/repositories/meta.go
+++ b/repositories/meta.go
@@ -2,7 +2,6 @@ package repositories
import (
"errors"
- "metachan/database"
"metachan/entities"
"metachan/utils/logger"
@@ -10,7 +9,7 @@ import (
)
func CreateOrUpdateSimpleImage(image *entities.SimpleImage) (uint, error) {
- result := database.DB.Clauses(clause.OnConflict{
+ result := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "image_url"}},
DoUpdates: clause.AssignmentColumns([]string{"image_url"}),
}).Create(image)
@@ -23,8 +22,44 @@ func CreateOrUpdateSimpleImage(image *entities.SimpleImage) (uint, error) {
return image.ID, nil
}
+func BatchCreateSimpleImages(images []entities.SimpleImage) error {
+ if len(images) == 0 {
+ return nil
+ }
+
+ result := DB.Clauses(clause.OnConflict{
+ Columns: []clause.Column{{Name: "image_url"}},
+ DoNothing: true,
+ }).CreateInBatches(&images, 100)
+
+ if result.Error != nil {
+ logger.Errorf("Meta", "Failed to batch create images: %v", result.Error)
+ return errors.New("failed to batch create images")
+ }
+
+ return nil
+}
+
+func BatchCreateSimpleTitles(titles []entities.SimpleTitle) error {
+ if len(titles) == 0 {
+ return nil
+ }
+
+ result := DB.Clauses(clause.OnConflict{
+ Columns: []clause.Column{{Name: "type"}, {Name: "title"}},
+ DoNothing: true,
+ }).CreateInBatches(&titles, 100)
+
+ if result.Error != nil {
+ logger.Errorf("Meta", "Failed to batch create titles: %v", result.Error)
+ return errors.New("failed to batch create titles")
+ }
+
+ return nil
+}
+
func CreateOrUpdateSimpleTitle(title *entities.SimpleTitle) (uint, error) {
- result := database.DB.Clauses(clause.OnConflict{
+ result := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "type"}, {Name: "title"}},
DoUpdates: clause.AssignmentColumns([]string{"type", "title"}),
}).Create(title)
@@ -38,7 +73,7 @@ func CreateOrUpdateSimpleTitle(title *entities.SimpleTitle) (uint, error) {
}
func CreateOrUpdateExternalURL(url *entities.ExternalURL) (uint, error) {
- result := database.DB.Clauses(clause.OnConflict{
+ result := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "name"}, {Name: "url"}},
DoUpdates: clause.AssignmentColumns([]string{"name", "url"}),
}).Create(url)
diff --git a/repositories/producer.go b/repositories/producer.go
index dade0d1..946d873 100644
--- a/repositories/producer.go
+++ b/repositories/producer.go
@@ -2,15 +2,15 @@ package repositories
import (
"errors"
- "metachan/database"
"metachan/entities"
"metachan/utils/logger"
+ "gorm.io/gorm"
"gorm.io/gorm/clause"
)
func CreateOrUpdateProducer(producer *entities.Producer) error {
- result := database.DB.Clauses(clause.OnConflict{
+ result := DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "mal_id"}},
DoUpdates: clause.AssignmentColumns([]string{
"url", "favorites", "count", "established", "about", "image_id",
@@ -24,3 +24,23 @@ func CreateOrUpdateProducer(producer *entities.Producer) error {
return nil
}
+
+func BatchCreateProducers(producers []entities.Producer) error {
+ if len(producers) == 0 {
+ return nil
+ }
+
+ result := DB.Session(&gorm.Session{FullSaveAssociations: true}).Clauses(clause.OnConflict{
+ Columns: []clause.Column{{Name: "mal_id"}},
+ DoUpdates: clause.AssignmentColumns([]string{
+ "url", "favorites", "count", "established", "about", "image_id",
+ }),
+ }).CreateInBatches(&producers, 100)
+
+ if result.Error != nil {
+ logger.Errorf("Producer", "Failed to batch create producers: %v", result.Error)
+ return errors.New("failed to batch create producers")
+ }
+
+ return nil
+}
diff --git a/repositories/tasks.go b/repositories/tasks.go
index 6a52e7a..097186f 100644
--- a/repositories/tasks.go
+++ b/repositories/tasks.go
@@ -2,7 +2,6 @@ package repositories
import (
"errors"
- "metachan/database"
"metachan/entities"
"metachan/utils/logger"
)
@@ -10,7 +9,7 @@ import (
func GetTaskStatus(taskName string) (entities.TaskStatus, error) {
var taskStatus entities.TaskStatus
- result := database.DB.Where("task_name = ?", taskName).First(&taskStatus)
+ result := DB.Where("task_name = ?", taskName).First(&taskStatus)
if result.Error != nil {
return entities.TaskStatus{}, errors.New("task status not found")
@@ -20,7 +19,7 @@ func GetTaskStatus(taskName string) (entities.TaskStatus, error) {
}
func SetTaskStatus(task *entities.TaskStatus) error {
- result := database.DB.Save(task)
+ result := DB.Save(task)
if result.Error != nil {
logger.Errorf("Task", "Failed to set task status for %s: %v", task.TaskName, result.Error)
@@ -34,7 +33,7 @@ func SetTaskStatus(task *entities.TaskStatus) error {
func GetLatestTaskLog(taskName string) (*entities.TaskLog, error) {
var taskLog entities.TaskLog
- result := database.DB.Where("task_name = ?", taskName).Order("executed_at desc").First(&taskLog)
+ result := DB.Where("task_name = ?", taskName).Order("executed_at desc").First(&taskLog)
if result.Error != nil {
return nil, result.Error
}
@@ -43,7 +42,7 @@ func GetLatestTaskLog(taskName string) (*entities.TaskLog, error) {
}
func CreateTaskLog(taskLog *entities.TaskLog) error {
- result := database.DB.Create(taskLog)
+ result := DB.Create(taskLog)
if result.Error != nil {
logger.Errorf("Task", "Failed to create task log: %v", result.Error)
return errors.New("failed to create task log")
diff --git a/repositories/types.go b/repositories/types.go
index ccc04f2..dcce328 100644
--- a/repositories/types.go
+++ b/repositories/types.go
@@ -1,5 +1,13 @@
package repositories
+import (
+ "metachan/database"
+
+ "gorm.io/gorm"
+)
+
+var DB *gorm.DB = database.DB
+
type idType interface {
~int | ~string
}