ees_microsoft_teams/local_storage.py (59 lines of code) (raw):
#
# Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
# or more contributor license agreements. Licensed under the Elastic License 2.0;
# you may not use this file except in compliance with the Elastic License 2.0.
#
import copy
import json
import os
from . import constant
class LocalStorage:
"""This class contains all the methods to do operations on doc_id json file"""
def __init__(self, logger):
self.logger = logger
self.ids_path_dict = {
"teams": constant.CHANNEL_CHAT_DELETION_PATH,
"user_chats": constant.USER_CHAT_DELETION_PATH,
"calendar": constant.CALENDAR_CHAT_DELETION_PATH
}
def load_storage(self, object_type):
"""This method fetches the contents of doc_id.json(local ids storage)
:param ids_path: Path to the respective doc_ids.json
"""
try:
ids_path = self.ids_path_dict.get(object_type)
if os.path.exists(ids_path) and os.path.getsize(ids_path) > 0:
with open(ids_path, encoding="utf-8") as ids_file:
try:
return json.load(ids_file)
except ValueError as exception:
self.logger.exception(
f"Error while parsing the json file of the ids store from path: {ids_path}. "
f"Error: {exception}"
)
except FileNotFoundError:
self.logger.debug(
f"Local storage for ids was not found with path: {ids_path}."
)
return {"global_keys": []}
def update_storage(self, ids, object_type):
"""This method is used to update the ids stored in doc_id.json file
:param ids: updated ids to be stored in the doc_id.json file
:param ids_path: Path to the respective doc_ids.json
"""
ids_path = self.ids_path_dict.get(object_type)
with open(ids_path, "w", encoding="utf-8") as ids_file:
try:
json.dump(ids, ids_file, indent=4)
except ValueError as exception:
self.logger.exception(
f"Error while updating the doc_id json file. Error: {exception}"
)
raise exception
def create_local_storage_directory(self):
"""Creates a doc_id directory if not present"""
if not os.path.exists(constant.LOCAL_STORAGE_DIRECTORY):
os.makedirs(constant.LOCAL_STORAGE_DIRECTORY)
def get_documents_from_doc_id_storage(self, object_type):
"""Returns a dictionary from doc_id file containing the document ids fetched from Microsoft Teams
:param ids_path: Path to the respective doc_ids.json
Returns:
document_ids_dictionary: Dictionary containing the Microsoft Teams document ids
"""
document_ids_dictionary = {"global_keys": [], "delete_keys": []}
ids_collection = self.load_storage(object_type)
document_ids_dictionary["delete_keys"] = copy.deepcopy(
ids_collection.get("global_keys")
)
if not ids_collection["global_keys"]:
ids_collection["global_keys"] = []
document_ids_dictionary["global_keys"] = copy.deepcopy(
ids_collection["global_keys"]
)
return document_ids_dictionary
def insert_document_into_doc_id_storage(self, ids_list, id, type, parent_id="", super_parent_id=""):
""" Prepares the document dictionary for deletion and insert it into the global_keys of respective doc_ids.json.
:param ids_list: Pass "global_keys" of microsoft_teams_user_chat_doc_ids.json,
microsoft_teams_channel_chat_doc_ids.json and microsoft_teams_calendar_doc_ids.json
:param id: Pass id of User Chat, User Chat Attachment, Calendar, Calendar Attachment, Teams, Channel Chat,
Channel Chat Attachment, Channel Chat Tabs and User Chat Tabs
:param type: Pass type of each document for deletion.
:param parent_id: Pass parent id of each document for deletion.
:param super_parent_id: Pass super parent id of each document for deletion
"""
new_item = {"id": str(id), "type": type, "parent_id": str(parent_id), "super_parent_id": str(super_parent_id)}
if new_item not in ids_list:
ids_list.append(new_item)
return ids_list