Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
6 changes: 4 additions & 2 deletions wacruit/src/apps/member/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from http import HTTPStatus
from typing import Annotated

from fastapi import APIRouter
from fastapi import Depends
from fastapi import Response
from fastapi import Security
from fastapi.security import APIKeyHeader

Expand All @@ -17,13 +19,13 @@
v3_router = APIRouter(prefix="/v3/members", tags=["members"])


@v3_router.post("")
@v3_router.post("", status_code=HTTPStatus.CREATED)
def create_member(
admin_user: AdminUser,
request: MemberCreateRequest,
member_service: Annotated[MemberService, Depends()],
):
return member_service.create_member(request)
member_service.create_member(request)


@v3_router.get("/{member_id}")
Expand Down
5 changes: 5 additions & 0 deletions wacruit/src/apps/project/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@ def __init__(self):
class ProjectAlreadyExistsException(WacruitException):
def __init__(self):
super().__init__(status_code=409, detail="이미 존재하는 프로젝트입니다.")


class ProjectImageNotFoundException(WacruitException):
def __init__(self):
super().__init__(status_code=404, detail="존재하지 않는 프로젝트 이미지입니다.")
11 changes: 6 additions & 5 deletions wacruit/src/apps/project/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class Project(DeclarativeBase):
urls: Mapped[list["ProjectURL"] | None] = relationship(
back_populates="source_project"
)
image_urls: Mapped[list["ProjectImageURL"] | None] = relationship(
images: Mapped[list["ProjectImage"] | None] = relationship(
back_populates="source_project"
)

Expand All @@ -48,11 +48,12 @@ class ProjectURL(DeclarativeBase):
source_project: Mapped["Project"] = relationship(back_populates="urls")


class ProjectImageURL(DeclarativeBase):
__tablename__ = "project_image_url"
class ProjectImage(DeclarativeBase):
__tablename__ = "project_image"

id: Mapped[intpk]
project_id: Mapped[int] = mapped_column(ForeignKey("project.id"))
url: Mapped[str255]
object_key: Mapped[str255]
is_uploaded: Mapped[bool] = mapped_column(default=False)

source_project: Mapped["Project"] = relationship(back_populates="image_urls")
source_project: Mapped["Project"] = relationship(back_populates="images")
26 changes: 24 additions & 2 deletions wacruit/src/apps/project/repositories.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from fastapi import Depends
from sqlalchemy import update
from sqlalchemy.orm import joinedload
from sqlalchemy.orm import Session

from wacruit.src.apps.project.models import Project
from wacruit.src.apps.project.models import ProjectImageURL
from wacruit.src.apps.project.models import ProjectImage
from wacruit.src.apps.project.models import ProjectURL
from wacruit.src.database.connection import get_db_session
from wacruit.src.database.connection import Transaction
Expand All @@ -23,7 +24,7 @@ def get_project_by_id(self, project_id: int) -> Project | None:
self.session.query(Project)
.options(
joinedload(Project.urls),
joinedload(Project.image_urls),
joinedload(Project.images),
)
.filter(Project.id == project_id)
.first()
Expand All @@ -45,3 +46,24 @@ def update_project(self, project: Project) -> Project:
self.session.merge(project)

return project

def get_project_image_by_id(self, image_id: int) -> ProjectImage | None:
return (
self.session.query(ProjectImage).filter(ProjectImage.id == image_id).first()
)

def get_project_images_by_project_id(self, project_id: int) -> list[ProjectImage]:
return (
self.session.query(ProjectImage)
.filter(ProjectImage.project_id == project_id)
.all()
)

def update_project_image(self, project_image_id: int) -> None:
with self.transaction:
query = (
update(ProjectImage)
.where(ProjectImage.id == project_image_id)
.values(is_uploaded=True)
)
self.session.execute(query)
47 changes: 20 additions & 27 deletions wacruit/src/apps/project/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class ProjectCreateRequest(BaseModel):
thumbnail_url: str | None = Field(None, max_length=255)
project_type: ProjectType
is_active: bool
images: list[str] | None
urls: list[ProjectLinkDto] | None


Expand All @@ -31,10 +30,23 @@ class ProjectUpdateRequest(BaseModel):
thumbnail_url: str | None = Field(None, max_length=255)
project_type: ProjectType | None
is_active: bool | None
images: list[str] | None
urls: list[ProjectLinkDto] | None


class ProjectImageResponse(OrmModel):
id: int
project_id: int
object_key: str
is_uploaded: bool


class PresignedUrlWithIdResponse(BaseModel):
object_name: str
presigned_url: str
fields: dict[str, str] = Field(default={})
project_image_id: int


class ProjectDetailResponse(OrmModel):
id: int
name: str
Expand All @@ -43,33 +55,9 @@ class ProjectDetailResponse(OrmModel):
thumbnail_url: str | None
project_type: ProjectType
is_active: bool
images: list[str] | None
images: list[PresignedUrlWithIdResponse] | None
urls: list[ProjectLinkDto] | None

@classmethod
def from_orm(cls, obj):
urls = None
if obj.urls:
urls = [
ProjectLinkDto(url_type=url.url_type, url=url.url) for url in obj.urls
]

images = None
if obj.image_urls:
images = [img.url for img in obj.image_urls]

return cls(
id=obj.id,
name=obj.name,
summary=obj.summary,
introduction=obj.introduction,
thumbnail_url=obj.thumbnail_url,
project_type=obj.project_type.name,
is_active=obj.is_active,
images=images,
urls=urls,
)


class ProjectBriefResponse(OrmModel):
id: int
Expand All @@ -91,5 +79,10 @@ def from_orm(cls, obj):
)


class ProjectImageUploadRequest(BaseModel):
project_id: int
file_name: str


class ProjectListResponse(OrmModel):
projects: list[ProjectBriefResponse]
Loading