diff --git a/.github/workflows/frontend-ci.yml b/.github/workflows/frontend-ci.yml index bc73796..466a2c9 100644 --- a/.github/workflows/frontend-ci.yml +++ b/.github/workflows/frontend-ci.yml @@ -50,8 +50,8 @@ jobs: - name: Build & Deploy run: | npm run build - # npx vercel --prod --yes --token=${{ secrets.TRELLO_FRONTEND_VERCEL_TOKEN }} - # env: - # VERCEL_ORG_ID: ${{ vars.TRELLO_FRONTEND_VERCEL_ORG_ID }} - # VERCEL_PROJECT_ID: ${{ vars.TRELLO_FRONTEND_VERCEL_PROJECT_ID }} - # VITE_TRELLO_LIKE_API_URL: ${{ vars.VITE_TRELLO_LIKE_API_URL }} + npx vercel --prod --yes --token=${{ secrets.TRELLO_FRONTEND_VERCEL_TOKEN }} + env: + VERCEL_ORG_ID: ${{ vars.TRELLO_FRONTEND_VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ vars.TRELLO_FRONTEND_VERCEL_PROJECT_ID }} + VITE_TRELLO_LIKE_API_URL: ${{ vars.VITE_TRELLO_LIKE_API_URL }} diff --git a/backend/app/dto/response/task/AssignedMemberResponse.scala b/backend/app/dto/response/task/AssignedMemberResponse.scala new file mode 100644 index 0000000..a06cf19 --- /dev/null +++ b/backend/app/dto/response/task/AssignedMemberResponse.scala @@ -0,0 +1,12 @@ +package dto.response.task + +import play.api.libs.json.{Format, Json} + +case class AssignedMemberResponse( + id: Int, + name: String + ) + +object AssignedMemberResponse { + implicit val format: Format[AssignedMemberResponse] = Json.format[AssignedMemberResponse] +} diff --git a/backend/app/dto/response/task/TaskDetailResponse.scala b/backend/app/dto/response/task/TaskDetailResponse.scala index 8fde710..9fc4839 100644 --- a/backend/app/dto/response/task/TaskDetailResponse.scala +++ b/backend/app/dto/response/task/TaskDetailResponse.scala @@ -15,7 +15,8 @@ case class TaskDetailResponse(id: Int, columnId: Int, isCompleted: Boolean, createdAt: Instant, - updatedAt: Instant + updatedAt: Instant, + assignedMembers: Seq[AssignedMemberResponse] = Seq.empty ) object TaskDetailResponse { diff --git a/backend/app/mappers/TaskMapper.scala b/backend/app/mappers/TaskMapper.scala index f812e70..2c53e69 100644 --- a/backend/app/mappers/TaskMapper.scala +++ b/backend/app/mappers/TaskMapper.scala @@ -1,6 +1,6 @@ package mappers -import dto.response.task.TaskDetailResponse +import dto.response.task.{AssignedMemberResponse, TaskDetailResponse} import models.entities.Task object TaskMapper { @@ -21,5 +21,22 @@ object TaskMapper { updatedAt = entity.updatedAt ) } + def toDetailWithAssignMembersResponse(entity: Task,assignedMembers: Seq[AssignedMemberResponse]): TaskDetailResponse = { + TaskDetailResponse( + id = entity.id.getOrElse(0), + name = entity.name, + description = entity.description, + startDate = entity.startDate, + endDate = entity.endDate, + priority = entity.priority.map(_.toString), + status = entity.status.toString, + position = entity.position.getOrElse(0), + columnId = entity.columnId, + isCompleted = entity.isCompleted, + createdAt = entity.createdAt, + updatedAt = entity.updatedAt, + assignedMembers = assignedMembers + ) + } } diff --git a/backend/app/repositories/TaskRepository.scala b/backend/app/repositories/TaskRepository.scala index 9fb05ba..d89a405 100644 --- a/backend/app/repositories/TaskRepository.scala +++ b/backend/app/repositories/TaskRepository.scala @@ -1,8 +1,7 @@ package repositories import db.MyPostgresProfile.api.{columnStatusTypeMapper, projectStatusTypeMapper, taskStatusTypeMapper} -import dto.response.task.AssignMemberToTaskResponse -import dto.response.task.TaskSummaryResponse +import dto.response.task.{AssignMemberToTaskResponse, AssignedMemberResponse, TaskSummaryResponse} import models.Enums.{ColumnStatus, ProjectStatus, TaskStatus} import models.entities.{Task, UserTask} import play.api.db.slick.{DatabaseConfigProvider, HasDatabaseConfigProvider} @@ -45,6 +44,15 @@ class TaskRepository@Inject()( query.result.headOption } + def findAssignedMembers(taskId: Int): DBIO[Seq[AssignedMemberResponse]] = { + val query = for { + ut <- userTasks if ut.taskId === taskId + u <- users if u.id === ut.assignedTo + } yield (u.id, u.name) + + query.result.map(_.map { case (id, name) => AssignedMemberResponse(id, name) }) + } + def update(task: Task): DBIO[Int] = { tasks.filter(_.id === task.id).update(task) } diff --git a/backend/app/services/TaskService.scala b/backend/app/services/TaskService.scala index 717f2b1..eaba1d7 100644 --- a/backend/app/services/TaskService.scala +++ b/backend/app/services/TaskService.scala @@ -124,11 +124,13 @@ class TaskService @Inject()(taskRepository: TaskRepository, def getTaskDetailById(taskId: Int, userId: Int): Future[Option[TaskDetailResponse]] = { val action = for { - result <- getTaskAndProjectByTaskId(taskId, userId) - } yield result + (task, _) <- getTaskAndProjectByTaskId(taskId, userId) + assignedMembers <- taskRepository.findAssignedMembers(taskId) + } yield (task, assignedMembers) db.run(action.transactionally).map { - case (task, _) => Some(TaskMapper.toDetailResponse(task)) + case (task, assignedMembers) => + Some(TaskMapper.toDetailWithAssignMembersResponse(task, assignedMembers)) } } diff --git a/frontend/index.html b/frontend/index.html index e0ef3be..7a4ffd6 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -8,6 +8,7 @@
+