From e7f9366256e3e3aa87c4e998c0c24028ee7df9ee Mon Sep 17 00:00:00 2001 From: Julien Kmec Date: Mon, 10 Feb 2025 16:41:10 -0800 Subject: [PATCH] MongoDB field changes (#18) * Allows database objects to be created with _id * Adds updatedAt to MongoDB objects --- bloxlink_lib/database.py | 8 +++++++- bloxlink_lib/models/guilds.py | 34 ++++++++++++++++++---------------- bloxlink_lib/models/users.py | 2 ++ 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/bloxlink_lib/database.py b/bloxlink_lib/database.py index 194500f..a1b9bff 100644 --- a/bloxlink_lib/database.py +++ b/bloxlink_lib/database.py @@ -209,7 +209,13 @@ async def update_item(domain: str, item_id: str, **aspects) -> None: # update database await mongo.bloxlink[domain].update_one( - {"_id": item_id}, {"$set": set_aspects, "$unset": unset_aspects}, upsert=True + {"_id": item_id}, + { + "$set": set_aspects, + "$unset": unset_aspects, + "$currentDate": {"updatedAt": True}, + }, + upsert=True, ) diff --git a/bloxlink_lib/models/guilds.py b/bloxlink_lib/models/guilds.py index bff38e1..1f194b5 100644 --- a/bloxlink_lib/models/guilds.py +++ b/bloxlink_lib/models/guilds.py @@ -1,6 +1,6 @@ from typing import Mapping, Self, Type, Literal, Annotated from pydantic import Field, field_validator -import hikari +from datetime import datetime from .base import PydanticList, BaseModel, PydanticDict, MemberSerializable from ..validators import is_positive_number_as_str from .migrators import migrate_restrictions @@ -70,15 +70,8 @@ class GuildData(BaseModel): """Representation of the stored settings for a guild""" id: Annotated[int, Field(alias="_id")] - binds: Annotated[list[binds_module.GuildBind], Field(default_factory=list)] - - @field_validator("binds", mode="before") - @classmethod - def transform_binds(cls: Type[Self], binds: list) -> list[binds_module.GuildBind]: - if all(isinstance(b, binds_module.GuildBind) for b in binds): - return binds - return [binds_module.GuildBind(**b) for b in binds] + binds: Annotated[list[binds_module.GuildBind], Field(default_factory=list)] verifiedRoleEnabled: bool = True verifiedRoleName: str | None = "Verified" # deprecated @@ -106,13 +99,6 @@ def transform_binds(cls: Type[Self], binds: list) -> list[binds_module.GuildBind restrictions: PydanticList[GuildRestriction] = Field(default_factory=list) - @field_validator("restrictions", mode="before") - @classmethod - def transform_restrictions( - cls: Type[Self], restrictions: dict[str, dict[str, GuildRestriction]] - ) -> list[GuildRestriction]: - return migrate_restrictions(restrictions) - webhooks: Webhooks = None hasBot: bool = False @@ -130,6 +116,22 @@ def transform_restrictions( groupIDs: PydanticDict = None migratedBindsToV4: bool = False + # field converters + @field_validator("binds", mode="before") + @classmethod + def transform_binds(cls: Type[Self], binds: list) -> list[binds_module.GuildBind]: + if all(isinstance(b, binds_module.GuildBind) for b in binds): + return binds + + return [binds_module.GuildBind(**b) for b in binds] + + @field_validator("restrictions", mode="before") + @classmethod + def transform_restrictions( + cls: Type[Self], restrictions: dict[str, dict[str, GuildRestriction]] + ) -> list[GuildRestriction]: + return migrate_restrictions(restrictions) + def model_post_init(self, __context): # merge verified roles into binds if self.verifiedRole: diff --git a/bloxlink_lib/models/users.py b/bloxlink_lib/models/users.py index 05e4a79..0b82d80 100644 --- a/bloxlink_lib/models/users.py +++ b/bloxlink_lib/models/users.py @@ -38,6 +38,8 @@ class UserData(BaseModel): """ id: Annotated[int, Field(alias="_id")] + updatedAt: datetime + robloxID: str | None = None robloxAccounts: dict = Field( default_factory=lambda: {"accounts": [], "guilds": {}, "confirms": {}}