fix&feature: fixxing some logical bogs and adding cursor pagination
This commit is contained in:
@@ -11,6 +11,8 @@ import { TaskMessage, TaskPhaseMessage } from "../../../common/enums/message.enu
|
||||
import { TaskPhaseRepository } from "../repositories/task-phase.repository";
|
||||
import { TMTaskPhase } from "../entities/task-phase.entity";
|
||||
import { PermissionEnum } from "../../users/enums/permission.enum";
|
||||
import { encodeCursor } from "../../utils/providers/cursor-pagination.utils";
|
||||
import { CursorDirection, CursorPaginationDto } from "../../../common/DTO/cursor-pagination.dto";
|
||||
|
||||
@Injectable()
|
||||
export class TaskService {
|
||||
@@ -126,4 +128,61 @@ export class TaskService {
|
||||
const taskDetail = await this.taskRepository.getTaskDetail(taskId);
|
||||
return taskDetail;
|
||||
}
|
||||
|
||||
async findTasksByTaskPhase(
|
||||
taskPhaseId: string,
|
||||
pagination: CursorPaginationDto,
|
||||
): Promise<{
|
||||
data: TMTask[];
|
||||
nextCursor: string | null;
|
||||
previousCursor: string | null;
|
||||
hasNextPage: boolean;
|
||||
hasPreviousPage: boolean;
|
||||
cursorPaginate: true;
|
||||
}> {
|
||||
await this.findTaskPhaseOrFail(taskPhaseId);
|
||||
|
||||
const isBackward = pagination.direction === CursorDirection.PREV;
|
||||
const { items, hasMore } = await this.taskRepository.findTasksByTaskPhase(taskPhaseId, pagination);
|
||||
|
||||
// paging backward always has more ahead (we came from there); paging forward relies on
|
||||
// whether a cursor was even supplied to know whether anything precedes this page
|
||||
const hasNextPage = items.length > 0 && (isBackward ? true : hasMore);
|
||||
const hasPreviousPage = items.length > 0 && (isBackward ? hasMore : !!pagination.cursor);
|
||||
|
||||
const nextCursor = hasNextPage ? encodeCursor(items[items.length - 1]) : null;
|
||||
const previousCursor = hasPreviousPage ? encodeCursor(items[0]) : null;
|
||||
|
||||
return { data: items, nextCursor, previousCursor, hasNextPage, hasPreviousPage, cursorPaginate: true };
|
||||
}
|
||||
|
||||
async changePriority(srcTaskId: string, destTaskId: string): Promise<TMTask> {
|
||||
const srcTask = await this.findOneOrFail(srcTaskId);
|
||||
const desTask = await this.findOneOrFail(destTaskId);
|
||||
|
||||
if (srcTask.taskPhaseId !== desTask.taskPhaseId)
|
||||
throw new BadRequestException(TaskMessage.TASKS_NOT_IN_THE_SAME_TASK_PHASE);
|
||||
|
||||
let movingUp: boolean = false;
|
||||
|
||||
if(srcTask.priority < desTask.priority) {
|
||||
movingUp = true;
|
||||
} else if(srcTask.priority < desTask.priority) {
|
||||
movingUp = false;
|
||||
} else {
|
||||
if(srcTask.createdAt > desTask.createdAt) {
|
||||
movingUp = true;
|
||||
}else {
|
||||
movingUp = false;
|
||||
}
|
||||
}
|
||||
|
||||
const priorityChange: number = movingUp ? 1 : -1;
|
||||
|
||||
srcTask.priority = desTask.priority + priorityChange;
|
||||
|
||||
await this.taskRepository.save(srcTask);
|
||||
|
||||
return srcTask;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user