Skip to content

Commit 63dd7b0

Browse files
committed
Merge branch 'develop'
2 parents 6607330 + c7a6211 commit 63dd7b0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+3476
-1004
lines changed

.gitignore

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,8 @@ venv.bak/
103103
# mypy
104104
.mypy_cache/
105105

106-
.vscode
106+
.vscode
107+
108+
ask-resources.json
109+
.ask
110+
lambda/node_modules

initial_data/load_data.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,40 @@
11
# encoding: utf-8
2-
from sys import path
3-
import os
4-
from os.path import dirname as dir
5-
6-
path.append(dir(path[0]))
2+
import json
3+
import urllib.parse
74

85
from pymongo import MongoClient
9-
from configurations import skill_config
10-
import urllib
11-
import json
126

13-
def connect():
7+
from initial_data.configurations import skill_config
8+
9+
10+
def connect() -> MongoClient:
1411
username = urllib.parse.quote_plus(skill_config.DB_USER)
1512
password = urllib.parse.quote_plus(skill_config.DB_PASS)
16-
db_ip = urllib.parse.quote_plus(skill_config.DB_IP)
17-
db_port = urllib.parse.quote_plus(skill_config.DB_PORT)
13+
db_url = urllib.parse.quote_plus(skill_config.DB_URL)
1814
db_name = urllib.parse.quote_plus(skill_config.DB_NAME)
1915

20-
client = MongoClient('mongodb://%s:%s@%s:%s/%s' %
21-
(username, password, db_ip, db_port, db_name))
16+
client = MongoClient(
17+
f"mongodb+srv://{username}:{password}@{db_url}/{db_name}?retryWrites=true&w=majority"
18+
)
2219

2320
return client
2421

25-
def close(client):
22+
23+
def close(client: MongoClient):
2624
client.close()
2725

26+
2827
def load_data():
2928
client = connect()
3029

31-
db = client[skill_config.DB_NAME]
32-
33-
questions = json.load(open('questions.json', 'r', encoding='utf-8'))
30+
db = client.get_database(skill_config.DB_NAME)
31+
32+
questions = json.load(open("questions.json", "r", encoding="utf-8"))
3433

3534
db.questions.insert_many(questions)
3635

3736
close(client)
3837

39-
if __name__ == '__main__':
40-
load_data()
38+
39+
if __name__ == "__main__":
40+
load_data()

interaction_model.json

Lines changed: 0 additions & 139 deletions
This file was deleted.

lambda/connectors/db_functions.py

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# encoding: utf-8
2+
from typing import Any, Dict, List, Union
3+
4+
from ask_sdk_core.handler_input import HandlerInput
5+
from bson import ObjectId
6+
from configurations import skill_config
7+
from connectors import db_utils
8+
9+
10+
def retrieve_random_question(handler_input: HandlerInput) -> Dict[str, Any]:
11+
req_envelope = handler_input.request_envelope
12+
13+
user_id = (
14+
req_envelope.context
15+
and req_envelope.context.system
16+
and req_envelope.context.system.user
17+
and req_envelope.context.system.user.user_id
18+
)
19+
20+
random_question = __get_question_for_user(user_id)
21+
22+
return random_question
23+
24+
25+
def get_question(question_id: str) -> Dict[str, Any]:
26+
client = db_utils.connect()
27+
db = client.get_database(skill_config.DB_NAME)
28+
29+
question = db.questions.find_one({"_id": ObjectId(question_id)})
30+
31+
if question is None:
32+
raise LookupError()
33+
34+
return question
35+
36+
37+
def __get_question_for_user(user_id: Union[str, None]) -> Dict[str, Any]:
38+
assert user_id is not None
39+
40+
question = None
41+
42+
if not __user_exists(user_id):
43+
__insert_new_user(user_id)
44+
45+
if __get_number_of_questions() == __get_number_of_already_fetched_questions(
46+
user_id
47+
):
48+
__reset_user_fetched_questions(user_id)
49+
50+
fetched_questions = __get_already_fetched_questions(user_id)
51+
52+
question = __get_random_question_not_fetched(fetched_questions)
53+
54+
__add_user_fetched_question(user_id, question["_id"])
55+
56+
return question
57+
58+
59+
def __add_user_fetched_question(user_id, question_id):
60+
client = db_utils.connect()
61+
db = client.get_database(skill_config.DB_NAME)
62+
63+
db.users.find_one_and_update(
64+
{"user_id": user_id}, {"$push": {"fetched_questions": question_id}}
65+
)
66+
67+
68+
def __get_random_question_not_fetched(already_fetched: List[str]) -> Dict[str, Any]:
69+
client = db_utils.connect()
70+
db = client.get_database(skill_config.DB_NAME)
71+
72+
questions = db.questions.aggregate(
73+
[{"$match": {"_id": {"$nin": already_fetched}}}, {"$sample": {"size": 1}}]
74+
)
75+
76+
return list(questions)[0]
77+
78+
79+
def __reset_user_fetched_questions(user_id: str):
80+
client = db_utils.connect()
81+
db = client.get_database(skill_config.DB_NAME)
82+
83+
db.users.find_one_and_update(
84+
{"user_id": user_id}, {"$set": {"fetched_questions": []}}
85+
)
86+
87+
88+
def __get_number_of_questions() -> int:
89+
client = db_utils.connect()
90+
db = client.get_database(skill_config.DB_NAME)
91+
92+
res = db.questions.count_documents({})
93+
94+
return res
95+
96+
97+
def __get_number_of_already_fetched_questions(user_id: str):
98+
return len(__get_already_fetched_questions(user_id))
99+
100+
101+
def __get_already_fetched_questions(user_id: str) -> List[str]:
102+
client = db_utils.connect()
103+
db = client.get_database(skill_config.DB_NAME)
104+
105+
res = db.users.find_one({"user_id": user_id})
106+
107+
if res is None:
108+
raise LookupError()
109+
110+
return res["fetched_questions"]
111+
112+
113+
def __user_exists(user_id: str) -> bool:
114+
client = db_utils.connect()
115+
db = client.get_database(skill_config.DB_NAME)
116+
117+
res = db.users.count_documents({"user_id": user_id})
118+
119+
return res == 1
120+
121+
122+
def __insert_new_user(user_id: str) -> None:
123+
client = db_utils.connect()
124+
db = client.get_database(skill_config.DB_NAME)
125+
126+
db.users.insert_one({"user_id": user_id, "fetched_questions": []})

lambda/connectors/db_utils.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# encoding: utf-8
2+
import urllib.parse
3+
from typing import Union
4+
5+
from configurations import skill_config
6+
from pymongo import MongoClient
7+
from pymongo.errors import ServerSelectionTimeoutError
8+
9+
client: Union[MongoClient, None] = None
10+
11+
12+
def connect() -> MongoClient:
13+
global client
14+
15+
if client is not None:
16+
try:
17+
client.server_info()
18+
return client
19+
except ServerSelectionTimeoutError:
20+
pass
21+
22+
username = urllib.parse.quote_plus(skill_config.DB_USER)
23+
password = urllib.parse.quote_plus(skill_config.DB_PASS)
24+
db_url = urllib.parse.quote_plus(skill_config.DB_URL)
25+
db_name = urllib.parse.quote_plus(skill_config.DB_NAME)
26+
27+
client = MongoClient(
28+
f"mongodb+srv://{username}:{password}@{db_url}/{db_name}?retryWrites=true&w=majority&serverSelectionTimeoutMS=3000"
29+
)
30+
31+
return client
32+
33+
34+
def close():
35+
global client
36+
37+
if client is not None:
38+
client.close()
39+
client = None

0 commit comments

Comments
 (0)