Commit 6ca6800c by Ooh-Ao

project

parent cf322a8e
# myproject/controllers/project_controller.py
from fastapi import HTTPException
from uuid import UUID
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from ..models.project import Project
from ..schemas.project_schema import (
ProjectCreate,
ProjectUpdate
)
# CREATE
async def create_project(
db: AsyncSession,
project_in: ProjectCreate
):
new_project = Project(
project_name=project_in.project_name,
project_desc=project_in.project_desc,
start_date=project_in.start_date,
end_date=project_in.end_date
)
db.add(new_project)
await db.commit()
await db.refresh(new_project)
return new_project
# READ ALL
async def get_all_projects(db: AsyncSession):
result = await db.execute(select(Project))
return result.scalars().all()
# READ ONE
async def get_project_by_id(
db: AsyncSession,
project_id: UUID
):
result = await db.execute(
select(Project).where(Project.project_id == project_id)
)
return result.scalar_one_or_none()
# UPDATE
async def update_project(
db: AsyncSession,
project_id: UUID,
project_in: ProjectUpdate
):
result = await db.execute(
select(Project).where(Project.project_id == project_id)
)
project_db = result.scalar_one_or_none()
if not project_db:
raise HTTPException(
status_code=404, detail="Project not found"
)
if project_in.project_name is not None:
project_db.project_name = project_in.project_name
if project_in.project_desc is not None:
project_db.project_desc = project_in.project_desc
if project_in.start_date is not None:
project_db.start_date = project_in.start_date
if project_in.end_date is not None:
project_db.end_date = project_in.end_date
await db.commit()
await db.refresh(project_db)
return project_db
# DELETE
async def delete_project(db: AsyncSession, project_id: UUID):
project_db = await db.get(Project, project_id)
if not project_db:
raise HTTPException(
status_code=404, detail="Project not found"
)
await db.delete(project_db)
await db.commit()
return {"message": "Project deleted successfully"}
......@@ -6,6 +6,7 @@ from fastapi.staticfiles import StaticFiles
import logging
from .routes import member_routes,auth_routes,file_upload_router
from .routes.equipment_routes import router as equipment_router
from .routes.project_routes import router as project_router
from fastapi.middleware.cors import CORSMiddleware
logging.basicConfig(level=logging.DEBUG)
......@@ -36,6 +37,7 @@ app.mount("/images", StaticFiles(directory=UPLOAD_DIR), name="images")
app.include_router(auth_routes.router, prefix="/auth", tags=["Authentication"])
app.include_router(member_routes.router, prefix="/members", tags=["Members"])
app.include_router(equipment_router, prefix="/equipments", tags=["Equipments"])
app.include_router(project_router, prefix="/projects", tags=["Projects"])
app.include_router(file_upload_router.router, prefix="/api", tags=["File Upload"])
@app.get("/")
async def root():
......
# myproject/models/project.py
import uuid
from sqlalchemy import Column, String, Text, Date
from sqlalchemy.dialects.postgresql import UUID
from ..config.database import Base
class Project(Base):
__tablename__ = 'projects' # ชื่อตารางใน DB
project_id = Column(
UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4
)
project_name = Column(String(255), nullable=False)
project_desc = Column(Text, nullable=True)
start_date = Column(Date, nullable=True)
end_date = Column(Date, nullable=True)
# myproject/routes/project_routes.py
from fastapi import APIRouter, Depends, HTTPException, status
from typing import List
from uuid import UUID
from sqlalchemy.ext.asyncio import AsyncSession
from ..config.database import get_db
from ..controllers.project_controller import (
create_project,
get_all_projects,
get_project_by_id,
update_project,
delete_project
)
from ..schemas.project_schema import (
ProjectCreate,
ProjectUpdate,
ProjectResponse
)
router = APIRouter()
# CREATE
@router.post("/", response_model=ProjectResponse, status_code=status.HTTP_201_CREATED)
async def create_new_project(
project_in: ProjectCreate,
db: AsyncSession = Depends(get_db)
):
project = await create_project(db, project_in)
return project
# READ ALL
@router.get("/", response_model=List[ProjectResponse])
async def read_all_projects(db: AsyncSession = Depends(get_db)):
projects = await get_all_projects(db)
return projects
# READ ONE
@router.get("/{id}", response_model=ProjectResponse)
async def read_project_by_id(
id: UUID,
db: AsyncSession = Depends(get_db)
):
project = await get_project_by_id(db, id)
if not project:
raise HTTPException(
status_code=404, detail="Project not found"
)
return project
# UPDATE
@router.put("/{id}", response_model=ProjectResponse)
async def update_existing_project(
id: UUID,
project_in: ProjectUpdate,
db: AsyncSession = Depends(get_db)
):
updated = await update_project(db, id, project_in)
return updated
# DELETE
@router.delete("/{id}")
async def delete_existing_project(
id: UUID,
db: AsyncSession = Depends(get_db)
):
return await delete_project(db, id)
# myproject/schemas/project_schema.py
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
from datetime import date
class ProjectBase(BaseModel):
project_name: str
project_desc: Optional[str] = None
start_date: Optional[date] = None
end_date: Optional[date] = None
class ProjectCreate(ProjectBase):
pass
class ProjectUpdate(BaseModel):
project_name: Optional[str] = None
project_desc: Optional[str] = None
start_date: Optional[date] = None
end_date: Optional[date] = None
class ProjectResponse(ProjectBase):
project_id: UUID
class Config:
orm_mode = True
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment