...
This commit is contained in:
0
services/users/project/api/__init__.py
Normal file
0
services/users/project/api/__init__.py
Normal file
22
services/users/project/api/models.py
Normal file
22
services/users/project/api/models.py
Normal file
@@ -0,0 +1,22 @@
|
||||
from sqlalchemy import func
|
||||
|
||||
from project import db
|
||||
|
||||
|
||||
class User(db.Model):
|
||||
|
||||
__tablename__ = 'users'
|
||||
|
||||
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
|
||||
username = db.Column(db.String, nullable=False)
|
||||
email = db.Column(db.String, nullable=False)
|
||||
active = db.Column(db.Boolean, default=True, nullable=False)
|
||||
created_date = db.Column(db.DateTime, default=func.now(), nullable=False)
|
||||
|
||||
def to_json(self):
|
||||
return {
|
||||
'id': self.id,
|
||||
'username': self.username,
|
||||
'email': self.email,
|
||||
'active': self.active,
|
||||
}
|
||||
49
services/users/project/api/templates/index.html
Normal file
49
services/users/project/api/templates/index.html
Normal file
@@ -0,0 +1,49 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Flask on Docker</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="author" content="">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<link href="//cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css"
|
||||
rel="stylesheet"
|
||||
>
|
||||
{% block css %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="column is-one-third">
|
||||
<br>
|
||||
<h1 class="title">All Users</h1>
|
||||
<hr><br>
|
||||
<form action="/" method="POST">
|
||||
<div class="field">
|
||||
<input
|
||||
name="username" class="input" type="text"
|
||||
placeholder="Enter a username" required>
|
||||
</div>
|
||||
<div class="field">
|
||||
<input
|
||||
name="email" class="input" type="email"
|
||||
placeholder="Enter an email address" required>
|
||||
</div>
|
||||
<input
|
||||
type="submit" class="button is-primary is-fullwidth" value="Submit">
|
||||
</form>
|
||||
<br>
|
||||
<hr>
|
||||
{% if users %}
|
||||
<ol>
|
||||
{% for user in users %}
|
||||
<li>{{user.username}}</li>
|
||||
{% endfor %}
|
||||
</ol>
|
||||
{% else %}
|
||||
<p>No users!</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% block js %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
89
services/users/project/api/users.py
Normal file
89
services/users/project/api/users.py
Normal file
@@ -0,0 +1,89 @@
|
||||
from flask import Blueprint, request, render_template
|
||||
from flask_restful import Resource, Api
|
||||
from sqlalchemy import exc
|
||||
|
||||
from project.api.models import User
|
||||
from project import db
|
||||
|
||||
users_blueprint = Blueprint('users', __name__, template_folder='./templates')
|
||||
api = Api(users_blueprint)
|
||||
|
||||
|
||||
class UsersPing(Resource):
|
||||
def get(self):
|
||||
return {
|
||||
'status': 'success',
|
||||
'message': 'pong!'
|
||||
}
|
||||
|
||||
|
||||
class UsersList(Resource):
|
||||
def get(self):
|
||||
response_object = {'status': 'success',
|
||||
'data': {
|
||||
'users': [user.to_json()
|
||||
for user in User.query.all()]
|
||||
}}
|
||||
return response_object, 200
|
||||
|
||||
def post(self):
|
||||
post_data = request.get_json()
|
||||
response_object = {
|
||||
'status': 'fail',
|
||||
'message': 'Invalid payload.',
|
||||
}
|
||||
if not post_data:
|
||||
return response_object, 400
|
||||
username = post_data.get('username')
|
||||
email = post_data.get('email')
|
||||
try:
|
||||
user = User.query.filter_by(email=email).first()
|
||||
if not user:
|
||||
db.session.add(User(username=username, email=email))
|
||||
db.session.commit()
|
||||
response_object['status'] = 'success'
|
||||
response_object['message'] = f'{email} was added!'
|
||||
return response_object, 201
|
||||
else:
|
||||
response_object['message'] = 'Sorry. That email already exists.'
|
||||
return response_object, 400
|
||||
except exc.IntegrityError:
|
||||
db.session.rollback()
|
||||
return response_object, 400
|
||||
|
||||
|
||||
class Users(Resource):
|
||||
def get(self, user_id):
|
||||
response_object = {'status': 'fail',
|
||||
'message': 'User does not exist'}
|
||||
try:
|
||||
user = User.query.filter_by(id=int(user_id)).first()
|
||||
if not user:
|
||||
return response_object, 404
|
||||
else:
|
||||
response_object = {'status': 'success',
|
||||
'data': {
|
||||
'id': user.id,
|
||||
'username': user.username,
|
||||
'email': user.email,
|
||||
'active': user.active,
|
||||
}}
|
||||
return response_object, 200
|
||||
except ValueError:
|
||||
return response_object, 404
|
||||
|
||||
|
||||
@users_blueprint.route('/', methods=['GET', 'POST'])
|
||||
def index():
|
||||
if request.method == 'POST':
|
||||
username = request.form['username']
|
||||
email = request.form['email']
|
||||
db.session.add(User(username=username, email=email))
|
||||
db.session.commit()
|
||||
users = User.query.all()
|
||||
return render_template('index.html', users=users)
|
||||
|
||||
|
||||
api.add_resource(UsersPing, '/users/ping')
|
||||
api.add_resource(UsersList, '/users')
|
||||
api.add_resource(Users, '/users/<user_id>')
|
||||
Reference in New Issue
Block a user