Skip to content

Commit 4a21b2d

Browse files
Use strawberry-graphql-django as dependency
strawberry-graphql-django is moving under strawberry-graphql as the official django integration, so better to use this (DRY, etc.) Fix bug with set_hero
1 parent 97cdb20 commit 4a21b2d

File tree

4 files changed

+51
-37
lines changed

4 files changed

+51
-37
lines changed

django-subscriptions-rxdb/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ uvicorn = {extras = ["standard"], version = "^0.13.4"}
1313
django-cors-headers = "^3.7.0"
1414
psycopg2-binary = {version = "^2.8.6", extras = ["postgres"], optional = true}
1515
broadcaster = {extras = ["postgres"], version = "^0.2.0"}
16+
strawberry-graphql-django = "^0.0.6"
1617

1718
[tool.poetry.extras]
1819
postgres = ["psycopg2-binary"]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.1.7 on 2021-03-03 02:54
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("api", "0001_initial"),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name="hero",
15+
name="deleted",
16+
field=models.BooleanField(),
17+
),
18+
]

django-subscriptions-rxdb/src/api/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ class Hero(models.Model):
1111
color = models.CharField(max_length=100)
1212
name = models.CharField(max_length=100, null=True)
1313
updatedAt = models.FloatField(max_length=100, null=True)
14-
deleted = models.BooleanField(default=True)
14+
deleted = models.BooleanField()

django-subscriptions-rxdb/src/api/schema.py

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -5,44 +5,43 @@
55
import traceback
66
from typing import List, Optional
77

8-
import django.core.serializers
98
import strawberry
109
from asgiref.sync import sync_to_async
10+
from django.core.serializers import deserialize, serialize
1111
from django.db.models import Q
12+
from strawberry_django import ModelResolver, types
1213

1314
from api import models
1415

1516

16-
# input HeroInput {
17+
class HeroResolver(ModelResolver):
18+
model = models.Hero
19+
20+
21+
# type Hero {
1722
# id: String
1823
# name: String
1924
# color: String!
2025
# updatedAt: Float
2126
# deleted: Boolean!
2227
# }
23-
@strawberry.input
24-
class HeroInput:
25-
id: str
26-
color: str
27-
name: Optional[str] = ""
28-
updatedAt: Optional[float] = 0
29-
deleted: Optional[bool] = False
28+
class Hero(HeroResolver.output_type):
29+
pass
3030

3131

32-
# type Hero {
32+
# input HeroInput {
3333
# id: String
3434
# name: String
3535
# color: String!
3636
# updatedAt: Float
3737
# deleted: Boolean!
3838
# }
39-
@strawberry.type
40-
class Hero:
41-
id: str
42-
color: str
43-
name: Optional[str] = ""
44-
updatedAt: Optional[float] = 0
45-
deleted: Optional[bool] = False
39+
# The client code expects the input type to be called "HeroInput", not "CreateHero", which is the default
40+
# We therefore need to create a new type via the strawberry.input decorator
41+
# class HeroInput(HeroResolver.create_input_type):
42+
@strawberry.input
43+
class HeroInput(HeroResolver.create_input_type):
44+
pass
4645

4746

4847
def filterHeroes(
@@ -68,9 +67,11 @@ def filterHeroes(
6867

6968
@strawberry.type
7069
class Query:
71-
@strawberry.field
72-
def hello() -> str:
73-
return "world"
70+
## to include the auto-generated methods from strawberry-graphql-django:
71+
## - hero(id: ID!): Hero!
72+
## - heros(filters: [String!] = null): [Hero!]!
73+
## declare the class as
74+
## class Query(HeroResolver.query()):
7475

7576
# type Query {
7677
# feedHero(id: String, updatedAt: Float, limit: Int!): [Hero!]!
@@ -89,15 +90,6 @@ class Mutation:
8990
# }
9091
@strawberry.mutation
9192
async def set_hero(self, info, hero: HeroInput = None) -> Hero:
92-
print(f"Creating Hero from HeroInput {hero}")
93-
94-
shero = Hero(
95-
id=hero.id,
96-
color=hero.color,
97-
name=hero.name,
98-
updatedAt=hero.updatedAt,
99-
deleted=hero.deleted,
100-
)
10193
try:
10294
dhero = await sync_to_async(models.Hero.objects.get)(id=hero.id)
10395
except models.Hero.DoesNotExist:
@@ -106,15 +98,20 @@ async def set_hero(self, info, hero: HeroInput = None) -> Hero:
10698
dhero.color = hero.color
10799
dhero.name = hero.name
108100
dhero.updatedAt = int(time.time())
109-
110101
dhero.deleted = hero.deleted
111-
await sync_to_async(dhero.save)()
112102

103+
await sync_to_async(dhero.save)()
113104
await info.context.broadcast.publish(
114-
channel="heros", message=django.core.serializers.serialize("json", [dhero])
105+
channel="heros", message=serialize("json", [dhero])
115106
)
116107

117-
return shero
108+
return Hero(
109+
id=dhero.id,
110+
color=dhero.color,
111+
name=dhero.name,
112+
updatedAt=dhero.updatedAt,
113+
deleted=dhero.deleted,
114+
)
118115

119116

120117
@strawberry.type
@@ -126,9 +123,7 @@ class Subscription:
126123
async def changed_hero(self, info, token: str) -> Hero:
127124
async with info.context.broadcast.subscribe(channel="heros") as subscriber:
128125
async for event in subscriber:
129-
hero = list(django.core.serializers.deserialize("json", event.message))[
130-
0
131-
].object
126+
hero = list(deserialize("json", event.message))[0].object
132127
yield Hero(
133128
id=hero.id,
134129
color=hero.color,

0 commit comments

Comments
 (0)