diff --git a/src/components/search/AlbumSearch.astro b/src/components/search/AlbumSearch.astro
index 6016d99..71ba34b 100644
--- a/src/components/search/AlbumSearch.astro
+++ b/src/components/search/AlbumSearch.astro
@@ -11,31 +11,20 @@ interface Props {
const take = 20
const { query } = Astro.props
+
+const queryString = query
+ .toLowerCase()
+ .split('_')
+ .map((w) => `+${w}`)
+ .join(' ')
const findQuery: Prisma.albumsFindManyArgs = {
select: { title: true, releaseDate: true, id: true },
where: {
- OR: [
- {
- title: {
- search: query
- .toLowerCase()
- .split('_')
- .map((w) => `+${w}`)
- .join(' ')
- }
- },
- {
- subTitle: {
- search: query
- .toLowerCase()
- .split('_')
- .map((w) => `+${w}`)
- .join(' ')
- }
- }
- ]
+ OR: [{ title: { search: queryString } }, { subTitle: { search: queryString } }]
},
- orderBy: { publishedAt: 'desc' }
+ orderBy: {
+ _relevance: { fields: ['title', 'subTitle'], sort: 'desc', search: query.toLowerCase() }
+ }
}
const countQuery: Prisma.albumsCountArgs
= {
where: findQuery.where
diff --git a/src/components/sidebar/GetLuckyAlbum.astro b/src/components/sidebar/GetLuckyAlbum.astro
new file mode 100644
index 0000000..9ff952b
--- /dev/null
+++ b/src/components/sidebar/GetLuckyAlbum.astro
@@ -0,0 +1,14 @@
+---
+interface Props {
+ class: string
+}
+
+import * as m from '../../paraglide/messages.js'
+
+import { getRandomAlbum } from 'utils/queries'
+
+const album = await getRandomAlbum()
+const { class: className } = Astro.props
+---
+
+{m.getLucky()}
diff --git a/src/layouts/PaginatedAlbumList.astro b/src/layouts/PaginatedAlbumList.astro
new file mode 100644
index 0000000..34bc19b
--- /dev/null
+++ b/src/layouts/PaginatedAlbumList.astro
@@ -0,0 +1,42 @@
+---
+interface Props {
+ albums: { title: string | null; id: number }[]
+ limitXS: number
+ limitMD: number
+ fullPageList: number[]
+ page: number
+}
+
+import Base from './base.astro'
+import AlbumBox from 'components/AlbumBox.astro'
+import FooterNav from 'components/lastAdded/FooterNav.astro'
+
+const { albums, limitMD, limitXS, ...listProps } = Astro.props
+
+if (albums.length === 0) {
+ Astro.redirect('/404')
+}
+---
+
+
+
+
+
+
+
+
+
+ {
+ albums.map((album) => (
+
+ ))
+ }
+
+
+
+
+
+
diff --git a/src/pages/album/list/index.astro b/src/pages/album/list/index.astro
index 1b78507..53274cc 100644
--- a/src/pages/album/list/index.astro
+++ b/src/pages/album/list/index.astro
@@ -1,11 +1,8 @@
---
import prismaClient from 'utils/prisma-client'
-import * as m from 'paraglide/messages'
-import { AlbumStatus } from '@prisma/client'
-import Sidebar from 'components/Sidebar.astro'
import BaseLayout from 'layouts/base.astro'
-import AlbumBox from 'components/AlbumBox.astro'
+import Sidebar from 'components/Sidebar.astro'
import LetterSection from 'components/albumList/letterSection.astro'
const letters: { letter: string; count: BigInt }[] = await prismaClient.$queryRaw`
@@ -40,7 +37,15 @@ const letters: { letter: string; count: BigInt }[] = await prismaClient.$queryRa
{l.letter}
-
+
+
+
+ {Array.from({ length: Number(l.count) }).map(() => (
+
+ ))}
+
+
+
))
diff --git a/src/pages/anim/latest/[...page].astro b/src/pages/anim/latest/[...page].astro
new file mode 100644
index 0000000..2c015a2
--- /dev/null
+++ b/src/pages/anim/latest/[...page].astro
@@ -0,0 +1,28 @@
+---
+import prismaClient from 'utils/prisma-client'
+import * as m from 'paraglide/messages'
+import { AlbumStatus } from '@prisma/client'
+
+import PaginatedAlbumList from 'layouts/PaginatedAlbumList.astro'
+
+const page = Math.min(1, parseInt(Astro.params.page ?? '1'))
+const take = 40
+const limitMD = 12
+const limitXS = 5
+
+const albums = await prismaClient.albums.findMany({
+ where: { status: AlbumStatus.SHOW, categories: { some: { categoryName: 'Animation' } } },
+ select: { id: true, title: true },
+ take,
+ skip: take * (page - 1),
+ orderBy: [{ releaseDate: 'desc' }, { publishedAt: 'desc' }, { createdAt: 'desc' }]
+})
+const count = await prismaClient.albums.count({ where: { status: AlbumStatus.SHOW } })
+
+const fullPageList = [...Array(Math.ceil(count / take))].map((v, i) => i + 1)
+const listProps = { fullPageList, page, albums, limitMD, limitXS }
+---
+
+
+ {m.latestAnimReleases()}
+
diff --git a/src/pages/game/latest/[...page].astro b/src/pages/game/latest/[...page].astro
new file mode 100644
index 0000000..63f9aae
--- /dev/null
+++ b/src/pages/game/latest/[...page].astro
@@ -0,0 +1,28 @@
+---
+import prismaClient from 'utils/prisma-client'
+import * as m from 'paraglide/messages'
+import { AlbumStatus } from '@prisma/client'
+
+import PaginatedAlbumList from 'layouts/PaginatedAlbumList.astro'
+
+const page = Math.min(1, parseInt(Astro.params.page ?? '1'))
+const take = 40
+const limitMD = 12
+const limitXS = 5
+
+const albums = await prismaClient.albums.findMany({
+ where: { status: AlbumStatus.SHOW, categories: { some: { categoryName: 'Game' } } },
+ select: { id: true, title: true },
+ take,
+ skip: take * (page - 1),
+ orderBy: [{ releaseDate: 'desc' }, { publishedAt: 'desc' }, { createdAt: 'desc' }]
+})
+const count = await prismaClient.albums.count({ where: { status: AlbumStatus.SHOW } })
+
+const fullPageList = [...Array(Math.ceil(count / take))].map((v, i) => i + 1)
+const listProps = { fullPageList, page, albums, limitMD, limitXS }
+---
+
+
+ {m.latestGameReleases()}
+
diff --git a/src/pages/holy12.astro b/src/pages/holy12.astro
new file mode 100644
index 0000000..465e9a5
--- /dev/null
+++ b/src/pages/holy12.astro
@@ -0,0 +1,26 @@
+---
+import * as m from 'paraglide/messages'
+
+import { getRandom } from 'utils/form'
+import { getRandomAlbum } from 'utils/queries'
+
+import Base from 'layouts/base.astro'
+import AlbumBox from 'components/AlbumBox.astro'
+
+const titles = [m.holy12_0(), m.holy12_1(), m.holy12_2(), m.holy12_3(), m.holy12_4(), m.holy12_5()]
+const title = getRandom(titles)
+const albums: { id: number; title: string }[] = await Promise.all(Array.from({ length: 12 }, getRandomAlbum))
+---
+
+
+
+
{title}
+
+ {
+ albums.map((album) => (
+
+ ))
+ }
+
+
+
diff --git a/src/pages/last-added/[...page].astro b/src/pages/last-added/[...page].astro
index 61c02da..959b44f 100644
--- a/src/pages/last-added/[...page].astro
+++ b/src/pages/last-added/[...page].astro
@@ -3,53 +3,26 @@ import prismaClient from 'utils/prisma-client'
import * as m from 'paraglide/messages'
import { AlbumStatus } from '@prisma/client'
-import BaseLayout from 'layouts/base.astro'
-import AlbumBox from 'components/AlbumBox.astro'
-import FooterNav from 'components/lastAdded/FooterNav.astro'
+import PaginatedAlbumList from 'layouts/PaginatedAlbumList.astro'
-const page = parseInt(Astro.params.page ?? '1')
+const page = Math.min(1, parseInt(Astro.params.page ?? '1'))
const take = 40
const limitMD = 12
const limitXS = 5
-if (page < 1) {
- Astro.redirect('/last-added')
-}
-
-const lastAlbums = await prismaClient.albums.findMany({
+const albums = await prismaClient.albums.findMany({
where: { status: AlbumStatus.SHOW },
select: { id: true, title: true },
take,
skip: take * (page - 1),
- orderBy: { createdAt: 'desc' }
+ orderBy: { publishedAt: 'desc' }
})
const count = await prismaClient.albums.count({ where: { status: AlbumStatus.SHOW } })
-if (lastAlbums.length === 0) {
- Astro.redirect('/404')
-}
-
const fullPageList = [...Array(Math.ceil(count / take))].map((v, i) => i + 1)
-const listProps = { fullPageList, page }
+const listProps = { fullPageList, page, albums, limitMD, limitXS }
---
-
-
-
-
- {m.lastAdded()}
-
-
- {
- lastAlbums.map((album) => (
-
- ))
- }
-
-
-
-
-
+
+ {m.lastAdded()}
+
diff --git a/src/utils/queries.ts b/src/utils/queries.ts
new file mode 100644
index 0000000..8ae49a7
--- /dev/null
+++ b/src/utils/queries.ts
@@ -0,0 +1,18 @@
+import prismaClient from './prisma-client'
+
+export async function getRandomAlbum(): Promise<{ id: number; title: string }> {
+ const res: { id: number; title: string }[] = await prismaClient.$queryRawUnsafe(`
+ SELECT r1.id as id, r1.title as title
+ FROM albums AS r1 JOIN (
+ SELECT (
+ RAND() * (
+ SELECT MAX(id) FROM albums
+ )
+ ) AS id
+ ) AS r2
+ WHERE r1.id >= r2.id
+ ORDER BY r1.id ASC
+ LIMIT 1;`)
+
+ return res[0]
+}