This commit is contained in:
2024-03-12 18:27:07 +01:00
parent 2db47b3335
commit 7d20d83834
2 changed files with 40 additions and 17 deletions

View File

@@ -61,9 +61,11 @@ export class CardsRepository {
}, },
question: { question: {
contains: question || undefined, contains: question || undefined,
mode: 'insensitive' as const,
}, },
answer: { answer: {
contains: answer || undefined, contains: answer || undefined,
mode: 'insensitive' as const,
}, },
} }
@@ -72,26 +74,46 @@ export class CardsRepository {
if (key === 'grade') { if (key === 'grade') {
const start = (currentPage - 1) * itemsPerPage const start = (currentPage - 1) * itemsPerPage
// Initialize parts of the WHERE clause
const whereParts = []
const queryParams: any[] = [userId, deckId]
// Add conditions for question and answer if they are provided
if (question) {
whereParts.push(`c."question" ILIKE $${queryParams.length + 1}`)
queryParams.push(`%${question}%`)
}
if (answer) {
whereParts.push(`c."answer" ILIKE $${queryParams.length + 1}`)
queryParams.push(`%${answer}%`)
}
// If no specific conditions are provided, match everything
if (whereParts.length === 0) {
whereParts.push('TRUE')
}
const whereClause = whereParts.join(' OR ')
const sqlQuery = ` const sqlQuery = `
SELECT c.*, g.grade as userGrade SELECT c.*, g.grade as "userGrade"
FROM card AS c FROM card AS c
LEFT JOIN grade AS g ON c.id = g.cardId AND g.userId = ? LEFT JOIN grade AS g ON c.id = g."cardId" AND g."userId" = $1
WHERE c.deckId = ? AND WHERE c."deckId" = $2 AND (${whereClause})
(c.question LIKE ? OR c.answer LIKE ?) ORDER BY g."grade" ${direction === 'asc' ? 'ASC NULLS FIRST' : 'DESC NULLS LAST'}
ORDER BY g.grade ${direction} LIMIT $${queryParams.length + 1} OFFSET $${queryParams.length + 2}
LIMIT ?, ? `
`
// Add itemsPerPage and start to the queryParams
queryParams.push(itemsPerPage, start)
const cardsRaw = (await this.prisma.$queryRawUnsafe( const cardsRaw = (await this.prisma.$queryRawUnsafe(
sqlQuery, sqlQuery,
userId, ...queryParams
deckId,
`%${question || ''}%`,
`%${answer || ''}%`,
start,
itemsPerPage
)) satisfies Array<any> )) satisfies Array<any>
console.log('123', sqlQuery, queryParams)
const cards: CardWithGrades[] = cardsRaw.map(({ userGrade, ...card }) => ({ const cards: CardWithGrades[] = cardsRaw.map(({ userGrade, ...card }) => ({
...card, ...card,
grades: [ grades: [

View File

@@ -59,7 +59,9 @@ export class DecksRepository {
async findMinMaxCards(): Promise<{ min: number; max: number }> { async findMinMaxCards(): Promise<{ min: number; max: number }> {
const result = await this.prisma const result = await this.prisma
.$queryRaw`SELECT MAX(card_count) as maxCardsCount, MIN(card_count) as minCardsCount FROM (SELECT deck.id, COUNT(card.id) as card_count FROM deck LEFT JOIN card ON deck.id = card."deckId" GROUP BY deck.id) AS card_counts;` .$queryRaw`SELECT MAX(card_count) as "maxCardsCount", MIN(card_count) as "minCardsCount" FROM (SELECT deck.id, COUNT(card.id) as card_count FROM deck LEFT JOIN card ON deck.id = card."deckId" GROUP BY deck.id) AS card_counts;`
console.log(result)
return { return {
max: Number(result[0].maxCardsCount), max: Number(result[0].maxCardsCount),
@@ -111,7 +113,7 @@ export class DecksRepository {
// Prepare the where clause conditions // Prepare the where clause conditions
const conditions = [] const conditions = []
if (name) conditions.push(`d.name LIKE ('%' || ? || '%')`) if (name) conditions.push(`d.name ILIKE ('%' || ? || '%')`)
if (authorId) conditions.push(`d."userId" = ?`) if (authorId) conditions.push(`d."userId" = ?`)
if (userId) if (userId)
conditions.push(`(d."isPrivate" = FALSE OR (d."isPrivate" = TRUE AND d."userId" = ?))`) conditions.push(`(d."isPrivate" = FALSE OR (d."isPrivate" = TRUE AND d."userId" = ?))`)
@@ -208,7 +210,6 @@ LIMIT $${conditions.length + havingConditions.length + 1} OFFSET $${
// Execute the raw SQL query for total count // Execute the raw SQL query for total count
const totalResult = await this.prisma.$queryRawUnsafe<any[]>(countQuery, ...countQueryParams) const totalResult = await this.prisma.$queryRawUnsafe<any[]>(countQuery, ...countQueryParams)
const total = Number(totalResult[0]?.total) ?? 1 const total = Number(totalResult[0]?.total) ?? 1
const modifiedDecks = decks.map(deck => { const modifiedDecks = decks.map(deck => {
const cardsCount = deck.cardsCount const cardsCount = deck.cardsCount