Feat: add user posts functionality for account page

This commit is contained in:
Aaron William Po
2023-11-26 21:45:03 -05:00
parent c0d90a84d8
commit 00e980d71e
10 changed files with 552 additions and 3 deletions

View File

@@ -10,6 +10,7 @@ import Security from '@/components/Account/Security';
import DeleteAccount from '@/components/Account/DeleteAccount';
import accountPageReducer from '@/reducers/accountPageReducer';
import UserAvatar from '@/components/Account/UserAvatar';
import UserPosts from '@/components/Account/UserPosts';
const AccountPage: NextPage = () => {
const { user } = useContext(UserContext);
@@ -32,9 +33,11 @@ const AccountPage: NextPage = () => {
/>
</Head>
<div className="flex flex-col items-center">
<div className="m-12 flex w-11/12 flex-col items-center justify-center space-y-3 lg:w-7/12">
<div className="m-12 flex w-11/12 flex-col items-center justify-center space-y-3 lg:w-8/12">
<div className="flex flex-col items-center space-y-3">
<UserAvatar user={user} />
<div className="h-32">
<UserAvatar user={user} />
</div>
<div className="flex flex-col items-center space-y-1">
<p className="text-3xl font-bold">Hello, {user!.username}!</p>
@@ -58,7 +61,9 @@ const AccountPage: NextPage = () => {
<Security pageState={pageState} dispatch={dispatch} />
<DeleteAccount pageState={pageState} dispatch={dispatch} />
</Tab.Panel>
<Tab.Panel>Your posts!</Tab.Panel>
<Tab.Panel className="h-full space-y-5">
<UserPosts />
</Tab.Panel>
</Tab.Panels>
</Tab.Group>
</div>

View File

@@ -0,0 +1,58 @@
import { NextApiRequest, NextApiResponse } from 'next';
import { createRouter } from 'next-connect';
import { z } from 'zod';
import validateRequest from '@/config/nextConnect/middleware/validateRequest';
import DBClient from '@/prisma/DBClient';
import getBeerPostsByPostedById from '@/services/BeerPost/getBeerPostsByPostedById';
import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema';
import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
interface GetBeerPostsRequest extends NextApiRequest {
query: {
page_num: string;
page_size: string;
id: string;
};
}
const getBeerPostsByUserId = async (
req: GetBeerPostsRequest,
res: NextApiResponse<z.infer<typeof APIResponseValidationSchema>>,
) => {
const pageNum = parseInt(req.query.page_num, 10);
const pageSize = parseInt(req.query.page_size, 10);
const { id } = req.query;
const beerPosts = await getBeerPostsByPostedById({ pageNum, pageSize, postedById: id });
const beerPostCount = await DBClient.instance.beerPost.count({
where: { postedBy: { id } },
});
res.setHeader('X-Total-Count', beerPostCount);
res.status(200).json({
message: `Beer posts by user ${id} fetched successfully`,
statusCode: 200,
payload: beerPosts,
success: true,
});
};
const router = createRouter<
GetBeerPostsRequest,
NextApiResponse<z.infer<typeof APIResponseValidationSchema>>
>();
router.get(
validateRequest({
querySchema: PaginatedQueryResponseSchema.extend({ id: z.string().cuid() }),
}),
getBeerPostsByUserId,
);
const handler = router.handler();
export default handler;

View File

@@ -0,0 +1,62 @@
import { NextApiRequest, NextApiResponse } from 'next';
import { createRouter } from 'next-connect';
import { z } from 'zod';
import validateRequest from '@/config/nextConnect/middleware/validateRequest';
import DBClient from '@/prisma/DBClient';
import getAllBreweryPostsByPostedById from '@/services/BreweryPost/getAllBreweryPostsByPostedById';
import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema';
import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
interface GetBreweryPostsRequest extends NextApiRequest {
query: {
page_num: string;
page_size: string;
id: string;
};
}
const getBreweryPostsByUserId = async (
req: GetBreweryPostsRequest,
res: NextApiResponse<z.infer<typeof APIResponseValidationSchema>>,
) => {
const pageNum = parseInt(req.query.page_num, 10);
const pageSize = parseInt(req.query.page_size, 10);
const { id } = req.query;
const breweryPosts = await getAllBreweryPostsByPostedById({
pageNum,
pageSize,
postedById: id,
});
const breweryPostCount = await DBClient.instance.breweryPost.count({
where: { postedBy: { id } },
});
res.setHeader('X-Total-Count', breweryPostCount);
res.status(200).json({
message: `Brewery posts by user ${id} fetched successfully`,
statusCode: 200,
payload: breweryPosts,
success: true,
});
};
const router = createRouter<
GetBreweryPostsRequest,
NextApiResponse<z.infer<typeof APIResponseValidationSchema>>
>();
router.get(
validateRequest({
querySchema: PaginatedQueryResponseSchema.extend({ id: z.string().cuid() }),
}),
getBreweryPostsByUserId,
);
const handler = router.handler();
export default handler;