diff --git a/server/api/public_schema.py b/server/api/schema_public.py similarity index 59% rename from server/api/public_schema.py rename to server/api/schema_public.py index f0c2abae..69c972aa 100644 --- a/server/api/public_schema.py +++ b/server/api/schema_public.py @@ -5,7 +5,7 @@ from graphene_django.debug import DjangoDebug from users.schema_public import UsersQuery -from users.mutations import ProfileMutations +from users.mutations_public import UserMutations class Query(UsersQuery, graphene.ObjectType): @@ -15,11 +15,10 @@ class Query(UsersQuery, graphene.ObjectType): debug = graphene.Field(DjangoDebug, name='__debug') -# class Mutation(BookMutations, RoomMutations, AssignmentMutations, ObjectiveMutations, CoreMutations, PortfolioMutations, -# ProfileMutations, SurveysMutations, graphene.ObjectType): +class Mutation(UserMutations, graphene.ObjectType): if settings.DEBUG: debug = graphene.Field(DjangoDebug, name='__debug') -schema = graphene.Schema(query=Query) +schema = graphene.Schema(query=Query, mutation=Mutation) diff --git a/server/api/urls.py b/server/api/urls.py index b3002aea..69beea15 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -3,7 +3,7 @@ from django.conf.urls import url from django.views.decorators.csrf import csrf_exempt from graphene_django.views import GraphQLView -from api.public_schema import schema +from api.schema_public import schema from core.views import PrivateGraphQLView @@ -15,7 +15,7 @@ urlpatterns = [ if settings.DEBUG: urlpatterns += [url(r'^graphiql-public', csrf_exempt(GraphQLView.as_view(schema=schema, graphiql=True, - pretty=True)))] + pretty=True)))] urlpatterns += [url(r'^graphiql', csrf_exempt(PrivateGraphQLView.as_view(graphiql=True, pretty=True)))] diff --git a/server/users/mutations_public.py b/server/users/mutations_public.py new file mode 100644 index 00000000..0c186b4f --- /dev/null +++ b/server/users/mutations_public.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# +# ITerativ GmbH +# http://www.iterativ.ch/ +# +# Copyright (c) 2019 ITerativ GmbH. All rights reserved. +# +# Created on 2019-10-01 +# @author: chrigu +import graphene +from django.contrib.auth import authenticate, login +from graphene import relay + + +class FieldError(graphene.ObjectType): + code = graphene.String() + + +class UpdateError(graphene.ObjectType): + field = graphene.String() + errors = graphene.List(FieldError) + + +class Login(relay.ClientIDMutation): + class Input: + username_input = graphene.String() + password_input = graphene.String() + + success = graphene.Boolean() + errors = graphene.List(UpdateError) # todo: change for consistency + + @classmethod + def mutate_and_get_payload(cls, root, info, **kwargs): + + user = authenticate(username=kwargs.get('username_input'), password=kwargs.get('password_input')) + if user is not None: + login(info.context, user) + return cls(success=True, errors=[]) + else: + return cls(success=False, errors=['invalid_credentials']) + + +class UserMutations: + login = Login.Field() + +