Skip to content

Commit

Permalink
Merge pull request #186 from TeamPiickle/feature/#172-none-blacklist-…
Browse files Browse the repository at this point in the history
…card-view

[FEAT] 블랙리스트 제외 카드 조회
  • Loading branch information
DongLee99 committed Jul 9, 2023
2 parents a03d53b + 40ce6cd commit d1509be
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 15 deletions.
53 changes: 42 additions & 11 deletions src/services/CategoryService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { CardResponseDto } from '../intefaces/CardResponseDto';
import Bookmark from '../models/bookmark';
import { IllegalArgumentException } from '../intefaces/exception';
import util from '../modules/util';
import { BlockedCard, BlockedCardDocument } from '../models/blockedCard';

const CARD_SIZE_PER_REQUEST = 30;

Expand Down Expand Up @@ -44,7 +45,19 @@ const getCardsWithIsBookmark = async (
if (!category) {
throw new IllegalArgumentException('해당 id의 카테고리가 없습니다.');
}
const allCards = await Card.find({ category: categoryId });
const blockedCards: BlockedCardDocument[] = await BlockedCard.find({
user: userId
});
const ninCards: Types.ObjectId[] = [];
if (blockedCards) {
for (const blockedCard of blockedCards) {
ninCards.push(blockedCard.card);
}
}
const allCards = await Card.find({
category: categoryId,
_id: { $nin: ninCards }
});

const randomCards = getRandomUniqueNumbersInRange(
allCards.length,
Expand Down Expand Up @@ -85,8 +98,11 @@ const makeQueryOption = (search: string[]) => {
return { filter: { $all: search } };
};

const getRandomizedPrimaryCards = async () => {
const primaryCards = await Card.find({ filter: FILTER_R_RATED });
const getRandomizedPrimaryCards = async (ninCards: Types.ObjectId[]) => {
const primaryCards = await Card.find({
filter: FILTER_R_RATED,
_id: { $nin: ninCards }
});
const randomizedPrimaryCards = getRandomUniqueNumbersInRange(
primaryCards.length,
4
Expand All @@ -96,29 +112,42 @@ const getRandomizedPrimaryCards = async () => {

async function getFilteredCardsWithSize(
search: string[],
primaryCardsSize: number
primaryCardsSize: number,
ninCards: Types.ObjectId[]
) {
const allCards = await Card.find({ filter: { $all: search } });
const allCards = await Card.find({
filter: { $all: search },
_id: { $nin: ninCards }
});
const sizedCards = getRandomUniqueNumbersInRange(
allCards.length,
CARD_SIZE_PER_REQUEST - primaryCardsSize
).map(idx => allCards[idx]);
return sizedCards;
}

const getCard = async (filterKeywords: string[]): Promise<CardDocument[]> => {
const getCard = async (
filterKeywords: string[],
blockedCards?: BlockedCardDocument[]
): Promise<CardDocument[]> => {
const primaryCards = [];

const ninCards: Types.ObjectId[] = [];
if (blockedCards) {
for (const blockedCard of blockedCards) {
ninCards.push(blockedCard.card);
}
}
if (filterKeywords.includes(FILTER_R_RATED)) {
const randomizedPrimaryCards = await getRandomizedPrimaryCards();
const randomizedPrimaryCards = await getRandomizedPrimaryCards(ninCards);

primaryCards.push(...randomizedPrimaryCards);
filterKeywords.splice(filterKeywords.indexOf(FILTER_R_RATED), 1);
}

const sizedCards = await getFilteredCardsWithSize(
filterKeywords,
primaryCards.length
primaryCards.length,
ninCards
);
return util.shuffle([...primaryCards, ...sizedCards]);
};
Expand All @@ -128,8 +157,10 @@ const getFilteredCards = async (
userId?: Types.ObjectId
): Promise<CardResponseDto[]> => {
try {
const cardDocuments = await getCard(filterKeywords);

const blockedCards: BlockedCardDocument[] = await BlockedCard.find({
user: userId
});
const cardDocuments = await getCard(filterKeywords, blockedCards);
const cardIds = cardDocuments.map(e => e._id);
const bookmarks = await Bookmark.find({
user: userId,
Expand Down
28 changes: 24 additions & 4 deletions src/services/cardService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import Bookmark, { BookmarkDocument } from '../models/bookmark';
import util from '../modules/util';
import { Types } from 'mongoose';
import { CardResponseDto } from '../intefaces/CardResponseDto';
import { BlockedCard, BlockedCardDocument } from '../models/blockedCard';

interface CardIdAndCnt {
_id: Types.ObjectId;
Expand Down Expand Up @@ -47,9 +48,24 @@ const findBestCardsLimit = async (size: number) => {
).filter(util.isNotEmpty);
};

const findExtraCardsExceptFor = async (cards: CardDocument[], size: number) => {
const findExtraCardsExceptFor = async (
cards: CardDocument[],
size: number,
blockedCards?: BlockedCardDocument[]
) => {
const ninCards: Types.ObjectId[] = [];
for (const card of cards) {
ninCards.push(card._id);
}
if (blockedCards) {
for (const blockedCard of blockedCards) {
ninCards.push(blockedCard.card);
}
}
const extraCards: CardDocument[] = await Card.find({
_id: { $nin: cards.map(c => c._id) }
_id: {
$nin: ninCards
}
})
.sort('_id')
.limit(size - cards.length);
Expand All @@ -65,7 +81,6 @@ const findBestCards = async (size: number, userId?: Types.ObjectId) => {
for (const card of [...cards, ...extraCards]) {
totalCards.push(await createCardResponse(card, userId));
}

return totalCards;
};

Expand All @@ -77,8 +92,13 @@ const findCards = async (
const cards: CardDocument[] = await Card.find({
_id: cardId
});
const blockedCards: BlockedCardDocument[] = await BlockedCard.find({
user: userId
});
const extraCards =
cards.length < size ? await findExtraCardsExceptFor(cards, size) : [];
cards.length < size
? await findExtraCardsExceptFor(cards, size, blockedCards)
: [];
const totalCards: CardResponseDto[] = [];
for (const card of [...cards, ...extraCards]) {
totalCards.push(await createCardResponse(card, userId));
Expand Down

0 comments on commit d1509be

Please sign in to comment.