-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
60 lines (38 loc) · 1.69 KB
/
main.py
File metadata and controls
60 lines (38 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from dataclasses import asdict
from dotenv import load_dotenv, dotenv_values
from flask import Flask, abort, request, jsonify
from result import Result
from contract.register import LocationTokenRegister
from guards.is_local_request_guard import is_local_request
from proof.challenger import Challenger, ChallengeInput, ChallengeSolution
from proof.keys import KeysHolder
# Loading env variables
load_dotenv()
conf = dotenv_values()
# Dependencies
register = LocationTokenRegister(conf['DAO_ADDRESS'], "contract/LocationToken.abi.json", conf['NODE_ADDRESS'])
keys_holder = KeysHolder(conf['CHALLENGER_PUB_KEY'], conf['CHALLENGER_PRIV_KEY'])
challenger = Challenger(register, keys_holder)
# The app
app = Flask(__name__)
@app.route("/v1/challenge", methods=['POST'])
def issue_challenge():
__handle_guard_error(is_local_request(request.remote_addr))
challenge_input = ChallengeInput(**request.get_json())
challenge_response = challenger.request_challenge(challenge_input)
if challenge_response.is_err():
abort(400, {'message': challenge_response.unwrap_err()})
return jsonify(asdict(challenge_response.unwrap()))
@app.route("/v1/solution", methods=['POST'])
def handle_solution():
__handle_guard_error(is_local_request(request.remote_addr))
solution = ChallengeSolution(**request.get_json())
solution_response = challenger.handle_solution(solution)
if solution_response.is_err():
abort(400, {"message": solution_response.unwrap_err()})
return jsonify(asdict(solution_response.unwrap()))
def __handle_guard_error(result: Result[None, str]):
if result.is_err():
abort(400, {'message': result.unwrap_err()})
if __name__ == "__main__":
app.run()