mirror of
https://github.com/Aviortheking/codestats-readme.git
synced 2025-04-22 02:32:09 +00:00
This PR remove the need to use Vercel to setup the server, currently it can still be used as such using the api folder
80 lines
1.8 KiB
TypeScript
80 lines
1.8 KiB
TypeScript
import { Request, Response } from 'express'
|
|
import ReactDOMServer from 'react-dom/server'
|
|
import { parseBoolean, prepareResponse, setCache, parseNumber, clampValue, parseArray } from '../src/common/utils'
|
|
import { fetchHistory } from '../src/fetcher'
|
|
import Error from '../src/components/Error'
|
|
import HistoryCard from '../src/cards/HistoryCard'
|
|
import themes from '../themes/themes.json'
|
|
|
|
export interface query {
|
|
username: string
|
|
days_count?: string
|
|
cache_seconds?: string
|
|
width?: string
|
|
height?: string
|
|
hide?: string
|
|
language_count?: string
|
|
layout?: 'horizontal'
|
|
reverse_order?: string
|
|
hide_legend?: string
|
|
|
|
// Mater
|
|
bg_color?: string
|
|
hide_border?: string
|
|
hide_title?: string
|
|
theme?: keyof typeof themes
|
|
title_color?: string
|
|
}
|
|
|
|
export default async (req: Request<unknown, unknown, unknown, query>, res: Response) => {
|
|
const {
|
|
username,
|
|
days_count,
|
|
cache_seconds,
|
|
width,
|
|
height,
|
|
language_count,
|
|
hide,
|
|
layout,
|
|
reverse_order,
|
|
hide_legend,
|
|
|
|
// Master
|
|
bg_color,
|
|
hide_border,
|
|
hide_title,
|
|
theme,
|
|
title_color
|
|
} = req.query
|
|
|
|
prepareResponse(res)
|
|
console.log(theme)
|
|
|
|
try {
|
|
const data = await fetchHistory(username, clampValue(parseNumber(days_count) || 14, 1, 30))
|
|
|
|
setCache(res, parseInt(cache_seconds || '', 10))
|
|
|
|
return res.send(ReactDOMServer.renderToStaticMarkup(
|
|
new HistoryCard(username, data, {
|
|
hide_title: parseBoolean(hide_title),
|
|
hide_border: parseBoolean(hide_border),
|
|
title_color,
|
|
hide_legend: parseBoolean(hide_legend),
|
|
bg_color,
|
|
layout,
|
|
theme,
|
|
reverse_order: parseBoolean(reverse_order),
|
|
language_count: parseNumber(language_count),
|
|
width: parseNumber(width),
|
|
height: clampValue(parseNumber(height) || 300, 200),
|
|
hide: parseArray(hide)
|
|
}).render()
|
|
))
|
|
} catch (err) {
|
|
return res.send(
|
|
ReactDOMServer.renderToStaticMarkup(new Error(err as any).render())
|
|
)
|
|
}
|
|
}
|