Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ __pycache__
rastreiobotenv/*
*.log
bot.log.*
venv
Empty file added config/__init__.py
Empty file.
8 changes: 8 additions & 0 deletions config/mongo_connector.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from pymongo import MongoClient


class MongoConnector:

def get_context(self):
return MongoClient().rastreiobot

Empty file added domain/__init__.py
Empty file.
38 changes: 38 additions & 0 deletions domain/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from config.mongo_connector import MongoConnector


class User:

def __init__(self):
self.db = MongoConnector.get_context()

@staticmethod
def update(self, telegram_id, upsert=False, **kwargs):
"""Update an User in the database

Args:
telegram_id (str): Telegram User ID. It's casts to string to keep
compatibility with current data.
upsert (bool): Create if the user doesn't exist

Kwargs:
All keyword arguments will be sent as fields and its values to
update the user data. The following example will update the user,
which ID is 123, with `lang` field equals to `"pt_BR"`.


>>> User.update(123, lang="pt_BR")

Returns:
An dict with User data.
"""

telegram_id = str(telegram_id)
kwargs["id"] = telegram_id # Don't miss `id` if creating a new User

return self.db.users.update(
{"id": telegram_id},
{"$set": kwargs},
upsert=upsert,
)

167 changes: 67 additions & 100 deletions rastreio/db.py
Original file line number Diff line number Diff line change
@@ -1,122 +1,89 @@
from time import time
from pymongo import ASCENDING, MongoClient


client = MongoClient()
db = client.rastreiobot


def metric_increase_package_counter():
return db.metrics.update_one(
{"metric": "total_packages"},
{"$inc": {"value": 1}},
upsert=True,
)


def all_packages():
return db.rastreiobot.find()


def search_package(code):
return db.rastreiobot.find_one({"code": code})


def search_packages_per_user(user_id):
user_id = str(user_id)
return db.rastreiobot.find({"users": user_id}).sort(user_id, ASCENDING)


def package_status(code):
return db.rastreiobot.find_one({"code": code})["stat"]


def package_has_user(code, user_id):
return db.rastreiobot.find_one({
"code": code.upper(),
"users": user_id,
})

from pymongo import ASCENDING
from config.mongo_connector import MongoConnector

class PackagesRepository:

def __init__(self):
self.db = MongoConnector.get_context()

def metric_increase_package_counter(self):
return self.db.metrics.update_one(
{"metric": "total_packages"},
{"$inc": {"value": 1}},
upsert=True,
)

def add_package(code, users, stat):
users = users if isinstance(users, (list, tuple)) else [users]
package = db.rastreiobot.insert_one({
"code": code.upper(),
"users": users,
"stat": stat,
"time": time(),
})
metric_increase_package_counter()
return package
def all_packages(self):
return self.db.rastreiobot.find()


def add_user_to_package(code, user):
return db.rastreiobot.update_one(
{"code": code.upper()},
{"$push": {"users": user}},
)
def search_package(self, code):
return self.db.rastreiobot.find_one({"code": code})


def update_package(code, **kwargs):
code = str(code).upper()
return db.rastreiobot.update_one(
{"code": code},
{"$set": kwargs},
)
def search_packages_per_user(self, user_id):
user_id = str(user_id)
return self.db.rastreiobot.find({"users": user_id}).sort(user_id, ASCENDING)


def remove_user_from_package(code, user_id):
print(code)
print(user_id)
package = search_package(code)
print(package)
users = package["users"]
users.remove(str(user_id))
return update_package(code, users=users)
def package_status(self, code):
return self.db.rastreiobot.find_one({"code": code})["stat"]


def set_package_description(code, user_id, description=None):
user_id = str(user_id)
code = str(code).upper()
description = description or code
return db.rastreiobot.update_one(
{"code": code},
{"$set": {user_id: description}},
)
def package_has_user(self, code, user_id):
return self.db.rastreiobot.find_one({
"code": code.upper(),
"users": user_id,
})


def delete_package(code):
return db.rastreiobot.delete_one({"code": code})
def add_package(self, code, users, stat):
users = users if isinstance(users, (list, tuple)) else [users]
package = self.db.rastreiobot.insert_one({
"code": code.upper(),
"users": users,
"stat": stat,
"time": time(),
})
self.metric_increase_package_counter()
return package


class User:
def add_user_to_package(self, code, user):
return self.db.rastreiobot.update_one(
{"code": code.upper()},
{"$push": {"users": user}},
)

@staticmethod
def update(telegram_id, upsert=False, **kwargs):
"""Update an User in the database

Args:
telegram_id (str): Telegram User ID. It's casts to string to keep
compatibility with current data.
upsert (bool): Create if the user doesn't exist
def update_package(self, code, **kwargs):
code = str(code).upper()
return self.db.rastreiobot.update_one(
{"code": code},
{"$set": kwargs},
)

Kwargs:
All keyword arguments will be sent as fields and its values to
update the user data. The following example will update the user,
which ID is 123, with `lang` field equals to `"pt_BR"`.

def remove_user_from_package(self, code, user_id):
print(code)
print(user_id)
package = self.search_package(code)
print(package)
users = package["users"]
users.remove(str(user_id))
return self.update_package(code, users=users)

>>> User.update(123, lang="pt_BR")

Returns:
An dict with User data.
"""
def set_package_description(self, code, user_id, description=None):
user_id = str(user_id)
code = str(code).upper()
description = description or code
return self.db.rastreiobot.update_one(
{"code": code},
{"$set": {user_id: description}},
)

telegram_id = str(telegram_id)
kwargs["id"] = telegram_id # Don't miss `id` if creating a new User

return db.users.update(
{"id": telegram_id},
{"$set": kwargs},
upsert=upsert,
)
def delete_package(self, code):
return self.db.rastreiobot.delete_one({"code": code})
5 changes: 3 additions & 2 deletions rastreiobot.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@

import utils.msgs as msgs
import utils.status as status
from rastreio import db
from rastreio.db import PackagesRepository


config = configparser.ConfigParser()
config.read('bot.conf')
Expand Down Expand Up @@ -56,7 +57,7 @@ def count_packages():
'''
Count total packages and packages per status
'''
cursor = db.all_packages()
cursor = PackagesRepository.all_packages()
pkg_status = defaultdict(int)
for elem in cursor:
if len(elem['code']) > 13:
Expand Down
2 changes: 1 addition & 1 deletion tests/test_api_correios.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def test_parse_multiple_codes_output(mocked_parse):
])


@patch("apis.apicorreios.db.update_package")
@patch("apis.apicorreios.db.PackagesRepository.update_package")
def test_parse_package_in_transit(mocked_update_package):
with open("tests/data/correios-package-in-transit.json") as file:
returned_package = json.load(file)
Expand Down
2 changes: 1 addition & 1 deletion tests/test_rastreiobot.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ def all_packages():


def test_count_packages(mocker, all_packages):
mocked = mocker.patch('rastreio.db.all_packages')
mocked = mocker.patch('rastreio.db.PackagesRepository.all_packages')
mocked.return_value = all_packages

assert dict(count_packages()) == {
Expand Down
2 changes: 1 addition & 1 deletion webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import sqlite3
import requests
from flask import abort, request
from rastreio.db import User
from domain.user import User

config = configparser.ConfigParser()
config.sections()
Expand Down