diff --git a/backend/app/models.py b/backend/app/models.py index 5a7b163..9a4ef45 100644 --- a/backend/app/models.py +++ b/backend/app/models.py @@ -1,28 +1,19 @@ from app import db from flask_login import UserMixin from datetime import datetime -from werkzeug.security import check_password_hash, generate_password_hash +from werkzeug.security import generate_password_hash, check_password_hash + class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) password_hash = db.Column(db.String(128)) - about_me = db.Column(db.String(140)) last_seen = db.Column(db.DateTime, default=datetime.utcnow) token = db.Column(db.String(32), index=True, unique=True) def __repr__(self): - return f'' - - def to_dict(self): - return { - "id": self.id, - "username": self.username, - "email": self.email, - "about_me": self.about_me, - } - + return f"" def set_password(self, password): self.password_hash = generate_password_hash(password) @@ -30,3 +21,16 @@ class User(UserMixin, db.Model): def check_password(self, password): return check_password_hash(self.password_hash, password) + def to_dict(self): + return { + "id": self.id, + "username": self.username, + "email": self.email, + } + + def from_dict(self, data, new_user=False): + for field in ["username", "email"]: + if field in data: + setattr(self, field, data[field]) + if new_user and "password" in data: + self.set_password(data["password"]) diff --git a/backend/app/routes.py b/backend/app/routes.py index 51b49b7..ed7a873 100644 --- a/backend/app/routes.py +++ b/backend/app/routes.py @@ -4,7 +4,7 @@ from flask import Response, jsonify, request from app.errors import error_response from flask_login import current_user -from app import login +from app import login, db from app.models import User @@ -32,7 +32,6 @@ def login_route(): login_user(user) resp = jsonify(user.to_dict()) - resp.status_code = 200 return resp @bp.route("/logout", methods=["POST"]) @@ -40,5 +39,29 @@ def logout_route(): if not current_user.is_authenticated: return error_response(400, "No users are logged in!") + resp = jsonify(current_user.to_dict()) logout_user() - return Response(status=200) + return resp + +@bp.route("/register", methods=["POST"]) +def register(): + data = request.get_json() + + required_fields = ['username', 'email', 'password', 'password2'] + for f in required_fields: + if f not in data: + return error_response(400, f"Must supply {f}") + + if User.query.filter_by(username=data['username']).first(): + return error_response(409, "User with that username already exists") + + if User.query.filter_by(email=data['email']).first(): + return error_response(409, "User with that email already exists") + + u = User() + u.from_dict(data, new_user=True) + db.session.add(u) + db.session.commit() + + resp = jsonify(u.to_dict()) + return resp