-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
140 lines (111 loc) · 3.96 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Imports
from flask import Flask
import graphene
from graphene_sqlalchemy import SQLAlchemyObjectType, SQLAlchemyConnectionField
from flask_sqlalchemy import SQLAlchemy
from flask_graphql import GraphQLView
# initializing our app
app = Flask(__name__)
app.debug = True
# Configs
# Our database configurations will go here
# Replace the user, password, hostname and database according to your configuration information
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:postgres@localhost:5432/graphql'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# Modules
# SQLAlchemy will be initiated here
db = SQLAlchemy(app)
# Models
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, index=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
books = db.relationship('Book', backref='author')
def __init__(self, username, email):
self.username = username
self.email = email
def __repr__(self):
return '' % self.id
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(256), index=True, nullable=False)
description = db.Column(db.Text, nullable=False)
year = db.Column(db.Integer, nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
def __repr__(self):
return '' % self.title % self.description % self.year % self.author_id
# mike = User(username='mikedean', email='[email protected]')
# db.session.add(mike)
# db.session.commit()
# flaskbook = Book()
# flaskbook.title = "Building with Flask"
# flaskbook.description = "The best Flask Python book on the web"
# flaskbook.year = 2019
# flaskbook.author_id = mike.id
# db.session.add(flaskbook)
# db.session.commit()
# Our relations will be setup here
# Schema Objects
# Our schema objects will go here
class BookObject(SQLAlchemyObjectType):
class Meta:
model = Book
interfaces = (graphene.relay.Node, )
class UserObject(SQLAlchemyObjectType):
class Meta:
model = User
interfaces = (graphene.relay.Node, )
class Query(graphene.ObjectType):
node = graphene.relay.Node.Field()
all_books = SQLAlchemyConnectionField(BookObject)
all_users = SQLAlchemyConnectionField(UserObject)
schema = graphene.Schema(query=Query)
class BookObject(SQLAlchemyObjectType):
class Meta:
model = Book
interfaces = (graphene.relay.Node, )
class UserObject(SQLAlchemyObjectType):
class Meta:
model = User
interfaces = (graphene.relay.Node, )
class Query(graphene.ObjectType):
node = graphene.relay.Node.Field()
all_books = SQLAlchemyConnectionField(BookObject)
all_users = SQLAlchemyConnectionField(UserObject)
schema = graphene.Schema(query=Query)
class AddBook(graphene.Mutation):
class Arguments:
title = graphene.String(required=True)
description = graphene.String(required=True)
year = graphene.Int(required=True)
username = graphene.String(required=True)
book = graphene.Field(lambda: BookObject)
def mutate(self, info, title, description, year, username):
user = User.query.filter_by(username=username).first()
book = Book(title=title, description=description, year=year)
if user is not None:
book.author = user
db.session.add(book)
db.session.commit()
return AddBook(book=book)
class Mutation(graphene.ObjectType):
add_book = AddBook.Field()
schema = graphene.Schema(query=Query, mutation=Mutation)
# Routes
# Our GraphQL route will go here
app.add_url_rule(
'/graphql-api',
view_func=GraphQLView.as_view(
'graphql',
schema=schema,
graphiql=True # for having the GraphiQL interface
)
)
@app.route('/')
def index():
return 'Welcome to Book Store Api'
if __name__ == '__main__':
app.run()