diff --git a/TeacherWorkout.Api/GraphQL/TeacherWorkoutMutation.cs b/TeacherWorkout.Api/GraphQL/TeacherWorkoutMutation.cs index 3673b44..57e6954 100644 --- a/TeacherWorkout.Api/GraphQL/TeacherWorkoutMutation.cs +++ b/TeacherWorkout.Api/GraphQL/TeacherWorkoutMutation.cs @@ -19,45 +19,33 @@ public TeacherWorkoutMutation(CompleteStep completeStep, { Name = "Mutation"; - Field>( - "lessonSave", - arguments: new QueryArguments( - new QueryArgument> { Name = "input" } - ), - resolve: context => + Field>("lessonSave") + .Argument>(Name = "input") + .Resolve(context => { var lessonSave = context.GetArgument("input"); return LessonSaveResolver.Resolve(lessonSave); }); - Field( - "stepComplete", - arguments: new QueryArguments( - new QueryArgument> { Name = "input" } - ), - resolve: context => + Field("stepComplete") + .Argument>(Name = "input") + .Resolve(context => { var input = context.GetArgument("input"); return completeStep.Execute(input); }); - Field( - "themeCreate", - arguments: new QueryArguments( - new QueryArgument> { Name = "input" } - ), - resolve: context => + Field("themeCreate") + .Argument>(Name = "input") + .Resolve(context => { var input = context.GetArgument("input"); return createTheme.Execute(input); }); - Field( - "themeUpdate", - arguments: new QueryArguments( - new QueryArgument> { Name = "input" } - ), - resolve: context => + Field("themeUpdate") + .Argument>(Name = "input") + .Resolve(context => { var input = context.GetArgument("input"); return updateTheme.Execute(input); diff --git a/TeacherWorkout.Api/GraphQL/TeacherWorkoutQuery.cs b/TeacherWorkout.Api/GraphQL/TeacherWorkoutQuery.cs index 9112dfb..3efd832 100644 --- a/TeacherWorkout.Api/GraphQL/TeacherWorkoutQuery.cs +++ b/TeacherWorkout.Api/GraphQL/TeacherWorkoutQuery.cs @@ -28,19 +28,13 @@ public TeacherWorkoutQuery(GetThemes getThemes, .ReturnAll() .Resolve(context => getLessons.Execute(context.ToInput()).ToConnection()); - Field>( - "step", - arguments: new QueryArguments( - new QueryArgument> {Name = "id", Description = "id of the step"} - ), - resolve: context => getStep.Execute(context.ToInput())); - - Field>>( - "lessonStatuses", - arguments: new QueryArguments( - new QueryArgument>>> { Name = "lessonIds", Description = "Ids of " } - ), - resolve: context => getLessonStatuses.Execute(context.ToInput())); + Field>("step") + .Argument>(Name = "id", Description = "id of the step") + .Resolve(context => getStep.Execute(context.ToInput())); + + Field>>("lessonStatuses") + .Argument>>>(Name = "lessonIds", Description = "Id's of leassons") + .Resolve(context => getLessonStatuses.Execute(context.ToInput())); } } } diff --git a/TeacherWorkout.Api/GraphQL/Types/AnswerStatusEnum.cs b/TeacherWorkout.Api/GraphQL/Types/AnswerStatusEnum.cs index 6fc6b67..e35dfc8 100644 --- a/TeacherWorkout.Api/GraphQL/Types/AnswerStatusEnum.cs +++ b/TeacherWorkout.Api/GraphQL/Types/AnswerStatusEnum.cs @@ -5,13 +5,5 @@ namespace TeacherWorkout.Api.GraphQL.Types { public class AnswerStatusEnum : EnumerationGraphType { - public AnswerStatusEnum() - { - Name = "AnswerStatus"; - - AddValue("Correct", "Correct.", 1); - AddValue("Incorrect", "Incorrect.", 2); - AddValue("None", "None.", 3); - } } } \ No newline at end of file diff --git a/TeacherWorkout.Api/GraphQL/Types/DurationUnitEnum.cs b/TeacherWorkout.Api/GraphQL/Types/DurationUnitEnum.cs index 9c33bd4..91d091d 100644 --- a/TeacherWorkout.Api/GraphQL/Types/DurationUnitEnum.cs +++ b/TeacherWorkout.Api/GraphQL/Types/DurationUnitEnum.cs @@ -5,12 +5,5 @@ namespace TeacherWorkout.Api.GraphQL.Types { public class DurationUnitEnum : EnumerationGraphType { - public DurationUnitEnum() - { - Name = "DurationUnit"; - - AddValue("Minutes", "Minutes.", 1); - AddValue("Hours", "Hours.", 2); - } } } \ No newline at end of file diff --git a/TeacherWorkout.Api/GraphQL/Types/ExerciseStepType.cs b/TeacherWorkout.Api/GraphQL/Types/ExerciseStepType.cs index 14678e3..0040e5a 100644 --- a/TeacherWorkout.Api/GraphQL/Types/ExerciseStepType.cs +++ b/TeacherWorkout.Api/GraphQL/Types/ExerciseStepType.cs @@ -13,6 +13,8 @@ public ExerciseStepType() Field(x => x.Id, type: typeof(IdGraphType)); Field(x => x.Question).Description("The question"); Field(x => x.Answers).Description("The possible possible answers"); + + IsTypeOf = obj => obj is ExerciseStep; } } } \ No newline at end of file diff --git a/TeacherWorkout.Api/GraphQL/Types/LessonStepInterface.cs b/TeacherWorkout.Api/GraphQL/Types/LessonStepInterface.cs index de41236..20ac95c 100644 --- a/TeacherWorkout.Api/GraphQL/Types/LessonStepInterface.cs +++ b/TeacherWorkout.Api/GraphQL/Types/LessonStepInterface.cs @@ -6,35 +6,35 @@ namespace TeacherWorkout.Api.GraphQL.Types { public class LessonStepInterface : InterfaceGraphType { - public LessonStepInterface( - SlideStepType slideStep, - ExerciseStepType exerciseStep, - ExerciseSummaryStepType exerciseSummaryStep, - LessonSummaryStepType lessonSummaryStep) + public LessonStepInterface() { Name = "LessonStep"; Field(d => d.Id, type: typeof(IdGraphType)).Description("The id of the step."); + + // Note: be sure not to pull in these references from DI when the graph types + // are registered as transients (the default lifetime for graph types) + // https://github.com/graphql-dotnet/graphql-dotnet/blob/master/docs2/site/docs/getting-started/interfaces.md#resolvetype ResolveType = obj => { if (obj is SlideStep) { - return slideStep; + return new GraphQLTypeReference("SlideStep"); } if (obj is ExerciseStep) { - return exerciseStep; + return new GraphQLTypeReference("ExerciseStep"); } if (obj is ExerciseSummaryStep) { - return exerciseSummaryStep; + return new GraphQLTypeReference("ExerciseSummaryStep"); } if (obj is LessonSummaryStep) { - return lessonSummaryStep; + return new GraphQLTypeReference("LessonSummaryStep"); } throw new ArgumentOutOfRangeException($"Could not resolve graph type for {obj.GetType().Name}"); diff --git a/TeacherWorkout.Api/Startup.cs b/TeacherWorkout.Api/Startup.cs index 02f6eac..f750d6d 100644 --- a/TeacherWorkout.Api/Startup.cs +++ b/TeacherWorkout.Api/Startup.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using GraphQL.Server; +using GraphQL; using GraphQL.Types; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -42,13 +42,10 @@ public void ConfigureServices(IServiceCollection services) AddRepositories(services, "TeacherWorkout.Data"); services.AddHttpContextAccessor(); - services.AddGraphQL(options => - { - options.EnableMetrics = false; - }) - .AddErrorInfoProvider(opt => opt.ExposeExceptionStackTrace = true) - .AddSystemTextJson() - .AddGraphTypes(); + services.AddGraphQL(b => b + .AddErrorInfoProvider(opt => opt.ExposeExceptionDetails = true) + .AddGraphTypes() + .AddSystemTextJson()); services.AddDbContext(options => options.UseNpgsql(Configuration.GetConnectionString("TeacherWorkoutContext"))); diff --git a/TeacherWorkout.Api/TeacherWorkout.Api.csproj b/TeacherWorkout.Api/TeacherWorkout.Api.csproj index f8df661..962310a 100644 --- a/TeacherWorkout.Api/TeacherWorkout.Api.csproj +++ b/TeacherWorkout.Api/TeacherWorkout.Api.csproj @@ -5,7 +5,7 @@ - + all diff --git a/TeacherWorkout.Data/Repositories/LessonStatusRepository.cs b/TeacherWorkout.Data/Repositories/LessonStatusRepository.cs index a1f86e3..bde679d 100644 --- a/TeacherWorkout.Data/Repositories/LessonStatusRepository.cs +++ b/TeacherWorkout.Data/Repositories/LessonStatusRepository.cs @@ -30,8 +30,20 @@ public IEnumerable List(LessonStatusFilter filter) return lessons.Select(l => new LessonStatus { Lesson = l, - CurrentLessonStep = new ExerciseStep { - Question = "Some very important question?" + CurrentLessonStep = new ExerciseStep + { + Id = "42", + Question = "Some very important question?", + Answers = new List { + new() { + Id = "42", + Title = "Yes" + }, + new() { + Id = "43", + Title = "Awesome" + } + } }, PercentCompleted = 1 });