from .database import DatabaseController from models.stats import Stats from datetime import datetime from utils.general_utils import is_within_x_days class StatsController(DatabaseController): FIELDS = ['id', 'userID', 'productID', 'viewDate'] TYPE = Stats def __init__(self): super().__init__() def create(self, view: Stats): params = [ view.userID, view.productID, view.viewDate ] query = """ INSERT INTO Views (userID, productID, viewDate) VALUES (?, ?, ?) """ self.do(query, params) def read(self) -> list[Stats] | None: query = "SELECT * FROM Views" self.get_many(query, []) def read_product(self, product_id: int = 0) -> list[Stats] | None: params = [ product_id ] query = """ SELECT * FROM Views WHERE productID = ? """ return self.get_many(query, params) def read_user(self, user_id: int) -> list[Stats] | None: params = [ user_id ] query = """ SELECT * FROM Views WHERE userID = ? """ return self.get_many(query, params) def read_days(self, product_id: int, prev_days: int = 7 ) -> dict[int, list[Stats]] | None: """ Returns data from within the given number of days """ data = self.read_product(product_id) # Filter the values to only be within X prev days filtered_data = list() if data is not None: filtered_data = list(filter( lambda d: is_within_x_days(d.viewDate, prev_days), data )) day_views: dict[int, list[Stats]] = dict() for i in range(0, prev_days): day_views[i] = list() # Organise data into distinct for view in filtered_data: diff = datetime.now()-view.viewDate day_views[diff.days].append(view) return day_views def read_product_views(self, id: int): """ Returns the total number of views for a product """ params = [ id ] # Total Views query = """ SELECT count(id) FROM Views WHERE productID = ? """ return self.get_one(query, params, int) def update(self): print("Doing work") def delete(self): print("Doing work")