Skip to content

Commit

Permalink
feat: change posts URL and validate
Browse files Browse the repository at this point in the history
  • Loading branch information
AlejandroAkbal committed Nov 24, 2023
1 parent ea9ec1f commit 4e1a62a
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 82 deletions.
8 changes: 2 additions & 6 deletions assets/js/RouterHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export function generatePostsRoute(
}

if (domain != null) {
route.query.domain = domain
route.path = `/posts/${domain}`
}

if (page != null) {
Expand All @@ -34,9 +34,5 @@ export function generatePostsRoute(
}

function objectIsEmpty(obj: Object) {
return isEmpty(
omitBy(
obj,
isNil)
)
return isEmpty(omitBy(obj, isNil))
}
2 changes: 1 addition & 1 deletion nuxt.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ export default defineNuxtConfig({
* @see https://nuxt.com/docs/guide/concepts/rendering#route-rules
*/
routeRules: {
'/posts': {
'/posts/*': {
// Incremental Static Regeneration for 5 minutes
isr: 60 * 5,

Expand Down
84 changes: 44 additions & 40 deletions pages/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@
definePageMeta({
middleware: [
/**
* Redirect to /posts if query parameters [domain, page, tags] are set.
* Redirect to /posts/<domain> if query parameters [domain, page, tags] are set.
*/
function (to, from) {
if (!to) {
Expand All @@ -97,19 +97,23 @@
return
}
return navigateTo({ path: '/posts', query: to.query, hash: to.hash })
return navigateTo({
path: '/posts/' + to.query.domain,
query: to.query,
hash: to.hash
})
}
]
})
const featuredDomains = [
{
domain: 'rule34.xxx',
path: '/posts?domain=rule34.xxx',
path: '/posts/rule34.xxx',
tags: [
{
name: 'Top posts',
path: '/posts?domain=rule34.xxx&filter%5Bsort%5D=score',
path: '/posts/rule34.xxx?filter%5Bsort%5D=score',
images: [
'/img/featured/rule34.xxx/top-1.jpg',
'/img/featured/rule34.xxx/top-2.jpg',
Expand All @@ -119,7 +123,7 @@
},
{
name: 'Popular posts',
path: '/posts?domain=rule34.xxx&filter%5Bscore%5D=>%3D50',
path: '/posts/rule34.xxx?filter%5Bscore%5D=>%3D50',
images: [
'/img/featured/rule34.xxx/top-5.jpg',
'/img/featured/rule34.xxx/top-6.jpg',
Expand All @@ -129,12 +133,12 @@
},
{
name: 'Animated',
path: '/posts?domain=rule34.xxx&tags=animated',
path: '/posts/rule34.xxx?tags=animated',
images: ['/img/featured/rule34.xxx/animated.jpeg']
},
{
name: 'Overwatch',
path: '/posts?domain=rule34.xxx&tags=overwatch',
path: '/posts/rule34.xxx?tags=overwatch',
images: [
'/img/featured/rule34.xxx/overwatch-1.jpeg',
'/img/featured/rule34.xxx/overwatch-2.jpeg',
Expand All @@ -147,69 +151,69 @@
},
{
name: 'Genshin Impact',
path: '/posts?domain=rule34.xxx&tags=genshin_impact',
path: '/posts/rule34.xxx?tags=genshin_impact',
images: ['/img/featured/rule34.xxx/genshin_impact.jpg']
},
{
name: 'Brawl Stars',
path: '/posts?domain=rule34.xxx&tags=brawl_stars',
path: '/posts/rule34.xxx?tags=brawl_stars',
images: ['/img/featured/rule34.xxx/brawl_stars.jpeg']
},
{
name: 'Friday Night Funkin',
path: '/posts?domain=rule34.xxx&tags=friday_night_funkin',
path: '/posts/rule34.xxx?tags=friday_night_funkin',
images: ['/img/featured/rule34.xxx/friday_night_funkin.jpg']
},
{
name: 'Atomic Heart',
path: '/posts?domain=rule34.xxx&tags=atomic_heart',
path: '/posts/rule34.xxx?tags=atomic_heart',
images: ['/img/featured/rule34.xxx/atomic_heart.jpg']
},
{
name: 'Minecraft',
path: '/posts?domain=rule34.xxx&tags=minecraft',
path: '/posts/rule34.xxx?tags=minecraft',
images: ['/img/featured/rule34.xxx/minecraft.jpg']
},
{
name: 'Murder Drones',
path: '/posts?domain=rule34.xxx&tags=murder_drones',
path: '/posts/rule34.xxx?tags=murder_drones',
images: ['/img/featured/rule34.xxx/murder_drones.jpg']
},
{
name: 'CountryHumans',
path: '/posts?domain=rule34.xxx&tags=countryhumans',
path: '/posts/rule34.xxx?tags=countryhumans',
images: ['/img/featured/rule34.xxx/countryhumans.jpg']
},
{
name: 'Honkai: Star Rail',
path: '/posts?domain=rule34.xxx&tags=honkai:_star_rail',
path: '/posts/rule34.xxx?tags=honkai:_star_rail',
images: ['/img/featured/rule34.xxx/honkai_star_rail.jpg']
},
{
name: "Five Nights at Freddy's",
path: "/posts?domain=rule34.xxx&tags=five_nights_at_freddy's",
path: "/posts/rule34.xxx?tags=five_nights_at_freddy's",
images: ['/img/featured/rule34.xxx/five_nights_at_freddys.jpg']
},
{
name: 'Roblox',
path: '/posts?domain=rule34.xxx&tags=roblox',
path: '/posts/rule34.xxx?tags=roblox',
images: ['/img/featured/rule34.xxx/roblox.jpg']
},
{
name: 'Undertale',
path: '/posts?domain=rule34.xxx&tags=undertale',
path: '/posts/rule34.xxx?tags=undertale',
images: ['/img/featured/rule34.xxx/undertale.jpeg']
}
]
},
{
domain: 'gelbooru.com',
path: '/posts?domain=gelbooru.com',
path: '/posts/gelbooru.com',
tags: [
{
name: 'Top posts',
path: '/posts?domain=gelbooru.com&filter%5Bsort%5D=score',
path: '/posts/gelbooru.com?filter%5Bsort%5D=score',
images: [
'/img/featured/gelbooru.com/top-1.jpeg',
'/img/featured/gelbooru.com/top-2.jpeg',
Expand All @@ -219,7 +223,7 @@
},
{
name: 'Popular posts',
path: '/posts?domain=gelbooru.com&filter%5Bscore%5D=>%3D50',
path: '/posts/gelbooru.com?filter%5Bscore%5D=>%3D50',
images: [
'/img/featured/gelbooru.com/top-5.jpeg',
'/img/featured/gelbooru.com/top-6.jpeg',
Expand All @@ -229,34 +233,34 @@
},
{
name: 'Animated',
path: '/posts?domain=gelbooru.com&tags=animated',
path: '/posts/gelbooru.com?tags=animated',
images: ['/img/featured/gelbooru.com/animated.jpeg']
},
{
name: 'Pokemon',
path: '/posts?domain=gelbooru.com&tags=pokemon',
path: '/posts/gelbooru.com?tags=pokemon',
images: ['/img/featured/gelbooru.com/pokemon.jpeg']
},
{
name: '3D',
path: '/posts?domain=gelbooru.com&tags=3d',
path: '/posts/gelbooru.com?tags=3d',
images: ['/img/featured/gelbooru.com/3d.jpeg']
},
{
name: 'Furry',
path: '/posts?domain=gelbooru.com&tags=furry',
path: '/posts/gelbooru.com?tags=furry',
images: ['/img/featured/gelbooru.com/furry.jpeg']
}
]
},
{
domain: 'e621.net',
path: '/posts?domain=e621.net',
path: '/posts/e621.net',
tags: [
{
name: 'Top posts',
path: '/posts?domain=e621.net&filter%5Bsort%5D=score',
path: '/posts/e621.net?filter%5Bsort%5D=score',
images: [
'/img/featured/e621.net/top-1.jpeg',
'/img/featured/e621.net/top-2.jpeg',
Expand All @@ -266,7 +270,7 @@
},
{
name: 'Popular posts',
path: '/posts?domain=e621.net&filter%5Bscore%5D=>%3D50',
path: '/posts/e621.net?filter%5Bscore%5D=>%3D50',
images: [
'/img/featured/e621.net/top-5.jpeg',
'/img/featured/e621.net/top-6.jpeg',
Expand All @@ -276,29 +280,29 @@
},
{
name: 'Animated',
path: '/posts?domain=e621.net&tags=animated',
path: '/posts/e621.net?tags=animated',
images: ['/img/featured/e621.net/animated.jpeg']
},
{
name: 'Gay',
path: '/posts?domain=e621.net&tags=gay',
path: '/posts/e621.net?tags=gay',
images: ['/img/featured/e621.net/gay.jpeg']
},
{
name: 'Pokemon',
path: '/posts?domain=e621.net&tags=pokemon',
path: '/posts/e621.net?tags=pokemon',
images: ['/img/featured/e621.net/pokemon.jpeg']
}
]
},
{
domain: 'realbooru.com',
path: '/posts?domain=realbooru.com',
path: '/posts/realbooru.com',
tags: [
{
name: 'Top posts',
path: '/posts?domain=realbooru.com&filter%5Bsort%5D=score',
path: '/posts/realbooru.com?filter%5Bsort%5D=score',
images: [
'/img/featured/realbooru.com/top-1.jpeg',
'/img/featured/realbooru.com/top-2.jpeg',
Expand All @@ -308,7 +312,7 @@
},
{
name: 'Popular posts',
path: '/posts?domain=realbooru.com&filter%5Bscore%5D=>%3D50',
path: '/posts/realbooru.com?filter%5Bscore%5D=>%3D50',
images: [
'/img/featured/realbooru.com/top-5.jpeg',
'/img/featured/realbooru.com/top-6.jpeg',
Expand All @@ -318,12 +322,12 @@
},
{
name: 'Animated',
path: '/posts?domain=realbooru.com&tags=animated',
path: '/posts/realbooru.com?tags=animated',
images: ['/img/featured/realbooru.com/animated.jpeg']
},
{
name: 'Cosplay',
path: '/posts?domain=realbooru.com&tags=cosplay',
path: '/posts/realbooru.com?tags=cosplay',
images: [
'/img/featured/realbooru.com/cosplay-1.jpeg',
'/img/featured/realbooru.com/cosplay-2.jpeg',
Expand All @@ -335,7 +339,7 @@
},
{
name: 'Goth',
path: '/posts?domain=realbooru.com&tags=goth',
path: '/posts/realbooru.com?tags=goth',
images: [
'/img/featured/realbooru.com/goth-1.jpeg',
'/img/featured/realbooru.com/goth-2.jpeg',
Expand All @@ -348,7 +352,7 @@
},
{
name: 'Asian',
path: '/posts?domain=realbooru.com&tags=asian',
path: '/posts/realbooru.com?tags=asian',
images: [
'/img/featured/realbooru.com/asian-1.jpeg',
'/img/featured/realbooru.com/asian-2.jpeg',
Expand All @@ -361,7 +365,7 @@
},
{
name: 'Teen (+18)',
path: '/posts?domain=realbooru.com&tags=teen',
path: '/posts/realbooru.com?tags=teen',
images: [
'/img/featured/realbooru.com/teen-1.jpeg',
'/img/featured/realbooru.com/teen-2.jpeg',
Expand All @@ -374,7 +378,7 @@
},
{
name: 'Transgender',
path: '/posts?domain=realbooru.com&tags=transgender',
path: '/posts/realbooru.com?tags=transgender',
images: [
'/img/featured/realbooru.com/transgender-1.jpeg',
'/img/featured/realbooru.com/transgender-2.jpeg',
Expand Down
22 changes: 18 additions & 4 deletions pages/posts.vue → pages/posts/[domain].vue
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
// TODO: Validate query - https://nuxt.com/docs/getting-started/routing#route-validation
const selectedBooru = computed(() => {
let domain = route.query.domain
let domain = route.params.domain
// Fallback to first Booru
if (!domain) {
Expand Down Expand Up @@ -404,8 +404,23 @@
definePageMeta({
validate: async (route) => {
if (!route) {
return true
const { booruList } = useBooruList()
const domain = route.params.domain
const booru = booruList.value.find((booru) => booru.domain === domain)
if (!booru) {
return false
}
const { isPremium } = useUserData()
if (!isPremium.value && booru.isPremium) {
return {
statusCode: 401,
statusMessage: 'Unauthorized, please login to view this page'
}
}
const page = route.query.page
Expand All @@ -419,7 +434,6 @@
}
}
// Validate `domain` query
// Validate `tags` query
// Validate `filters` query
Expand Down
3 changes: 1 addition & 2 deletions test/pages/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,7 @@ describe('/', async () => {
// Assert
const currentUrl = new URL(page.url())

expect(currentUrl.pathname).toBe('/posts')
expect(currentUrl.searchParams.get('domain')).toBe('safebooru.org')
expect(currentUrl.pathname).toBe('/posts/safebooru.org')
expect(currentUrl.searchParams.get('page')).toBe('3')
expect(currentUrl.searchParams.get('tags')).toBe('cat|black_hair')
})
Expand Down
Loading

0 comments on commit 4e1a62a

Please sign in to comment.