database and services updated and tested

This commit is contained in:
2025-01-08 21:35:11 +03:00
parent 364a4df4b1
commit 08896e4c61
132 changed files with 13302 additions and 95 deletions

View File

View File

@@ -0,0 +1,136 @@
import datetime
from databases.no_sql_models.validations import PasswordHistoryViaUser, DomainViaUser, AccessHistoryViaUser
from databases.no_sql_models.mongo_database import MongoQuery
class MongoQueryIdentity:
"""
4ex. mongo_collection_name = str(Company.uu_id()) + "*" + str('UserPasswordHistory')
"""
def __init__(self, company_uuid, storage_reasoning: str = None):
self.company_uuid = company_uuid
self.mongo_collection_base = str(company_uuid)
if storage_reasoning:
self.mongo_collection_name = (
str(company_uuid) + "*" + str(storage_reasoning)
)
else:
self.mongo_collection_name = str(company_uuid) + "*" + str("Domain")
self.mongo_engine = MongoQuery(
table_name=self.mongo_collection_name, database_name="mongo_database"
)
def use_collection(self, storage_reasoning):
self.mongo_collection_name = (
str(self.company_uuid) + "*" + str(storage_reasoning)
)
self.mongo_engine = MongoQuery(
table_name=self.mongo_collection_name, database_name="mongo_database"
)
def create_domain_via_user(self, payload: DomainViaUser):
self.use_collection("Domain")
return self.mongo_engine.find_or_insert(
field="user_uu_id",
payload={
"user_uu_id": payload.user_uu_id,
"other_domains_list": [payload.main_domain],
"main_domain": payload.main_domain,
"modified_at": datetime.datetime.now().timestamp(),
}
)
def update_domain_via_user(self, payload: DomainViaUser):
self.use_collection("Domain")
return self.mongo_engine.update(
match=payload.user_uu_id,
payload={
"other_domains_list": payload.other_domains_list,
"modified_at": datetime.datetime.now().timestamp(),
},
field="user_uu_id",
)
def get_domain_via_user(self, user_uu_id):
self.use_collection("Domain")
return self.mongo_engine.get_one(match=str(user_uu_id), field="user_uu_id")
def refresh_password_history_via_user(self, payload: PasswordHistoryViaUser):
self.use_collection("PasswordHistory")
password_history_item = self.mongo_engine.get_one(
match=payload.user_uu_id, field="user_uu_id"
)
if not password_history_item:
self.mongo_engine.insert(
payload={
"user_uu_id": str(payload.user_uu_id),
"password_history": [],
}
)
password_history_item = self.mongo_engine.get_one(
match=payload.user_uu_id, field="user_uu_id"
)
password_history_list = password_history_item.get("password_history", [])
hashed_password = payload.password_add.get("password")
for password_in_history in password_history_list:
if str(password_in_history.get("password")) == str(hashed_password):
raise Exception(
dict(
status_code=400,
detail="Password already used. Please enter a new password that you have not used last 3 times."
)
)
if len(password_history_list) > 3:
password_history_list.pop(0)
password_history_list.append(payload.password_add)
return self.mongo_engine.update(
match=payload.user_uu_id,
payload={
"password_history": password_history_list,
"access_history_detail": payload.access_history_detail,
"modified_at": datetime.datetime.now().timestamp(),
},
field="user_uu_id",
)
def get_password_history_via_user(self, user_uu_id):
self.use_collection("PasswordHistory")
return self.mongo_engine.get_one(match=user_uu_id, field="user_uu_id")
def update_access_history_via_user(self, payload: AccessHistoryViaUser):
self.use_collection("AccessHistory")
if already_dict := self.get_access_history_via_user(
user_uu_id=payload.user_uu_id
):
access_history = already_dict[0].get("access_history") or []
access_history.append(payload.access_history)
if len(access_history) > 60:
access_history.pop(0)
return self.mongo_engine.update(
match=payload.user_uu_id,
payload={
"user_uu_id": payload.user_uu_id,
"access_history": access_history,
"modified_at": datetime.datetime.now().timestamp(),
},
field="user_uu_id",
)
return self.mongo_engine.insert(
payload={
"user_uu_id": payload.user_uu_id,
"access_history": [payload.access_history],
"modified_at": datetime.datetime.now().timestamp(),
}
)
def get_access_history_via_user(self, user_uu_id):
self.use_collection("AccessHistory")
return self.mongo_engine.filter_by(
payload={"user_uu_id": user_uu_id},
sort_by="modified_at",
sort_direction="desc",
)

View File

@@ -0,0 +1,88 @@
# from loggers.loggers import LoginLogger
def get_menu_from_mongo(user_id, company_name):
from databases.no_sql_models.mongo_database import MongoQuery
mongo = MongoQuery(
table_name=company_name.replace(" ", ""), database_name="mongo_database"
)
mongo_dict = mongo.parse_json(mongo.get_one(match=user_id, field="user_id")) or {}
return mongo_dict.get("menu", [])
def load_user_with_erp_details(found_user, access_dict: dict = None):
duties = []
employee = found_user.person.employee
duty_dict = {}
try:
duty_dict = employee.duty.get_dict(
include=["duty_name", "duty_code", "duty_description"]
)
duty_dict["buildings"] = []
duty_dict["response_buildings"] = []
duty_dict["department"] = employee.duty.department.get_dict(
include=["department_name", "department_code"]
)
duty_dict["company"] = employee.duty.department.company.get_dict(
include=["formal_name", "public_name", "tax_no", "default_lang_type"]
)
except Exception as e:
# LoginLogger.log_exception(
# {
# "exc": e,
# "user": found_user.uu_id,
# "function": "load_user_with_erp_details",
# }
# )
err = e
print("MongoQuery load_user_with_erp_details", err)
for building in list(set(employee.duty.department.company.response_buildings)):
build_parts = []
for part in building.parts:
build_parts.append(
part.get_dict(
include=["uu_id", "part_name", "part_code", "part_description"]
)
)
duty_dict["response_buildings"].append(
{
"build": building.get_dict(include=["build_name", "uu_id"]),
"parts": build_parts,
}
)
for building in list(set(employee.duty.department.company.buildings)):
build_parts = []
for part in building.parts:
build_parts.append(
part.get_dict(
include=[
"uu_id",
"part_name",
"part_code",
"part_description",
]
)
)
duty_dict["buildings"].append(
{
"build": building.get_dict(include=["build_name", "uu_id"]),
"parts": build_parts,
}
)
duties.append(duty_dict)
return_dict = access_dict if access_dict else {}
return_dict.update(
{
"data": {
"profile": found_user.get_dict(),
"employee_info": duties,
"menu": get_menu_from_mongo(
found_user.id,
company_name=duty_dict.get("company", {}).get("public_name", ""),
),
},
}
)
return return_dict

View File

@@ -0,0 +1,312 @@
from itertools import count
import pymongo
from json import loads
from bson import ObjectId, json_util
from pydantic import BaseModel
from api_configs import MongoConfig
from pymongo import MongoClient
from pymongo.collection import Collection
from pymongo.results import InsertManyResult
# from configs import TestMongo as MongoConfig
class Paginate(BaseModel):
pageSize: int = 10
pageNumber: int = 1
sortField: str = "_id"
sortOrder: str = "desc"
def grab_paginates(self):
size_ = self.pageSize
return (
size_,
size_ * (self.pageNumber - 1),
self.sortField,
-1 if self.sortOrder == "desc" else 1,
)
class MongoResponse:
def __init__(self, status: bool, message: str, message_code:str = None, data: dict = None, mongo=None, count: int = 1):
self.status = status
self.message = message
self.data = data
self.mongo = mongo
self.message_code = message_code
self.count = count
def as_dict(self):
return {
"status": self.status,
"count": self.count,
"message": self.message,
"message_code": self.message_code,
"data": self.data,
}
class MongoQuery:
def __init__(self, table_name: str, database_name: str):
database = MongoClient(MongoConfig.url)[database_name]
self.table: Collection = database[table_name]
@staticmethod
def grab_paginates(paginate):
return (
paginate.size,
paginate.size * (paginate.page - 1),
paginate.order_field,
-1 if paginate.order_type == "desc" else 1,
)
@staticmethod
def parse_json(data):
return loads(json_util.dumps(data))
def insert(self, payload) -> MongoResponse:
insert = self.table.insert_one(document=payload)
if insert.acknowledged:
return MongoResponse(
status=True,
message="The document has been created",
message_code="CREATED",
data=payload,
mongo=insert,
)
return MongoResponse(
status=False,
message="The document has not been created",
message_code="NOT_CREATED",
data=None,
mongo=insert,
count=0
)
def insert_many(self, payload) -> MongoResponse:
insert_many = self.table.insert_many(documents=payload)
if insert_many.acknowledged:
return MongoResponse(
status=True,
message="The documents have been created",
message_code="CREATED",
data=payload,
mongo=insert_many,
count=len(payload)
)
return MongoResponse(
status=False,
message="The documents have not been created",
message_code="NOT_CREATED",
data=None,
mongo=insert_many,
count=0
)
def find_or_insert(self, payload, field: str = "id") -> MongoResponse:
if field == "id":
found_row = self.get_one(match=payload["_id"], field="_id")
if found_row.status:
return MongoResponse(
status=False,
message="The document already exists",
data=found_row.data,
mongo=found_row.mongo,
)
if mongo := self.table.insert_one(document=payload).acknowledged:
return MongoResponse(
status=True,
message="The document has been created",
data=payload,
mongo=mongo
)
found_row = self.get_one(match=payload[field], field=field)
if found_row.status:
return MongoResponse(
status=False,
message_code="ALREADY_EXISTS",
message="The document already exists",
data=found_row.data,
mongo=found_row.mongo
)
insert_row = self.table.insert_one(document=payload)
return MongoResponse(
status=True,
message="The document has been created",
message_code="CREATED",
data=payload,
mongo=insert_row
)
def update(self, match, payload, field: str = "id"):
if field == "id":
filter_ = {"_id": ObjectId(match)}
update_one = self.table.update_one(filter=filter_, update={"$set": payload})
return MongoResponse(
status=True,
message="The document has been updated",
message_code="UPDATED",
data=self.get_one(match=match, field=field).data,
mongo=update_one
)
update_one = self.table.update_one(filter={field: match}, update={"$set": payload})
return MongoResponse(
status=True,
message="The document has been updated",
message_code="UPDATED",
data=self.get_one(match=match, field=field).data,
mongo=update_one
)
def get_one(self, match, field: str = "id"):
if field == "id":
if get_one := self.table.find_one(filter={"_id": ObjectId(match)}):
return MongoResponse(
status=True,
message="The document has been found",
message_code="FOUND",
data=self.parse_json(data=get_one),
mongo=get_one
)
if get_one := self.table.find_one(filter={field: match}):
return MongoResponse(
status=True,
message="The document has been found",
message_code="FOUND",
data=self.parse_json(data=get_one),
mongo=get_one
)
return MongoResponse(
status=False,
message="The document has not been found",
message_code="NOT_FOUND",
data=None,
mongo=None
)
def filter_by(self, payload, sort_by: str = "_id", sort_direction: str = "asc"):
sort_direction = (
pymongo.ASCENDING
if str(sort_direction).lower() == "asc"
else pymongo.DESCENDING
)
return_ = self.table.find(payload).sort(sort_by, sort_direction)
data = self.parse_json(data=return_)
if len(data) == 0:
return MongoResponse(
status=False,
message="The documents have not been found",
message_code="NOT_FOUND",
data=None,
mongo=return_,
count=0
)
return MongoResponse(
status=True,
message="The documents have been found",
message_code="FOUND",
count=self.table.count_documents(payload),
data=data,
)
def delete_one(self, match, field: str = "id"):
if field == "id":
delete_one = self.table.delete_one(filter={"_id": ObjectId(match)})
if delete_one.deleted_count:
return MongoResponse(
status=True,
message="The document has been deleted",
message_code="DELETED",
data=None,
count=delete_one.deleted_count,
mongo=delete_one
)
delete_one = self.table.delete_one(filter={field: match})
if delete_one.deleted_count:
return MongoResponse(
status=True,
message="The document has been deleted",
message_code="DELETED",
data=None,
count=delete_one.deleted_count,
mongo=delete_one
)
return MongoResponse(
status=False,
message="The document has not been deleted",
message_code="NOT_DELETED",
data=None,
mongo=None,
count=0
)
def delete_all(self, match, field: str = "id"):
if field == "id":
delete_many = self.table.delete_many(filter={"_id": ObjectId(match)})
if delete_many.deleted_count:
return MongoResponse(
status=True,
message="The document has been deleted",
message_code="DELETED",
data=None,
count=delete_many.deleted_count,
mongo=delete_many
)
delete_many = self.table.delete_many(filter={field: match})
if delete_many.deleted_count:
return MongoResponse(
status=True,
message="The document has been deleted",
message_code="DELETED",
data=None,
count=delete_many.deleted_count,
mongo=delete_many
)
return MongoResponse(
status=False,
message="The document has not been deleted",
message_code="NOT_DELETED",
data=None,
mongo=None,
count=0
)
def list_all(self, paginate: Paginate):
size, skip, field, order = paginate.grab_paginates()
return_ = self.table.find().sort([(field, order)]).skip(skip).limit(size)
self.table.count_documents({}), self.parse_json(data=return_)
data = self.parse_json(data=return_)
if len(data) == 0:
return MongoResponse(
status=False,
message="The documents have not been found",
message_code="NOT_FOUND",
data=None,
mongo=return_,
count=0
)
return MongoResponse(
status=True,
message="The documents have been found",
message_code="FOUND",
count=self.table.count_documents({}),
data=data,
mongo=return_
)
def get_all(self):
return_ = self.table.find()
return MongoResponse(
status=True,
message="The documents have been found",
message_code="FOUND",
count=self.table.count_documents({}),
data=self.parse_json(data=return_),
mongo=return_
)
# Mongo = MongoQuery(table_name="XcompanyConfig", database_name="mongo_database")

View File

@@ -0,0 +1,19 @@
from typing import Optional
from pydantic import BaseModel
class DomainViaUser(BaseModel):
user_uu_id: str
main_domain: str
other_domains_list: Optional[list] = None
class PasswordHistoryViaUser(BaseModel):
user_uu_id: str
password_add: dict
access_history_detail: Optional[dict]
class AccessHistoryViaUser(BaseModel):
user_uu_id: str
access_history: dict