From b96b7d7a93934c40aaac8a8bd3b8ed2d472611c4 Mon Sep 17 00:00:00 2001 From: Adam French Date: Wed, 15 Apr 2026 18:57:23 +0100 Subject: [PATCH] Split schema.graphql and schema.resolvers.go into per-domain files Move Query/Mutation field declarations from the monolithic schema.graphql into each domain's .graphql file using extend type, so gqlgen places resolvers in the matching *.resolvers.go files. Extract helper functions into *_helpers.go files to prevent gqlgen from commenting them out. Co-Authored-By: Claude Opus 4.6 --- backend/graph/activity.resolvers.go | 29 + backend/graph/auth.resolvers.go | 146 + backend/graph/bookmark.resolvers.go | 42 + backend/graph/favorite.resolvers.go | 29 + backend/graph/generated.go | 2694 ++++++++--------- backend/graph/gitea.resolvers.go | 16 +- backend/graph/gitea_helpers.go | 17 + backend/graph/job_app_reference.resolvers.go | 71 + backend/graph/job_application.resolvers.go | 93 + backend/graph/message.resolvers.go | 13 + backend/graph/post.resolvers.go | 96 + backend/graph/rowing.resolvers.go | 13 + backend/graph/schema.resolvers.go | 613 +--- backend/graph/schema/activity.graphql | 8 + backend/graph/schema/auth.graphql | 10 + backend/graph/schema/bookmark.graphql | 9 + backend/graph/schema/favorite.graphql | 8 + backend/graph/schema/gitea.graphql | 4 + .../graph/schema/job_app_reference.graphql | 10 + backend/graph/schema/job_application.graphql | 11 + backend/graph/schema/message.graphql | 4 + backend/graph/schema/post.graphql | 11 + backend/graph/schema/rowing.graphql | 4 + backend/graph/schema/schema.graphql | 43 +- backend/graph/schema/spotify.graphql | 5 + backend/graph/schema/steam.graphql | 4 + backend/graph/schema/user.graphql | 11 + backend/graph/spotify.resolvers.go | 52 +- backend/graph/spotify_helpers.go | 51 + backend/graph/steam.resolvers.go | 20 +- backend/graph/steam_helpers.go | 22 + backend/graph/user.resolvers.go | 96 + 32 files changed, 2184 insertions(+), 2071 deletions(-) create mode 100644 backend/graph/auth.resolvers.go create mode 100644 backend/graph/gitea_helpers.go create mode 100644 backend/graph/spotify_helpers.go create mode 100644 backend/graph/steam_helpers.go diff --git a/backend/graph/activity.resolvers.go b/backend/graph/activity.resolvers.go index 63a13e6..8aeac6a 100644 --- a/backend/graph/activity.resolvers.go +++ b/backend/graph/activity.resolvers.go @@ -7,7 +7,9 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" ) @@ -16,6 +18,33 @@ func (r *activityResolver) ID(ctx context.Context, obj *models.Activity) (int, e return int(obj.ID), nil } +// CreateActivity is the resolver for the createActivity field. +func (r *mutationResolver) CreateActivity(ctx context.Context, input model.CreateActivityInput) (*models.Activity, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + activity := models.Activity{Type: input.Type, Name: input.Name, Link: input.Link} + if err := r.Store.DB.Create(&activity).Error; err != nil { + return nil, err + } + + return &activity, nil +} + +// Activities is the resolver for the activities field. +func (r *queryResolver) Activities(ctx context.Context) ([]*models.Activity, error) { + var activities []models.Activity + if err := r.Store.DB.Order("created_at DESC").Find(&activities).Error; err != nil { + return nil, err + } + result := make([]*models.Activity, len(activities)) + for i := range activities { + result[i] = &activities[i] + } + return result, nil +} + // Activity returns ActivityResolver implementation. func (r *Resolver) Activity() ActivityResolver { return &activityResolver{r} } diff --git a/backend/graph/auth.resolvers.go b/backend/graph/auth.resolvers.go new file mode 100644 index 0000000..90d8a47 --- /dev/null +++ b/backend/graph/auth.resolvers.go @@ -0,0 +1,146 @@ +package graph + +// This file will be automatically regenerated based on the schema, any resolver +// implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.88 + +import ( + "context" + "fmt" + "net/http" + + "adam-french.co.uk/backend/graph/model" + "adam-french.co.uk/backend/models" + "golang.org/x/crypto/bcrypt" +) + +// Login is the resolver for the login field. +func (r *mutationResolver) Login(ctx context.Context, input model.LoginInput) (*model.AuthPayload, error) { + gc := GinContextFromCtx(ctx) + if gc == nil { + return nil, fmt.Errorf("could not get gin context") + } + + if !r.Store.LoginLimiter.Allow(gc.ClientIP()) { + return nil, fmt.Errorf("too many login attempts, please try again later") + } + + var user models.User + if err := r.Store.DB.Where("username = ?", input.Username).First(&user).Error; err != nil { + return nil, fmt.Errorf("invalid credentials") + } + + if err := bcrypt.CompareHashAndPassword(user.Password, []byte(input.Password)); err != nil { + return nil, fmt.Errorf("invalid credentials") + } + + tokens, err := r.Store.Auth.GenerateJWT(&user) + if err != nil { + return nil, fmt.Errorf("failed to generate tokens") + } + + gc.SetSameSite(http.SameSiteLaxMode) + gc.SetCookie( + "access_token", + tokens.AccessToken, + int(r.Store.Auth.Config.AccessTokenLifetime.Seconds()), + "/", + r.Store.Auth.Config.Domain, + true, true, + ) + gc.SetCookie( + "refresh_token", + tokens.RefreshToken, + int(r.Store.Auth.Config.RefreshTokenLifetime.Seconds()), + "/", + r.Store.Auth.Config.Domain, + true, true, + ) + + return &model.AuthPayload{User: &user}, nil +} + +// Logout is the resolver for the logout field. +func (r *mutationResolver) Logout(ctx context.Context) (bool, error) { + gc := GinContextFromCtx(ctx) + if gc == nil { + return false, fmt.Errorf("could not get gin context") + } + + gc.SetSameSite(http.SameSiteLaxMode) + gc.SetCookie("access_token", "", -1, "/", r.Store.Auth.Config.Domain, true, true) + gc.SetCookie("refresh_token", "", -1, "/", r.Store.Auth.Config.Domain, true, true) + + return true, nil +} + +// RefreshToken is the resolver for the refreshToken field. +func (r *mutationResolver) RefreshToken(ctx context.Context) (*model.AuthPayload, error) { + gc := GinContextFromCtx(ctx) + if gc == nil { + return nil, fmt.Errorf("could not get gin context") + } + + refreshToken, err := gc.Cookie("refresh_token") + if err != nil { + return nil, fmt.Errorf("unauthorized") + } + + claims, err := r.Store.Auth.VerifyJWT(refreshToken) + if err != nil { + return nil, fmt.Errorf("unauthorized") + } + + userIDF, ok := (*claims)["id"].(float64) + if !ok { + return nil, fmt.Errorf("invalid token claims") + } + + var user models.User + user.ID = uint(userIDF) + if err := r.Store.DB.First(&user).Error; err != nil { + return nil, fmt.Errorf("user not found") + } + + tokens, err := r.Store.Auth.GenerateJWT(&user) + if err != nil { + return nil, fmt.Errorf("failed to generate tokens") + } + + gc.SetSameSite(http.SameSiteLaxMode) + gc.SetCookie( + "access_token", + tokens.AccessToken, + int(r.Store.Auth.Config.AccessTokenLifetime.Seconds()), + "/", + r.Store.Auth.Config.Domain, + true, true, + ) + gc.SetCookie( + "refresh_token", + tokens.RefreshToken, + int(r.Store.Auth.Config.RefreshTokenLifetime.Seconds()), + "/", + r.Store.Auth.Config.Domain, + true, true, + ) + + return &model.AuthPayload{User: &user}, nil +} + +// Me is the resolver for the me field. +func (r *queryResolver) Me(ctx context.Context) (*models.User, error) { + userID, ok := UserIDFromCtx(ctx) + if !ok { + return nil, fmt.Errorf("unauthorized") + } + + var user models.User + user.ID = userID + if err := r.Store.DB.First(&user).Error; err != nil { + return nil, fmt.Errorf("user not found") + } + + return &user, nil +} diff --git a/backend/graph/bookmark.resolvers.go b/backend/graph/bookmark.resolvers.go index 153d9a3..92c6b00 100644 --- a/backend/graph/bookmark.resolvers.go +++ b/backend/graph/bookmark.resolvers.go @@ -7,7 +7,9 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" ) @@ -16,6 +18,46 @@ func (r *bookmarkResolver) ID(ctx context.Context, obj *models.Bookmark) (int, e return int(obj.ID), nil } +// CreateBookmark is the resolver for the createBookmark field. +func (r *mutationResolver) CreateBookmark(ctx context.Context, input model.CreateBookmarkInput) (*models.Bookmark, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + bookmark := models.Bookmark{Category: input.Category, Name: input.Name, Link: input.Link} + if err := r.Store.DB.Create(&bookmark).Error; err != nil { + return nil, err + } + return &bookmark, nil +} + +// DeleteBookmark is the resolver for the deleteBookmark field. +func (r *mutationResolver) DeleteBookmark(ctx context.Context, id int) (*models.Bookmark, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var bookmark models.Bookmark + if err := r.Store.DB.First(&bookmark, id).Error; err != nil { + return nil, err + } + if err := r.Store.DB.Delete(&bookmark).Error; err != nil { + return nil, err + } + return &bookmark, nil +} + +// Bookmarks is the resolver for the bookmarks field. +func (r *queryResolver) Bookmarks(ctx context.Context) ([]*models.Bookmark, error) { + var bookmarks []models.Bookmark + if err := r.Store.DB.Order("category ASC, created_at ASC").Find(&bookmarks).Error; err != nil { + return nil, err + } + result := make([]*models.Bookmark, len(bookmarks)) + for i := range bookmarks { + result[i] = &bookmarks[i] + } + return result, nil +} + // Bookmark returns BookmarkResolver implementation. func (r *Resolver) Bookmark() BookmarkResolver { return &bookmarkResolver{r} } diff --git a/backend/graph/favorite.resolvers.go b/backend/graph/favorite.resolvers.go index 83b8717..c39fad5 100644 --- a/backend/graph/favorite.resolvers.go +++ b/backend/graph/favorite.resolvers.go @@ -7,7 +7,9 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" ) @@ -16,6 +18,33 @@ func (r *favoriteResolver) ID(ctx context.Context, obj *models.Favorite) (int, e return int(obj.ID), nil } +// CreateFavorite is the resolver for the createFavorite field. +func (r *mutationResolver) CreateFavorite(ctx context.Context, input model.CreateFavoriteInput) (*models.Favorite, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + favorite := models.Favorite{Type: input.Type, Name: input.Name, Link: input.Link} + if err := r.Store.DB.Create(&favorite).Error; err != nil { + return nil, err + } + + return &favorite, nil +} + +// Favorites is the resolver for the favorites field. +func (r *queryResolver) Favorites(ctx context.Context) ([]*models.Favorite, error) { + var favorites []models.Favorite + if err := r.Store.DB.Order("created_at DESC").Find(&favorites).Error; err != nil { + return nil, err + } + result := make([]*models.Favorite, len(favorites)) + for i := range favorites { + result[i] = &favorites[i] + } + return result, nil +} + // Favorite returns FavoriteResolver implementation. func (r *Resolver) Favorite() FavoriteResolver { return &favoriteResolver{r} } diff --git a/backend/graph/generated.go b/backend/graph/generated.go index 10e4865..f8a0227 100644 --- a/backend/graph/generated.go +++ b/backend/graph/generated.go @@ -251,47 +251,47 @@ type MessageResolver interface { AuthorID(ctx context.Context, obj *models.Message) (int, error) } type MutationResolver interface { + CreateActivity(ctx context.Context, input model.CreateActivityInput) (*models.Activity, error) Login(ctx context.Context, input model.LoginInput) (*model.AuthPayload, error) Logout(ctx context.Context) (bool, error) RefreshToken(ctx context.Context) (*model.AuthPayload, error) + CreateBookmark(ctx context.Context, input model.CreateBookmarkInput) (*models.Bookmark, error) + DeleteBookmark(ctx context.Context, id int) (*models.Bookmark, error) + CreateFavorite(ctx context.Context, input model.CreateFavoriteInput) (*models.Favorite, error) + CreateJobAppReference(ctx context.Context, input model.CreateJobAppReferenceInput) (*models.JobAppReference, error) + UpdateJobAppReference(ctx context.Context, id int, input model.UpdateJobAppReferenceInput) (*models.JobAppReference, error) + DeleteJobAppReference(ctx context.Context, id int) (bool, error) + CreateJobApplication(ctx context.Context, input model.CreateJobApplicationInput) (*models.JobApplication, error) + UpdateJobApplication(ctx context.Context, id int, input model.UpdateJobApplicationInput) (*models.JobApplication, error) + DeleteJobApplication(ctx context.Context, id int) (bool, error) CreatePost(ctx context.Context, input model.CreatePostInput) (*models.Post, error) UpdatePost(ctx context.Context, id int, input model.UpdatePostInput) (*models.Post, error) DeletePost(ctx context.Context, id int) (*models.Post, error) CreateUser(ctx context.Context, input model.CreateUserInput) (*models.User, error) DeleteUser(ctx context.Context, id int) (*models.User, error) SetUserAdmin(ctx context.Context, id int, admin bool) (*models.User, error) - CreateFavorite(ctx context.Context, input model.CreateFavoriteInput) (*models.Favorite, error) - CreateActivity(ctx context.Context, input model.CreateActivityInput) (*models.Activity, error) - CreateJobApplication(ctx context.Context, input model.CreateJobApplicationInput) (*models.JobApplication, error) - UpdateJobApplication(ctx context.Context, id int, input model.UpdateJobApplicationInput) (*models.JobApplication, error) - CreateBookmark(ctx context.Context, input model.CreateBookmarkInput) (*models.Bookmark, error) - DeleteBookmark(ctx context.Context, id int) (*models.Bookmark, error) - DeleteJobApplication(ctx context.Context, id int) (bool, error) - CreateJobAppReference(ctx context.Context, input model.CreateJobAppReferenceInput) (*models.JobAppReference, error) - UpdateJobAppReference(ctx context.Context, id int, input model.UpdateJobAppReferenceInput) (*models.JobAppReference, error) - DeleteJobAppReference(ctx context.Context, id int) (bool, error) } type PostResolver interface { ID(ctx context.Context, obj *models.Post) (int, error) } type QueryResolver interface { - Users(ctx context.Context) ([]*models.User, error) - User(ctx context.Context, id int) (*models.User, error) - Posts(ctx context.Context) ([]*models.Post, error) - Post(ctx context.Context, id int) (*models.Post, error) Activities(ctx context.Context) ([]*models.Activity, error) - Favorites(ctx context.Context) ([]*models.Favorite, error) - RowingSessions(ctx context.Context) ([]*models.Rowing, error) - Messages(ctx context.Context) ([]*models.Message, error) - SpotifyListening(ctx context.Context) (*model.SpotifyPlaying, error) - SpotifyRecent(ctx context.Context) ([]*model.SpotifyRecentItem, error) - GiteaFeed(ctx context.Context) (*model.GiteaFeedItem, error) - SteamStatus(ctx context.Context) (*model.SteamStatus, error) Me(ctx context.Context) (*models.User, error) Bookmarks(ctx context.Context) ([]*models.Bookmark, error) + Favorites(ctx context.Context) ([]*models.Favorite, error) + GiteaFeed(ctx context.Context) (*model.GiteaFeedItem, error) + JobAppReferences(ctx context.Context) ([]*models.JobAppReference, error) JobApplications(ctx context.Context) ([]*models.JobApplication, error) JobApplication(ctx context.Context, id int) (*models.JobApplication, error) - JobAppReferences(ctx context.Context) ([]*models.JobAppReference, error) + Messages(ctx context.Context) ([]*models.Message, error) + Posts(ctx context.Context) ([]*models.Post, error) + Post(ctx context.Context, id int) (*models.Post, error) + RowingSessions(ctx context.Context) ([]*models.Rowing, error) + SpotifyListening(ctx context.Context) (*model.SpotifyPlaying, error) + SpotifyRecent(ctx context.Context) ([]*model.SpotifyRecentItem, error) + SteamStatus(ctx context.Context) (*model.SteamStatus, error) + Users(ctx context.Context) ([]*models.User, error) + User(ctx context.Context, id int) (*models.User, error) } type RowingResolver interface { ID(ctx context.Context, obj *models.Rowing) (int, error) @@ -2957,6 +2957,61 @@ func (ec *executionContext) fieldContext_Message_createdAt(_ context.Context, fi return fc, nil } +func (ec *executionContext) _Mutation_createActivity(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_createActivity, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().CreateActivity(ctx, fc.Args["input"].(model.CreateActivityInput)) + }, + nil, + ec.marshalNActivity2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐActivity, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_createActivity(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Activity_id(ctx, field) + case "createdAt": + return ec.fieldContext_Activity_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Activity_updatedAt(ctx, field) + case "type": + return ec.fieldContext_Activity_type(ctx, field) + case "name": + return ec.fieldContext_Activity_name(ctx, field) + case "link": + return ec.fieldContext_Activity_link(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Activity", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_createActivity_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Mutation_login(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -3064,6 +3119,493 @@ func (ec *executionContext) fieldContext_Mutation_refreshToken(_ context.Context return fc, nil } +func (ec *executionContext) _Mutation_createBookmark(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_createBookmark, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().CreateBookmark(ctx, fc.Args["input"].(model.CreateBookmarkInput)) + }, + nil, + ec.marshalNBookmark2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐBookmark, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_createBookmark(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Bookmark_id(ctx, field) + case "createdAt": + return ec.fieldContext_Bookmark_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Bookmark_updatedAt(ctx, field) + case "category": + return ec.fieldContext_Bookmark_category(ctx, field) + case "name": + return ec.fieldContext_Bookmark_name(ctx, field) + case "link": + return ec.fieldContext_Bookmark_link(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Bookmark", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_createBookmark_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_deleteBookmark(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_deleteBookmark, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().DeleteBookmark(ctx, fc.Args["id"].(int)) + }, + nil, + ec.marshalNBookmark2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐBookmark, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_deleteBookmark(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Bookmark_id(ctx, field) + case "createdAt": + return ec.fieldContext_Bookmark_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Bookmark_updatedAt(ctx, field) + case "category": + return ec.fieldContext_Bookmark_category(ctx, field) + case "name": + return ec.fieldContext_Bookmark_name(ctx, field) + case "link": + return ec.fieldContext_Bookmark_link(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Bookmark", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_deleteBookmark_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_createFavorite(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_createFavorite, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().CreateFavorite(ctx, fc.Args["input"].(model.CreateFavoriteInput)) + }, + nil, + ec.marshalNFavorite2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐFavorite, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_createFavorite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Favorite_id(ctx, field) + case "createdAt": + return ec.fieldContext_Favorite_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Favorite_updatedAt(ctx, field) + case "type": + return ec.fieldContext_Favorite_type(ctx, field) + case "name": + return ec.fieldContext_Favorite_name(ctx, field) + case "link": + return ec.fieldContext_Favorite_link(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Favorite", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_createFavorite_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_createJobAppReference(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_createJobAppReference, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().CreateJobAppReference(ctx, fc.Args["input"].(model.CreateJobAppReferenceInput)) + }, + nil, + ec.marshalNJobAppReference2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobAppReference, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_createJobAppReference(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_JobAppReference_id(ctx, field) + case "createdAt": + return ec.fieldContext_JobAppReference_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_JobAppReference_updatedAt(ctx, field) + case "category": + return ec.fieldContext_JobAppReference_category(ctx, field) + case "label": + return ec.fieldContext_JobAppReference_label(ctx, field) + case "value": + return ec.fieldContext_JobAppReference_value(ctx, field) + case "sortOrder": + return ec.fieldContext_JobAppReference_sortOrder(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type JobAppReference", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_createJobAppReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_updateJobAppReference(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_updateJobAppReference, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().UpdateJobAppReference(ctx, fc.Args["id"].(int), fc.Args["input"].(model.UpdateJobAppReferenceInput)) + }, + nil, + ec.marshalNJobAppReference2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobAppReference, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_updateJobAppReference(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_JobAppReference_id(ctx, field) + case "createdAt": + return ec.fieldContext_JobAppReference_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_JobAppReference_updatedAt(ctx, field) + case "category": + return ec.fieldContext_JobAppReference_category(ctx, field) + case "label": + return ec.fieldContext_JobAppReference_label(ctx, field) + case "value": + return ec.fieldContext_JobAppReference_value(ctx, field) + case "sortOrder": + return ec.fieldContext_JobAppReference_sortOrder(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type JobAppReference", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_updateJobAppReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_deleteJobAppReference(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_deleteJobAppReference, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().DeleteJobAppReference(ctx, fc.Args["id"].(int)) + }, + nil, + ec.marshalNBoolean2bool, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_deleteJobAppReference(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_deleteJobAppReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_createJobApplication(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_createJobApplication, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().CreateJobApplication(ctx, fc.Args["input"].(model.CreateJobApplicationInput)) + }, + nil, + ec.marshalNJobApplication2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobApplication, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_createJobApplication(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_JobApplication_id(ctx, field) + case "createdAt": + return ec.fieldContext_JobApplication_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_JobApplication_updatedAt(ctx, field) + case "jobTitle": + return ec.fieldContext_JobApplication_jobTitle(ctx, field) + case "company": + return ec.fieldContext_JobApplication_company(ctx, field) + case "location": + return ec.fieldContext_JobApplication_location(ctx, field) + case "url": + return ec.fieldContext_JobApplication_url(ctx, field) + case "status": + return ec.fieldContext_JobApplication_status(ctx, field) + case "notes": + return ec.fieldContext_JobApplication_notes(ctx, field) + case "appliedAt": + return ec.fieldContext_JobApplication_appliedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type JobApplication", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_createJobApplication_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_updateJobApplication(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_updateJobApplication, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().UpdateJobApplication(ctx, fc.Args["id"].(int), fc.Args["input"].(model.UpdateJobApplicationInput)) + }, + nil, + ec.marshalNJobApplication2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobApplication, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_updateJobApplication(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_JobApplication_id(ctx, field) + case "createdAt": + return ec.fieldContext_JobApplication_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_JobApplication_updatedAt(ctx, field) + case "jobTitle": + return ec.fieldContext_JobApplication_jobTitle(ctx, field) + case "company": + return ec.fieldContext_JobApplication_company(ctx, field) + case "location": + return ec.fieldContext_JobApplication_location(ctx, field) + case "url": + return ec.fieldContext_JobApplication_url(ctx, field) + case "status": + return ec.fieldContext_JobApplication_status(ctx, field) + case "notes": + return ec.fieldContext_JobApplication_notes(ctx, field) + case "appliedAt": + return ec.fieldContext_JobApplication_appliedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type JobApplication", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_updateJobApplication_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_deleteJobApplication(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_deleteJobApplication, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().DeleteJobApplication(ctx, fc.Args["id"].(int)) + }, + nil, + ec.marshalNBoolean2bool, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_deleteJobApplication(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_deleteJobApplication_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Mutation_createPost(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -3388,548 +3930,6 @@ func (ec *executionContext) fieldContext_Mutation_setUserAdmin(ctx context.Conte return fc, nil } -func (ec *executionContext) _Mutation_createFavorite(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_createFavorite, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().CreateFavorite(ctx, fc.Args["input"].(model.CreateFavoriteInput)) - }, - nil, - ec.marshalNFavorite2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐFavorite, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_createFavorite(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Favorite_id(ctx, field) - case "createdAt": - return ec.fieldContext_Favorite_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Favorite_updatedAt(ctx, field) - case "type": - return ec.fieldContext_Favorite_type(ctx, field) - case "name": - return ec.fieldContext_Favorite_name(ctx, field) - case "link": - return ec.fieldContext_Favorite_link(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Favorite", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_createFavorite_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_createActivity(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_createActivity, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().CreateActivity(ctx, fc.Args["input"].(model.CreateActivityInput)) - }, - nil, - ec.marshalNActivity2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐActivity, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_createActivity(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Activity_id(ctx, field) - case "createdAt": - return ec.fieldContext_Activity_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Activity_updatedAt(ctx, field) - case "type": - return ec.fieldContext_Activity_type(ctx, field) - case "name": - return ec.fieldContext_Activity_name(ctx, field) - case "link": - return ec.fieldContext_Activity_link(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Activity", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_createActivity_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_createJobApplication(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_createJobApplication, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().CreateJobApplication(ctx, fc.Args["input"].(model.CreateJobApplicationInput)) - }, - nil, - ec.marshalNJobApplication2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobApplication, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_createJobApplication(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_JobApplication_id(ctx, field) - case "createdAt": - return ec.fieldContext_JobApplication_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_JobApplication_updatedAt(ctx, field) - case "jobTitle": - return ec.fieldContext_JobApplication_jobTitle(ctx, field) - case "company": - return ec.fieldContext_JobApplication_company(ctx, field) - case "location": - return ec.fieldContext_JobApplication_location(ctx, field) - case "url": - return ec.fieldContext_JobApplication_url(ctx, field) - case "status": - return ec.fieldContext_JobApplication_status(ctx, field) - case "notes": - return ec.fieldContext_JobApplication_notes(ctx, field) - case "appliedAt": - return ec.fieldContext_JobApplication_appliedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type JobApplication", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_createJobApplication_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_updateJobApplication(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_updateJobApplication, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().UpdateJobApplication(ctx, fc.Args["id"].(int), fc.Args["input"].(model.UpdateJobApplicationInput)) - }, - nil, - ec.marshalNJobApplication2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobApplication, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_updateJobApplication(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_JobApplication_id(ctx, field) - case "createdAt": - return ec.fieldContext_JobApplication_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_JobApplication_updatedAt(ctx, field) - case "jobTitle": - return ec.fieldContext_JobApplication_jobTitle(ctx, field) - case "company": - return ec.fieldContext_JobApplication_company(ctx, field) - case "location": - return ec.fieldContext_JobApplication_location(ctx, field) - case "url": - return ec.fieldContext_JobApplication_url(ctx, field) - case "status": - return ec.fieldContext_JobApplication_status(ctx, field) - case "notes": - return ec.fieldContext_JobApplication_notes(ctx, field) - case "appliedAt": - return ec.fieldContext_JobApplication_appliedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type JobApplication", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_updateJobApplication_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_createBookmark(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_createBookmark, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().CreateBookmark(ctx, fc.Args["input"].(model.CreateBookmarkInput)) - }, - nil, - ec.marshalNBookmark2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐBookmark, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_createBookmark(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Bookmark_id(ctx, field) - case "createdAt": - return ec.fieldContext_Bookmark_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Bookmark_updatedAt(ctx, field) - case "category": - return ec.fieldContext_Bookmark_category(ctx, field) - case "name": - return ec.fieldContext_Bookmark_name(ctx, field) - case "link": - return ec.fieldContext_Bookmark_link(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Bookmark", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_createBookmark_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_deleteBookmark(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_deleteBookmark, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().DeleteBookmark(ctx, fc.Args["id"].(int)) - }, - nil, - ec.marshalNBookmark2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐBookmark, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_deleteBookmark(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Bookmark_id(ctx, field) - case "createdAt": - return ec.fieldContext_Bookmark_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Bookmark_updatedAt(ctx, field) - case "category": - return ec.fieldContext_Bookmark_category(ctx, field) - case "name": - return ec.fieldContext_Bookmark_name(ctx, field) - case "link": - return ec.fieldContext_Bookmark_link(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Bookmark", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_deleteBookmark_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_deleteJobApplication(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_deleteJobApplication, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().DeleteJobApplication(ctx, fc.Args["id"].(int)) - }, - nil, - ec.marshalNBoolean2bool, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_deleteJobApplication(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_deleteJobApplication_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_createJobAppReference(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_createJobAppReference, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().CreateJobAppReference(ctx, fc.Args["input"].(model.CreateJobAppReferenceInput)) - }, - nil, - ec.marshalNJobAppReference2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobAppReference, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_createJobAppReference(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_JobAppReference_id(ctx, field) - case "createdAt": - return ec.fieldContext_JobAppReference_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_JobAppReference_updatedAt(ctx, field) - case "category": - return ec.fieldContext_JobAppReference_category(ctx, field) - case "label": - return ec.fieldContext_JobAppReference_label(ctx, field) - case "value": - return ec.fieldContext_JobAppReference_value(ctx, field) - case "sortOrder": - return ec.fieldContext_JobAppReference_sortOrder(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type JobAppReference", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_createJobAppReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_updateJobAppReference(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_updateJobAppReference, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().UpdateJobAppReference(ctx, fc.Args["id"].(int), fc.Args["input"].(model.UpdateJobAppReferenceInput)) - }, - nil, - ec.marshalNJobAppReference2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobAppReference, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_updateJobAppReference(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_JobAppReference_id(ctx, field) - case "createdAt": - return ec.fieldContext_JobAppReference_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_JobAppReference_updatedAt(ctx, field) - case "category": - return ec.fieldContext_JobAppReference_category(ctx, field) - case "label": - return ec.fieldContext_JobAppReference_label(ctx, field) - case "value": - return ec.fieldContext_JobAppReference_value(ctx, field) - case "sortOrder": - return ec.fieldContext_JobAppReference_sortOrder(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type JobAppReference", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_updateJobAppReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Mutation_deleteJobAppReference(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Mutation_deleteJobAppReference, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Mutation().DeleteJobAppReference(ctx, fc.Args["id"].(int)) - }, - nil, - ec.marshalNBoolean2bool, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Mutation_deleteJobAppReference(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Mutation", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - return nil, errors.New("field of type Boolean does not have child fields") - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Mutation_deleteJobAppReference_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - func (ec *executionContext) _Post_id(ctx context.Context, field graphql.CollectedField, obj *models.Post) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -4116,198 +4116,6 @@ func (ec *executionContext) fieldContext_Post_content(_ context.Context, field g return fc, nil } -func (ec *executionContext) _Query_users(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_users, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().Users(ctx) - }, - nil, - ec.marshalNUser2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐUserᚄ, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Query_users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "createdAt": - return ec.fieldContext_User_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_User_updatedAt(ctx, field) - case "username": - return ec.fieldContext_User_username(ctx, field) - case "admin": - return ec.fieldContext_User_admin(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_user, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Query().User(ctx, fc.Args["id"].(int)) - }, - nil, - ec.marshalOUser2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐUser, - true, - false, - ) -} - -func (ec *executionContext) fieldContext_Query_user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_User_id(ctx, field) - case "createdAt": - return ec.fieldContext_User_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_User_updatedAt(ctx, field) - case "username": - return ec.fieldContext_User_username(ctx, field) - case "admin": - return ec.fieldContext_User_admin(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type User", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - -func (ec *executionContext) _Query_posts(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_posts, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().Posts(ctx) - }, - nil, - ec.marshalNPost2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐPostᚄ, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Query_posts(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Post_id(ctx, field) - case "createdAt": - return ec.fieldContext_Post_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Post_updatedAt(ctx, field) - case "title": - return ec.fieldContext_Post_title(ctx, field) - case "author": - return ec.fieldContext_Post_author(ctx, field) - case "content": - return ec.fieldContext_Post_content(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Post", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_post(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_post, - func(ctx context.Context) (any, error) { - fc := graphql.GetFieldContext(ctx) - return ec.Resolvers.Query().Post(ctx, fc.Args["id"].(int)) - }, - nil, - ec.marshalOPost2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐPost, - true, - false, - ) -} - -func (ec *executionContext) fieldContext_Query_post(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Post_id(ctx, field) - case "createdAt": - return ec.fieldContext_Post_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Post_updatedAt(ctx, field) - case "title": - return ec.fieldContext_Post_title(ctx, field) - case "author": - return ec.fieldContext_Post_author(ctx, field) - case "content": - return ec.fieldContext_Post_content(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Post", field.Name) - }, - } - defer func() { - if r := recover(); r != nil { - err = ec.Recover(ctx, r) - ec.Error(ctx, err) - } - }() - ctx = graphql.WithFieldContext(ctx, fc) - if fc.Args, err = ec.field_Query_post_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { - ec.Error(ctx, err) - return fc, err - } - return fc, nil -} - func (ec *executionContext) _Query_activities(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -4351,283 +4159,6 @@ func (ec *executionContext) fieldContext_Query_activities(_ context.Context, fie return fc, nil } -func (ec *executionContext) _Query_favorites(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_favorites, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().Favorites(ctx) - }, - nil, - ec.marshalNFavorite2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐFavoriteᚄ, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Query_favorites(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Favorite_id(ctx, field) - case "createdAt": - return ec.fieldContext_Favorite_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_Favorite_updatedAt(ctx, field) - case "type": - return ec.fieldContext_Favorite_type(ctx, field) - case "name": - return ec.fieldContext_Favorite_name(ctx, field) - case "link": - return ec.fieldContext_Favorite_link(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Favorite", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_rowingSessions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_rowingSessions, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().RowingSessions(ctx) - }, - nil, - ec.marshalNRowing2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐRowingᚄ, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Query_rowingSessions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Rowing_id(ctx, field) - case "createdAt": - return ec.fieldContext_Rowing_createdAt(ctx, field) - case "date": - return ec.fieldContext_Rowing_date(ctx, field) - case "time": - return ec.fieldContext_Rowing_time(ctx, field) - case "distance": - return ec.fieldContext_Rowing_distance(ctx, field) - case "timePer500m": - return ec.fieldContext_Rowing_timePer500m(ctx, field) - case "calories": - return ec.fieldContext_Rowing_calories(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Rowing", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_messages(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_messages, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().Messages(ctx) - }, - nil, - ec.marshalNMessage2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐMessageᚄ, - true, - true, - ) -} - -func (ec *executionContext) fieldContext_Query_messages(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "id": - return ec.fieldContext_Message_id(ctx, field) - case "content": - return ec.fieldContext_Message_content(ctx, field) - case "authorId": - return ec.fieldContext_Message_authorId(ctx, field) - case "fileUrl": - return ec.fieldContext_Message_fileUrl(ctx, field) - case "createdAt": - return ec.fieldContext_Message_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type Message", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_spotifyListening(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_spotifyListening, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().SpotifyListening(ctx) - }, - nil, - ec.marshalOSpotifyPlaying2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyPlaying, - true, - false, - ) -} - -func (ec *executionContext) fieldContext_Query_spotifyListening(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "playing": - return ec.fieldContext_SpotifyPlaying_playing(ctx, field) - case "track": - return ec.fieldContext_SpotifyPlaying_track(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type SpotifyPlaying", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_spotifyRecent(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_spotifyRecent, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().SpotifyRecent(ctx) - }, - nil, - ec.marshalOSpotifyRecentItem2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItemᚄ, - true, - false, - ) -} - -func (ec *executionContext) fieldContext_Query_spotifyRecent(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "track": - return ec.fieldContext_SpotifyRecentItem_track(ctx, field) - case "playedAt": - return ec.fieldContext_SpotifyRecentItem_playedAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type SpotifyRecentItem", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_giteaFeed(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_giteaFeed, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().GiteaFeed(ctx) - }, - nil, - ec.marshalOGiteaFeedItem2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐGiteaFeedItem, - true, - false, - ) -} - -func (ec *executionContext) fieldContext_Query_giteaFeed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "avatarUrl": - return ec.fieldContext_GiteaFeedItem_avatarUrl(ctx, field) - case "repoUrl": - return ec.fieldContext_GiteaFeedItem_repoUrl(ctx, field) - case "repoName": - return ec.fieldContext_GiteaFeedItem_repoName(ctx, field) - case "opType": - return ec.fieldContext_GiteaFeedItem_opType(ctx, field) - case "commitMessage": - return ec.fieldContext_GiteaFeedItem_commitMessage(ctx, field) - case "createdAt": - return ec.fieldContext_GiteaFeedItem_createdAt(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type GiteaFeedItem", field.Name) - }, - } - return fc, nil -} - -func (ec *executionContext) _Query_steamStatus(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { - return graphql.ResolveField( - ctx, - ec.OperationContext, - field, - ec.fieldContext_Query_steamStatus, - func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().SteamStatus(ctx) - }, - nil, - ec.marshalOSteamStatus2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSteamStatus, - true, - false, - ) -} - -func (ec *executionContext) fieldContext_Query_steamStatus(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { - fc = &graphql.FieldContext{ - Object: "Query", - Field: field, - IsMethod: true, - IsResolver: true, - Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { - switch field.Name { - case "online": - return ec.fieldContext_SteamStatus_online(ctx, field) - case "recentGames": - return ec.fieldContext_SteamStatus_recentGames(ctx, field) - } - return nil, fmt.Errorf("no field named %q was found under type SteamStatus", field.Name) - }, - } - return fc, nil -} - func (ec *executionContext) _Query_me(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -4712,6 +4243,137 @@ func (ec *executionContext) fieldContext_Query_bookmarks(_ context.Context, fiel return fc, nil } +func (ec *executionContext) _Query_favorites(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_favorites, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().Favorites(ctx) + }, + nil, + ec.marshalNFavorite2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐFavoriteᚄ, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Query_favorites(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Favorite_id(ctx, field) + case "createdAt": + return ec.fieldContext_Favorite_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Favorite_updatedAt(ctx, field) + case "type": + return ec.fieldContext_Favorite_type(ctx, field) + case "name": + return ec.fieldContext_Favorite_name(ctx, field) + case "link": + return ec.fieldContext_Favorite_link(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Favorite", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_giteaFeed(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_giteaFeed, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().GiteaFeed(ctx) + }, + nil, + ec.marshalOGiteaFeedItem2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐGiteaFeedItem, + true, + false, + ) +} + +func (ec *executionContext) fieldContext_Query_giteaFeed(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "avatarUrl": + return ec.fieldContext_GiteaFeedItem_avatarUrl(ctx, field) + case "repoUrl": + return ec.fieldContext_GiteaFeedItem_repoUrl(ctx, field) + case "repoName": + return ec.fieldContext_GiteaFeedItem_repoName(ctx, field) + case "opType": + return ec.fieldContext_GiteaFeedItem_opType(ctx, field) + case "commitMessage": + return ec.fieldContext_GiteaFeedItem_commitMessage(ctx, field) + case "createdAt": + return ec.fieldContext_GiteaFeedItem_createdAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type GiteaFeedItem", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_jobAppReferences(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_jobAppReferences, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().JobAppReferences(ctx) + }, + nil, + ec.marshalNJobAppReference2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobAppReferenceᚄ, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Query_jobAppReferences(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_JobAppReference_id(ctx, field) + case "createdAt": + return ec.fieldContext_JobAppReference_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_JobAppReference_updatedAt(ctx, field) + case "category": + return ec.fieldContext_JobAppReference_category(ctx, field) + case "label": + return ec.fieldContext_JobAppReference_label(ctx, field) + case "value": + return ec.fieldContext_JobAppReference_value(ctx, field) + case "sortOrder": + return ec.fieldContext_JobAppReference_sortOrder(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type JobAppReference", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _Query_jobApplications(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -4826,23 +4488,23 @@ func (ec *executionContext) fieldContext_Query_jobApplication(ctx context.Contex return fc, nil } -func (ec *executionContext) _Query_jobAppReferences(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { +func (ec *executionContext) _Query_messages(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, ec.OperationContext, field, - ec.fieldContext_Query_jobAppReferences, + ec.fieldContext_Query_messages, func(ctx context.Context) (any, error) { - return ec.Resolvers.Query().JobAppReferences(ctx) + return ec.Resolvers.Query().Messages(ctx) }, nil, - ec.marshalNJobAppReference2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐJobAppReferenceᚄ, + ec.marshalNMessage2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐMessageᚄ, true, true, ) } -func (ec *executionContext) fieldContext_Query_jobAppReferences(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { +func (ec *executionContext) fieldContext_Query_messages(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { fc = &graphql.FieldContext{ Object: "Query", Field: field, @@ -4851,26 +4513,364 @@ func (ec *executionContext) fieldContext_Query_jobAppReferences(_ context.Contex Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { switch field.Name { case "id": - return ec.fieldContext_JobAppReference_id(ctx, field) + return ec.fieldContext_Message_id(ctx, field) + case "content": + return ec.fieldContext_Message_content(ctx, field) + case "authorId": + return ec.fieldContext_Message_authorId(ctx, field) + case "fileUrl": + return ec.fieldContext_Message_fileUrl(ctx, field) case "createdAt": - return ec.fieldContext_JobAppReference_createdAt(ctx, field) - case "updatedAt": - return ec.fieldContext_JobAppReference_updatedAt(ctx, field) - case "category": - return ec.fieldContext_JobAppReference_category(ctx, field) - case "label": - return ec.fieldContext_JobAppReference_label(ctx, field) - case "value": - return ec.fieldContext_JobAppReference_value(ctx, field) - case "sortOrder": - return ec.fieldContext_JobAppReference_sortOrder(ctx, field) + return ec.fieldContext_Message_createdAt(ctx, field) } - return nil, fmt.Errorf("no field named %q was found under type JobAppReference", field.Name) + return nil, fmt.Errorf("no field named %q was found under type Message", field.Name) }, } return fc, nil } +func (ec *executionContext) _Query_posts(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_posts, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().Posts(ctx) + }, + nil, + ec.marshalNPost2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐPostᚄ, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Query_posts(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Post_id(ctx, field) + case "createdAt": + return ec.fieldContext_Post_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Post_updatedAt(ctx, field) + case "title": + return ec.fieldContext_Post_title(ctx, field) + case "author": + return ec.fieldContext_Post_author(ctx, field) + case "content": + return ec.fieldContext_Post_content(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Post", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_post(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_post, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Query().Post(ctx, fc.Args["id"].(int)) + }, + nil, + ec.marshalOPost2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐPost, + true, + false, + ) +} + +func (ec *executionContext) fieldContext_Query_post(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Post_id(ctx, field) + case "createdAt": + return ec.fieldContext_Post_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_Post_updatedAt(ctx, field) + case "title": + return ec.fieldContext_Post_title(ctx, field) + case "author": + return ec.fieldContext_Post_author(ctx, field) + case "content": + return ec.fieldContext_Post_content(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Post", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_post_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query_rowingSessions(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_rowingSessions, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().RowingSessions(ctx) + }, + nil, + ec.marshalNRowing2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐRowingᚄ, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Query_rowingSessions(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Rowing_id(ctx, field) + case "createdAt": + return ec.fieldContext_Rowing_createdAt(ctx, field) + case "date": + return ec.fieldContext_Rowing_date(ctx, field) + case "time": + return ec.fieldContext_Rowing_time(ctx, field) + case "distance": + return ec.fieldContext_Rowing_distance(ctx, field) + case "timePer500m": + return ec.fieldContext_Rowing_timePer500m(ctx, field) + case "calories": + return ec.fieldContext_Rowing_calories(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Rowing", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_spotifyListening(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_spotifyListening, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().SpotifyListening(ctx) + }, + nil, + ec.marshalOSpotifyPlaying2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyPlaying, + true, + false, + ) +} + +func (ec *executionContext) fieldContext_Query_spotifyListening(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "playing": + return ec.fieldContext_SpotifyPlaying_playing(ctx, field) + case "track": + return ec.fieldContext_SpotifyPlaying_track(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type SpotifyPlaying", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_spotifyRecent(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_spotifyRecent, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().SpotifyRecent(ctx) + }, + nil, + ec.marshalOSpotifyRecentItem2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSpotifyRecentItemᚄ, + true, + false, + ) +} + +func (ec *executionContext) fieldContext_Query_spotifyRecent(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "track": + return ec.fieldContext_SpotifyRecentItem_track(ctx, field) + case "playedAt": + return ec.fieldContext_SpotifyRecentItem_playedAt(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type SpotifyRecentItem", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_steamStatus(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_steamStatus, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().SteamStatus(ctx) + }, + nil, + ec.marshalOSteamStatus2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋgraphᚋmodelᚐSteamStatus, + true, + false, + ) +} + +func (ec *executionContext) fieldContext_Query_steamStatus(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "online": + return ec.fieldContext_SteamStatus_online(ctx, field) + case "recentGames": + return ec.fieldContext_SteamStatus_recentGames(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type SteamStatus", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_users(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_users, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Query().Users(ctx) + }, + nil, + ec.marshalNUser2ᚕᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐUserᚄ, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Query_users(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_User_id(ctx, field) + case "createdAt": + return ec.fieldContext_User_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_User_updatedAt(ctx, field) + case "username": + return ec.fieldContext_User_username(ctx, field) + case "admin": + return ec.fieldContext_User_admin(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _Query_user(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Query_user, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Query().User(ctx, fc.Args["id"].(int)) + }, + nil, + ec.marshalOUser2ᚖadamᚑfrenchᚗcoᚗukᚋbackendᚋmodelsᚐUser, + true, + false, + ) +} + +func (ec *executionContext) fieldContext_Query_user(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_User_id(ctx, field) + case "createdAt": + return ec.fieldContext_User_createdAt(ctx, field) + case "updatedAt": + return ec.fieldContext_User_updatedAt(ctx, field) + case "username": + return ec.fieldContext_User_username(ctx, field) + case "admin": + return ec.fieldContext_User_admin(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type User", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_user_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -8593,6 +8593,13 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Mutation") + case "createActivity": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_createActivity(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "login": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_login(ctx, field) @@ -8614,6 +8621,69 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { out.Invalids++ } + case "createBookmark": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_createBookmark(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deleteBookmark": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_deleteBookmark(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "createFavorite": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_createFavorite(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "createJobAppReference": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_createJobAppReference(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "updateJobAppReference": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_updateJobAppReference(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deleteJobAppReference": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_deleteJobAppReference(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "createJobApplication": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_createJobApplication(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "updateJobApplication": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_updateJobApplication(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deleteJobApplication": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_deleteJobApplication(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } case "createPost": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { return ec._Mutation_createPost(ctx, field) @@ -8656,76 +8726,6 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { out.Invalids++ } - case "createFavorite": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_createFavorite(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "createActivity": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_createActivity(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "createJobApplication": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_createJobApplication(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "updateJobApplication": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_updateJobApplication(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "createBookmark": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_createBookmark(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "deleteBookmark": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_deleteBookmark(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "deleteJobApplication": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_deleteJobApplication(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "createJobAppReference": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_createJobAppReference(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "updateJobAppReference": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_updateJobAppReference(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } - case "deleteJobAppReference": - out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { - return ec._Mutation_deleteJobAppReference(ctx, field) - }) - if out.Values[i] == graphql.Null { - out.Invalids++ - } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -8860,88 +8860,6 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr switch field.Name { case "__typename": out.Values[i] = graphql.MarshalString("Query") - case "users": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_users(ctx, field) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "user": - field := field - - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_user(ctx, field) - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "posts": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_posts(ctx, field) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "post": - field := field - - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_post(ctx, field) - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "activities": field := field @@ -8963,148 +8881,6 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "favorites": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_favorites(ctx, field) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "rowingSessions": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_rowingSessions(ctx, field) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "messages": - field := field - - innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_messages(ctx, field) - if res == graphql.Null { - atomic.AddUint32(&fs.Invalids, 1) - } - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "spotifyListening": - field := field - - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_spotifyListening(ctx, field) - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "spotifyRecent": - field := field - - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_spotifyRecent(ctx, field) - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "giteaFeed": - field := field - - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_giteaFeed(ctx, field) - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "steamStatus": - field := field - - innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { - defer func() { - if r := recover(); r != nil { - ec.Error(ctx, ec.Recover(ctx, r)) - } - }() - res = ec._Query_steamStatus(ctx, field) - return res - } - - rrm := func(ctx context.Context) graphql.Marshaler { - return ec.OperationContext.RootResolverMiddleware(ctx, - func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) - } - out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "me": field := field @@ -9146,6 +8922,69 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "favorites": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_favorites(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "giteaFeed": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_giteaFeed(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "jobAppReferences": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_jobAppReferences(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "jobApplications": field := field @@ -9188,7 +9027,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) - case "jobAppReferences": + case "messages": field := field innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { @@ -9197,7 +9036,7 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr ec.Error(ctx, ec.Recover(ctx, r)) } }() - res = ec._Query_jobAppReferences(ctx, field) + res = ec._Query_messages(ctx, field) if res == graphql.Null { atomic.AddUint32(&fs.Invalids, 1) } @@ -9209,6 +9048,167 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "posts": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_posts(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "post": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_post(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "rowingSessions": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_rowingSessions(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "spotifyListening": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_spotifyListening(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "spotifyRecent": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_spotifyRecent(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "steamStatus": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_steamStatus(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "users": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_users(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "user": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_user(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) case "__type": out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { diff --git a/backend/graph/gitea.resolvers.go b/backend/graph/gitea.resolvers.go index dbd90e2..54ae70a 100644 --- a/backend/graph/gitea.resolvers.go +++ b/backend/graph/gitea.resolvers.go @@ -1,5 +1,10 @@ package graph +// This file will be automatically regenerated based on the schema, any resolver +// implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.88 + import ( "context" "time" @@ -8,17 +13,6 @@ import ( "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() { diff --git a/backend/graph/gitea_helpers.go b/backend/graph/gitea_helpers.go new file mode 100644 index 0000000..95fad87 --- /dev/null +++ b/backend/graph/gitea_helpers.go @@ -0,0 +1,17 @@ +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/job_app_reference.resolvers.go b/backend/graph/job_app_reference.resolvers.go index 76a0932..0834d6a 100644 --- a/backend/graph/job_app_reference.resolvers.go +++ b/backend/graph/job_app_reference.resolvers.go @@ -7,7 +7,9 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" ) @@ -16,6 +18,75 @@ func (r *jobAppReferenceResolver) ID(ctx context.Context, obj *models.JobAppRefe return int(obj.ID), nil } +// CreateJobAppReference is the resolver for the createJobAppReference field. +func (r *mutationResolver) CreateJobAppReference(ctx context.Context, input model.CreateJobAppReferenceInput) (*models.JobAppReference, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + ref := models.JobAppReference{ + Category: input.Category, + Label: input.Label, + Value: input.Value, + } + if input.SortOrder != nil { + ref.SortOrder = *input.SortOrder + } + if err := r.Store.DB.Create(&ref).Error; err != nil { + return nil, err + } + return &ref, nil +} + +// UpdateJobAppReference is the resolver for the updateJobAppReference field. +func (r *mutationResolver) UpdateJobAppReference(ctx context.Context, id int, input model.UpdateJobAppReferenceInput) (*models.JobAppReference, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var ref models.JobAppReference + if err := r.Store.DB.First(&ref, id).Error; err != nil { + return nil, err + } + if input.Category != nil { + ref.Category = *input.Category + } + if input.Label != nil { + ref.Label = *input.Label + } + if input.Value != nil { + ref.Value = *input.Value + } + if input.SortOrder != nil { + ref.SortOrder = *input.SortOrder + } + if err := r.Store.DB.Save(&ref).Error; err != nil { + return nil, err + } + return &ref, nil +} + +// DeleteJobAppReference is the resolver for the deleteJobAppReference field. +func (r *mutationResolver) DeleteJobAppReference(ctx context.Context, id int) (bool, error) { + if !IsAdminFromCtx(ctx) { + return false, fmt.Errorf("admin access required") + } + if err := r.Store.DB.Delete(&models.JobAppReference{}, id).Error; err != nil { + return false, err + } + return true, nil +} + +// JobAppReferences is the resolver for the jobAppReferences field. +func (r *queryResolver) JobAppReferences(ctx context.Context) ([]*models.JobAppReference, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var refs []*models.JobAppReference + if err := r.Store.DB.Order("category ASC, sort_order ASC, created_at ASC").Find(&refs).Error; err != nil { + return nil, err + } + return refs, nil +} + // JobAppReference returns JobAppReferenceResolver implementation. func (r *Resolver) JobAppReference() JobAppReferenceResolver { return &jobAppReferenceResolver{r} } diff --git a/backend/graph/job_application.resolvers.go b/backend/graph/job_application.resolvers.go index 9ee91a6..165beed 100644 --- a/backend/graph/job_application.resolvers.go +++ b/backend/graph/job_application.resolvers.go @@ -7,7 +7,9 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" ) @@ -16,6 +18,97 @@ func (r *jobApplicationResolver) ID(ctx context.Context, obj *models.JobApplicat return int(obj.ID), nil } +// CreateJobApplication is the resolver for the createJobApplication field. +func (r *mutationResolver) CreateJobApplication(ctx context.Context, input model.CreateJobApplicationInput) (*models.JobApplication, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + app := models.JobApplication{ + JobTitle: input.JobTitle, + Company: input.Company, + Location: input.Location, + URL: input.URL, + Status: input.Status, + Notes: input.Notes, + AppliedAt: input.AppliedAt, + } + if err := r.Store.DB.Create(&app).Error; err != nil { + return nil, err + } + return &app, nil +} + +// UpdateJobApplication is the resolver for the updateJobApplication field. +func (r *mutationResolver) UpdateJobApplication(ctx context.Context, id int, input model.UpdateJobApplicationInput) (*models.JobApplication, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var app models.JobApplication + if err := r.Store.DB.First(&app, id).Error; err != nil { + return nil, err + } + if input.JobTitle != nil { + app.JobTitle = *input.JobTitle + } + if input.Company != nil { + app.Company = *input.Company + } + if input.Location != nil { + app.Location = input.Location + } + if input.URL != nil { + app.URL = input.URL + } + if input.Status != nil { + app.Status = *input.Status + } + if input.Notes != nil { + app.Notes = input.Notes + } + if input.AppliedAt != nil { + app.AppliedAt = input.AppliedAt + } + if err := r.Store.DB.Save(&app).Error; err != nil { + return nil, err + } + return &app, nil +} + +// DeleteJobApplication is the resolver for the deleteJobApplication field. +func (r *mutationResolver) DeleteJobApplication(ctx context.Context, id int) (bool, error) { + if !IsAdminFromCtx(ctx) { + return false, fmt.Errorf("admin access required") + } + if err := r.Store.DB.Delete(&models.JobApplication{}, id).Error; err != nil { + return false, err + } + return true, nil +} + +// JobApplications is the resolver for the jobApplications field. +func (r *queryResolver) JobApplications(ctx context.Context) ([]*models.JobApplication, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var apps []*models.JobApplication + if err := r.Store.DB.Order("created_at desc").Find(&apps).Error; err != nil { + return nil, err + } + return apps, nil +} + +// JobApplication is the resolver for the jobApplication field. +func (r *queryResolver) JobApplication(ctx context.Context, id int) (*models.JobApplication, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var app models.JobApplication + if err := r.Store.DB.First(&app, id).Error; err != nil { + return nil, err + } + return &app, nil +} + // JobApplication returns JobApplicationResolver implementation. func (r *Resolver) JobApplication() JobApplicationResolver { return &jobApplicationResolver{r} } diff --git a/backend/graph/message.resolvers.go b/backend/graph/message.resolvers.go index 29bedba..d1022f3 100644 --- a/backend/graph/message.resolvers.go +++ b/backend/graph/message.resolvers.go @@ -21,6 +21,19 @@ func (r *messageResolver) AuthorID(ctx context.Context, obj *models.Message) (in return int(obj.AuthorID), nil } +// Messages is the resolver for the messages field. +func (r *queryResolver) Messages(ctx context.Context) ([]*models.Message, error) { + var messages []models.Message + if err := r.Store.DB.Order("created_at DESC").Find(&messages).Error; err != nil { + return nil, err + } + result := make([]*models.Message, len(messages)) + for i := range messages { + result[i] = &messages[i] + } + return result, nil +} + // Message returns MessageResolver implementation. func (r *Resolver) Message() MessageResolver { return &messageResolver{r} } diff --git a/backend/graph/post.resolvers.go b/backend/graph/post.resolvers.go index fe09987..f2b32f0 100644 --- a/backend/graph/post.resolvers.go +++ b/backend/graph/post.resolvers.go @@ -7,15 +7,111 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" ) +// CreatePost is the resolver for the createPost field. +func (r *mutationResolver) CreatePost(ctx context.Context, input model.CreatePostInput) (*models.Post, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + userID, ok := UserIDFromCtx(ctx) + if !ok { + return nil, fmt.Errorf("unauthorized") + } + + post := models.Post{Title: input.Title, Content: input.Content, AuthorID: userID} + if err := r.Store.DB.Create(&post).Error; err != nil { + return nil, err + } + + return &post, nil +} + +// UpdatePost is the resolver for the updatePost field. +func (r *mutationResolver) UpdatePost(ctx context.Context, id int, input model.UpdatePostInput) (*models.Post, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + userID, ok := UserIDFromCtx(ctx) + if !ok { + return nil, fmt.Errorf("unauthorized") + } + + var post models.Post + if err := r.Store.DB.First(&post, id).Error; err != nil { + return nil, fmt.Errorf("post not found") + } + + if post.AuthorID != userID { + return nil, fmt.Errorf("you can only update your own posts") + } + + post.Title = input.Title + post.Content = input.Content + if err := r.Store.DB.Save(&post).Error; err != nil { + return nil, err + } + + return &post, nil +} + +// DeletePost is the resolver for the deletePost field. +func (r *mutationResolver) DeletePost(ctx context.Context, id int) (*models.Post, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + userID, ok := UserIDFromCtx(ctx) + if !ok { + return nil, fmt.Errorf("unauthorized") + } + + var post models.Post + if err := r.Store.DB.First(&post, id).Error; err != nil { + return nil, fmt.Errorf("post not found") + } + + if post.AuthorID != userID { + return nil, fmt.Errorf("you can only delete your own posts") + } + + r.Store.DB.Delete(&post) + return &post, nil +} + // ID is the resolver for the id field. func (r *postResolver) ID(ctx context.Context, obj *models.Post) (int, error) { return int(obj.ID), nil } +// Posts is the resolver for the posts field. +func (r *queryResolver) Posts(ctx context.Context) ([]*models.Post, error) { + var posts []models.Post + if err := r.Store.DB.Preload("Author").Order("created_at DESC").Find(&posts).Error; err != nil { + return nil, err + } + result := make([]*models.Post, len(posts)) + for i := range posts { + result[i] = &posts[i] + } + return result, nil +} + +// Post is the resolver for the post field. +func (r *queryResolver) Post(ctx context.Context, id int) (*models.Post, error) { + var post models.Post + if err := r.Store.DB.Preload("Author").First(&post, id).Error; err != nil { + return nil, fmt.Errorf("post not found") + } + return &post, nil +} + // Post returns PostResolver implementation. func (r *Resolver) Post() PostResolver { return &postResolver{r} } diff --git a/backend/graph/rowing.resolvers.go b/backend/graph/rowing.resolvers.go index 7a318f6..08a1ca7 100644 --- a/backend/graph/rowing.resolvers.go +++ b/backend/graph/rowing.resolvers.go @@ -11,6 +11,19 @@ import ( "adam-french.co.uk/backend/models" ) +// RowingSessions is the resolver for the rowingSessions field. +func (r *queryResolver) RowingSessions(ctx context.Context) ([]*models.Rowing, error) { + var rows []models.Rowing + if err := r.Store.DB.Order("created_at DESC").Find(&rows).Error; err != nil { + return nil, err + } + result := make([]*models.Rowing, len(rows)) + for i := range rows { + result[i] = &rows[i] + } + return result, nil +} + // ID is the resolver for the id field. func (r *rowingResolver) ID(ctx context.Context, obj *models.Rowing) (int, error) { return int(obj.ID), nil diff --git a/backend/graph/schema.resolvers.go b/backend/graph/schema.resolvers.go index 97f01d6..9750de1 100644 --- a/backend/graph/schema.resolvers.go +++ b/backend/graph/schema.resolvers.go @@ -5,620 +5,11 @@ package graph // will be copied through when generating and any unknown code will be moved to the end. // Code generated by github.com/99designs/gqlgen version v0.17.88 -import ( - "context" - "fmt" - "net/http" - - "adam-french.co.uk/backend/graph/model" - "adam-french.co.uk/backend/models" - "golang.org/x/crypto/bcrypt" -) - -// Login is the resolver for the login field. -func (r *mutationResolver) Login(ctx context.Context, input model.LoginInput) (*model.AuthPayload, error) { - gc := GinContextFromCtx(ctx) - if gc == nil { - return nil, fmt.Errorf("could not get gin context") - } - - if !r.Store.LoginLimiter.Allow(gc.ClientIP()) { - return nil, fmt.Errorf("too many login attempts, please try again later") - } - - var user models.User - if err := r.Store.DB.Where("username = ?", input.Username).First(&user).Error; err != nil { - return nil, fmt.Errorf("invalid credentials") - } - - if err := bcrypt.CompareHashAndPassword(user.Password, []byte(input.Password)); err != nil { - return nil, fmt.Errorf("invalid credentials") - } - - tokens, err := r.Store.Auth.GenerateJWT(&user) - if err != nil { - return nil, fmt.Errorf("failed to generate tokens") - } - - gc.SetSameSite(http.SameSiteLaxMode) - gc.SetCookie( - "access_token", - tokens.AccessToken, - int(r.Store.Auth.Config.AccessTokenLifetime.Seconds()), - "/", - r.Store.Auth.Config.Domain, - true, true, - ) - gc.SetCookie( - "refresh_token", - tokens.RefreshToken, - int(r.Store.Auth.Config.RefreshTokenLifetime.Seconds()), - "/", - r.Store.Auth.Config.Domain, - true, true, - ) - - return &model.AuthPayload{User: &user}, nil -} - -// Logout is the resolver for the logout field. -func (r *mutationResolver) Logout(ctx context.Context) (bool, error) { - gc := GinContextFromCtx(ctx) - if gc == nil { - return false, fmt.Errorf("could not get gin context") - } - - gc.SetSameSite(http.SameSiteLaxMode) - gc.SetCookie("access_token", "", -1, "/", r.Store.Auth.Config.Domain, true, true) - gc.SetCookie("refresh_token", "", -1, "/", r.Store.Auth.Config.Domain, true, true) - - return true, nil -} - -// RefreshToken is the resolver for the refreshToken field. -func (r *mutationResolver) RefreshToken(ctx context.Context) (*model.AuthPayload, error) { - gc := GinContextFromCtx(ctx) - if gc == nil { - return nil, fmt.Errorf("could not get gin context") - } - - refreshToken, err := gc.Cookie("refresh_token") - if err != nil { - return nil, fmt.Errorf("unauthorized") - } - - claims, err := r.Store.Auth.VerifyJWT(refreshToken) - if err != nil { - return nil, fmt.Errorf("unauthorized") - } - - userIDF, ok := (*claims)["id"].(float64) - if !ok { - return nil, fmt.Errorf("invalid token claims") - } - - var user models.User - user.ID = uint(userIDF) - if err := r.Store.DB.First(&user).Error; err != nil { - return nil, fmt.Errorf("user not found") - } - - tokens, err := r.Store.Auth.GenerateJWT(&user) - if err != nil { - return nil, fmt.Errorf("failed to generate tokens") - } - - gc.SetSameSite(http.SameSiteLaxMode) - gc.SetCookie( - "access_token", - tokens.AccessToken, - int(r.Store.Auth.Config.AccessTokenLifetime.Seconds()), - "/", - r.Store.Auth.Config.Domain, - true, true, - ) - gc.SetCookie( - "refresh_token", - tokens.RefreshToken, - int(r.Store.Auth.Config.RefreshTokenLifetime.Seconds()), - "/", - r.Store.Auth.Config.Domain, - true, true, - ) - - return &model.AuthPayload{User: &user}, nil -} - -// CreatePost is the resolver for the createPost field. -func (r *mutationResolver) CreatePost(ctx context.Context, input model.CreatePostInput) (*models.Post, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - userID, ok := UserIDFromCtx(ctx) - if !ok { - return nil, fmt.Errorf("unauthorized") - } - - post := models.Post{Title: input.Title, Content: input.Content, AuthorID: userID} - if err := r.Store.DB.Create(&post).Error; err != nil { - return nil, err - } - - return &post, nil -} - -// UpdatePost is the resolver for the updatePost field. -func (r *mutationResolver) UpdatePost(ctx context.Context, id int, input model.UpdatePostInput) (*models.Post, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - userID, ok := UserIDFromCtx(ctx) - if !ok { - return nil, fmt.Errorf("unauthorized") - } - - var post models.Post - if err := r.Store.DB.First(&post, id).Error; err != nil { - return nil, fmt.Errorf("post not found") - } - - if post.AuthorID != userID { - return nil, fmt.Errorf("you can only update your own posts") - } - - post.Title = input.Title - post.Content = input.Content - if err := r.Store.DB.Save(&post).Error; err != nil { - return nil, err - } - - return &post, nil -} - -// DeletePost is the resolver for the deletePost field. -func (r *mutationResolver) DeletePost(ctx context.Context, id int) (*models.Post, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - userID, ok := UserIDFromCtx(ctx) - if !ok { - return nil, fmt.Errorf("unauthorized") - } - - var post models.Post - if err := r.Store.DB.First(&post, id).Error; err != nil { - return nil, fmt.Errorf("post not found") - } - - if post.AuthorID != userID { - return nil, fmt.Errorf("you can only delete your own posts") - } - - r.Store.DB.Delete(&post) - return &post, nil -} - -// CreateUser is the resolver for the createUser field. -func (r *mutationResolver) CreateUser(ctx context.Context, input model.CreateUserInput) (*models.User, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - hashedPassword, err := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost) - if err != nil { - return nil, err - } - - user := models.User{Username: input.Username, Password: hashedPassword} - if err := r.Store.DB.Create(&user).Error; err != nil { - return nil, err - } - - return &user, nil -} - -// DeleteUser is the resolver for the deleteUser field. -func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (*models.User, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - var user models.User - if err := r.Store.DB.First(&user, id).Error; err != nil { - return nil, fmt.Errorf("user not found") - } - - if err := r.Store.DB.Delete(&user).Error; err != nil { - return nil, err - } - - return &user, nil -} - -// SetUserAdmin is the resolver for the setUserAdmin field. -func (r *mutationResolver) SetUserAdmin(ctx context.Context, id int, admin bool) (*models.User, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - callerID, ok := UserIDFromCtx(ctx) - if !ok { - return nil, fmt.Errorf("unauthorized") - } - - if uint(id) == callerID { - return nil, fmt.Errorf("cannot change your own admin status") - } - - var user models.User - if err := r.Store.DB.First(&user, id).Error; err != nil { - return nil, fmt.Errorf("user not found") - } - - user.Admin = admin - if err := r.Store.DB.Save(&user).Error; err != nil { - return nil, err - } - - return &user, nil -} - -// CreateFavorite is the resolver for the createFavorite field. -func (r *mutationResolver) CreateFavorite(ctx context.Context, input model.CreateFavoriteInput) (*models.Favorite, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - favorite := models.Favorite{Type: input.Type, Name: input.Name, Link: input.Link} - if err := r.Store.DB.Create(&favorite).Error; err != nil { - return nil, err - } - - return &favorite, nil -} - -// CreateActivity is the resolver for the createActivity field. -func (r *mutationResolver) CreateActivity(ctx context.Context, input model.CreateActivityInput) (*models.Activity, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - - activity := models.Activity{Type: input.Type, Name: input.Name, Link: input.Link} - if err := r.Store.DB.Create(&activity).Error; err != nil { - return nil, err - } - - return &activity, nil -} - -// CreateJobApplication is the resolver for the createJobApplication field. -func (r *mutationResolver) CreateJobApplication(ctx context.Context, input model.CreateJobApplicationInput) (*models.JobApplication, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - app := models.JobApplication{ - JobTitle: input.JobTitle, - Company: input.Company, - Location: input.Location, - URL: input.URL, - Status: input.Status, - Notes: input.Notes, - AppliedAt: input.AppliedAt, - } - if err := r.Store.DB.Create(&app).Error; err != nil { - return nil, err - } - return &app, nil -} - -// UpdateJobApplication is the resolver for the updateJobApplication field. -func (r *mutationResolver) UpdateJobApplication(ctx context.Context, id int, input model.UpdateJobApplicationInput) (*models.JobApplication, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var app models.JobApplication - if err := r.Store.DB.First(&app, id).Error; err != nil { - return nil, err - } - if input.JobTitle != nil { - app.JobTitle = *input.JobTitle - } - if input.Company != nil { - app.Company = *input.Company - } - if input.Location != nil { - app.Location = input.Location - } - if input.URL != nil { - app.URL = input.URL - } - if input.Status != nil { - app.Status = *input.Status - } - if input.Notes != nil { - app.Notes = input.Notes - } - if input.AppliedAt != nil { - app.AppliedAt = input.AppliedAt - } - if err := r.Store.DB.Save(&app).Error; err != nil { - return nil, err - } - return &app, nil -} - -// CreateBookmark is the resolver for the createBookmark field. -func (r *mutationResolver) CreateBookmark(ctx context.Context, input model.CreateBookmarkInput) (*models.Bookmark, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - bookmark := models.Bookmark{Category: input.Category, Name: input.Name, Link: input.Link} - if err := r.Store.DB.Create(&bookmark).Error; err != nil { - return nil, err - } - return &bookmark, nil -} - -// DeleteBookmark is the resolver for the deleteBookmark field. -func (r *mutationResolver) DeleteBookmark(ctx context.Context, id int) (*models.Bookmark, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var bookmark models.Bookmark - if err := r.Store.DB.First(&bookmark, id).Error; err != nil { - return nil, err - } - if err := r.Store.DB.Delete(&bookmark).Error; err != nil { - return nil, err - } - return &bookmark, nil -} - -// DeleteJobApplication is the resolver for the deleteJobApplication field. -func (r *mutationResolver) DeleteJobApplication(ctx context.Context, id int) (bool, error) { - if !IsAdminFromCtx(ctx) { - return false, fmt.Errorf("admin access required") - } - if err := r.Store.DB.Delete(&models.JobApplication{}, id).Error; err != nil { - return false, err - } - return true, nil -} - -// CreateJobAppReference is the resolver for the createJobAppReference field. -func (r *mutationResolver) CreateJobAppReference(ctx context.Context, input model.CreateJobAppReferenceInput) (*models.JobAppReference, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - ref := models.JobAppReference{ - Category: input.Category, - Label: input.Label, - Value: input.Value, - } - if input.SortOrder != nil { - ref.SortOrder = *input.SortOrder - } - if err := r.Store.DB.Create(&ref).Error; err != nil { - return nil, err - } - return &ref, nil -} - -// UpdateJobAppReference is the resolver for the updateJobAppReference field. -func (r *mutationResolver) UpdateJobAppReference(ctx context.Context, id int, input model.UpdateJobAppReferenceInput) (*models.JobAppReference, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var ref models.JobAppReference - if err := r.Store.DB.First(&ref, id).Error; err != nil { - return nil, err - } - if input.Category != nil { - ref.Category = *input.Category - } - if input.Label != nil { - ref.Label = *input.Label - } - if input.Value != nil { - ref.Value = *input.Value - } - if input.SortOrder != nil { - ref.SortOrder = *input.SortOrder - } - if err := r.Store.DB.Save(&ref).Error; err != nil { - return nil, err - } - return &ref, nil -} - -// DeleteJobAppReference is the resolver for the deleteJobAppReference field. -func (r *mutationResolver) DeleteJobAppReference(ctx context.Context, id int) (bool, error) { - if !IsAdminFromCtx(ctx) { - return false, fmt.Errorf("admin access required") - } - if err := r.Store.DB.Delete(&models.JobAppReference{}, id).Error; err != nil { - return false, err - } - return true, nil -} - -// Users is the resolver for the users field. -func (r *queryResolver) Users(ctx context.Context) ([]*models.User, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var users []models.User - if err := r.Store.DB.Find(&users).Error; err != nil { - return nil, err - } - result := make([]*models.User, len(users)) - for i := range users { - result[i] = &users[i] - } - return result, nil -} - -// User is the resolver for the user field. -func (r *queryResolver) User(ctx context.Context, id int) (*models.User, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var user models.User - if err := r.Store.DB.First(&user, id).Error; err != nil { - return nil, fmt.Errorf("user not found") - } - return &user, nil -} - -// Posts is the resolver for the posts field. -func (r *queryResolver) Posts(ctx context.Context) ([]*models.Post, error) { - var posts []models.Post - if err := r.Store.DB.Preload("Author").Order("created_at DESC").Find(&posts).Error; err != nil { - return nil, err - } - result := make([]*models.Post, len(posts)) - for i := range posts { - result[i] = &posts[i] - } - return result, nil -} - -// Post is the resolver for the post field. -func (r *queryResolver) Post(ctx context.Context, id int) (*models.Post, error) { - var post models.Post - if err := r.Store.DB.Preload("Author").First(&post, id).Error; err != nil { - return nil, fmt.Errorf("post not found") - } - return &post, nil -} - -// Activities is the resolver for the activities field. -func (r *queryResolver) Activities(ctx context.Context) ([]*models.Activity, error) { - var activities []models.Activity - if err := r.Store.DB.Order("created_at DESC").Find(&activities).Error; err != nil { - return nil, err - } - result := make([]*models.Activity, len(activities)) - for i := range activities { - result[i] = &activities[i] - } - return result, nil -} - -// Favorites is the resolver for the favorites field. -func (r *queryResolver) Favorites(ctx context.Context) ([]*models.Favorite, error) { - var favorites []models.Favorite - if err := r.Store.DB.Order("created_at DESC").Find(&favorites).Error; err != nil { - return nil, err - } - result := make([]*models.Favorite, len(favorites)) - for i := range favorites { - result[i] = &favorites[i] - } - return result, nil -} - -// RowingSessions is the resolver for the rowingSessions field. -func (r *queryResolver) RowingSessions(ctx context.Context) ([]*models.Rowing, error) { - var rows []models.Rowing - if err := r.Store.DB.Order("created_at DESC").Find(&rows).Error; err != nil { - return nil, err - } - result := make([]*models.Rowing, len(rows)) - for i := range rows { - result[i] = &rows[i] - } - return result, nil -} - -// Messages is the resolver for the messages field. -func (r *queryResolver) Messages(ctx context.Context) ([]*models.Message, error) { - var messages []models.Message - if err := r.Store.DB.Order("created_at DESC").Find(&messages).Error; err != nil { - return nil, err - } - result := make([]*models.Message, len(messages)) - for i := range messages { - result[i] = &messages[i] - } - return result, nil -} - -// Me is the resolver for the me field. -func (r *queryResolver) Me(ctx context.Context) (*models.User, error) { - userID, ok := UserIDFromCtx(ctx) - if !ok { - return nil, fmt.Errorf("unauthorized") - } - - var user models.User - user.ID = userID - if err := r.Store.DB.First(&user).Error; err != nil { - return nil, fmt.Errorf("user not found") - } - - return &user, nil -} - -// Bookmarks is the resolver for the bookmarks field. -func (r *queryResolver) Bookmarks(ctx context.Context) ([]*models.Bookmark, error) { - var bookmarks []models.Bookmark - if err := r.Store.DB.Order("category ASC, created_at ASC").Find(&bookmarks).Error; err != nil { - return nil, err - } - result := make([]*models.Bookmark, len(bookmarks)) - for i := range bookmarks { - result[i] = &bookmarks[i] - } - return result, nil -} - -// JobApplications is the resolver for the jobApplications field. -func (r *queryResolver) JobApplications(ctx context.Context) ([]*models.JobApplication, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var apps []*models.JobApplication - if err := r.Store.DB.Order("created_at desc").Find(&apps).Error; err != nil { - return nil, err - } - return apps, nil -} - -// JobApplication is the resolver for the jobApplication field. -func (r *queryResolver) JobApplication(ctx context.Context, id int) (*models.JobApplication, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var app models.JobApplication - if err := r.Store.DB.First(&app, id).Error; err != nil { - return nil, err - } - return &app, nil -} - -// JobAppReferences is the resolver for the jobAppReferences field. -func (r *queryResolver) JobAppReferences(ctx context.Context) ([]*models.JobAppReference, error) { - if !IsAdminFromCtx(ctx) { - return nil, fmt.Errorf("admin access required") - } - var refs []*models.JobAppReference - if err := r.Store.DB.Order("category ASC, sort_order ASC, created_at ASC").Find(&refs).Error; err != nil { - return nil, err - } - return refs, nil -} - // Mutation returns MutationResolver implementation. func (r *Resolver) Mutation() MutationResolver { return &mutationResolver{r} } // Query returns QueryResolver implementation. func (r *Resolver) Query() QueryResolver { return &queryResolver{r} } -type ( - mutationResolver struct{ *Resolver } - queryResolver struct{ *Resolver } -) +type mutationResolver struct{ *Resolver } +type queryResolver struct{ *Resolver } diff --git a/backend/graph/schema/activity.graphql b/backend/graph/schema/activity.graphql index 17ad67b..6cd92a2 100644 --- a/backend/graph/schema/activity.graphql +++ b/backend/graph/schema/activity.graphql @@ -12,3 +12,11 @@ input CreateActivityInput { name: String! link: String } + +extend type Query { + activities: [Activity!]! +} + +extend type Mutation { + createActivity(input: CreateActivityInput!): Activity! +} diff --git a/backend/graph/schema/auth.graphql b/backend/graph/schema/auth.graphql index efe5ecb..ffaf3a2 100644 --- a/backend/graph/schema/auth.graphql +++ b/backend/graph/schema/auth.graphql @@ -6,3 +6,13 @@ input LoginInput { type AuthPayload { user: User! } + +extend type Query { + me: User +} + +extend type Mutation { + login(input: LoginInput!): AuthPayload! + logout: Boolean! + refreshToken: AuthPayload! +} diff --git a/backend/graph/schema/bookmark.graphql b/backend/graph/schema/bookmark.graphql index 614b31e..7bd09a9 100644 --- a/backend/graph/schema/bookmark.graphql +++ b/backend/graph/schema/bookmark.graphql @@ -12,3 +12,12 @@ input CreateBookmarkInput { name: String! link: String! } + +extend type Query { + bookmarks: [Bookmark!]! +} + +extend type Mutation { + createBookmark(input: CreateBookmarkInput!): Bookmark! + deleteBookmark(id: ID!): Bookmark! +} diff --git a/backend/graph/schema/favorite.graphql b/backend/graph/schema/favorite.graphql index c317a99..04a6a0f 100644 --- a/backend/graph/schema/favorite.graphql +++ b/backend/graph/schema/favorite.graphql @@ -12,3 +12,11 @@ input CreateFavoriteInput { name: String! link: String } + +extend type Query { + favorites: [Favorite!]! +} + +extend type Mutation { + createFavorite(input: CreateFavoriteInput!): Favorite! +} diff --git a/backend/graph/schema/gitea.graphql b/backend/graph/schema/gitea.graphql index 1749736..71eb382 100644 --- a/backend/graph/schema/gitea.graphql +++ b/backend/graph/schema/gitea.graphql @@ -6,3 +6,7 @@ type GiteaFeedItem { commitMessage: String! createdAt: Time! } + +extend type Query { + giteaFeed: GiteaFeedItem +} diff --git a/backend/graph/schema/job_app_reference.graphql b/backend/graph/schema/job_app_reference.graphql index 4d7f0e3..9ea756a 100644 --- a/backend/graph/schema/job_app_reference.graphql +++ b/backend/graph/schema/job_app_reference.graphql @@ -21,3 +21,13 @@ input UpdateJobAppReferenceInput { value: String sortOrder: Int } + +extend type Query { + jobAppReferences: [JobAppReference!]! +} + +extend type Mutation { + createJobAppReference(input: CreateJobAppReferenceInput!): JobAppReference! + updateJobAppReference(id: ID!, input: UpdateJobAppReferenceInput!): JobAppReference! + deleteJobAppReference(id: ID!): Boolean! +} diff --git a/backend/graph/schema/job_application.graphql b/backend/graph/schema/job_application.graphql index 726fef7..41aaff8 100644 --- a/backend/graph/schema/job_application.graphql +++ b/backend/graph/schema/job_application.graphql @@ -30,3 +30,14 @@ input UpdateJobApplicationInput { notes: String appliedAt: Time } + +extend type Query { + jobApplications: [JobApplication!]! + jobApplication(id: ID!): JobApplication +} + +extend type Mutation { + createJobApplication(input: CreateJobApplicationInput!): JobApplication! + updateJobApplication(id: ID!, input: UpdateJobApplicationInput!): JobApplication! + deleteJobApplication(id: ID!): Boolean! +} diff --git a/backend/graph/schema/message.graphql b/backend/graph/schema/message.graphql index 68b993a..5e4787f 100644 --- a/backend/graph/schema/message.graphql +++ b/backend/graph/schema/message.graphql @@ -5,3 +5,7 @@ type Message { fileUrl: String createdAt: Time! } + +extend type Query { + messages: [Message!]! +} diff --git a/backend/graph/schema/post.graphql b/backend/graph/schema/post.graphql index d9fa1f1..1b3f9e0 100644 --- a/backend/graph/schema/post.graphql +++ b/backend/graph/schema/post.graphql @@ -16,3 +16,14 @@ input UpdatePostInput { title: String! content: String! } + +extend type Query { + posts: [Post!]! + post(id: ID!): Post +} + +extend type Mutation { + createPost(input: CreatePostInput!): Post! + updatePost(id: ID!, input: UpdatePostInput!): Post! + deletePost(id: ID!): Post! +} diff --git a/backend/graph/schema/rowing.graphql b/backend/graph/schema/rowing.graphql index 7d38cc0..69ce674 100644 --- a/backend/graph/schema/rowing.graphql +++ b/backend/graph/schema/rowing.graphql @@ -7,3 +7,7 @@ type Rowing { timePer500m: Float! calories: Float! } + +extend type Query { + rowingSessions: [Rowing!]! +} diff --git a/backend/graph/schema/schema.graphql b/backend/graph/schema/schema.graphql index 642e8ea..bd56abb 100644 --- a/backend/graph/schema/schema.graphql +++ b/backend/graph/schema/schema.graphql @@ -1,43 +1,4 @@ scalar Time -type Query { - users: [User!]! - user(id: ID!): User - posts: [Post!]! - post(id: ID!): Post - activities: [Activity!]! - favorites: [Favorite!]! - rowingSessions: [Rowing!]! - messages: [Message!]! - spotifyListening: SpotifyPlaying - spotifyRecent: [SpotifyRecentItem!] - giteaFeed: GiteaFeedItem - steamStatus: SteamStatus - me: User - bookmarks: [Bookmark!]! - jobApplications: [JobApplication!]! - jobApplication(id: ID!): JobApplication - jobAppReferences: [JobAppReference!]! -} - -type Mutation { - login(input: LoginInput!): AuthPayload! - logout: Boolean! - refreshToken: AuthPayload! - createPost(input: CreatePostInput!): Post! - updatePost(id: ID!, input: UpdatePostInput!): Post! - deletePost(id: ID!): Post! - createUser(input: CreateUserInput!): User! - deleteUser(id: ID!): User! - setUserAdmin(id: ID!, admin: Boolean!): User! - createFavorite(input: CreateFavoriteInput!): Favorite! - createActivity(input: CreateActivityInput!): Activity! - createJobApplication(input: CreateJobApplicationInput!): JobApplication! - updateJobApplication(id: ID!, input: UpdateJobApplicationInput!): JobApplication! - createBookmark(input: CreateBookmarkInput!): Bookmark! - deleteBookmark(id: ID!): Bookmark! - deleteJobApplication(id: ID!): Boolean! - createJobAppReference(input: CreateJobAppReferenceInput!): JobAppReference! - updateJobAppReference(id: ID!, input: UpdateJobAppReferenceInput!): JobAppReference! - deleteJobAppReference(id: ID!): Boolean! -} +type Query +type Mutation diff --git a/backend/graph/schema/spotify.graphql b/backend/graph/schema/spotify.graphql index c74c5f0..e101fce 100644 --- a/backend/graph/schema/spotify.graphql +++ b/backend/graph/schema/spotify.graphql @@ -26,3 +26,8 @@ type SpotifyRecentItem { track: SpotifyTrack! playedAt: Time! } + +extend type Query { + spotifyListening: SpotifyPlaying + spotifyRecent: [SpotifyRecentItem!] +} diff --git a/backend/graph/schema/steam.graphql b/backend/graph/schema/steam.graphql index 10effee..9198266 100644 --- a/backend/graph/schema/steam.graphql +++ b/backend/graph/schema/steam.graphql @@ -10,3 +10,7 @@ type SteamStatus { online: Boolean! recentGames: [SteamGame!]! } + +extend type Query { + steamStatus: SteamStatus +} diff --git a/backend/graph/schema/user.graphql b/backend/graph/schema/user.graphql index eb5bfa7..95aa35b 100644 --- a/backend/graph/schema/user.graphql +++ b/backend/graph/schema/user.graphql @@ -10,3 +10,14 @@ input CreateUserInput { username: String! password: String! } + +extend type Query { + users: [User!]! + user(id: ID!): User +} + +extend type Mutation { + createUser(input: CreateUserInput!): User! + deleteUser(id: ID!): User! + setUserAdmin(id: ID!, admin: Boolean!): User! +} diff --git a/backend/graph/spotify.resolvers.go b/backend/graph/spotify.resolvers.go index aee7acc..8f8af7c 100644 --- a/backend/graph/spotify.resolvers.go +++ b/backend/graph/spotify.resolvers.go @@ -1,58 +1,18 @@ package graph +// This file will be automatically regenerated based on the schema, any resolver +// implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.88 + import ( "context" "time" "adam-french.co.uk/backend/graph/model" - "github.com/zmb3/spotify/v2" + spotify "github.com/zmb3/spotify/v2" ) -func mapSpotifyImages(images []spotify.Image) []*model.SpotifyImage { - result := make([]*model.SpotifyImage, len(images)) - for i, img := range images { - result[i] = &model.SpotifyImage{URL: img.URL} - } - return result -} - -func mapSpotifyTrack(track *spotify.FullTrack) *model.SpotifyTrack { - artists := make([]*model.SpotifyArtist, len(track.Artists)) - for i, a := range track.Artists { - artists[i] = &model.SpotifyArtist{Name: a.Name} - } - return &model.SpotifyTrack{ - Name: track.Name, - Artists: artists, - Album: &model.SpotifyAlbum{ - Name: track.Album.Name, - Images: mapSpotifyImages(track.Album.Images), - }, - } -} - -func mapRecentItems(items []spotify.RecentlyPlayedItem) []*model.SpotifyRecentItem { - result := make([]*model.SpotifyRecentItem, len(items)) - for i, item := range items { - artists := make([]*model.SpotifyArtist, len(item.Track.Artists)) - for j, a := range item.Track.Artists { - artists[j] = &model.SpotifyArtist{Name: a.Name} - } - result[i] = &model.SpotifyRecentItem{ - PlayedAt: item.PlayedAt, - Track: &model.SpotifyTrack{ - Name: item.Track.Name, - Artists: artists, - Album: &model.SpotifyAlbum{ - Name: item.Track.Album.Name, - Images: mapSpotifyImages(item.Track.Album.Images), - }, - }, - } - } - 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 { diff --git a/backend/graph/spotify_helpers.go b/backend/graph/spotify_helpers.go new file mode 100644 index 0000000..3841f79 --- /dev/null +++ b/backend/graph/spotify_helpers.go @@ -0,0 +1,51 @@ +package graph + +import ( + "adam-french.co.uk/backend/graph/model" + "github.com/zmb3/spotify/v2" +) + +func mapSpotifyImages(images []spotify.Image) []*model.SpotifyImage { + result := make([]*model.SpotifyImage, len(images)) + for i, img := range images { + result[i] = &model.SpotifyImage{URL: img.URL} + } + return result +} + +func mapSpotifyTrack(track *spotify.FullTrack) *model.SpotifyTrack { + artists := make([]*model.SpotifyArtist, len(track.Artists)) + for i, a := range track.Artists { + artists[i] = &model.SpotifyArtist{Name: a.Name} + } + return &model.SpotifyTrack{ + Name: track.Name, + Artists: artists, + Album: &model.SpotifyAlbum{ + Name: track.Album.Name, + Images: mapSpotifyImages(track.Album.Images), + }, + } +} + +func mapRecentItems(items []spotify.RecentlyPlayedItem) []*model.SpotifyRecentItem { + result := make([]*model.SpotifyRecentItem, len(items)) + for i, item := range items { + artists := make([]*model.SpotifyArtist, len(item.Track.Artists)) + for j, a := range item.Track.Artists { + artists[j] = &model.SpotifyArtist{Name: a.Name} + } + result[i] = &model.SpotifyRecentItem{ + PlayedAt: item.PlayedAt, + Track: &model.SpotifyTrack{ + Name: item.Track.Name, + Artists: artists, + Album: &model.SpotifyAlbum{ + Name: item.Track.Album.Name, + Images: mapSpotifyImages(item.Track.Album.Images), + }, + }, + } + } + return result +} diff --git a/backend/graph/steam.resolvers.go b/backend/graph/steam.resolvers.go index 5a6758e..f91a0fd 100644 --- a/backend/graph/steam.resolvers.go +++ b/backend/graph/steam.resolvers.go @@ -1,28 +1,18 @@ package graph +// This file will be automatically regenerated based on the schema, any resolver +// implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.88 + 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 == "" { diff --git a/backend/graph/steam_helpers.go b/backend/graph/steam_helpers.go new file mode 100644 index 0000000..33ac21f --- /dev/null +++ b/backend/graph/steam_helpers.go @@ -0,0 +1,22 @@ +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 +} diff --git a/backend/graph/user.resolvers.go b/backend/graph/user.resolvers.go index 8d2e3c3..74bf8c4 100644 --- a/backend/graph/user.resolvers.go +++ b/backend/graph/user.resolvers.go @@ -7,10 +7,106 @@ package graph import ( "context" + "fmt" + "adam-french.co.uk/backend/graph/model" "adam-french.co.uk/backend/models" + "golang.org/x/crypto/bcrypt" ) +// CreateUser is the resolver for the createUser field. +func (r *mutationResolver) CreateUser(ctx context.Context, input model.CreateUserInput) (*models.User, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost) + if err != nil { + return nil, err + } + + user := models.User{Username: input.Username, Password: hashedPassword} + if err := r.Store.DB.Create(&user).Error; err != nil { + return nil, err + } + + return &user, nil +} + +// DeleteUser is the resolver for the deleteUser field. +func (r *mutationResolver) DeleteUser(ctx context.Context, id int) (*models.User, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + var user models.User + if err := r.Store.DB.First(&user, id).Error; err != nil { + return nil, fmt.Errorf("user not found") + } + + if err := r.Store.DB.Delete(&user).Error; err != nil { + return nil, err + } + + return &user, nil +} + +// SetUserAdmin is the resolver for the setUserAdmin field. +func (r *mutationResolver) SetUserAdmin(ctx context.Context, id int, admin bool) (*models.User, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + + callerID, ok := UserIDFromCtx(ctx) + if !ok { + return nil, fmt.Errorf("unauthorized") + } + + if uint(id) == callerID { + return nil, fmt.Errorf("cannot change your own admin status") + } + + var user models.User + if err := r.Store.DB.First(&user, id).Error; err != nil { + return nil, fmt.Errorf("user not found") + } + + user.Admin = admin + if err := r.Store.DB.Save(&user).Error; err != nil { + return nil, err + } + + return &user, nil +} + +// Users is the resolver for the users field. +func (r *queryResolver) Users(ctx context.Context) ([]*models.User, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var users []models.User + if err := r.Store.DB.Find(&users).Error; err != nil { + return nil, err + } + result := make([]*models.User, len(users)) + for i := range users { + result[i] = &users[i] + } + return result, nil +} + +// User is the resolver for the user field. +func (r *queryResolver) User(ctx context.Context, id int) (*models.User, error) { + if !IsAdminFromCtx(ctx) { + return nil, fmt.Errorf("admin access required") + } + var user models.User + if err := r.Store.DB.First(&user, id).Error; err != nil { + return nil, fmt.Errorf("user not found") + } + return &user, nil +} + // ID is the resolver for the id field. func (r *userResolver) ID(ctx context.Context, obj *models.User) (int, error) { return int(obj.ID), nil