diff --git a/measurer/views/measurer.py b/measurer/views/measurer.py index f14734ed7619527951200e1c106d2f6c4c9af876..5f648fa553dfd68523f422ca702e53b9b60844f3 100644 --- a/measurer/views/measurer.py +++ b/measurer/views/measurer.py @@ -45,6 +45,34 @@ def add_vote() -> typing.Union[flask.Response, int]: return flask.jsonify(None), http.client.NO_CONTENT +@measurer_blueprint.route("/", methods=["DELETE"]) +@validators.validate_json({ + "point": { + "type": "string", + "allowed": flask.current_app.config["POINTS"], + "nullable": False + } +}) +def delete_vote() -> typing.Union[flask.Response, int]: + vote = flask.g.sa_session.execute( + sqlalchemy.select(database.Vote). + where( + sqlalchemy.and_( + database.Vote.point == flask.g.json["point"], + database.Vote.identifier == utils.get_ip_hash() + ) + ) + ).scalars().one_or_none() + + if vote is None: + raise werkzeug.exceptions.NotFound + + flask.g.sa_session.delete(vote) + flask.g.sa_session.commit() + + return flask.jsonify(None), http.client.NO_CONTENT + + @measurer_blueprint.route("/", methods=["GET"]) def list_votes() -> typing.Union[flask.Response, int]: votes = flask.g.sa_session.execute(