♻ Split types, mutations, queries by model

This commit is contained in:
nikolark committed 2022-02-19 14:31:05 +01:00
1 parent 3274cb96c0
commit 41638e605f
13 files changed
+193 -156

No files matched your search

View File
Whitespace-only changes.
@@ -7,7 +7,8 @@ from strawberry import ID
from main import models from main import models
from main.api.errors import Error, FieldError, FormErrors from main.api.errors import Error, FieldError, FormErrors
from main.api.types import Order, Transaction from main.api.types.inventory import Transaction
from main.api.types.shop import Order
UserModel = get_user_model() UserModel = get_user_model()
@@ -128,3 +129,9 @@ def create_deposit(user_id: ID, amount: int) -> CreateDepositResponse:
profile.save() profile.save()
return CreateDepositSuccess(transaction=trans) return CreateDepositSuccess(transaction=trans)
@strawberry.type
class ShopMutations:
create_order = create_order
create_deposit = create_deposit
View File
Whitespace-only changes.
+9
View File
@@ -0,0 +1,9 @@
import strawberry
import strawberry_django
from main.api.types.inventory import Transaction, TransactionOrdering
@strawberry.type
class InventoryQueries:
transaction_list: list[Transaction] = strawberry_django.field(pagination=True, order=TransactionOrdering)
+24
View File
@@ -0,0 +1,24 @@
import strawberry
import strawberry_django
from main import models
from main.api.types.shop import Order, OrderOrdering, OrderStats, OrderStatsByTime, Product
@strawberry.type
class ShopQueries:
all_products: list[Product] = strawberry_django.field()
all_orders: list[Order] = strawberry_django.field()
order_list: list[Order] = strawberry_django.field(pagination=True, order=OrderOrdering)
@strawberry.field
def order_stats(self) -> OrderStats:
return OrderStats(
**{
period: [
OrderStatsByTime(**stat)
for stat in models.Order.objects.count_by_created_period(period).order_by("period")
]
for period in ["yearly", "monthly", "daily", "hourly"]
}
)
+15
View File
@@ -0,0 +1,15 @@
import strawberry
import strawberry_django
from django.contrib.auth.models import User as DjangoUser
from strawberry import ID
from main.api.types.users import User
@strawberry.type
class UsersQueries:
all_users: list[User] = strawberry_django.field()
@strawberry.field
def user(self, user_id: ID) -> User:
return DjangoUser.objects.get(pk=user_id)
+8 -40
View File
@@ -1,51 +1,19 @@
import strawberry import strawberry
import strawberry_django
from django.contrib.auth.models import User as DjangoUser
from strawberry import ID
from main import models from main.api.mutations.shop import ShopMutations
from main.api import mutations from main.api.queries.inventory import InventoryQueries
from main.api.types import ( from main.api.queries.shop import ShopQueries
Order, from main.api.queries.users import UsersQueries
OrderOrdering,
OrderStats,
OrderStatsByTime,
Product,
Transaction,
TransactionOrdering,
User,
)
@strawberry.type @strawberry.type
class Query: class Query(InventoryQueries, ShopQueries, UsersQueries):
all_products: list[Product] = strawberry_django.field() pass
all_users: list[User] = strawberry_django.field()
all_orders: list[Order] = strawberry_django.field()
order_list: list[Order] = strawberry_django.field(pagination=True, order=OrderOrdering)
transaction_list: list[Transaction] = strawberry_django.field(pagination=True, order=TransactionOrdering)
@strawberry.field
def user(self, user_id: ID) -> User:
return DjangoUser.objects.get(pk=user_id)
@strawberry.field
def order_stats(self) -> OrderStats:
return OrderStats(
**{
period: [
OrderStatsByTime(**stat)
for stat in models.Order.objects.count_by_created_period(period).order_by("period")
]
for period in ["yearly", "monthly", "daily", "hourly"]
}
)
@strawberry.type @strawberry.type
class Mutation: class Mutation(ShopMutations):
create_order = mutations.create_order pass
create_deposit = mutations.create_deposit
schema = strawberry.Schema(query=Query, mutation=Mutation) schema = strawberry.Schema(query=Query, mutation=Mutation)
-115
View File
@@ -1,115 +0,0 @@
import json
from datetime import datetime
from typing import Any, NewType
import strawberry
import strawberry_django
from django.contrib.auth import get_user_model
from strawberry_django import auto
from main import models
UserModel = get_user_model()
JSONScalar = strawberry.scalar(
NewType("JSONScalar", Any),
serialize=lambda v: v,
parse_value=lambda v: json.loads(v),
description="The GenericScalar scalar type represents a generic GraphQL scalar value that could be: List or Object.",
)
@strawberry_django.filters.filter(models.Product)
class ProductFilter:
id: auto
active: auto
@strawberry_django.type(models.Product, filters=ProductFilter)
class Product:
id: auto
name: auto
image_url: str
sale_price_int: auto
sale_price_ext: auto
# FIXME: stricter types
user_counts: JSONScalar
@strawberry.type
class TopMonth:
period: str
count: int
sum: int
@strawberry_django.type(models.UserProfile)
class UserProfile:
id: auto
balance: auto
image: auto
last_purchase_date: datetime
order_sum_total: float
@strawberry.field()
def top_months(self) -> list[TopMonth]:
return [TopMonth(**month) for month in self.top_months()]
@strawberry_django.type(UserModel)
class User:
id: auto
first_name: auto
last_name: auto
profile: UserProfile
@strawberry_django.ordering.order(models.Order)
class OrderOrdering:
created: auto
@strawberry_django.type(models.Order)
class Order:
id: auto
customer: "User"
order_sum: auto
created: auto
orderlines: list["OrderLine"]
is_external: bool
@strawberry_django.type(models.OrderLine)
class OrderLine:
id: auto
order: "Order"
product: "Product"
amount: auto
unit_price: auto
@strawberry.type
class OrderStatsByTime:
period: int
count: str
@strawberry.type
class OrderStats:
yearly: list[OrderStatsByTime]
monthly: list[OrderStatsByTime]
daily: list[OrderStatsByTime]
hourly: list[OrderStatsByTime]
@strawberry_django.ordering.order(models.Transaction)
class TransactionOrdering:
created: auto
@strawberry_django.type(models.Transaction)
class Transaction:
id: auto
user: "User"
amount: auto
created: auto
View File
Whitespace-only changes.
+18
View File
@@ -0,0 +1,18 @@
import strawberry_django
from strawberry_django import auto
from main import models
from main.api.types.users import User
@strawberry_django.ordering.order(models.Transaction)
class TransactionOrdering:
created: auto
@strawberry_django.type(models.Transaction)
class Transaction:
id: auto
user: "User"
amount: auto
created: auto
+62
View File
@@ -0,0 +1,62 @@
import strawberry
import strawberry_django
from strawberry_django import auto
from main import models
from main.api.types.users import User
from main.api.types.utils import JSONScalar
@strawberry_django.filters.filter(models.Product)
class ProductFilter:
id: auto
active: auto
@strawberry_django.type(models.Product, filters=ProductFilter)
class Product:
id: auto
name: auto
image_url: str
sale_price_int: auto
sale_price_ext: auto
# FIXME: stricter types
user_counts: JSONScalar
@strawberry_django.ordering.order(models.Order)
class OrderOrdering:
created: auto
@strawberry_django.type(models.Order)
class Order:
id: auto
customer: User
order_sum: auto
created: auto
orderlines: list["OrderLine"]
is_external: bool
@strawberry_django.type(models.OrderLine)
class OrderLine:
id: auto
order: Order
product: Product
amount: auto
unit_price: auto
@strawberry.type
class OrderStatsByTime:
period: int
count: str
@strawberry.type
class OrderStats:
yearly: list[OrderStatsByTime]
monthly: list[OrderStatsByTime]
daily: list[OrderStatsByTime]
hourly: list[OrderStatsByTime]
+38
View File
@@ -0,0 +1,38 @@
from datetime import datetime
import strawberry
import strawberry_django
from django.contrib.auth import get_user_model
from strawberry_django import auto
from main import models
UserModel = get_user_model()
@strawberry.type
class TopMonth:
period: str
count: int
sum: int
@strawberry_django.type(models.UserProfile)
class UserProfile:
id: auto
balance: auto
image: auto
last_purchase_date: datetime
order_sum_total: float
@strawberry.field()
def top_months(self) -> list[TopMonth]:
return [TopMonth(**month) for month in self.top_months()]
@strawberry_django.type(UserModel)
class User:
id: auto
first_name: auto
last_name: auto
profile: UserProfile
+11
View File
@@ -0,0 +1,11 @@
import json
from typing import Any, NewType
import strawberry
JSONScalar = strawberry.scalar(
NewType("JSONScalar", Any),
serialize=lambda v: v,
parse_value=lambda v: json.loads(v),
description="The GenericScalar scalar type represents a generic GraphQL scalar value that could be: List or Object.",
)