Skip to content
Merged
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
2 changes: 1 addition & 1 deletion app.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def activated(object_id):

@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
return {'error': 'Page not found', 'code': 404}

if __name__ == '__main__':
app.run(debug=True)
78 changes: 49 additions & 29 deletions config/dev.json
Original file line number Diff line number Diff line change
@@ -1,31 +1,51 @@
{
"_comment": "Your app information",
"APP_NAME": "My App",
"API_LINK": "http://localhost:8000/api/",
"APP_LINK": "http://localhost:8000/",


"_comment": "Testing information NO NEED TO CHANGE",
"TEST_API_URL": "http://localhost:5000/api",
"TEST_PASSWORD": "testing",
"TEST_TOKEN": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im5naGlhOCIsInVwZGF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsIm9iamVjdElkIjoiODJqU3NXeTZoVSIsImNyZWF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsInNlc3Npb25Ub2tlbiI6ImVGNkZDUDF5ZkE3RjFESFdWUjYxbTVHbUsifQ.o4nBdmbBOFvNANQ1LffRNy2FUvI2JxQIM-RPDgJ2QMk",


"_comment": "Parse credentials",
"PARSE_URL": "https://api.parse.com/1",
"PARSE_REST_KEY": "PLACE YOUR PARSE_REST_KEY",
"PARSE_APP_ID": "PLACE YOUR PARSE_APP_ID",
"PARSE_CLIENT_KEY": "PLACE YOUR PARSE_CLIENT_KEY",
"PARSE_MASTER_KEY": "PLACE YOUR PARSE_MASTER_KEY",


"_comment": "JWT_KEY for checking authorization",
"JWT_KEY": "PLACE YOUR JWT KEY HERE",


"_comment": "Change SENDGRID to 1 to use built-in and 0 to not",
"SENDGRID": 0,
"SENDGRID_API_KEY": "PLACE YOUR SENDGRID API KEY",
"EMAIL_FROM_NAME": "PLACE YOUR NAME",
"EMAIL_FROM": "PLACE YOUR EMAIL"
"_comment": "Your app information",
"APP_INFO": {
"APP_NAME": "My App",
"API_LINK": "http://localhost:8000/api/",
"APP_LINK": "http://localhost:8000/"
},

"_comment": "Config for request_limits",
"REQUEST_LIMITS" : {
"PER_IP_LIMIT": {
"NUM_REQUESTS": 100,
"INTERVAL": 30
},
"PARSE_LIMIT": {
"NUM_REQUESTS": 30,
"INTERVAL": 1
}
},

"_comment": "Testing information NO NEED TO CHANGE",
"TEST_API_URL": "http://localhost:5000/api",
"TEST_PASSWORD": "testing",
"TEST_TOKEN": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im5naGlhOCIsInVwZGF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsIm9iamVjdElkIjoiODJqU3NXeTZoVSIsImNyZWF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsInNlc3Npb25Ub2tlbiI6ImVGNkZDUDF5ZkE3RjFESFdWUjYxbTVHbUsifQ.o4nBdmbBOFvNANQ1LffRNy2FUvI2JxQIM-RPDgJ2QMk",

"_comment": "Parse credentials",
"PARSE_INFO": {
"PARSE_URL": "https://api.parse.com/1",
"PARSE_REST_KEY": "PLACE YOUR PARSE_REST_KEY",
"PARSE_APP_ID": "PLACE YOUR PARSE_APP_ID",
"PARSE_CLIENT_KEY": "PLACE YOUR PARSE_CLIENT_KEY",
"PARSE_MASTER_KEY": "PLACE YOUR PARSE_MASTER_KEY"
},

"_comment": "JWT_KEY for checking authorization",
"JWT_KEY": "PLACE YOUR JWT KEY HERE",

"_comment": "Email automation",
"SENDGRID_INFO": {
"SENDGRID_API_KEY": "PLACE YOUR SENDGRID API KEY",
"SENDGRID_NAME": "test user",
"SENDGRID_EMAIL": "email@email.com"
},

"_comment": "SMS automation",
"TWILLIO_INFO": {
"TWILLIO_ACCOUNT": "YOUR ACCOUNT SID",
"TWILLIO_AUTH_TOKEN": "YOUR AUTH TOKEN",
"TWILLIO_NUMBER": "YOUR TWILLIO NUMBER"
}
}
74 changes: 45 additions & 29 deletions config/test.json
Original file line number Diff line number Diff line change
@@ -1,31 +1,47 @@
{
"_comment": "Your app information",
"APP_NAME": "My App",
"API_LINK": "http://localhost:8000/api/",
"APP_LINK": "http://localhost:8000/",


"_comment": "Testing information NO NEED TO CHANGE",
"TEST_API_URL": "http://localhost:5000/api",
"TEST_PASSWORD": "testing",
"TEST_TOKEN": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im5naGlhOCIsInVwZGF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsIm9iamVjdElkIjoiODJqU3NXeTZoVSIsImNyZWF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsInNlc3Npb25Ub2tlbiI6ImVGNkZDUDF5ZkE3RjFESFdWUjYxbTVHbUsifQ.o4nBdmbBOFvNANQ1LffRNy2FUvI2JxQIM-RPDgJ2QMk",


"_comment": "Parse credentials",
"PARSE_URL": "https://api.parse.com/1",
"PARSE_REST_KEY": "6u6FTDhqC4s84UWJjRA4wJNIxOqxWNT3iLZHfTkj",
"PARSE_APP_ID": "aNcLKlFlOSSlgFHdyelHlMLzgVxUB5MutK2Dsn4K",
"PARSE_CLIENT_KEY": "yZNdTx7QvSPZVNZGKdxlKz4NRhQYDKs4NISxGgkG",
"PARSE_MASTER_KEY": "Tv6qfFe4nfffqsYZuvqe18msieLgeoca2EBFkC1X",


"_comment": "JWT_KEY for checking authorization",
"JWT_KEY": "qwertyuiopasdfghjklzxcvbnm123456",


"_comment": "Change SENDGRID to 1 to use built-in and 0 to not",
"SENDGRID": 0,
"SENDGRID_API_KEY": "PLACE YOUR SENDGRID API KEY",
"EMAIL_FROM_NAME": "test user",
"EMAIL_FROM": "email@email.com"
"_comment": "Your app information",
"APP_INFO": {
"APP_NAME": "My App",
"API_LINK": "http://localhost:8000/api/",
"APP_LINK": "http://localhost:8000/"
},

"_comment": "Config for request_limits",
"REQUEST_LIMITS" : {
"PER_IP_LIMIT": {
"NUM_REQUESTS": 100,
"INTERVAL": 30
},
"PARSE_LIMIT": {
"NUM_REQUESTS": 30,
"INTERVAL": 1
}
},

"_comment": "Testing information NO NEED TO CHANGE",
"TEST_API_URL": "http://localhost:5000/api",
"TEST_PASSWORD": "testing",
"TEST_TOKEN": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im5naGlhOCIsInVwZGF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsIm9iamVjdElkIjoiODJqU3NXeTZoVSIsImNyZWF0ZWRBdCI6IjIwMTUtMTEtMTlUMjM6Mzc6MjAuMjA0WiIsInNlc3Npb25Ub2tlbiI6ImVGNkZDUDF5ZkE3RjFESFdWUjYxbTVHbUsifQ.o4nBdmbBOFvNANQ1LffRNy2FUvI2JxQIM-RPDgJ2QMk",

"_comment": "Parse credentials",
"PARSE_INFO": {
"PARSE_URL": "https://api.parse.com/1",
"PARSE_REST_KEY": "6u6FTDhqC4s84UWJjRA4wJNIxOqxWNT3iLZHfTkj",
"PARSE_APP_ID": "aNcLKlFlOSSlgFHdyelHlMLzgVxUB5MutK2Dsn4K",
"PARSE_CLIENT_KEY": "yZNdTx7QvSPZVNZGKdxlKz4NRhQYDKs4NISxGgkG",
"PARSE_MASTER_KEY": "Tv6qfFe4nfffqsYZuvqe18msieLgeoca2EBFkC1X"
},

"_comment": "JWT_KEY for checking authorization",
"JWT_KEY": "qwertyuiopasdfghjklzxcvbnm123456",

"_comment": "Email automation",
"SENDGRID_INFO": {},

"_comment": "SMS automation",
"TWILLIO_INFO": {
"TWILLIO_ACCOUNT": "YOUR ACCOUNT SID",
"TWILLIO_AUTH_TOKEN": "YOUR AUTH TOKEN",
"TWILLIO_NUMBER": "YOUR TWILLIO NUMBER"
}
}
5 changes: 0 additions & 5 deletions src/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +0,0 @@
from flask_restful import Resource, Api
from src.utils import get_config
import requests
import json

5 changes: 3 additions & 2 deletions src/controllers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# @name <%= app_name %>
# @description
# Create connection between controllers and forms

from src.models.user_model import\
UserModel
Expand All @@ -8,8 +11,6 @@
UserLoginForm,\
UserResetPasswordForm,\
AuthDataForm
from src.models.authentication_model import\
validate_auth_token

from flask_restful import Resource, Api

Expand Down
52 changes: 24 additions & 28 deletions src/controllers/user_controller.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
# @name <%= app_name %>
# @description
# UserControler handles everything related to users' information from
# registration, verification, authenciation, ....

import json
from src.controllers import\
BaseUserController
from src.models.authentication_model import\
requires_auth,\
limit
check_all_request_limit

_parse_class_name = BaseUserController.model._parse_class_name


class UsersController(BaseUserController):
# Require authentication token
@requires_auth
# Limit number of requests per IP
@limit(requests=100, window=30, by='ip', group=None)
# Limit number of requests per second
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def get(self):
form = self.get_form()
if form.validate():
Expand All @@ -28,13 +29,12 @@ def get(self):
res['params'] = params
return res

return {'error':'Unvalid inputs', 'code': 400}
return {'error': 'Unvalid inputs', 'code': 400}


class UserController(BaseUserController):
@requires_auth
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def get(self, object_id):
where = {
'objectId': object_id
Expand All @@ -48,8 +48,7 @@ def get(self, object_id):
return res

@requires_auth
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def put(self, object_id):
form = self.put_form()
if form.validate():
Expand All @@ -60,11 +59,10 @@ def put(self, object_id):
object_id=object_id)
return res

return {'error':'Unvalid inputs', 'code': 400}
return {'error': 'Unvalid inputs', 'code': 400}

@requires_auth
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def delete(self, object_id):
res = self.model.delete(
collection='users',
Expand All @@ -75,8 +73,7 @@ def delete(self, object_id):


class SignupController(BaseUserController):
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def post(self):
form = self.signup_form()
if form.validate():
Expand All @@ -87,26 +84,25 @@ def post(self):
)
return res

return {'error':'Unvalid inputs', 'code': 400}
return {'error': 'Unvalid inputs', 'code': 400}


class LoginController(BaseUserController):
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def get(self):
form = self.login_form()
if form.validate():
params = form.filter_data()

res = self.model.user_login(
params= params
params=params
)
return res
return {'error':'Unvalid inputs', 'code': 400}
return {'error': 'Unvalid inputs', 'code': 400}


class ResetpasswordController(BaseUserController):
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def post(self):
form = self.reset_password_form()
if form.validate():
Expand All @@ -116,11 +112,11 @@ def post(self):
where=where
)
return res
return {'error':'Unvalid inputs', 'code': 400}
return {'error': 'Unvalid inputs', 'code': 400}


class AuthController(BaseUserController):
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def post(self):
form = self.auth_form()
if form.validate():
Expand All @@ -130,11 +126,11 @@ def post(self):
)

return res
return {'error':'Unvalid inputs', 'code': 400}
return {'error': 'Unvalid inputs', 'code': 400}


class UserActivationController(BaseUserController):
@limit(requests=100, window=30, by='ip', group=None)
@limit(requests=30, window=1, by='parse', group='parse')
@check_all_request_limit
def get(self, object_id):
payload = {
'email_verified': True
Expand Down
Loading