Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
GOOGLE_APPLICATION_CREDENTIALS="./key.json"
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,7 @@ __pycache__

# Environment files
*.env
!example.env
!example.env

# firebase key file
key.json
12 changes: 3 additions & 9 deletions Pipfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,15 @@ pylint = "*"

[packages]
flask = "*"
sqlalchemy = "*"
flask-cors = "*"
flask-swagger = "*"
flask-sqlalchemy = "*"
flask-migrate = "*"
python-dotenv = "*"
mysql-connector-python = "*"
psycopg2-binary = "*"
flask-dotenv = "*"
firebase-admin = "*"

[requires]
python_version = "3.7"

[scripts]
start="flask run -p 3000 -h 0.0.0.0"
init="flask db init"
migrate="flask db migrate"
upgrade="flask db upgrade"
start="now dev"
deploy="now --prod"
445 changes: 294 additions & 151 deletions Pipfile.lock

Large diffs are not rendered by default.

Empty file removed api/test/__init__.py
Empty file.
8 changes: 0 additions & 8 deletions api/test/main.py

This file was deleted.

157 changes: 124 additions & 33 deletions api/user/index.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,132 @@
import os
from flask import Flask, request, jsonify, url_for, Blueprint, Response
# from flask_dotenv import DotEnv
# from flask_sqlalchemy import SQLAlchemy
# from flask_migrate import Migrate
from flask_swagger import swagger
from flask_cors import CORS
# from api.user.model import db,User
# This is a demo for creating a user catchall endpoint that uses firestore
# To publish this, make sure you push your environment variables to your CI/CD

import os
from flask import Flask, request, jsonify, Response
from firebase_admin import credentials, firestore, initialize_app
from .model import User

# Initialize Flask App
app = Flask(__name__)
# app.url_map.strict_slashes = False
# app.config.from_pyfile('settings.cfg')
# MIGRATE = Migrate(app, db)
# db.init_app(app)
# with app.app_context():
# db.create_all()
# db.session.commit()
# CORS(app)

# Set an environment variables for GOOGLE_APPLICATION_CREDENTIALS in .env file to test locally
# to push to production on zeit, you will need to use the CLI to define and then expose it.
cred = credentials.Certificate(os.environ['GOOGLE_APPLICATION_CREDENTIALS'])
# Initialize Firestore DB
default_app = initialize_app(cred)
db = firestore.client()
# if you are saving to a collection called users, you need to set this in a variable like so
user_ref = db.collection('users')

# the actual route is a catch-all, so you have to treat
# each request type as a conditional
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
@app.route('/<path:path>', methods=['GET','POST','PUT','DELETE'])
def catch_all(path):
return Response("<h1>Flask on Now</h1><p>You visited: /%s</p>" % (path), mimetype="text/html")


# @app.route('/api/user/', methods=["GET", "POST"])
# def user():
# if request.method == 'POST':
# request_json = request.get_json()
# name = request_json.get('username')
# email = request_json.get('email')
# new = User(username=name, email=email)
# db.session.add(new)
# db.session.commit()
# return 'User Added',200
# else:
# json_list = [i.serialize for i in User.query.all()]
# return jsonify(json_list), 200
# Get User or Users
# if you want a specific user pass an id parameter as a query string
if(request.method=="GET"):
try:
# Check if ID or Username was passed to URL query
# if so, return a single user
user_id = request.args.get('id')
user_name = request.args.get('username')

if user_id:
user_query = user_ref.where(u'id', u'==', user_id).stream()
query_result = []
for user in user_query:
query_result.append(
{
"doc_id": user.id,
"user": user.to_dict()
})
return jsonify(query_result), 200

if user_name:
user_query = user_ref.where(u'username', u'==', user_name).stream()
query_result = []
for user in user_query:
query_result.append(
{
"doc_id": user.id,
"user": user.to_dict()
})
return jsonify(query_result), 200

# Otherwise, return all users
else:
all_users = [doc.to_dict() for doc in user_ref.stream()]
return jsonify(all_users), 200

except Exception as e:
return "An exception of type {0} occurred. \nArguments: {1!r}".format(
type(e).__name__, e.args)

# Create User Record
elif(request.method=="POST"):
try:
# set up the json object
req = request.get_json()
# define parameters from object
user_id = req['user_id']
username = req['username']
first_name = req['first_name']
last_name = req['last_name']
friendly_name = req['friendly_name']
password = req['password']
password_hint = req['password_hint']
# instantiate class for object to type check
user = User(user_id=user_id, username=username, first_name=first_name,
last_name=last_name, friendly_name=friendly_name,
password=password, password_hint=password_hint)
# no errors thrown, then write the user to firestore
user_ref.document().set(user.to_dict())
# return success
return jsonify({"Success": True, "message": "The User has been successfully created."}), 200
except KeyError as e:
return f"The required property {e} is missing. Please include it in your request."
except Exception as e:
return "An exception of type {0} occurred. \nArguments: {1!r}".format(
type(e).__name__, e.args)


elif(request.method == "PUT"):
try:
id = request.json['id']
user_ref.document(id).update(request.json)
return jsonify({"Success": True, "message": "The User has been successfully updated."}), 200
except Exception as e:
return "An exception of type {0} occurred. \nArguments: {1!r}".format(
type(e).__name__, e.args)

elif(request.method == "DELETE"):
try:
# Check if ID or Username was passed to URL query
user_id = request.args.get('id')
user_name = request.args.get('username')

if user_id:
user_query = user_ref.where(u'id', u'==', user_id).stream()
query_result = []
for user in user_query:
query_result.append(
user.id)
user_ref.document(query_result[0]).delete()
return jsonify({"success": True, "message": "The User has been successfully deleted."}), 200

if user_name:
user_query = user_ref.where(
u'username', u'==', user_name).stream()
query_result = []
for user in user_query:
query_result.append(
user.id)
user_ref.document(query_result[0]).delete()
return jsonify({"success": True, "message":"The User has been successfully deleted."}), 200
except Exception as e:
return "An exception of type {0} occurred. \nArguments: {1!r}".format(
type(e).__name__, e.args)

else:
return jsonify({"success": False, "message": "That request method isn't available on this endpoint."}), 405
31 changes: 31 additions & 0 deletions api/user/model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
class User(object):
def __init__(self, user_id=None, username=None, first_name=None, last_name=None,
friendly_name="", password=None, password_hint=None):
self.user_id = user_id
self.username = username
self.first_name = first_name
self.last_name = last_name
self.friendly_name = friendly_name
self.password = password
self.password_hint = password_hint

@staticmethod
def from_dict(source):
pass

def to_dict(self):
return {
'user_id': self.user_id,
'username': self.username,
'first_name': self.first_name,
'last_name': self.last_name,
'friendly_name': self.friendly_name,
'password': self.password,
'password_hint': self.password_hint
}

def __repr__(self):
return(
u'User(username={}, first_name={}, last_name={}, friendly_name={}, password={}, password_hint={})'
.format(self.username, self.first_name, self.last_name, self.friendly_name,
self.password, self.password_hint))
12 changes: 12 additions & 0 deletions key.json.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"type": "service_account",
"project_id": "your-project",
"private_key_id": "some key id",
"private_key": "private key",
"client_email": "your client email",
"client_id": "youre client id",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "your cert url"
}
2 changes: 0 additions & 2 deletions setup.cfg

This file was deleted.