diff --git a/database/database.py b/database/database.py index 35fedb44cb123bd2741fcdfc16d7605d14544ff8..c83b250098c90e1b2c0b46936a06713394313892 100644 --- a/database/database.py +++ b/database/database.py @@ -1,6 +1,7 @@ from flask import Flask from flask_mongoengine import MongoEngine from bson import json_util +from datetime import datetime import json mongo = MongoEngine() @@ -26,6 +27,7 @@ class Comment(mongo.Document): commenter_id = mongo.StringField(max_length=20, required=True) comment_text = mongo.StringField(required=True) page = mongo.ReferenceField('VizData', required=True) + date = mongo.DateTimeField(default = datetime.utcnow) reply = mongo.EmbeddedDocumentField('Reply') class VizData(mongo.Document): diff --git a/modules/comment.py b/modules/comment.py index c4a7cf6a01d4a8becc87eb6c33b7d950fe050dff..90a7063bb48eaad26c6a4095b0432935cea73b8a 100644 --- a/modules/comment.py +++ b/modules/comment.py @@ -1,3 +1,50 @@ -from flask import Blueprint +import json +import jwt +from datetime import datetime +from flask import Blueprint, jsonify, request, current_app +from database import database as db +from modules.tools.token import Token, validate_login_token +from modules.tools.roles import Roles -comment_route = Blueprint('comment', __name__, template_folder="templates") \ No newline at end of file +comment_route = Blueprint('comment', __name__, template_folder="templates") + +@comment_route.route("/api/comment/get", methods = ["POST"]) +def get_comment(): + page_id = request.get_json().get("page_id") + page = db.VizData.objects.with_id(page_id) + comments = db.Comment.objects(page=page).order_by('-date') + return jsonify({ + "status":200, + "data":comments + }) + +@comment_route.route("/api/comment/get-unreplied", methods=["POST"]) +def get_unreplied_comment(): + page_id = request.get_json().get("page_id") + page = db.VizData.objects.with_id(page_id) + comments = db.Comment.objects(page=page, reply__exists=False).order_by('-date') + return jsonify({ + "status":200, + "data":comments + }) + + +@comment_route.route("/api/comment/add", methods=["POST"]) +@validate_login_token(pass_user=True) +def add_comment(user): + req = request.get_json() + page_id = req.get("page_id") + text = req.get("text") + try: + page = db.VizData.objects.with_id(page_id) + new_comment = db.Comment(commenter_id = user.id, comment_text=text, page=page) + new_comment.save() + return jsonify({ + "status":200, + "message":"comment added successfully" + }) + except Exception as e: + return jsonify({ + "status":500, + "message":str(e) + }) diff --git a/modules/login.py b/modules/login.py index 299e41c560d40a7f4f00bfdcd4a27d9f607741f8..e34b4574c092e33087ccea0f350604f3d20e845e 100644 --- a/modules/login.py +++ b/modules/login.py @@ -61,8 +61,21 @@ def check_user_existence(): @login_route.route("/api/get-user", methods=["POST"]) @validate_login_token(pass_user=True) def get_user_from_token(user): + del user.password return jsonify({ "status": 200, + "data": user #sends back all information about user except password + }) + +@login_route.route("/api/get-user-public", methods=["POST"]) +def get_user_from_id(): + req = request.get_json() + user_id = req.get("user_id") + user = db.User.objecs.with_id(user_id) + del user.password + del user.username + del user.page_list + return jsonify({ + "status":200, "data": user }) - \ No newline at end of file diff --git a/modules/page.py b/modules/page.py index 878e0d4f5d2d419dcdedbd1667fd437ce7f56ccb..01703095bdeba2579b9d3d29b4dd6f730254dcac 100644 --- a/modules/page.py +++ b/modules/page.py @@ -35,6 +35,11 @@ def get_page(): "data":vdata, "subdata":[child for child in vdata.subdata] }) + except Exception as e: + return jsonify({ + "status": 500, + "message": str(e) + }) @page_route.route("/api/hidden/add-data", methods=["POST"]) diff --git a/modules/register.py b/modules/register.py index 7f4bdfe6191b5cfe50593019b7cf6636c109a3e7..151b0f6cdd8faaba06c48689be3ef071125f952d 100644 --- a/modules/register.py +++ b/modules/register.py @@ -1,6 +1,7 @@ from flask import Blueprint, jsonify, request, current_app from database import database as db from modules.tools.token import Token +from modules.tools.roles import Roles register_route = Blueprint('register', __name__, template_folder="templates") @@ -33,20 +34,20 @@ def add_new_user(): @register_route.route('/api/unregister', methods=["POST"]) -def delete_user(): +@validate_login_token(pass_user=True) +def delete_user(user): try: - token = request.headers.get("Authorization") - password = request.get_json().get("password") - if token is not None: - code, user_id = Token.decode_token(token) - if code > 0: - raise Exception(user_id) + user_id = request.get_json().get("user_id") + if user_id is not None: + del_user = db.User.objects.with_id(user_id) + if del_user != user and user.role < Roles.ADMIN: + return jsonify({ + "status":401, + "message":"unauthorized delete" + }) else: - user_id = request.get_json().get("user_id") - if user_id is None: - raise Exception("Invalid credentials") - check = db.User.objects.with_id(user_id) - check.delete() + del_user = user + del_user.delete() return jsonify({ "status": 200, "message": "User deleted successfully" diff --git a/readme.md b/readme.md index 17759fbc793e871dd1bc7760c08aa2c42fde3b26..9579cdb11a41b159d0657956eaa591144b4f4323 100644 --- a/readme.md +++ b/readme.md @@ -10,4 +10,57 @@ Server ini akan menyediakan api yang menangani akun-akun pengguna dan pemrosesan pip install flask pip install flask_mongoengine pip install PyJWT -``` \ No newline at end of file +``` + +## API Endpoints + +Berikut adalah API dari backend server VIS-MASY: + +### Login dan Register + +* #### /api/login + Method: POST + Data request: username, password + Response: status, token + Melakukan login dan mengirim balik token login + +* #### /api/check-user + Method: POST + Data request: username + Response: status, message, exist + Mengecek apakah suatu username sudah terdaftar + +* #### /api/get-user + Method: POST + Data request: Authorization header + Response: status, data user yang sesuai authorization + Meminta data user berdasarkan authorization token + +* #### /api/register + Method: POST + Data request: user_id, username, name, password, role + Response: status, message + Menambah user ke database pengguna + +* #### /api/unregister + Method: POST + Data request: Authorization header \[, user_id] + Response: status, message + Menghapus pengguna dengan user_id jika authorization header untuk admin, atau menghapus pengguna dalam authorization header jika user_id tidak diberikan. + +### Page + +* #### /api/page/get-top + Method: POST + Data request: year + Response: status, data, subdata + Mengirim data untuk halaman data paling atas dan subdata yang akan menjadi visualisasi + +* #### /api/page/get + Method: POST + Data request: data_id + Response: status, data, subdata + Mengirim data yang akan menjadi halaman dan subdata yang akan menjadi visualisasi + +### Comment and Reply +