portfolio/lib/dashboard.ts

145 lines
4.3 KiB
TypeScript
Raw Normal View History

2023-07-29 22:40:36 +00:00
import {cookies} from 'next/headers'
import {createServerComponentClient} from '@supabase/auth-helpers-nextjs'
import {getTopRepo, getTotalFollowers, getTotalForks, getTotalRepos, getTotalStars} from '@/lib/github'
2023-01-28 21:59:01 +00:00
import {getAllArticles} from '@/lib/getAllArticles'
import {getTopArtist, getTopGenre} from '@/lib/spotify'
2023-07-30 18:47:25 +00:00
import {getRamUsage, getRootFsUsage, getSysLoad, getTemp, getUptime} from '@/lib/pi'
import {getStats} from '@/lib/statsfm'
import {Metric} from '@/types'
2023-01-28 21:24:05 +00:00
2023-07-29 22:40:36 +00:00
export async function getDashboardData() {
const supabase = createServerComponentClient({cookies})
const {data: views} = await supabase.rpc('total_views')
2023-01-28 21:24:05 +00:00
const [totalRepos, totalFollowers] = await Promise.all([
getTotalRepos(),
getTotalFollowers()
])
2023-02-21 21:21:11 +00:00
const topRepo = await getTopRepo()
2023-01-28 21:24:05 +00:00
const totalStars = await getTotalStars(totalRepos)
2023-02-21 17:03:38 +00:00
const totalForks = await getTotalForks(totalRepos)
2023-01-29 11:24:06 +00:00
const totalArticles = (await getAllArticles()).length
const topArtist = await getTopArtist()
const {genre} = await getTopGenre()
2023-07-29 22:40:36 +00:00
const {hoursListened, minutesListened, streams} = await getStats()
2023-07-30 18:47:25 +00:00
const {temp} = await getTemp()
const {sysLoad} = await getSysLoad()
const {ramUsage} = await getRamUsage()
const {rootFsUsage} = await getRootFsUsage()
const {days} = await getUptime()
2023-01-28 21:24:05 +00:00
const metrics: Metric[] = [
2023-07-29 22:40:36 +00:00
{
title: "Streams",
value: +streams,
group: "Spotify",
href: "https://open.spotify.com/?"
},
{
title: "Hours listened",
value: +hoursListened,
group: "Spotify",
href: "https://open.spotify.com/?"
},
{
title: "Minutes listened",
value: +minutesListened,
group: "Spotify",
href: "https://open.spotify.com/?"
},
2023-01-30 22:28:27 +00:00
{
title: "Top genre",
value: genre,
2023-01-30 22:28:27 +00:00
group: "Spotify",
href: "https://open.spotify.com/?"
2023-01-30 22:28:27 +00:00
},
{
title: "Top artist",
value: topArtist.artist,
2023-01-30 22:28:27 +00:00
group: "Spotify",
href: topArtist.uri
2023-01-30 22:28:27 +00:00
},
2023-01-28 21:24:05 +00:00
{
2023-01-29 22:16:58 +00:00
title: "Repos",
2023-02-10 17:01:27 +00:00
value: +totalRepos,
2023-01-29 22:16:58 +00:00
group: "GitHub",
2023-01-28 23:04:49 +00:00
href: "https://github.com/r-freeman?tab=repositories"
2023-01-28 21:24:05 +00:00
},
2023-02-21 21:21:11 +00:00
{
title: "Top repo",
value: topRepo.name,
group: "GitHub",
href: topRepo.url
},
2023-01-28 21:24:05 +00:00
{
2023-01-29 22:16:58 +00:00
title: "Followers",
2023-02-10 17:01:27 +00:00
value: +totalFollowers,
2023-01-29 22:16:58 +00:00
group: "GitHub",
2023-01-28 23:04:49 +00:00
href: "https://github.com/r-freeman?tab=followers"
2023-01-28 21:24:05 +00:00
},
{
2023-01-29 22:16:58 +00:00
title: "Stars",
2023-02-10 17:01:27 +00:00
value: +totalStars,
2023-01-29 22:16:58 +00:00
group: "GitHub",
2023-01-28 21:24:05 +00:00
href: "https://github.com/r-freeman/"
2023-01-28 21:59:01 +00:00
},
2023-02-21 17:03:38 +00:00
{
title: "Forks",
value: +totalForks,
group: "GitHub",
href: "https://github.com/r-freeman/"
},
2023-01-28 21:59:01 +00:00
{
2023-01-30 21:06:04 +00:00
title: "Total articles",
2023-02-10 17:01:27 +00:00
value: +totalArticles,
2023-04-12 20:25:53 +00:00
group: "Blog",
2023-01-28 21:59:01 +00:00
href: "/writing"
},
2023-04-12 15:15:17 +00:00
{
2023-04-12 20:25:53 +00:00
title: "Total article views",
value: +views,
group: "Blog",
2023-04-13 20:00:47 +00:00
href: "/writing"
2023-07-30 18:47:25 +00:00
},
{
title: "Temp",
value: `${temp}`,
group: "Raspberry Pi",
href: ""
},
{
title: "Sys load (5m avg)",
value: `${sysLoad}%`,
group: "Raspberry Pi",
href: ""
},
{
title: "RAM usage",
value: `${ramUsage}%`,
group: "Raspberry Pi",
href: ""
},
{
title: "Root FS usage",
value: `${rootFsUsage}%`,
group: "Raspberry Pi",
href: ""
},
{
title: "Uptime days",
value: `${Math.round(days)}`,
group: "Raspberry Pi",
href: ""
2023-04-12 15:15:17 +00:00
}
2023-01-28 21:24:05 +00:00
]
2023-01-29 22:16:58 +00:00
// sort metrics into named groups
const groups = metrics.reduce((acc: { [key: string]: Metric[] }, item) => {
2023-01-29 22:16:58 +00:00
(acc[item.group] = acc[item.group] || []).push(item);
2023-01-29 22:32:21 +00:00
return acc
}, {} as { [key: string]: Metric[] })
2023-01-29 22:16:58 +00:00
return Object.entries(groups).map(([groupName, groupItems]) => {
return {groupName, groupItems}
})
2023-01-28 21:24:05 +00:00
}