Skip to content

Commit

Permalink
refactor: restructure and cleanup code for api schema.py
Browse files Browse the repository at this point in the history
  • Loading branch information
awaisdar001 committed Jan 6, 2022
1 parent a23dd11 commit 9de1c65
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 33 deletions.
17 changes: 17 additions & 0 deletions scheduler/api/schema.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import graphene
from graphql_auth.schema import UserQuery

from scheduler.meeting_scheduler.schema import (
AvailabilityQuery, BookingQuery, AvailabilityMutation, BookingMutation, UserMutation
)


class Query(BookingQuery, AvailabilityQuery, UserQuery):
pass


class Mutation(AvailabilityMutation, BookingMutation, UserMutation):
pass


schema = graphene.Schema(query=Query, mutation=Mutation)
2 changes: 1 addition & 1 deletion scheduler/api/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"""
from datetime import time

from scheduler.meeting_scheduler.schema import schema
from .schema import schema
from scheduler.meeting_scheduler.tests import BaseTests


Expand Down
3 changes: 1 addition & 2 deletions scheduler/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@
from django.views.decorators.csrf import csrf_exempt
from graphene_django.views import GraphQLView

from scheduler.meeting_scheduler.schema import schema
from .schema import schema

urlpatterns = [
path("graphql", csrf_exempt(GraphQLView.as_view(graphiql=True, schema=schema))),

]
3 changes: 2 additions & 1 deletion scheduler/meeting_scheduler/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
from django.contrib import admin
from django.contrib.sessions.models import Session

from scheduler.meeting_scheduler.models import Booking, Availability, UserModel as User
from .models import Booking, Availability, UserModel as User


class SessionAdmin(admin.ModelAdmin):
"""Django session model admin """

def _session_data(self, obj):
"""Return decoded session data."""
return obj.get_decoded()
Expand Down
8 changes: 4 additions & 4 deletions scheduler/meeting_scheduler/mutations.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
import graphene
from graphql import GraphQLError

from scheduler.meeting_scheduler.decorators import user_required
from scheduler.meeting_scheduler.enums import Description
from scheduler.meeting_scheduler.models import Booking, UserModel as User, Availability
from scheduler.meeting_scheduler.nodes import BookingNode, AvailabilityNode
from .decorators import user_required
from .enums import Description
from .models import Booking, UserModel as User, Availability
from .nodes import BookingNode, AvailabilityNode


class CreateBooking(graphene.Mutation):
Expand Down
2 changes: 1 addition & 1 deletion scheduler/meeting_scheduler/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import graphene
from graphene_django import DjangoObjectType

from scheduler.meeting_scheduler.models import Booking, Availability, UserModel
from .models import Booking, Availability, UserModel


class UserType(DjangoObjectType):
Expand Down
55 changes: 32 additions & 23 deletions scheduler/meeting_scheduler/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,29 +3,39 @@
from graphql_auth.schema import UserQuery
from graphql_jwt.decorators import user_passes_test

from scheduler.meeting_scheduler.models import Booking, Availability
from scheduler.meeting_scheduler.mutations import (
from .models import Booking, Availability
from .mutations import (
CreateBooking, CreateAvailability, DeleteAvailability, UpdateAvailability,
)
from scheduler.meeting_scheduler.nodes import AvailabilityNode, BookingNode
from .nodes import AvailabilityNode, BookingNode


class Query(UserQuery, graphene.ObjectType):
class BookingQuery(graphene.ObjectType):
"""
Describes entry point for fields to *read* data in the booking Schema.
Describes entry point for fields to *read* data in the booking schema.
"""
availabilities = graphene.List(AvailabilityNode)
availability = graphene.Field(AvailabilityNode, id=graphene.Int(
required=True, description="ID of a availability to view"
))

bookings_by_user = graphene.List(
BookingNode,
username=graphene.String(required=True),
# Alternative
# username=graphene.Argument(graphene.String, description="Pass username of the user.", required=True),
)

@classmethod
def resolve_bookings_by_user(cls, root, info, username):
"""Resolve bookings by user"""
return Booking.objects.filter(user__username=username).prefetch_related('user')


class AvailabilityQuery(UserQuery, graphene.ObjectType):
"""
Describes entry point for fields to *read* data in the availability schema.
"""
availabilities = graphene.List(AvailabilityNode)
availability = graphene.Field(AvailabilityNode, id=graphene.Int(
required=True, description="ID of a availability to view"
))

@classmethod
@user_passes_test(lambda user: user and not user.is_anonymous)
def resolve_availabilities(cls, root, info):
Expand All @@ -38,27 +48,26 @@ def resolve_availability(cls, root, info, id):
"""Resolve the user availability field"""
return Availability.objects.get(id=id, user=info.context.user)

@classmethod
def resolve_bookings_by_user(cls, root, info, username):
"""Resolve bookings by user"""
return Booking.objects.filter(user__username=username).prefetch_related('user')

class BookingMutation(graphene.ObjectType):
"""
Describes entry point for fields to *create* data in bookings API.
"""
create_booking = CreateBooking.Field()


class Mutation(graphene.ObjectType):
class AvailabilityMutation(graphene.ObjectType):
"""
Describes entry point for fields to *create, update or delete* data in bookings API.
Describes entry point for fields to *create, update or delete* data in availability API.
"""
# Availability mutations
create_availability = CreateAvailability.Field()
update_availability = UpdateAvailability.Field()
delete_availability = DeleteAvailability.Field()

# Booking mutations
create_booking = CreateBooking.Field()

# User mutations
class UserMutation(graphene.ObjectType):
"""
Describes entry point for fields to *login, verify token* data in user API.
"""
login = mutations.ObtainJSONWebToken.Field(description="Login and obtain token for the user")
verify_token = mutations.VerifyToken.Field(description="Verify if the token is valid.")


schema = graphene.Schema(query=Query, mutation=Mutation)
2 changes: 1 addition & 1 deletion scheduler/meeting_scheduler/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from django.test import TestCase

from scheduler.meeting_scheduler.models import Booking, UserModel, Availability
from .models import Booking, UserModel, Availability


class BaseTests(TestCase):
Expand Down

0 comments on commit 9de1c65

Please sign in to comment.