diff --git a/docker-compose.yml b/docker-compose.yml index b2191116..049abae2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,4 +102,17 @@ services: - BACKEND=dashboard - PORT=8080 - USERNAME=admin - - PASSWORD=pass \ No newline at end of file + - PASSWORD=pass + + user-dashboard: + build: + context: user-dashboard + image: cello-user-dashboard + container_name: user-dashboard + links: + - mongo:dashboard_mongo + - dashboard + ports: + - "8081:8080" + environment: + - SV_BaseURL=http://dashboard:8080/api/auth/ diff --git a/src/resources/auth_api.py b/src/resources/auth_api.py index d82a8b69..4193ee16 100644 --- a/src/resources/auth_api.py +++ b/src/resources/auth_api.py @@ -41,8 +41,16 @@ def register(): try: user = User(username, password) - user.save() - return make_ok_resp(code=CODE_CREATED) + user_id = user.save() + user = user.get_by_id(user_id) + data = { + "username": user.username, + "apikey": str(user.id), + "isActivated": user.active, + "balance": user.balance, + "success": True + } + return make_ok_resp(code=CODE_CREATED, data=data) except Exception as exc: logger.info("exc %s", exc) return make_fail_resp(error="register failed") @@ -59,11 +67,12 @@ def login(): user_obj = User() try: user = user_obj.get_by_username_w_password(username) - if user.is_admin() and \ - bcrypt.checkpw(password.encode('utf8'), - bytes(user.password.encode())): + if bcrypt.checkpw(password.encode('utf8'), + bytes(user.password.encode())): login_user(user) + user_id = str(user.id) return make_ok_resp(data={'success': True, + 'id': user_id, 'next': url_for('bp_index.show')}, code=CODE_CREATED) else: @@ -77,3 +86,23 @@ def login(): def logout(): logout_user() return redirect(url_for('bp_index.show')) + + +@bp_auth_api.route('/user/account/', methods=['GET']) +def account(user_id): + logger.info("in account api {}".format(user_id)) + if not user_id: + return make_fail_resp(error="no user id", data={"success": False}) + user_obj = User() + user = user_obj.get_by_id(user_id) + if not user: + return make_fail_resp(error="no such user", data={"success": False}) + + data = { + "username": user.username, + "apikey": str(user.id), + "isActivated": user.active, + "balance": user.balance + } + + return make_ok_resp(data=data) diff --git a/src/resources/models.py b/src/resources/models.py index 64d622be..04344b0c 100644 --- a/src/resources/models.py +++ b/src/resources/models.py @@ -18,3 +18,4 @@ class User(Document): isAdmin = BooleanField(default=False) role = IntField(default=COMMON_USER) timestamp = DateTimeField(default=datetime.datetime.now) + balance = IntField(default=0) diff --git a/src/resources/user.py b/src/resources/user.py index 027ccbdd..cd312398 100644 --- a/src/resources/user.py +++ b/src/resources/user.py @@ -13,13 +13,14 @@ class User(UserMixin): def __init__(self, username=None, password=None, active=True, - is_admin=False, role=None, id=None): + is_admin=False, role=None, id=None, balance=0): self.username = username self.password = password self.active = active self.isAdmin = is_admin self.role = role self.id = None + self.balance = balance def is_active(self): return self.active @@ -35,6 +36,7 @@ def save(self): password=self.password, active=self.active, role=self.role, + balance=self.balance, isAdmin=self.isAdmin) new_user.save() self.id = new_user.id @@ -47,6 +49,7 @@ def get_by_username(self, username): self.username = dbUser.username self.active = dbUser.active self.id = dbUser.id + self.balance = dbUser.balance return self else: return None @@ -62,6 +65,7 @@ def get_by_username_w_password(self, username): self.password = dbUser.password self.id = dbUser.id self.isAdmin = dbUser.isAdmin + self.balance = dbUser.balance return self else: logger.info("not get user") @@ -71,15 +75,17 @@ def get_by_username_w_password(self, username): return None def get_by_id(self, id): - dbUser = models.User.objects.with_id(id) - if dbUser: + try: + dbUser = models.User.objects.get(id=id) + except Exception: + return None + else: self.username = dbUser.username self.active = dbUser.active self.id = dbUser.id + self.balance = dbUser.balance return self - else: - return None class Anonymous(AnonymousUserMixin): diff --git a/src/resources/user_api.py b/src/resources/user_api.py index 0aa21af2..60a9d6d3 100644 --- a/src/resources/user_api.py +++ b/src/resources/user_api.py @@ -60,6 +60,7 @@ def list_user(): "isAdmin": user.isAdmin, "role": user.role, "active": user.active, + "balance": user.balance, "timestamp": time.mktime(user.timestamp.timetuple()) } for user in users] @@ -87,13 +88,14 @@ def create_user(): username, password = r.form["username"], r.form["password"] role, active = int(r.form["role"]), r.form["active"] + balance = int(r.form["balance"]) active = active == "true" salt = app.config.get("SALT", b"") password = bcrypt.hashpw(password.encode('utf8'), bytes(salt.encode())) try: user = User(username, password, is_admin=role == ADMIN, - role=role, active=active) + role=role, active=active, balance=balance) user.save() return make_ok_resp(code=CODE_CREATED) except Exception as exc: @@ -112,11 +114,13 @@ def update_user(user_id): return make_fail_resp(error=error_msg, data=r.form) username, role = r.form["username"], int(r.form["role"]) + balance = int(r.form["balance"]) active = r.form["active"] active = active == "true" try: UserModel.objects(id=user_id).update(set__username=username, set__active=active, + set__balance=balance, set__role=role, upsert=True) except Exception as exc: error_msg = exc.message diff --git a/src/themes/basic/templates/users.html b/src/themes/basic/templates/users.html index ed0272d3..5fc786ff 100644 --- a/src/themes/basic/templates/users.html +++ b/src/themes/basic/templates/users.html @@ -47,6 +47,9 @@