Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
added new database module
  • Loading branch information
brucewzj99 committed Mar 16, 2024
commit 12418216f35e6908e3e73b6f82af29bf382f7431
File renamed without changes.
17 changes: 17 additions & 0 deletions bot/database_service/auth.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from firebase_admin import firestore
import firebase_admin
from firebase_admin import credentials
import os
import json


def get_db_client():
"""
Get credentials for the Google Sheets API.
"""
firebase_json = json.loads(os.environ["FIREBASE_JSON"])

cred = credentials.Certificate(firebase_json)
firebase_admin.initialize_app(cred)

return firestore.client()
44 changes: 44 additions & 0 deletions bot/database_service/firestore_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from bot.database_service.auth import get_db_client


class FirestoreService:
"""
This class is responsible for managing the Firestore database.
"""

def __init__(self):
self.db = get_db_client()

# New user setup
def new_user_setup(self, telegram_id, sheet_id):
user_ref = self.db.collection("users").document(str(telegram_id))
user_ref.set({"sheet_id": sheet_id})

# Check if user exists
def check_if_user_exists(self, telegram_id):
user_ref = self.db.collection("users").document(str(telegram_id))
user_doc = user_ref.get()
return user_doc.exists

# Get user sheet id
def get_user_sheet_id(self, telegram_id):
user_ref = self.db.collection("users").document(str(telegram_id))
user_doc = user_ref.get()
if user_doc.exists:
return user_doc.get("sheet_id")
else:
return None

# Get all user IDs
def get_all_user_id(self):
users_ref = self.db.collection("users")
user_ids = [int(user.id) for user in users_ref.stream()]
return user_ids

# Get all sheet IDs
def get_all_sheet_id(self):
users_ref = self.db.collection("users")
sheet_ids = []
for user in users_ref.stream():
sheet_ids.append(user.get("sheet_id"))
return sheet_ids
Empty file added bot/sheet_service/__init__.py
Empty file.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ def get_main_dropdown_value(self, spreadsheet_id, entry_type) -> list[str]:
def get_sub_dropdown_value(
self, spreadsheet_id, header_value, entry_type
) -> list[str]:
"""
This method gets the sub values for the CATEGORY/PAYMENT of the transaction.
"""
range = []
# if entry_type is transport, should be calling this instead of get_main_dropdown_value
if entry_type == EntryType.OTHERS:
Expand Down Expand Up @@ -112,6 +115,33 @@ class EntryManager:
def __init__(self):
self.sheets_api = GoogleSheetsClient.get_instance()

def create_entry(self, spreadsheet_id, month, row_tracker, row_data):
entry_type = row_data[0]
price = row_data[1].strip()
remarks = row_data[2].strip()
category = row_data[3].strip()
payment = row_data[4].strip()

data = [price, remarks, category, payment]
sheet_column_start = "H"
sheet_column_end = "K"
if entry_type == EntryType.TRANSPORT:
remarks_list = [remark.strip() for remark in remarks.split(",")]
sheet_column_start = "C"
sheet_column_end = "G"
data = [price] + remarks_list + [category, payment]

body = {"values": [data]}
range_name = (
f"{month}!{sheet_column_start}{row_tracker}:{sheet_column_end}{row_tracker}"
)
self.sheets_api.spreadsheets().values().update(
spreadsheetId=spreadsheet_id,
range=range_name,
valueInputOption="USER_ENTERED",
body=body,
).execute()


class SheetManager:
"""
Expand All @@ -120,3 +150,58 @@ class SheetManager:

def __init__(self):
self.sheets_api = GoogleSheetsClient.get_instance()

def get_last_entered_row(self, spreadsheet_id, month):
"""
This method gets the last entered row for the month.
"""
result = (
self.sheets_api.spreadsheets()
.values()
.get(spreadsheetId=spreadsheet_id, range=f"{month}!A:K")
.execute()
)
values = result.get("values", [])
return len(values)

# to be rename as update_prev_day_total
def update_prev_day(self, spreadsheet_id, month, first_row, last_row=0):
"""
This method update the total amount spend for the previous day
"""
if last_row == 0:
last_row = self.get_last_entered_row(spreadsheet_id, month)
body = {"values": [[f"=SUM(C{first_row}:H{last_row})"]]}
range_name = f"{month}!B{first_row}"
self.sheets_api.spreadsheets().values().update(
spreadsheetId=spreadsheet_id,
range=range_name,
valueInputOption="USER_ENTERED",
body=body,
).execute()

def create_date(self, spreadsheet_id, day, month, first_row):
"""
This method creates the date for the day.
"""
body = {"values": [[day]]}
range_name = f"{month}!A{first_row}"
self.sheets_api.spreadsheets().values().update(
spreadsheetId=spreadsheet_id,
range=range_name,
valueInputOption="USER_ENTERED",
body=body,
).execute()

def get_sheet_id_by_title(self, spreadsheet_id, title_to_find):
sheet_metadata = (
self.sheets_api.spreadsheets().get(spreadsheetId=spreadsheet_id).execute()
)
sheets = sheet_metadata.get("sheets", "")

for sheet in sheets:
title = sheet.get("properties", {}).get("title")
if title == title_to_find:
return sheet.get("properties", {}).get("sheetId")

return None
File renamed without changes.
7 changes: 7 additions & 0 deletions release_notes.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,11 @@
# Release Notes
## Version 2.3.0 - Date 16 Mar 2024
### For Developer 🧑‍💻
- Create new database module which is currently in use for future maintenance and development purposes

### Changes 🛠️
- Censor URL for error message

## Version 2.2.1 - Date 24 Feb 2024
### Changes 🛠️
- Include error message when replying back to users
Expand Down