diff options
| author | Bobby <[email protected]> | 2026-02-03 14:52:56 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-02-03 14:52:56 +0530 |
| commit | 8b31922b72cd2a3bb77b5b09aeebcad37e39d37b (patch) | |
| tree | 3795cb872d5db238302ec4588d1d014878194dec /tasks/genresync.task.go | |
| parent | e4d65624c49c11db7da46d05f5e4caeec79bd955 (diff) | |
| download | metachan-8b31922b72cd2a3bb77b5b09aeebcad37e39d37b.tar.xz metachan-8b31922b72cd2a3bb77b5b09aeebcad37e39d37b.zip | |
Refactor anime and genre synchronization tasks: replace existing implementations with new structured code for improved maintainability and performance
Diffstat (limited to 'tasks/genresync.task.go')
| -rw-r--r-- | tasks/genresync.task.go | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/tasks/genresync.task.go b/tasks/genresync.task.go new file mode 100644 index 0000000..e240833 --- /dev/null +++ b/tasks/genresync.task.go @@ -0,0 +1,82 @@ +package tasks + +import ( + "fmt" + "metachan/database" + "metachan/entities" + "metachan/utils/api/jikan" + "metachan/utils/logger" +) + +// GenreSync synchronizes genre data from MAL via Jikan API +func GenreSync() error { + logger.Log("Starting Genre Sync from MAL", logger.LogOptions{ + Level: logger.Info, + Prefix: "GenreSync", + }) + + // Create Jikan client + client := jikan.NewJikanClient() + + // Wait for rate limit + client.WaitForRateLimit() + + // Fetch genres from Jikan API + genresResponse, err := client.GetAnimeGenres() + if err != nil { + logger.Log(fmt.Sprintf("Failed to fetch genres from MAL: %v", err), logger.LogOptions{ + Level: logger.Error, + Prefix: "GenreSync", + }) + return err + } + + logger.Log(fmt.Sprintf("Fetched %d genres from MAL", len(genresResponse.Data)), logger.LogOptions{ + Level: logger.Info, + Prefix: "GenreSync", + }) + + // Update or create genres in database + for _, genre := range genresResponse.Data { + // Create a genre entry with AnimeID = 0 to indicate it's a master genre + genreEntity := entities.AnimeGenre{ + AnimeID: 0, // Master genre, not tied to specific anime + GenreID: genre.MALID, + Name: genre.Name, + URL: genre.URL, + Count: genre.Count, + } + + // Update or create + var existing entities.AnimeGenre + result := database.DB.Where("genre_id = ? AND anime_id = 0", genre.MALID).First(&existing) + + if result.Error == nil { + // Update existing + existing.Name = genre.Name + existing.URL = genre.URL + existing.Count = genre.Count + if err := database.DB.Save(&existing).Error; err != nil { + logger.Log(fmt.Sprintf("Failed to update genre %s: %v", genre.Name, err), logger.LogOptions{ + Level: logger.Warn, + Prefix: "GenreSync", + }) + } + } else { + // Create new + if err := database.DB.Create(&genreEntity).Error; err != nil { + logger.Log(fmt.Sprintf("Failed to create genre %s: %v", genre.Name, err), logger.LogOptions{ + Level: logger.Warn, + Prefix: "GenreSync", + }) + } + } + } + + logger.Log("Genre Sync completed successfully", logger.LogOptions{ + Level: logger.Success, + Prefix: "GenreSync", + }) + + return nil +} |
