-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathworker.py
More file actions
91 lines (66 loc) · 2.41 KB
/
Copy pathworker.py
File metadata and controls
91 lines (66 loc) · 2.41 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from datetime import datetime
from threading import get_ident
import time
import json
from collections import namedtuple
from oidcutils import webid_to_resource, is_token_expired
from rsslogic import rss_iteration
import requests
worker_state = {"users": {}}
_DB = "https://solidtokens.nsergey82.repl.co/"
User = namedtuple("User", ["web_id", "headers", "fetcher", "putter"])
def fetch_from_db():
data = requests.get(_DB).json()
print(data)
for k, v in data.items():
add_user(k, json.loads(v), False)
def update_db(webid: str, headers: str):
requests.post(_DB + "update", data={"webid": webid, "token": json.dumps(headers)})
print("db updated")
def add_user(web_id: str, headers, shall_update_db=True):
if is_token_expired(headers[0]["Authorization"].split(" ")[1]):
print("token expired, not adding ", web_id)
return
if web_id in worker_state["users"]:
print(f"{web_id} already in users. Overwriting")
def fetcher():
url = webid_to_resource(web_id)
resp = requests.get(url=url, headers=headers[0])
if resp.status_code == requests.codes.ok:
return resp.json()
print(f"{resp.status_code} while fetching {url}")
return {}
def putter(newdata):
url = webid_to_resource(web_id)
resp = requests.put(
url=url,
data=json.dumps(newdata),
headers=headers[1],
)
if resp.status_code != requests.codes.created:
print(f"{resp.status_code} while putting {url}")
worker_state["users"][web_id] = User(web_id, headers, fetcher, putter)
if shall_update_db:
update_db(web_id, headers)
def _operate_users(users):
print(f"Backend worker active [{get_ident()}] {datetime.now()}")
print(len(users), "user tokens present")
for user in users.values():
print("Updating for User", user.web_id)
rss_iteration(user.fetcher, user.putter)
def get_user_data(web_id):
if web_id in worker_state["users"]:
return worker_state["users"][web_id].fetcher()
return None
def get_worker_state():
return worker_state
def worker(idle_seconds):
print("Starting worker with sleep of", idle_seconds)
i = 0
fetch_from_db()
while True:
i += 1
worker_state["worker"] = i
worker_state["latest"] = datetime.now()
_operate_users(worker_state["users"])
time.sleep(idle_seconds)