Skip to content

Commit

Permalink
refactor: 버전표기 및 사용하지 않는 함수 삭제
Browse files Browse the repository at this point in the history
  • Loading branch information
niamu01 committed Dec 8, 2023
1 parent 32c71fd commit c4768bb
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 240 deletions.
21 changes: 0 additions & 21 deletions src/tag-log/dto/subType/InOutLog.type.v1.ts

This file was deleted.

224 changes: 5 additions & 219 deletions src/tag-log/tag-log.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { DeviceInfoDto } from './dto/device-info.dto';
import { InOutDto } from './dto/inout.dto';
import { PairInfoDto } from './dto/pair-info.dto';
import { InOutLogType } from './dto/subType/InOutLog.type';
import { InOutLogTypeV1 } from './dto/subType/InOutLog.type.v1';
import { TagLogDto } from './dto/tag-log.dto';
import { IDeviceInfoRepository } from './repository/interface/device-info-repository.interface';
import { IPairInfoRepository } from './repository/interface/pair-info-repository.interface';
Expand Down Expand Up @@ -187,28 +186,6 @@ export class TagLogService {
return taglogs;
}

/**
* 인자로 들어간 디바이스가 쌍이 맞는지 확인하는 함수입니다.
*
* @param deviceInfo
* @param enterDevice
* @param device
* @version 2
*/
validateDevicePair(
deviceInfos: PairInfoDto[],
inDevice: number,
outDevice: number,
): boolean {
//this.logger.debug(`@validateDevicePair) ${inDevice} - ${outDevice}`);
// TODO: O(N) 보다 더 적게 시간을 소요하도록 리팩터링 필요
const find = deviceInfos.find(
(device) =>
device.in_device === inDevice && device.out_device === outDevice,
);
return !!find;
}

/**
* 인자로 들어간 디바이스 번호가 입실 디바이스인지 확인합니다.
*
Expand Down Expand Up @@ -363,7 +340,7 @@ export class TagLogService {
}

/**
* tagStart에서 tagEnd의 기간 내에 userId의 태그로그를 전부 반환합니다.
* tagStart에서 tagEnd의 기간 내의 태그로그를 반환합니다.
* 24시를 기준으로 가상 태그로그가 포함되어 있습니다.
*
* @param userId number
Expand Down Expand Up @@ -419,6 +396,8 @@ export class TagLogService {

/**
* 일별 모든 태그를 반환합니다.
* version 3: 짝이 맞는 태그로그를 반환합니다.
* version 4: 유저의 태그로그를 전부 반환합니다.
*
* @param userId 사용자 ID
* @param date 날짜
Expand Down Expand Up @@ -495,6 +474,8 @@ export class TagLogService {

/**
* 인자로 들어가는 사용자 ID와 날짜에 대한 월별 모든 태그를 반환합니다.
* version 3: 짝이 맞는 태그로그를 반환합니다.
* version 4: 유저의 태그로그를 전부 반환합니다.
*
* @param userId 사용자 ID
* @param date 날짜
Expand Down Expand Up @@ -655,199 +636,4 @@ export class TagLogService {
}
return taglogs;
}

/**
* 기기 쌍 정보와 태깅한 로그들을 이용하여 출입 로그를 반환합니다.
*
* @param taglogs 입출입 로그
* @param deviceInfos 기기 짝 정보
* @version 2
*/
getPairsByTagLogs(
taglogs: TagLogDto[],
deviceInfos: PairInfoDto[],
): InOutLogTypeV1[] {
this.logger.debug(`@getPairsByTagLogs)`);

/**
* 데이터를 날짜의 내림차순으로 정렬
*/
// const timeLines = taglogs
// //.sort((a, b) => (a.tag_at < b.tag_at ? 1 : -1))
// .map((v) => ({
// tag_at: v.tag_at,
// device_id: v.device_id,
// }));
const timeLines = taglogs;

let leave: TagLogDto | null = null;
const resultPairs: InOutLogTypeV1[] = [];

// 타임라인 배열이 빌 때까지 루프를 돌립니다.
while (timeLines.length > 0) {
// 가장 뒤의 원소(가장 늦은 날짜)를 뽑습니다.
const val = timeLines.pop();

// 만약 퇴장로그로 가정한 로그가 없다면 뽑은 원소를 넣고 루프를 다시 실행합니다.
if (leave === null) {
leave = val;
continue;
}

// 뽑아낸 원소를 임시로 저장합니다.
const temp: TagLogDto | null = val;

// 퇴장로그로 가정한 로그와 현재 뽑아낸 로그가 기기 짝이 맞는지 확인합니다.
if (
this.validateDevicePair(deviceInfos, temp.device_id, leave.device_id)
) {
// 기기 짝이 맞을 경우 임시 원소를 입장 로그로 지정합니다.
const enter = temp;

// 입장 로그와 퇴장 로그가 짝이 맞는지 확인합니다.
if (this.dateCalculator.checkEqualDay(enter.tag_at, leave.tag_at)) {
// 만약 동일한 날짜에 속한다면 해당 쌍이 짝이 됩니다.
const inTimeStamp = this.dateCalculator.toTimestamp(enter.tag_at);
const outTimeStamp = this.dateCalculator.toTimestamp(leave.tag_at);
resultPairs.push({
inTimeStamp,
outTimeStamp,
durationSecond: outTimeStamp - inTimeStamp,
});
} else {
// 만약 입장 로그와 퇴장 로그가 짝이 맞지만, 동일한 날짜에 속하지 않으면 일 단위로 자릅니다.

// 퇴장 로그의 정시 (00시)를 기준으로 두 날짜의 간격을 자릅니다. 두 날짜는 가상의 입퇴장 짝이 됩니다.
const virtualEnterTime = this.dateCalculator.getStartOfDate(
leave.tag_at,
);
const virtualLeaveTime = this.dateCalculator.getEndOfLastDate(
leave.tag_at,
);

// 가상 입장시간 (퇴장시간의 날짜의 정시 - 00시)과 퇴장시간이 짝을 맞춥니다.
const inTimeStamp = this.dateCalculator.toTimestamp(virtualEnterTime);
const outTimeStamp = this.dateCalculator.toTimestamp(leave.tag_at);
resultPairs.push({
inTimeStamp,
outTimeStamp,
durationSecond: outTimeStamp - inTimeStamp,
});

// 그리고 가상 퇴장시간을 다시 배열에 넣어 가상 퇴장시간과 맞는 짝을 찾습니다.
timeLines.push(val);
timeLines.push({
tag_at: virtualLeaveTime,
device_id: leave.device_id,
idx: -1,
card_id: val.card_id,
});
}

// 퇴장로그로 가정한 로그를 초기화합니다.
leave = null;
} else {
// pair가 아닌 경우 뽑아낸 로그를 퇴장로그로 가정하고 루프를 다시 실행합니다.
leave = temp;
}
}

return resultPairs;
}

/**
* 인자로 들어가는 사용자 ID와 날짜에 대한 일별 누적시간을 반환합니다.
*
* @param userId 사용자 ID
* @param date 날짜
* @returns InOutLogType[]
* @version 2
*/
async getPerDay(userId: number, date: Date): Promise<InOutLogTypeV1[]> {
this.logger.debug(`@getPerDay) ${userId}, ${date}`);
const tagStart = this.dateCalculator.getStartOfDate(date);
const tagEnd = this.dateCalculator.getEndOfDate(date);

const pairs = await this.pairInfoRepository.findAll();

const cards = await this.userService.findCardsByUserId(
userId,
tagStart,
tagEnd,
);

const tagLogs = await this.tagLogRepository.findTagLogsByCards(
cards,
tagStart,
tagEnd,
);

const sortedTagLogs = tagLogs.sort((a, b) =>
a.tag_at > b.tag_at ? 1 : -1,
);

// FIXME: 임시 조치임
const filteredTagLogs = sortedTagLogs.filter(
(v) => v.device_id !== 35 && v.device_id !== 16,
);

const trimmedTagLogs = await this.trimTagLogs(
filteredTagLogs,
cards,
tagStart,
tagEnd,
);

const resultPairs = this.getPairsByTagLogs(trimmedTagLogs, pairs);

return resultPairs;
}

/**
* 인자로 들어가는 사용자 ID와 날짜에 대한 월별 누적시간을 반환합니다.
*
* @param userId 사용자 ID
* @param date 날짜
* @returns InOutLogType[]
* @version 2
*/
async getPerMonth(userId: number, date: Date): Promise<InOutLogTypeV1[]> {
this.logger.debug(`@getPerMonth) ${userId}, ${date}`);
const tagStart = this.dateCalculator.getStartOfMonth(date);
const tagEnd = this.dateCalculator.getEndOfMonth(date);

const pairs = await this.pairInfoRepository.findAll();

const cards = await this.userService.findCardsByUserId(
userId,
tagStart,
tagEnd,
);

const tagLogs = await this.tagLogRepository.findTagLogsByCards(
cards,
tagStart,
tagEnd,
);

const sortedTagLogs = tagLogs.sort((a, b) =>
a.tag_at > b.tag_at ? 1 : -1,
);

// FIXME: 임시 조치임
const filteredTagLogs = sortedTagLogs.filter(
(v) => v.device_id !== 35 && v.device_id !== 16,
);

const trimmedTagLogs = await this.trimTagLogs(
filteredTagLogs,
cards,
tagStart,
tagEnd,
);

const resultPairs = this.getPairsByTagLogs(trimmedTagLogs, pairs);

return resultPairs;
}
}

0 comments on commit c4768bb

Please sign in to comment.