Handle missing Spotify auth gracefully instead of returning errors
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 3m42s

Return nil/empty results when Spotify client is not authenticated,
preventing GraphQL errors from breaking the home page data query.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-25 17:02:11 +00:00
parent 29350af2e0
commit 7a737f6d10
5 changed files with 27 additions and 26 deletions

View File

@@ -2917,9 +2917,9 @@ func (ec *executionContext) _Query_spotifyRecent(ctx context.Context, field grap
return ec.Resolvers.Query().SpotifyRecent(ctx) return ec.Resolvers.Query().SpotifyRecent(ctx)
}, },
nil, nil,
ec.marshalNSpotifyRecentItem2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItemᚄ, ec.marshalOSpotifyRecentItem2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItemᚄ,
true,
true, true,
false,
) )
} }
@@ -6348,16 +6348,13 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr
case "spotifyRecent": case "spotifyRecent":
field := field field := field
innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) {
defer func() { defer func() {
if r := recover(); r != nil { if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r)) ec.Error(ctx, ec.Recover(ctx, r))
} }
}() }()
res = ec._Query_spotifyRecent(ctx, field) res = ec._Query_spotifyRecent(ctx, field)
if res == graphql.Null {
atomic.AddUint32(&fs.Invalids, 1)
}
return res return res
} }
@@ -7586,22 +7583,6 @@ func (ec *executionContext) marshalNSpotifyImage2ᚖadamᚑfrenchᚗcoᚗukᚋba
return ec._SpotifyImage(ctx, sel, v) return ec._SpotifyImage(ctx, sel, v)
} }
func (ec *executionContext) marshalNSpotifyRecentItem2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItemᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.SpotifyRecentItem) graphql.Marshaler {
ret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {
fc := graphql.GetFieldContext(ctx)
fc.Result = &v[i]
return ec.marshalNSpotifyRecentItem2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItem(ctx, sel, v[i])
})
for _, e := range ret {
if e == graphql.Null {
return graphql.Null
}
}
return ret
}
func (ec *executionContext) marshalNSpotifyRecentItem2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItem(ctx context.Context, sel ast.SelectionSet, v *model.SpotifyRecentItem) graphql.Marshaler { func (ec *executionContext) marshalNSpotifyRecentItem2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItem(ctx context.Context, sel ast.SelectionSet, v *model.SpotifyRecentItem) graphql.Marshaler {
if v == nil { if v == nil {
if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
@@ -7881,6 +7862,25 @@ func (ec *executionContext) marshalOSpotifyPlaying2ᚖadamᚑfrenchᚗcoᚗukᚋ
return ec._SpotifyPlaying(ctx, sel, v) return ec._SpotifyPlaying(ctx, sel, v)
} }
func (ec *executionContext) marshalOSpotifyRecentItem2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItemᚄ(ctx context.Context, sel ast.SelectionSet, v []*model.SpotifyRecentItem) graphql.Marshaler {
if v == nil {
return graphql.Null
}
ret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler {
fc := graphql.GetFieldContext(ctx)
fc.Result = &v[i]
return ec.marshalNSpotifyRecentItem2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItem(ctx, sel, v[i])
})
for _, e := range ret {
if e == graphql.Null {
return graphql.Null
}
}
return ret
}
func (ec *executionContext) marshalOSpotifyTrack2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyTrack(ctx context.Context, sel ast.SelectionSet, v *model.SpotifyTrack) graphql.Marshaler { func (ec *executionContext) marshalOSpotifyTrack2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyTrack(ctx context.Context, sel ast.SelectionSet, v *model.SpotifyTrack) graphql.Marshaler {
if v == nil { if v == nil {
return graphql.Null return graphql.Null

View File

@@ -392,7 +392,7 @@ func (r *queryResolver) Messages(ctx context.Context) ([]*models.Message, error)
// SpotifyListening is the resolver for the spotifyListening field. // SpotifyListening is the resolver for the spotifyListening field.
func (r *queryResolver) SpotifyListening(ctx context.Context) (*model.SpotifyPlaying, error) { func (r *queryResolver) SpotifyListening(ctx context.Context) (*model.SpotifyPlaying, error) {
if r.Store.SpotifyClient == nil { if r.Store.SpotifyClient == nil {
return nil, fmt.Errorf("Spotify not authenticated") return nil, nil
} }
playing, err := r.Store.SpotifyClient.PlayerCurrentlyPlaying(ctx) playing, err := r.Store.SpotifyClient.PlayerCurrentlyPlaying(ctx)
@@ -411,7 +411,7 @@ func (r *queryResolver) SpotifyListening(ctx context.Context) (*model.SpotifyPla
// SpotifyRecent is the resolver for the spotifyRecent field. // SpotifyRecent is the resolver for the spotifyRecent field.
func (r *queryResolver) SpotifyRecent(ctx context.Context) ([]*model.SpotifyRecentItem, error) { func (r *queryResolver) SpotifyRecent(ctx context.Context) ([]*model.SpotifyRecentItem, error) {
if r.Store.SpotifyClient == nil { if r.Store.SpotifyClient == nil {
return nil, fmt.Errorf("Spotify not authenticated") return []*model.SpotifyRecentItem{}, nil
} }
if r.Store.RecentSongsFresh() { if r.Store.RecentSongsFresh() {

View File

@@ -10,7 +10,7 @@ type Query {
rowingSessions: [Rowing!]! rowingSessions: [Rowing!]!
messages: [Message!]! messages: [Message!]!
spotifyListening: SpotifyPlaying spotifyListening: SpotifyPlaying
spotifyRecent: [SpotifyRecentItem!]! spotifyRecent: [SpotifyRecentItem!]
giteaFeed: GiteaFeedItem giteaFeed: GiteaFeedItem
me: User me: User
} }

1
icecast2/.dockerignore Normal file
View File

@@ -0,0 +1 @@
fallback_music/

View File

@@ -35,7 +35,7 @@ export const useHomeDataStore = defineStore("homeData", () => {
posts.value = data.posts; posts.value = data.posts;
favorites.value = data.favorites; favorites.value = data.favorites;
activities.value = data.activities; activities.value = data.activities;
spotifyRecent.value = data.spotifyRecent; spotifyRecent.value = data.spotifyRecent || [];
rowingSessions.value = data.rowingSessions; rowingSessions.value = data.rowingSessions;
gitFeed.value = data.giteaFeed || null; gitFeed.value = data.giteaFeed || null;
me.value = data.me || null; me.value = data.me || null;