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
17 changes: 12 additions & 5 deletions src/repositories/task.repository.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { prisma } from "../db.config.js";
import dayjs from "dayjs";
import timezone from "dayjs/plugin/timezone.js";
import utc from "dayjs/plugin/utc.js";
dayjs.extend(utc);
dayjs.extend(timezone);

class TaskRepository {
async getCompletedTasks(userId) {
Expand Down Expand Up @@ -200,15 +205,17 @@ class TaskRepository {

// 초대 코드 생성 및 업데이트
async updateTaskInviteCode(taskId, inviteCode, tx = prisma) {
// 1년 후 만료일로 설정
const oneYearLater = new Date();
oneYearLater.setFullYear(oneYearLater.getFullYear() + 1);
// 1일 후 만료일로 설정
// 1일 후 만료일로 설정 (한국 시간 기준)
const oneDayLater = dayjs().add(9, "hour").add(1, "day").toDate(); // 9시간 차이 보정 UTC +9시간
console.log("oneDayLater (KST):", oneDayLater);


return await tx.task.update({
where: { id: taskId },
where: { id: taskId }, //팀과제만 가능 (개인과제는 초대 코드로 참여 불가)
data: {
inviteCode,
inviteExpiredAt: oneYearLater
inviteExpiredAt: oneDayLater
},
select: {
inviteCode: true,
Expand Down
17 changes: 10 additions & 7 deletions src/services/task.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,11 @@ class TaskService {
// 과제 존재 여부 확인
const task = await taskRepository.findTaskById(taskId);
if (!task) {
throw new NotFoundError("과제를 찾을 수 없습니다.");
throw new NotFoundError("TASK_NOT_FOUND", "과제를 찾을 수 없습니다.");
}

if (task.type === 'PERSONAL') {
throw new ForbiddenError("PERSONAL_TASK", "개인 과제는 초대 코드 생성이 불가능합니다.");
}

// 사용자가 해당 과제의 멤버인지 확인
Expand All @@ -472,7 +476,7 @@ class TaskService {
});

if (!isMember) {
throw new ForbiddenError("초대 링크를 생성할 권한이 없습니다.");
throw new ForbiddenError("NOT_MEMBER", "해당 과제에 참여한 멤버가 아닙니다.");
}

// 랜덤한 8자리 초대 코드 생성 (대문자 + 숫자)
Expand All @@ -494,15 +498,14 @@ class TaskService {
invite_expired: result.inviteExpiredAt
};
}
// ... existing code ...

// 초대 코드로 팀 참여
async joinTaskByInviteCode(userId, inviteCode) {
// 초대 코드로 과제 찾기
const task = await prisma.task.findFirst({
where: {
inviteCode: inviteCode,
type: 'TEAM', // 팀 과제만 가능
type: 'TEAM', // 팀 과제만 가능 (개인 과제는 초대 코드로 참여 불가)
},
});

Expand All @@ -511,8 +514,8 @@ class TaskService {
}

// 초대 코드 만료일 확인
if (task.inviteExpiredAt && new Date() > new Date(task.inviteExpiredAt)) {
throw new BadRequestError("EXPIRED_INVITE_CODE", "만료된 초대 코드입니다.");
if (task.inviteExpiredAt && new Date(Date.now() + 9 * 60 * 60 * 1000) > new Date(task.inviteExpiredAt)) {
throw new ForbiddenError("EXPIRED_INVITE_CODE", "만료된 초대 코드입니다.");
}

// 이미 멤버인지 확인
Expand All @@ -524,7 +527,7 @@ class TaskService {
});

if (existingMember) {
throw new BadRequestError("ALREADY_MEMBER", "이미 팀 멤버입니다.");
throw new ForbiddenError("ALREADY_MEMBER", "이미 팀 멤버입니다.");
}

// 트랜잭션으로 멤버 추가 및 알림 생성
Expand Down