diff --git a/backend/entities/__init__.py b/backend/entities/__init__.py index 4191027..0b82067 100644 --- a/backend/entities/__init__.py +++ b/backend/entities/__init__.py @@ -1,2 +1,10 @@ from .entity_base import EntityBase from .sample_entity import SampleEntity +from .tag_entity import TagEntity +from .user_entity import UserEntity +from .resource_entity import ResourceEntity +from .resource_tag_entity import ResourceTagEntity +from .service_entity import ServiceEntity +from .service_tag_entity import ServiceTagEntity +from .program_enum import ProgramEnum +from .user_enum import RoleEnum diff --git a/backend/entities/program_enum.py b/backend/entities/program_enum.py new file mode 100644 index 0000000..3a207bd --- /dev/null +++ b/backend/entities/program_enum.py @@ -0,0 +1,10 @@ +from sqlalchemy import Enum + + +class ProgramEnum(Enum): + ECONOMIC = "economic" + DOMESTIC = "domestic" + COMMUNITY = "community" + + def __init__(self): + super().__init__(name="program_enum") diff --git a/backend/entities/resource_entity.py b/backend/entities/resource_entity.py index 4adea78..b38e625 100644 --- a/backend/entities/resource_entity.py +++ b/backend/entities/resource_entity.py @@ -1,38 +1,68 @@ """ Defines the table for storing resources """ + # Import our mapped SQL types from SQLAlchemy from sqlalchemy import Integer, String, DateTime + # Import mapping capabilities from the SQLAlchemy ORM from sqlalchemy.orm import Mapped, mapped_column, relationship + # Import the EntityBase that we are extending from .entity_base import EntityBase + # Import datetime for created_at type from datetime import datetime -# Import enums for Program -import enum -from sqlalchemy import Enum -class ProgramEnum(enum.Enum): - """ Determine program for Resource """ - DOMESTIC = 'DOMESTIC' - ECONOMIC = 'ECONOMIC' - COMMUNITY = 'COMMUNITY' +# Import self for to model +from typing import Self +from backend.entities.program_enum import ProgramEnum -class ResourceEntity(EntityBase): - #set table name +class ResourceEntity(EntityBase): + + # set table name __tablename__ = "resource" - #set fields + # set fields id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now) name: Mapped[str] = mapped_column(String(32), nullable=False) summary: Mapped[str] = mapped_column(String(100), nullable=False) link: Mapped[str] = mapped_column(String, nullable=False) - program: Mapped[ProgramEnum] = mapped_column(Enum(ProgramEnum), nullable=False) + program: Mapped[ProgramEnum] = mapped_column(ProgramEnum, nullable=False) - #relationships - resourceTags: Mapped[list["ResourceTagEntity"]] = relationship(back_populates="resource", cascade="all,delete") + # relationships + resourceTags: Mapped[list["ResourceTagEntity"]] = relationship( + back_populates="resource", cascade="all,delete" + ) + # + # @classmethod + # def from_model(cls, model: user_model) -> Self: + # """ + # Create a UserEntity from a User model. + # Args: + # model (User): The model to create the entity from. + # Returns: + # Self: The entity (not yet persisted). + # """ + # return cls ( + # id = model.id, + # created_at = model.created_at, + # name = model.name, + # summary = model.summary, + # link = model.link, + # program = model.program, + # ) + + # def to_model(self) -> user_model: + # return user_model ( + # id = self.id, + # created_at = self.created_at, + # name = self.name, + # summary = self.summary, + # link = self.link, + # program = self.program, + # ) diff --git a/backend/entities/resource_tag_entity.py b/backend/entities/resource_tag_entity.py index 3b7d198..f1de522 100644 --- a/backend/entities/resource_tag_entity.py +++ b/backend/entities/resource_tag_entity.py @@ -1,7 +1,7 @@ """ Defines the table for resource tags """ # Import our mapped SQL types from SQLAlchemy -from sqlalchemy import ForeignKey, Integer, String, DateTime, ARRAY +from sqlalchemy import ForeignKey, Integer, String, DateTime # Import mapping capabilities from the SQLAlchemy ORM from sqlalchemy.orm import Mapped, mapped_column, relationship @@ -12,9 +12,8 @@ from .entity_base import EntityBase # Import datetime for created_at type from datetime import datetime -# Import enums for Role and Program -import enum -from sqlalchemy import Enum +# Import self for to model +from typing import Self class ResourceTagEntity(EntityBase): @@ -24,9 +23,24 @@ class ResourceTagEntity(EntityBase): # set fields or 'columns' for the user table id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) - resourceId: Mapped[int] = mapped_column(ForeignKey("event.id"), primary_key=True) - tagId: Mapped[int] = mapped_column(ForeignKey("user.pid"), primary_key=True) + resourceId: Mapped[int] = mapped_column(ForeignKey("resource.id")) + tagId: Mapped[int] = mapped_column(ForeignKey("tag.id")) # relationships resource: Mapped["ResourceEntity"] = relationship(back_populates="resourceTags") tag: Mapped["TagEntity"] = relationship(back_populates="resourceTags") + + # @classmethod + # def from_model (cls, model: resource_tag_model) -> Self: + # return cls ( + # id = model.id, + # resourceId = model.resourceId, + # tagId = model.tagId, + # ) + + # def to_model (self) -> resource_tag_model: + # return user_model( + # id = self.id, + # resourceId = self.resourceId, + # tagId = self.tagId, + # ) diff --git a/backend/entities/serivce_entity.py b/backend/entities/service_entity.py similarity index 83% rename from backend/entities/serivce_entity.py rename to backend/entities/service_entity.py index 4e257ec..e927be7 100644 --- a/backend/entities/serivce_entity.py +++ b/backend/entities/service_entity.py @@ -19,17 +19,18 @@ from sqlalchemy import Enum class ProgramEnum(enum.Enum): """Determine program for Service""" + DOMESTIC = "DOMESTIC" ECONOMIC = "ECONOMIC" COMMUNITY = "COMMUNITY" -class ResourceEntity(EntityBase): +class ServiceEntity(EntityBase): - #set table name + # set table name __tablename__ = "service" - #set fields + # set fields id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now) name: Mapped[str] = mapped_column(String(32), nullable=False) @@ -37,5 +38,7 @@ class ResourceEntity(EntityBase): requirements: Mapped[list[str]] = mapped_column(ARRAY(String)) program: Mapped[ProgramEnum] = mapped_column(Enum(ProgramEnum), nullable=False) - #relationships - resourceTags: Mapped[list["ServiceTagEntity"]] = relationship(back_populates="service", cascade="all,delete") + # relationships + serviceTags: Mapped[list["ServiceTagEntity"]] = relationship( + back_populates="service", cascade="all,delete" + ) diff --git a/backend/entities/service_tag_entity.py b/backend/entities/service_tag_entity.py index 689d675..c1dbdc7 100644 --- a/backend/entities/service_tag_entity.py +++ b/backend/entities/service_tag_entity.py @@ -10,15 +10,15 @@ from sqlalchemy.orm import Mapped, mapped_column, relationship from .entity_base import EntityBase -class ResourceTagEntity(EntityBase): +class ServiceTagEntity(EntityBase): # set table name to user in the database __tablename__ = "serviceTag" # set fields or 'columns' for the user table id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) - sericeId: Mapped[int] = mapped_column(ForeignKey("event.id"), primary_key=True) - tagId: Mapped[int] = mapped_column(ForeignKey("user.pid"), primary_key=True) + serviceId: Mapped[int] = mapped_column(ForeignKey("service.id")) + tagId: Mapped[int] = mapped_column(ForeignKey("tag.id")) # relationships service: Mapped["ServiceEntity"] = relationship(back_populates="resourceTags") diff --git a/backend/entities/tag_entity.py b/backend/entities/tag_entity.py index 8106892..e61f1ee 100644 --- a/backend/entities/tag_entity.py +++ b/backend/entities/tag_entity.py @@ -26,3 +26,37 @@ class TagEntity(EntityBase): resourceTags: Mapped[list["ResourceTagEntity"]] = relationship(back_populates="tag", cascade="all,delete") serviceTags: Mapped[list["ServiceTagEntity"]] = relationship(back_populates="tag", cascade="all,delete") + + """ + @classmethod + def from_model(cls, model: Tag) -> Self: + + Create a user entity from model + + Args: model (User): the model to create the entity from + + Returns: + self: The entity + + + return cls( + id=model.id, + content=model.id, + ) + + def to_model(self) -> Tag: + + Create a user model from entity + + Returns: + User: A User model for API usage + + + return Tag( + id=self.id, + content=self.id, + ) + + """ + + diff --git a/backend/entities/user_entity.py b/backend/entities/user_entity.py index c7b77f0..8f82e4d 100644 --- a/backend/entities/user_entity.py +++ b/backend/entities/user_entity.py @@ -2,31 +2,27 @@ # Import our mapped SQL types from SQLAlchemy from sqlalchemy import Integer, String, DateTime, ARRAY + + # Import mapping capabilities from the SQLAlchemy ORM from sqlalchemy.orm import Mapped, mapped_column + + # Import the EntityBase that we are extending from .entity_base import EntityBase + + # Import datetime for created_at type from datetime import datetime + + # Import enums for Role and Program -import enum -from sqlalchemy import Enum - -class RoleEnum(enum.Enum): - """ Determine role for User """ - ADMIN = 'ADMIN' - EMPLOYEE = 'EMPLOYEE' - VOLUNTEER = 'VOLUNTEER' - -class ProgramEnum(enum.Enum): - """Determine program for User """ - DOMESTIC = 'DOMESTIC' - ECONOMIC = 'ECONOMIC' - COMMUNITY = 'COMMUNITY' +from backend.entities.program_enum import ProgramEnum +from .user_enum import RoleEnum class UserEntity(EntityBase): - """Serves as the databse model for User table""" + """Serves as the database model for User table""" # set table name to user in the database __tablename__ = "user" @@ -34,10 +30,61 @@ class UserEntity(EntityBase): # set fields or 'columns' for the user table id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) created_at: Mapped[datetime] = mapped_column(DateTime, default=datetime.now) - username: Mapped[str] = mapped_column(String(32), nullable=False, default="", unique=True) - role: Mapped[RoleEnum] = mapped_column(Enum(RoleEnum), nullable=False) + username: Mapped[str] = mapped_column( + String(32), nullable=False, default="", unique=True + ) + role: Mapped[RoleEnum] = mapped_column(RoleEnum, nullable=False) + username: Mapped[str] = mapped_column( + String(32), nullable=False, default="", unique=True + ) + role: Mapped[RoleEnum] = mapped_column(RoleEnum, nullable=False) email: Mapped[str] = mapped_column(String(50), nullable=False, unique=True) - program: Mapped[list[ProgramEnum]] = mapped_column(ARRAY(Enum(ProgramEnum)), nullable=False) + program: Mapped[list[ProgramEnum]] = mapped_column( + ARRAY(ProgramEnum), nullable=False + ) + program: Mapped[list[ProgramEnum]] = mapped_column( + ARRAY(ProgramEnum), nullable=False + ) experience: Mapped[int] = mapped_column(Integer, nullable=False) group: Mapped[str] = mapped_column(String(50)) - + + """ + @classmethod + def from_model(cls, model: User) -> Self: + + Create a user entity from model + + Args: model (User): the model to create the entity from + + Returns: + self: The entity + + + return cls( + id=model.id, + username=model.username, + role=model.role, + email=model.email, + program=model.program, + experience=model.experience, + group=model.group, + ) + + def to_model(self) -> User: + + Create a user model from entity + + Returns: + User: A User model for API usage + + + return User( + id=self.id, + username=self.id, + role=self.role, + email=self.email, + program=self.program, + experience=self.experience, + group=self.group, + ) + """ diff --git a/backend/entities/user_enum.py b/backend/entities/user_enum.py new file mode 100644 index 0000000..99594ec --- /dev/null +++ b/backend/entities/user_enum.py @@ -0,0 +1,12 @@ +from sqlalchemy import Enum + + +class RoleEnum(Enum): + """Determine role for User""" + + ADMIN = "ADMIN" + EMPLOYEE = "EMPLOYEE" + VOLUNTEER = "VOLUNTEER" + + def __init__(self): + super().__init__(name="role_enum")