From a0e99e5ba9402f10eb3c4287dd592b38295f239d Mon Sep 17 00:00:00 2001 From: knst-kotov Date: Wed, 4 Aug 2021 13:38:56 +0000 Subject: [PATCH] return value unification --- auth/authenticate.py | 2 +- resolvers/auth.py | 29 ++++++--------------- resolvers/base.py | 23 ++-------------- resolvers/inbox.py | 37 ++++++++------------------ schema.graphql | 62 ++++++++++++++++++++------------------------ 5 files changed, 50 insertions(+), 103 deletions(-) diff --git a/auth/authenticate.py b/auth/authenticate.py index 60f9d6ef..15b92e74 100644 --- a/auth/authenticate.py +++ b/auth/authenticate.py @@ -71,6 +71,6 @@ def login_required(func): async def wrap(parent, info: GraphQLResolveInfo, *args, **kwargs): auth: AuthCredentials = info.context["request"].auth if not auth.logged_in: - raise OperationNotAllowed(auth.error_message or "Please login") + return {"error" : auth.error_message or "Please login"} return await func(parent, info, *args, **kwargs) return wrap diff --git a/resolvers/auth.py b/resolvers/auth.py index 108846d1..50aa3cbc 100644 --- a/resolvers/auth.py +++ b/resolvers/auth.py @@ -7,7 +7,7 @@ from auth.password import Password from auth.validations import CreateUser from orm import User from orm.base import global_session -from resolvers.base import mutation, query, sign_in_result, register_user_result, ApiError +from resolvers.base import mutation, query from exceptions import InvalidPassword from settings import JWT_AUTH_HEADER @@ -18,9 +18,9 @@ async def confirm(*_, confirm_token): if auth_token: user.emailConfirmed = True user.save() - return { "status": True, "token": auth_token } + return { "token": auth_token, "user" : user} else: - return { "status": False, "error": "Email not confirmed"} + return { "error": "Email not confirmed"} @mutation.field("registerUser") @@ -41,18 +41,12 @@ async def register(*_, email: str, password: str = ""): token = await Authorize.authorize(user) return {"user": user, "token": token } -@register_user_result.type_resolver -def resolve_register_user_result(obj, *_): - if isinstance(obj, ApiError): - return "ApiError" - return "RegisterUserOk" - @query.field("signIn") async def sign_in(_, info: GraphQLResolveInfo, email: str, password: str): orm_user = global_session.query(User).filter(User.email == email).first() if orm_user is None: - return ApiError("invalid email") + return {"error" : "invalid email"} try: device = info.context["request"].headers['device'] @@ -63,25 +57,18 @@ async def sign_in(_, info: GraphQLResolveInfo, email: str, password: str): try: user = Identity.identity(user_id=orm_user.id, password=password) except InvalidPassword: - return ApiError("invalid password") + return {"error" : "invalid password"} token = await Authorize.authorize(user, device=device, auto_delete=auto_delete) return {"token" : token, "user": user} -@sign_in_result.type_resolver -def resolve_sign_in_result(obj, *_): - if isinstance(obj, ApiError): - return "ApiError" - return "SignInOk" - @query.field("signOut") @login_required async def sign_out(_, info: GraphQLResolveInfo): token = info.context["request"].headers[JWT_AUTH_HEADER] status = await Authorize.revoke(token) - return {"status" : status} - + return {} @query.field("getCurrentUser") @login_required @@ -89,9 +76,9 @@ async def get_user(_, info): auth = info.context["request"].auth user_id = auth.user_id user = global_session.query(User).filter(User.id == user_id).first() - return { "status": True, "user": user } + return { "user": user } @query.field("isEmailFree") async def is_email_free(_, info, email): user = global_session.query(User).filter(User.email == email).first() - return { "status": user is None } + return user is None diff --git a/resolvers/base.py b/resolvers/base.py index 3f8c03f7..68414507 100644 --- a/resolvers/base.py +++ b/resolvers/base.py @@ -1,4 +1,4 @@ -from ariadne import MutationType, QueryType, SubscriptionType, ScalarType, InterfaceType, UnionType +from ariadne import MutationType, QueryType, SubscriptionType, ScalarType query = QueryType() @@ -12,23 +12,4 @@ datetime_scalar = ScalarType("DateTime") def serialize_datetime(value): return value.isoformat() - -class ApiError: - def __init__(self, message): - self.message = message - -error_interface = InterfaceType("ErrorInterface") - -@error_interface.type_resolver -def resolve_search_result_type(obj, *_): - if isinstance(obj, ApiError): - return "ApiError" - - -sign_in_result = UnionType("SignInResult") -register_user_result = UnionType("RegisterUserResult") - -results = [sign_in_result, register_user_result] - -resolvers = [query, mutation, subscription, datetime_scalar, error_interface] -resolvers.extend(results) +resolvers = [query, mutation, subscription, datetime_scalar] diff --git a/resolvers/inbox.py b/resolvers/inbox.py index c2e39255..9104ac24 100644 --- a/resolvers/inbox.py +++ b/resolvers/inbox.py @@ -17,22 +17,19 @@ class MessageQueue: @mutation.field("createMessage") @login_required -async def create_message(_, info, input): +async def create_message(_, info, body, replyTo = None): auth = info.context["request"].auth user_id = auth.user_id new_message = Message.create( author = user_id, - body = input["body"], - replyTo = input.get("replyTo") + body = body, + replyTo = replyTo ) MessageQueue.new_message.put_nowait(new_message) - return { - "status": True, - "message" : new_message - } + return {"message" : new_message} @query.field("getMessages") @login_required @@ -57,28 +54,21 @@ def check_and_get_message(message_id, user_id) : @mutation.field("updateMessage") @login_required -async def update_message(_, info, input): +async def update_message(_, info, id, body): auth = info.context["request"].auth user_id = auth.user_id - message_id = input["id"] try: - message = check_and_get_message(message_id, user_id) + message = check_and_get_message(id, user_id) except Exception as err: - return { - "status" : False, - "error" : err - } + return {"error" : err} - message.body = input["body"] + message.body = body global_session.commit() MessageQueue.updated_message.put_nowait(message) - return { - "status" : True, - "message" : message - } + return {"message" : message} @mutation.field("deleteMessage") @login_required @@ -89,19 +79,14 @@ async def delete_message(_, info, id): try: message = check_and_get_message(id, user_id) except Exception as err: - return { - "status" : False, - "error" : err - } + return {"error" : err} global_session.delete(message) global_session.commit() MessageQueue.deleted_message.put_nowait(message) - return { - "status" : True - } + return {} @subscription.source("messageCreated") diff --git a/schema.graphql b/schema.graphql index 311fc34a..91682309 100644 --- a/schema.graphql +++ b/schema.graphql @@ -2,34 +2,28 @@ scalar DateTime ################################### Payload -interface ErrorInterface { - message: String! +type Result { + error: String } -type ApiError implements ErrorInterface { - message: String! -} - -type SignInOk { - token: String! - user: User! -} - -union SignInResult = ApiError | SignInOk - -type RegisterUserOk { - token: String - user: User! -} - -union RegisterUserResult = ApiError | RegisterUserOk - -type ResultPayload { - status: Boolean! +type SignInResult { error: String token: String - user: User + user: User +} + +type UserResult { + error: String + user: User +} + +type MessageResult { + error: String message: Message +} + +type ShoutResult { + error: String shout: Shout } @@ -37,23 +31,23 @@ type ResultPayload { type Mutation { # message - createMessage(body: String!, replyTo: Int): ResultPayload! - updateMessage(id: Int!, body: String!): ResultPayload! - deleteMessage(messageId: Int!): ResultPayload! + createMessage(body: String!, replyTo: Int): MessageResult! + updateMessage(id: Int!, body: String!): MessageResult! + deleteMessage(messageId: Int!): Result! # auth # resetPassword(password: String!, token: String!): Token! - confirmEmail(token: String!): ResultPayload! + confirmEmail(token: String!): SignInResult! # invalidateAllTokens: Boolean! # invalidateTokenById(id: Int!): Boolean! # requestEmailConfirmation: User! # requestPasswordReset(email: String!): Boolean! - registerUser(email: String!, password: String!): RegisterUserResult! + registerUser(email: String!, password: String!): SignInResult! # shout - createShout: ResultPayload! - deleteShout(shoutId: Int!): ResultPayload! - rateShout(value: Int!): ResultPayload! + createShout: ShoutResult! + deleteShout(shoutId: Int!): Result! + rateShout(value: Int!): Result! # profile # rateUser(value: Int!): ResultPayload! @@ -65,10 +59,10 @@ type Mutation { type Query { # auth / user - isEmailFree(email: String!): ResultPayload! + isEmailFree(email: String!): Boolean! signIn(email: String!, password: String!): SignInResult! - signOut: ResultPayload! - getCurrentUser: ResultPayload! + signOut: Result! + getCurrentUser: UserResult! # getUserById(id: Int!): ResultPayload! # getUserRating(shout: Int): Int!