|
|
|
import guides from '../content/guides.json';
|
|
|
|
import formatDate from 'date-fns/format';
|
|
|
|
import { NextApiRequest } from 'next';
|
|
|
|
import { AuthorType, findAuthorByUsername } from './author';
|
|
|
|
|
|
|
|
export type GuideType = {
|
|
|
|
title: string;
|
|
|
|
description: string;
|
|
|
|
url: string;
|
|
|
|
fileName: string;
|
|
|
|
isPro: boolean;
|
|
|
|
isDraft: boolean;
|
|
|
|
createdAt: string;
|
|
|
|
updatedAt: string;
|
|
|
|
formattedCreatedAt: string;
|
|
|
|
formattedUpdatedAt: string;
|
|
|
|
authorUsername: string;
|
|
|
|
author?: AuthorType;
|
|
|
|
};
|
|
|
|
|
|
|
|
export function getAllGuides(limit: number = 0): GuideType[] {
|
|
|
|
return (guides as GuideType[])
|
|
|
|
.filter(guide => !guide.isDraft)
|
|
|
|
.sort((a, b) => (new Date(b.updatedAt) as any) - (new Date(a.updatedAt) as any))
|
|
|
|
.map(guide => ({
|
|
|
|
...guide,
|
|
|
|
formattedCreatedAt: formatDate(new Date(guide.createdAt), 'MMMM d, yyyy'),
|
|
|
|
formattedUpdatedAt: formatDate(new Date(guide.updatedAt), 'MMMM d, yyyy')
|
|
|
|
}))
|
|
|
|
.slice(0, limit ? limit : guides.length);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function getRequestedGuide(req: NextApiRequest): GuideType | undefined {
|
|
|
|
const allGuides = getAllGuides();
|
|
|
|
const guide = allGuides.find(guide => guide.url === req.url);
|
|
|
|
if (!guide) {
|
|
|
|
return undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
return {
|
|
|
|
...guide,
|
|
|
|
author: findAuthorByUsername(guide.authorUsername)
|
|
|
|
};
|
|
|
|
} catch (e) {
|
|
|
|
console.log(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
return undefined;
|
|
|
|
}
|