51 lines
1.1 KiB
TypeScript
51 lines
1.1 KiB
TypeScript
|
import { Handlers, RouteConfig } from '$fresh/server.ts'
|
||
|
|
||
|
import { contentType } from '$std/media_types/mod.ts'
|
||
|
import { parse } from '$std/path/mod.ts'
|
||
|
|
||
|
const db = [
|
||
|
'julien.oculi',
|
||
|
]
|
||
|
|
||
|
async function getPortfolio(
|
||
|
user: string,
|
||
|
pathname: string,
|
||
|
): Promise<Response> {
|
||
|
const url = new URL(
|
||
|
pathname,
|
||
|
`https://git.cohabit.fr/${user}/.portfolio/raw/branch/main/`,
|
||
|
)
|
||
|
|
||
|
const { ext } = parse(pathname)
|
||
|
|
||
|
try {
|
||
|
const response = await fetch(url)
|
||
|
if (response.ok) {
|
||
|
return new Response(response.body, {
|
||
|
headers: {
|
||
|
'Content-Type': contentType(ext) ?? 'text/plain; charset=utf-8',
|
||
|
},
|
||
|
})
|
||
|
}
|
||
|
throw new Error(response.statusText)
|
||
|
} catch (error) {
|
||
|
return new Response(
|
||
|
'Portfolio introuvable\n```js\n' + String(error) + '\n```',
|
||
|
)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export const config: RouteConfig = {
|
||
|
skipAppWrapper: true,
|
||
|
}
|
||
|
|
||
|
export const handler: Handlers = {
|
||
|
GET(req, _ctx) {
|
||
|
const url = new URL(req.url)
|
||
|
const id = Number(url.pathname.split('/')[2])
|
||
|
const user = db[id]
|
||
|
const query = url.pathname.split('/').slice(4).join('/')
|
||
|
return getPortfolio(user, query === '' ? 'index.html' : query)
|
||
|
},
|
||
|
}
|