From 37171478b1da9554192819c1ef0c6e9fab217f6c Mon Sep 17 00:00:00 2001 From: Adam French Date: Wed, 15 Apr 2026 18:33:19 +0100 Subject: [PATCH] refactored code, removed *_helper.go files and placed them in *.resolvers.go files for uniformity --- backend/graph/gitea.resolvers.go | 40 +++++++ backend/graph/gitea_helpers.go | 17 --- backend/graph/schema.resolvers.go | 108 +----------------- ...potify_helpers.go => spotify.resolvers.go} | 44 +++++++ backend/graph/steam.resolvers.go | 62 ++++++++++ backend/graph/steam_helpers.go | 22 ---- 6 files changed, 150 insertions(+), 143 deletions(-) create mode 100644 backend/graph/gitea.resolvers.go delete mode 100644 backend/graph/gitea_helpers.go rename backend/graph/{spotify_helpers.go => spotify.resolvers.go} (55%) create mode 100644 backend/graph/steam.resolvers.go delete mode 100644 backend/graph/steam_helpers.go diff --git a/backend/graph/gitea.resolvers.go b/backend/graph/gitea.resolvers.go new file mode 100644 index 0000000..dbd90e2 --- /dev/null +++ b/backend/graph/gitea.resolvers.go @@ -0,0 +1,40 @@ +package graph + +import ( + "context" + "time" + + "adam-french.co.uk/backend/graph/model" + "adam-french.co.uk/backend/services" +) + +func mapGiteaFeed(feed *services.GiteaFeedResponse) *model.GiteaFeedItem { + return &model.GiteaFeedItem{ + AvatarURL: feed.ActUser.AvatarURL, + RepoURL: feed.Repo.HTMLURL, + RepoName: feed.Repo.FullName, + OpType: feed.OpType, + CommitMessage: services.ParseCommitMessage(feed.Content), + CreatedAt: feed.Created, + } +} + +// GiteaFeed is the resolver for the giteaFeed field. +func (r *queryResolver) GiteaFeed(ctx context.Context) (*model.GiteaFeedItem, error) { + if r.Store.GiteaFeedFresh() { + return mapGiteaFeed(r.Store.GiteaFeed), nil + } + + feed, err := services.FetchLatestFeed(r.Store.GiteaHost, r.Store.GiteaPort) + if err != nil { + return nil, err + } + if feed == nil { + return nil, nil + } + + r.Store.GiteaFeed = feed + r.Store.GiteaFeedFetchedAt = time.Now() + + return mapGiteaFeed(feed), nil +} diff --git a/backend/graph/gitea_helpers.go b/backend/graph/gitea_helpers.go deleted file mode 100644 index 95fad87..0000000 --- a/backend/graph/gitea_helpers.go +++ /dev/null @@ -1,17 +0,0 @@ -package graph - -import ( - "adam-french.co.uk/backend/graph/model" - "adam-french.co.uk/backend/services" -) - -func mapGiteaFeed(feed *services.GiteaFeedResponse) *model.GiteaFeedItem { - return &model.GiteaFeedItem{ - AvatarURL: feed.ActUser.AvatarURL, - RepoURL: feed.Repo.HTMLURL, - RepoName: feed.Repo.FullName, - OpType: feed.OpType, - CommitMessage: services.ParseCommitMessage(feed.Content), - CreatedAt: feed.Created, - } -} diff --git a/backend/graph/schema.resolvers.go b/backend/graph/schema.resolvers.go index ec5ce02..97f01d6 100644 --- a/backend/graph/schema.resolvers.go +++ b/backend/graph/schema.resolvers.go @@ -9,12 +9,9 @@ import ( "context" "fmt" "net/http" - "time" "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" - "adam-french.co.uk/backend/services" - spotify "github.com/zmb3/spotify/v2" "golang.org/x/crypto/bcrypt" ) @@ -550,105 +547,6 @@ func (r *queryResolver) Messages(ctx context.Context) ([]*models.Message, error) return result, nil } -// SpotifyListening is the resolver for the spotifyListening field. -func (r *queryResolver) SpotifyListening(ctx context.Context) (*model.SpotifyPlaying, error) { - if r.Store.SpotifyClient == nil { - return nil, nil - } - - playing, err := r.Store.SpotifyClient.PlayerCurrentlyPlaying(ctx) - if err != nil { - return nil, err - } - - result := &model.SpotifyPlaying{Playing: playing.Playing} - if playing.Item != nil { - result.Track = mapSpotifyTrack(playing.Item) - } - - return result, nil -} - -// SpotifyRecent is the resolver for the spotifyRecent field. -func (r *queryResolver) SpotifyRecent(ctx context.Context) ([]*model.SpotifyRecentItem, error) { - if r.Store.SpotifyClient == nil { - return []*model.SpotifyRecentItem{}, nil - } - - if r.Store.RecentSongsFresh() { - return mapRecentItems(*r.Store.RecentSongs), nil - } - - opts := spotify.RecentlyPlayedOptions{Limit: 3} - played, err := r.Store.SpotifyClient.PlayerRecentlyPlayedOpt(ctx, &opts) - if err != nil { - return nil, err - } - - r.Store.RecentSongs = &played - r.Store.RecentSongsFetchedAt = time.Now() - - return mapRecentItems(played), nil -} - -// GiteaFeed is the resolver for the giteaFeed field. -func (r *queryResolver) GiteaFeed(ctx context.Context) (*model.GiteaFeedItem, error) { - if r.Store.GiteaFeedFresh() { - return mapGiteaFeed(r.Store.GiteaFeed), nil - } - - feed, err := services.FetchLatestFeed(r.Store.GiteaHost, r.Store.GiteaPort) - if err != nil { - return nil, err - } - if feed == nil { - return nil, nil - } - - r.Store.GiteaFeed = feed - r.Store.GiteaFeedFetchedAt = time.Now() - - return mapGiteaFeed(feed), nil -} - -// SteamStatus is the resolver for the steamStatus field. -func (r *queryResolver) SteamStatus(ctx context.Context) (*model.SteamStatus, error) { - if r.Store.SteamAPIKey == "" { - return nil, nil - } - - if r.Store.SteamFresh() { - return &model.SteamStatus{ - Online: r.Store.SteamOnline, - RecentGames: mapSteamGames(r.Store.SteamRecentGames), - }, nil - } - - games, err := services.FetchRecentlyPlayedGames(r.Store.SteamAPIKey, r.Store.SteamID) - if err != nil { - return nil, err - } - - summary, err := services.FetchPlayerSummary(r.Store.SteamAPIKey, r.Store.SteamID) - if err != nil { - return nil, err - } - - online := false - if summary != nil { - online = summary.PersonaState > 0 - } - - r.Store.SteamRecentGames = games - r.Store.SteamOnline = online - r.Store.SteamFetchedAt = time.Now() - - return &model.SteamStatus{ - Online: online, - RecentGames: mapSteamGames(games), - }, nil -} - // Me is the resolver for the me field. func (r *queryResolver) Me(ctx context.Context) (*models.User, error) { userID, ok := UserIDFromCtx(ctx) @@ -720,5 +618,7 @@ func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} } // Query returns QueryResolver implementation. func (r *Resolver) Query() QueryResolver { return &queryResolver{r} } -type mutationResolver struct{ *Resolver } -type queryResolver struct{ *Resolver } +type ( + mutationResolver struct{ *Resolver } + queryResolver struct{ *Resolver } +) diff --git a/backend/graph/spotify_helpers.go b/backend/graph/spotify.resolvers.go similarity index 55% rename from backend/graph/spotify_helpers.go rename to backend/graph/spotify.resolvers.go index 3841f79..aee7acc 100644 --- a/backend/graph/spotify_helpers.go +++ b/backend/graph/spotify.resolvers.go @@ -1,6 +1,9 @@ package graph import ( + "context" + "time" + "adam-french.co.uk/backend/graph/model" "github.com/zmb3/spotify/v2" ) @@ -49,3 +52,44 @@ func mapRecentItems(items []spotify.RecentlyPlayedItem) []*model.SpotifyRecentIt } return result } + +// SpotifyListening is the resolver for the spotifyListening field. +func (r *queryResolver) SpotifyListening(ctx context.Context) (*model.SpotifyPlaying, error) { + if r.Store.SpotifyClient == nil { + return nil, nil + } + + playing, err := r.Store.SpotifyClient.PlayerCurrentlyPlaying(ctx) + if err != nil { + return nil, err + } + + result := &model.SpotifyPlaying{Playing: playing.Playing} + if playing.Item != nil { + result.Track = mapSpotifyTrack(playing.Item) + } + + return result, nil +} + +// SpotifyRecent is the resolver for the spotifyRecent field. +func (r *queryResolver) SpotifyRecent(ctx context.Context) ([]*model.SpotifyRecentItem, error) { + if r.Store.SpotifyClient == nil { + return []*model.SpotifyRecentItem{}, nil + } + + if r.Store.RecentSongsFresh() { + return mapRecentItems(*r.Store.RecentSongs), nil + } + + opts := spotify.RecentlyPlayedOptions{Limit: 3} + played, err := r.Store.SpotifyClient.PlayerRecentlyPlayedOpt(ctx, &opts) + if err != nil { + return nil, err + } + + r.Store.RecentSongs = &played + r.Store.RecentSongsFetchedAt = time.Now() + + return mapRecentItems(played), nil +} diff --git a/backend/graph/steam.resolvers.go b/backend/graph/steam.resolvers.go new file mode 100644 index 0000000..5a6758e --- /dev/null +++ b/backend/graph/steam.resolvers.go @@ -0,0 +1,62 @@ +package graph + +import ( + "context" + "fmt" + "time" + + "adam-french.co.uk/backend/graph/model" + "adam-french.co.uk/backend/services" +) + +func mapSteamGames(games []services.SteamRecentGame) []*model.SteamGame { + result := make([]*model.SteamGame, len(games)) + for i, g := range games { + result[i] = &model.SteamGame{ + AppID: g.AppID, + Name: g.Name, + Playtime2Weeks: g.Playtime2Weeks, + PlaytimeForever: g.PlaytimeForever, + HeaderImageURL: fmt.Sprintf("https://cdn.akamai.steamstatic.com/steam/apps/%d/header.jpg", g.AppID), + } + } + return result +} + +// SteamStatus is the resolver for the steamStatus field. +func (r *queryResolver) SteamStatus(ctx context.Context) (*model.SteamStatus, error) { + if r.Store.SteamAPIKey == "" { + return nil, nil + } + + if r.Store.SteamFresh() { + return &model.SteamStatus{ + Online: r.Store.SteamOnline, + RecentGames: mapSteamGames(r.Store.SteamRecentGames), + }, nil + } + + games, err := services.FetchRecentlyPlayedGames(r.Store.SteamAPIKey, r.Store.SteamID) + if err != nil { + return nil, err + } + + summary, err := services.FetchPlayerSummary(r.Store.SteamAPIKey, r.Store.SteamID) + if err != nil { + return nil, err + } + + online := false + if summary != nil { + online = summary.PersonaState > 0 + } + + r.Store.SteamRecentGames = games + r.Store.SteamOnline = online + r.Store.SteamFetchedAt = time.Now() + + return &model.SteamStatus{ + Online: online, + RecentGames: mapSteamGames(games), + }, nil +} diff --git a/backend/graph/steam_helpers.go b/backend/graph/steam_helpers.go deleted file mode 100644 index 33ac21f..0000000 --- a/backend/graph/steam_helpers.go +++ /dev/null @@ -1,22 +0,0 @@ -package graph - -import ( - "fmt" - - "adam-french.co.uk/backend/graph/model" - "adam-french.co.uk/backend/services" -) - -func mapSteamGames(games []services.SteamRecentGame) []*model.SteamGame { - result := make([]*model.SteamGame, len(games)) - for i, g := range games { - result[i] = &model.SteamGame{ - AppID: g.AppID, - Name: g.Name, - Playtime2Weeks: g.Playtime2Weeks, - PlaytimeForever: g.PlaytimeForever, - HeaderImageURL: fmt.Sprintf("https://cdn.akamai.steamstatic.com/steam/apps/%d/header.jpg", g.AppID), - } - } - return result -}