Commit 0987f285 by Ooh-Ao

จัดการสมาชิก

parent d2625cfd
......@@ -24,15 +24,21 @@ async def create_project_member(db: AsyncSession, pm_in: ProjectMemberCreate):
raise HTTPException(status_code=400, detail=str(e.orig))
return new_pm
# READ ALL (โหลดข้อมูลของ Project ด้วย)
# READ ALL (โหลดข้อมูล Project และ Member ด้วย)
async def get_all_project_members(db: AsyncSession):
stmt = select(ProjectMember).options(selectinload(ProjectMember.project))
stmt = select(ProjectMember).options(
selectinload(ProjectMember.project),
selectinload(ProjectMember.member)
)
result = await db.execute(stmt)
return result.scalars().all()
# READ ONE (โหลดข้อมูลของ Project ด้วย)
# READ ONE (โหลดข้อมูล Project และ Member ด้วย)
async def get_project_member_by_id(db: AsyncSession, pm_id: UUID):
stmt = select(ProjectMember).options(selectinload(ProjectMember.project)).where(ProjectMember.pmId == pm_id)
stmt = select(ProjectMember).options(
selectinload(ProjectMember.project),
selectinload(ProjectMember.member)
).where(ProjectMember.pmId == pm_id)
result = await db.execute(stmt)
return result.scalar_one_or_none()
......@@ -73,8 +79,22 @@ async def delete_project_member(db: AsyncSession, pm_id: UUID):
return {"message": "ProjectMember deleted successfully"}
# READ Projects by MemberId (โหลดข้อมูล Project ที่สัมพันธ์กับ ProjectMember ด้วย)
# READ Projects by MemberId (โหลดข้อมูล Project ด้วย)
async def get_projects_by_member_id(db: AsyncSession, member_id: UUID):
stmt = select(ProjectMember).options(selectinload(ProjectMember.project)).where(ProjectMember.memberId == member_id)
stmt = select(ProjectMember).options(
selectinload(ProjectMember.project),
selectinload(ProjectMember.member)
).where(ProjectMember.memberId == member_id)
result = await db.execute(stmt)
return result.scalars().all()
async def get_members_by_project_id(db: AsyncSession, project_id: UUID):
"""
ดึงข้อมูล ProjectMember ทั้งหมดที่สัมพันธ์กับ project_id ที่กำหนด
พร้อมโหลดข้อมูลของ Member ด้วย (nested)
"""
stmt = select(ProjectMember).options(
selectinload(ProjectMember.member)
).where(ProjectMember.projectId == project_id)
result = await db.execute(stmt)
return result.scalars().all()
......@@ -34,7 +34,7 @@ class Member(Base):
updatedAt = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow)
# ProjectEmployees = relationship("ProjectEmployee", back_populates="member")
project_member = relationship("ProjectMember", back_populates="member")
# ฟังก์ชันเพื่อแฮชรหัสผ่านก่อนบันทึก
def hash_password(self, password):
self.passwordHash = bcrypt.hash(password)
......
......@@ -10,23 +10,9 @@ class ProjectMember(Base):
__tablename__ = 'project_member'
pmId = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
# Foreign Keys
memberId = Column(
UUID(as_uuid=True),
ForeignKey("member.memberId"), # หรือ "users.userId" ตามตารางจริง
nullable=False
)
projectId = Column(
UUID(as_uuid=True),
ForeignKey("project.projectId"),
nullable=False
)
memberId = Column(UUID(as_uuid=True), ForeignKey("member.memberId"), nullable=False)
projectId = Column(UUID(as_uuid=True), ForeignKey("project.projectId"), nullable=False)
role_in_project = Column(String(100), nullable=True)
# Relationship เชื่อมกลับไปยัง Project
project = relationship("Project", back_populates="project_member")
# ถ้ามี Model Member/User ก็สามารถประกาศ relationship ได้ เช่น
# member = relationship("Member", back_populates="project_members")
project = relationship("Project", back_populates="project_member", lazy="joined")
member = relationship("Member", back_populates="project_member", lazy="joined")
......@@ -12,7 +12,8 @@ from ..controllers.project_member_controller import (
get_project_member_by_id,
update_project_member,
delete_project_member,
get_projects_by_member_id
get_projects_by_member_id,
get_members_by_project_id
)
from ..schemas.project_member_schema import (
ProjectMemberCreate,
......@@ -74,4 +75,12 @@ async def get_projects_for_member(
ดึงรายการ ProjectMember ทั้งหมดที่ memberId คนนี้สังกัดอยู่
"""
pms = await get_projects_by_member_id(db, memberId)
return pms
@router.get("/project/{projectId}", response_model=List[ProjectMemberResponse])
async def get_member_for_project(
projectId: UUID,
db: AsyncSession = Depends(get_db)
):
pms = await get_members_by_project_id(db, projectId)
return pms
\ No newline at end of file
# myproject/schemas/project_member_schema.py
from pydantic import BaseModel
from typing import Optional
from uuid import UUID
from .project_schema import ProjectResponse # Import schema ของ Project
from .project_schema import ProjectResponse # Schema ของ Project
from .member_schema import MemberResponse # Schema ของ Member
class ProjectMemberBase(BaseModel):
memberId: UUID
......@@ -15,7 +14,8 @@ class ProjectMemberCreate(ProjectMemberBase):
class ProjectMemberResponse(ProjectMemberBase):
pmId: UUID
projectId: UUID
project: Optional[ProjectResponse] = None # เพิ่ม field นี้เพื่อแสดงข้อมูลของ Project
project: Optional[ProjectResponse] = None # ข้อมูลของ Project ที่สัมพันธ์กัน
member: Optional[MemberResponse] = None # ข้อมูลของ Member ที่สัมพันธ์กัน
class Config:
orm_mode = True
import { TranslateService } from "@ngx-translate/core";
import { BaseModel } from "./base.model";
import { ProjectModel } from "./project.model";
import { UserProfileModel } from "./user.model";
export class ProjectMemberModel extends BaseModel {
pm_id: string;
user_id: string;
projectId: string;
memberId: string;
role_in_project: string;
created_at: string;
updated_at: string;
pmId: string;
projectId: string;
project: ProjectModel;
member: UserProfileModel;
constructor(data?: Partial<ProjectMemberModel>, translateService?: TranslateService) {
super(data, translateService);
this.pm_id = data?.pm_id ?? '';
this.user_id = data?.user_id ?? '';
this.pmId = data?.pmId ?? '';
this.memberId = data?.memberId ?? '';
this.projectId = data?.projectId ?? '';
this.role_in_project = data?.role_in_project ?? '';
this.created_at = data?.created_at ?? new Date().toISOString();
this.updated_at = data?.updated_at ?? new Date().toISOString();
}
this.project = data?.project || new ProjectModel();
this.member = data?.member ? new UserProfileModel(data.member) : new UserProfileModel();
}
}
......@@ -19,7 +19,7 @@ export class ProjectMemberService {
.pipe(map((e) => new ProjectMemberModel(e)));
}
getLists() {
getLists(projectId: string) {
return this.http
.get<ProjectMemberModel[]>(this.apiBaseUrl)
.pipe(
......@@ -27,25 +27,23 @@ export class ProjectMemberService {
);
}
save(body: ProjectMemberModel) {
return this.http.post<{
"message": string,
"user": ProjectMemberModel
}>(this.apiBaseUrl, new ProjectMemberModel(body));
save(body: any) {
return this.http.post<ProjectMemberModel>(this.apiBaseUrl, body);
}
update(body: ProjectMemberModel) {
return this.http.put<{
"message": string,
"user": ProjectMemberModel
}>(this.apiBaseUrl + "/" + body.user_id, new ProjectMemberModel(body));
}>(this.apiBaseUrl + "/" + body.memberId, new ProjectMemberModel(body));
}
delete(body: ProjectMemberModel) {
return this.http.delete<{
"message": string,
"user": ProjectMemberModel
}>(this.apiBaseUrl + "/" + body.user_id);
}>(this.apiBaseUrl + "/" + body.pmId);
}
getCompanyAdmin(memberId: string) {
......
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