diff --git a/client/src/components/modules/Module.vue b/client/src/components/modules/Module.vue index 215e1b00..489272e5 100644 --- a/client/src/components/modules/Module.vue +++ b/client/src/components/modules/Module.vue @@ -7,7 +7,7 @@ data-cy="toggle-enable-solutions">

{{module.metaTitle}}

-

{{module.title}}

+

{{module.title}}

@@ -40,6 +40,7 @@ import ToggleSolutionsForModule from '@/components/ToggleSolutionsForModule.vue'; import UPDATE_OBJECTIVE_PROGRESS_MUTATION from '@/graphql/gql/mutations/updateObjectiveProgress.gql'; + import UPDATE_LAST_MODULE_MUTATION from '@/graphql/gql/mutations/updateLastModule.gql'; import OBJECTIVE_QUERY from '@/graphql/gql/objectiveQuery.gql'; import ME_QUERY from '@/graphql/gql/meQuery.gql'; @@ -62,6 +63,7 @@ }, created() { + this.updateLastVisitedModule(this.module.id) }, computed: { @@ -81,6 +83,26 @@ }, methods: { + updateLastVisitedModule(moduleId) { + this.$apollo.mutate({ + mutation: UPDATE_LAST_MODULE_MUTATION, + variables: { + input: { + id: moduleId + } + }, + update(store, {data: {updateLastModule: {module}}}) { + if (module) { + const data = store.readQuery({query: ME_QUERY}); + if (data) { + console.log(data); + data.me.lastModule = module; + store.writeQuery({query: ME_QUERY, data}); + } + } + } + }); + }, updateObjectiveProgress(done, objectiveId) { this.$apollo.mutate({ mutation: UPDATE_OBJECTIVE_PROGRESS_MUTATION, @@ -91,18 +113,14 @@ } }, update(store, {data: {updateObjectiveProgress: {objective}}}) { - try { - if (objective) { - const variables = {id: objectiveId}; - const query = OBJECTIVE_QUERY; - const data = store.readQuery({query, variables}); - if (data.objective.objectiveProgress.edges.length > 0) { - data.objective.objectiveProgress.edges[0].node.done = done; - } - store.writeQuery({query: OBJECTIVE_QUERY, data, variables}); + if (objective) { + const variables = {id: objectiveId}; + const query = OBJECTIVE_QUERY; + const data = store.readQuery({query, variables}); + if (data && data.objective.objectiveProgress.edges.length > 0) { + data.objective.objectiveProgress.edges[0].node.done = done; } - } catch (e) { - // Query did not exist in the cache, and apollo throws a generic Error. Do nothing + store.writeQuery({query: OBJECTIVE_QUERY, data, variables}); } } }) diff --git a/client/src/graphql/gql/mutations/updateLastModule.gql b/client/src/graphql/gql/mutations/updateLastModule.gql new file mode 100644 index 00000000..2ea683c9 --- /dev/null +++ b/client/src/graphql/gql/mutations/updateLastModule.gql @@ -0,0 +1,9 @@ +#import "../fragments/moduleParts.gql" +mutation UpdateLastModule($input: UpdateLastModuleInput!) { + updateLastModule(input: $input) { + module { + ...ModuleParts + } + errors + } +} diff --git a/client/src/graphql/gql/mutations/updateObjectiveProgress.gql b/client/src/graphql/gql/mutations/updateObjectiveProgress.gql index 9f939931..7dd9320f 100644 --- a/client/src/graphql/gql/mutations/updateObjectiveProgress.gql +++ b/client/src/graphql/gql/mutations/updateObjectiveProgress.gql @@ -1,4 +1,4 @@ -mutation UpdateObjectiveProgressInput($input: UpdateObjectiveProgressInput!) { +mutation UpdateObjectiveProgress($input: UpdateObjectiveProgressInput!) { updateObjectiveProgress(input: $input){ objective { id diff --git a/server/books/schema/mutations/main.py b/server/books/schema/mutations/main.py index db56272e..5d2bb6f4 100644 --- a/server/books/schema/mutations/main.py +++ b/server/books/schema/mutations/main.py @@ -1,5 +1,5 @@ from books.schema.mutations.contentblock import MutateContentBlock, AddContentBlock, DeleteContentBlock -from books.schema.mutations.module import UpdateSolutionVisibility +from books.schema.mutations.module import UpdateSolutionVisibility, UpdateLastModule class BookMutations(object): @@ -7,3 +7,4 @@ class BookMutations(object): add_content_block = AddContentBlock.Field() delete_content_block = DeleteContentBlock.Field() update_solution_visibility = UpdateSolutionVisibility.Field() + update_last_module = UpdateLastModule.Field() diff --git a/server/books/schema/mutations/module.py b/server/books/schema/mutations/module.py index 9e590181..7c3e9a2a 100644 --- a/server/books/schema/mutations/module.py +++ b/server/books/schema/mutations/module.py @@ -3,6 +3,7 @@ from graphene import relay from api.utils import get_errors, get_object from books.models import Module +from books.schema.queries import ModuleNode class UpdateSolutionVisibility(relay.ClientIDMutation): @@ -38,3 +39,33 @@ class UpdateSolutionVisibility(relay.ClientIDMutation): errors = ['Error: {}'.format(e)] return cls(success=False, solutions_enabled=None, errors=errors) + + +class UpdateLastModule(relay.ClientIDMutation): + class Input: + id = graphene.ID() + + module = graphene.Field(ModuleNode) + errors = graphene.List(graphene.String) + + @classmethod + def mutate_and_get_payload(cls, root, info, **args): + try: + user = info.context.user + id = args.get('id') + + module = get_object(Module, id) + if not module: + raise Module.DoesNotExist + + user.last_module = module + user.save() + + return cls(module=module) + + except Module.DoesNotExist: + return cls(errors=['Module not found']) + + except Exception as e: + errors = ['Error: {}'.format(e)] + return cls(errors=errors) diff --git a/server/books/schema/queries.py b/server/books/schema/queries.py index 3473a790..c2804209 100644 --- a/server/books/schema/queries.py +++ b/server/books/schema/queries.py @@ -199,8 +199,6 @@ class BookQuery(object): def resolve_module(self, info, **kwargs): slug = kwargs.get('slug') id = kwargs.get('id') - # save last visited module in user - user = info.context.user module = None if id is not None: @@ -209,10 +207,6 @@ class BookQuery(object): elif slug is not None: module = Module.objects.get(slug=slug) - if module is not None: - user.last_module = module - user.save() - return module def resolve_topic(self, info, **kwargs):