mirror of
https://github.com/ershisan99/flashcards-api.git
synced 2025-12-17 05:09:26 +00:00
wip
This commit is contained in:
@@ -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: [
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user