mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-02-16 20:13:49 +00:00
Refactor: update beer post services, comment services
This commit is contained in:
@@ -5,7 +5,6 @@ import {
|
||||
EditBeerPostCommentById,
|
||||
FindOrDeleteBeerPostCommentById,
|
||||
GetAllBeerPostComments,
|
||||
GetBeerPostCommentCount,
|
||||
} from './types';
|
||||
|
||||
const beerPostCommentSelect = {
|
||||
@@ -66,22 +65,20 @@ export const deleteBeerCommentByIdService: FindOrDeleteBeerPostCommentById = ({
|
||||
});
|
||||
};
|
||||
|
||||
export const getAllBeerCommentsService: GetAllBeerPostComments = ({
|
||||
export const getAllBeerCommentsService: GetAllBeerPostComments = async ({
|
||||
beerPostId,
|
||||
pageNum,
|
||||
pageSize,
|
||||
}) => {
|
||||
return DBClient.instance.beerComment.findMany({
|
||||
const comments = await DBClient.instance.beerComment.findMany({
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
take: pageSize,
|
||||
where: { beerPostId },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
select: beerPostCommentSelect,
|
||||
});
|
||||
};
|
||||
|
||||
export const getBeerPostCommentCountService: GetBeerPostCommentCount = ({
|
||||
beerPostId,
|
||||
}) => {
|
||||
return DBClient.instance.beerComment.count({ where: { beerPostId } });
|
||||
const count = await DBClient.instance.beerComment.count({ where: { beerPostId } });
|
||||
|
||||
return { comments, count };
|
||||
};
|
||||
|
||||
@@ -19,10 +19,11 @@ export type FindOrDeleteBeerPostCommentById = (args: {
|
||||
beerPostCommentId: string;
|
||||
}) => Promise<BeerPostComment | null>;
|
||||
|
||||
export type GetBeerPostCommentCount = (args: { beerPostId: string }) => Promise<number>;
|
||||
|
||||
export type GetAllBeerPostComments = (args: {
|
||||
beerPostId: string;
|
||||
pageNum: number;
|
||||
pageSize: number;
|
||||
}) => Promise<BeerPostComment[]>;
|
||||
}) => Promise<{
|
||||
comments: BeerPostComment[];
|
||||
count: number;
|
||||
}>;
|
||||
|
||||
@@ -2,7 +2,6 @@ import DBClient from '@/prisma/DBClient';
|
||||
import {
|
||||
CreateNewBeerStyleComment,
|
||||
GetAllBeerStyleComments,
|
||||
GetBeerStyleCommentCount,
|
||||
UpdateBeerStyleCommentById,
|
||||
FindOrDeleteBeerStyleCommentById,
|
||||
} from './types';
|
||||
@@ -35,22 +34,24 @@ export const createNewBeerStyleComment: CreateNewBeerStyleComment = ({
|
||||
});
|
||||
};
|
||||
|
||||
export const getAllBeerStyleComments: GetAllBeerStyleComments = ({
|
||||
export const getAllBeerStyleComments: GetAllBeerStyleComments = async ({
|
||||
beerStyleId,
|
||||
pageNum,
|
||||
pageSize,
|
||||
}) => {
|
||||
return DBClient.instance.beerStyleComment.findMany({
|
||||
const comments = await DBClient.instance.beerStyleComment.findMany({
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
take: pageSize,
|
||||
where: { beerStyleId },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
select: beerStyleCommentSelect,
|
||||
});
|
||||
};
|
||||
|
||||
export const getBeerStyleCommentCount: GetBeerStyleCommentCount = ({ beerStyleId }) => {
|
||||
return DBClient.instance.beerStyleComment.count({ where: { beerStyleId } });
|
||||
const count = await DBClient.instance.beerStyleComment.count({
|
||||
where: { beerStyleId },
|
||||
});
|
||||
|
||||
return { comments, count };
|
||||
};
|
||||
|
||||
export const updateBeerStyleCommentById: UpdateBeerStyleCommentById = ({
|
||||
|
||||
@@ -13,13 +13,14 @@ export type UpdateBeerStyleCommentById = (args: {
|
||||
beerStyleCommentId: string;
|
||||
}) => Promise<BeerStyleComment>;
|
||||
|
||||
export type GetBeerStyleCommentCount = (args: { beerStyleId: string }) => Promise<number>;
|
||||
|
||||
export type GetAllBeerStyleComments = (args: {
|
||||
beerStyleId: string;
|
||||
pageNum: number;
|
||||
pageSize: number;
|
||||
}) => Promise<BeerStyleComment[]>;
|
||||
}) => Promise<{
|
||||
comments: BeerStyleComment[];
|
||||
count: number;
|
||||
}>;
|
||||
|
||||
export type CreateNewBeerStyleComment = (args: {
|
||||
body: z.infer<typeof CreateCommentValidationSchema>;
|
||||
|
||||
@@ -3,7 +3,6 @@ import {
|
||||
CreateNewBreweryComment,
|
||||
FindDeleteBreweryCommentById,
|
||||
GetAllBreweryComments,
|
||||
GetBreweryCommentCount,
|
||||
UpdateBreweryCommentById,
|
||||
} from './types';
|
||||
|
||||
@@ -48,18 +47,24 @@ export const createNewBreweryComment: CreateNewBreweryComment = ({
|
||||
});
|
||||
};
|
||||
|
||||
export const getAllBreweryComments: GetAllBreweryComments = ({
|
||||
export const getAllBreweryComments: GetAllBreweryComments = async ({
|
||||
id,
|
||||
pageNum,
|
||||
pageSize,
|
||||
}) => {
|
||||
return DBClient.instance.breweryComment.findMany({
|
||||
const comments = await DBClient.instance.breweryComment.findMany({
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
take: pageSize,
|
||||
where: { breweryPostId: id },
|
||||
select: breweryCommentSelect,
|
||||
orderBy: { createdAt: 'desc' },
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.breweryComment.count({
|
||||
where: { breweryPostId: id },
|
||||
});
|
||||
|
||||
return { comments, count };
|
||||
};
|
||||
|
||||
export const getBreweryCommentById: FindDeleteBreweryCommentById = ({
|
||||
@@ -79,7 +84,3 @@ export const deleteBreweryCommentByIdService: FindDeleteBreweryCommentById = ({
|
||||
select: breweryCommentSelect,
|
||||
});
|
||||
};
|
||||
|
||||
export const getBreweryCommentCount: GetBreweryCommentCount = ({ breweryPostId }) => {
|
||||
return DBClient.instance.breweryComment.count({ where: { breweryPostId } });
|
||||
};
|
||||
|
||||
@@ -20,10 +20,8 @@ export type GetAllBreweryComments = (args: {
|
||||
id: string;
|
||||
pageNum: number;
|
||||
pageSize: number;
|
||||
}) => Promise<BreweryComment[]>;
|
||||
}) => Promise<{ comments: BreweryComment[]; count: number }>;
|
||||
|
||||
export type FindDeleteBreweryCommentById = (args: {
|
||||
breweryCommentId: string;
|
||||
}) => Promise<BreweryComment | null>;
|
||||
|
||||
export type GetBreweryCommentCount = (args: { breweryPostId: string }) => Promise<number>;
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import { z } from 'zod';
|
||||
import BeerPostQueryResult from './schema/BeerPostQueryResult';
|
||||
import CreateBeerPostValidationSchema from './schema/CreateBeerPostValidationSchema';
|
||||
|
||||
const CreateBeerPostWithUserSchema = CreateBeerPostValidationSchema.extend({
|
||||
userId: z.string().cuid(),
|
||||
});
|
||||
|
||||
const createNewBeerPost = ({
|
||||
name,
|
||||
description,
|
||||
abv,
|
||||
ibu,
|
||||
styleId,
|
||||
breweryId,
|
||||
userId,
|
||||
}: z.infer<typeof CreateBeerPostWithUserSchema>): Promise<
|
||||
z.infer<typeof BeerPostQueryResult>
|
||||
> => {
|
||||
return DBClient.instance.beerPost.create({
|
||||
data: {
|
||||
name,
|
||||
description,
|
||||
abv,
|
||||
ibu,
|
||||
style: { connect: { id: styleId } },
|
||||
postedBy: { connect: { id: userId } },
|
||||
brewery: { connect: { id: breweryId } },
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
description: true,
|
||||
abv: true,
|
||||
ibu: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
brewery: { select: { id: true, name: true } },
|
||||
style: { select: { id: true, name: true, description: true } },
|
||||
postedBy: { select: { id: true, username: true } },
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export default createNewBeerPost;
|
||||
@@ -1,39 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import { z } from 'zod';
|
||||
import BeerPostQueryResult from './schema/BeerPostQueryResult';
|
||||
|
||||
interface DeleteBeerPostByIdArgs {
|
||||
beerPostId: string;
|
||||
}
|
||||
|
||||
const deleteBeerPostById = ({
|
||||
beerPostId,
|
||||
}: DeleteBeerPostByIdArgs): Promise<z.infer<typeof BeerPostQueryResult> | null> => {
|
||||
return DBClient.instance.beerPost.delete({
|
||||
where: { id: beerPostId },
|
||||
select: {
|
||||
abv: true,
|
||||
createdAt: true,
|
||||
description: true,
|
||||
ibu: true,
|
||||
id: true,
|
||||
name: true,
|
||||
updatedAt: true,
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
style: { select: { id: true, name: true, description: true } },
|
||||
postedBy: { select: { id: true, username: true } },
|
||||
brewery: { select: { id: true, name: true } },
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export default deleteBeerPostById;
|
||||
@@ -1,45 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import { z } from 'zod';
|
||||
import EditBeerPostValidationSchema from './schema/EditBeerPostValidationSchema';
|
||||
import BeerPostQueryResult from './schema/BeerPostQueryResult';
|
||||
|
||||
const schema = EditBeerPostValidationSchema.omit({ id: true, styleId: true });
|
||||
|
||||
interface EditBeerPostByIdArgs {
|
||||
id: string;
|
||||
data: z.infer<typeof schema>;
|
||||
}
|
||||
|
||||
const editBeerPostById = ({
|
||||
id,
|
||||
data: { abv, ibu, name, description },
|
||||
}: EditBeerPostByIdArgs): Promise<z.infer<typeof BeerPostQueryResult>> => {
|
||||
return DBClient.instance.beerPost.update({
|
||||
where: { id },
|
||||
data: { abv, ibu, name, description },
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
description: true,
|
||||
abv: true,
|
||||
ibu: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
brewery: { select: { id: true, name: true } },
|
||||
style: { select: { id: true, name: true, description: true } },
|
||||
postedBy: { select: { id: true, username: true } },
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export default editBeerPostById;
|
||||
@@ -1,45 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult';
|
||||
import { z } from 'zod';
|
||||
|
||||
const prisma = DBClient.instance;
|
||||
|
||||
interface GetAllBeerPostsArgs {
|
||||
pageNum: number;
|
||||
pageSize: number;
|
||||
}
|
||||
|
||||
const getAllBeerPosts = ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
}: GetAllBeerPostsArgs): Promise<z.infer<typeof BeerPostQueryResult>[]> => {
|
||||
return prisma.beerPost.findMany({
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
ibu: true,
|
||||
abv: true,
|
||||
description: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
style: { select: { name: true, id: true, description: true } },
|
||||
brewery: { select: { name: true, id: true } },
|
||||
postedBy: { select: { id: true, username: true } },
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
orderBy: { createdAt: 'desc' },
|
||||
});
|
||||
};
|
||||
|
||||
export default getAllBeerPosts;
|
||||
@@ -1,37 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult';
|
||||
import { z } from 'zod';
|
||||
|
||||
const prisma = DBClient.instance;
|
||||
|
||||
const getBeerPostById = async (
|
||||
id: string,
|
||||
): Promise<z.infer<typeof BeerPostQueryResult> | null> => {
|
||||
return prisma.beerPost.findFirst({
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
ibu: true,
|
||||
abv: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
description: true,
|
||||
postedBy: { select: { username: true, id: true } },
|
||||
brewery: { select: { name: true, id: true } },
|
||||
style: { select: { name: true, id: true, description: true } },
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
where: { id },
|
||||
});
|
||||
};
|
||||
|
||||
export default getBeerPostById;
|
||||
@@ -1,47 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import { z } from 'zod';
|
||||
import BeerPostQueryResult from './schema/BeerPostQueryResult';
|
||||
|
||||
interface GetBeerPostsByBeerStyleIdArgs {
|
||||
styleId: string;
|
||||
pageSize: number;
|
||||
pageNum: number;
|
||||
}
|
||||
|
||||
const getBeerPostsByBeerStyleId = async ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
styleId,
|
||||
}: GetBeerPostsByBeerStyleIdArgs): Promise<z.infer<typeof BeerPostQueryResult>[]> => {
|
||||
const beers = await DBClient.instance.beerPost.findMany({
|
||||
where: { styleId },
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
ibu: true,
|
||||
abv: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
description: true,
|
||||
postedBy: { select: { username: true, id: true } },
|
||||
brewery: { select: { name: true, id: true } },
|
||||
style: { select: { name: true, id: true, description: true } },
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return beers;
|
||||
};
|
||||
|
||||
export default getBeerPostsByBeerStyleId;
|
||||
@@ -1,47 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import { z } from 'zod';
|
||||
import BeerPostQueryResult from './schema/BeerPostQueryResult';
|
||||
|
||||
interface GetBeerPostsByBeerStyleIdArgs {
|
||||
breweryId: string;
|
||||
pageSize: number;
|
||||
pageNum: number;
|
||||
}
|
||||
|
||||
const getAllBeerPostsByBreweryId = async ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
breweryId,
|
||||
}: GetBeerPostsByBeerStyleIdArgs): Promise<z.infer<typeof BeerPostQueryResult>[]> => {
|
||||
const beers = await DBClient.instance.beerPost.findMany({
|
||||
where: { breweryId },
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
ibu: true,
|
||||
abv: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
description: true,
|
||||
postedBy: { select: { username: true, id: true } },
|
||||
brewery: { select: { name: true, id: true } },
|
||||
style: { select: { name: true, id: true, description: true } },
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return beers;
|
||||
};
|
||||
|
||||
export default getAllBeerPostsByBreweryId;
|
||||
@@ -1,47 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import { z } from 'zod';
|
||||
import BeerPostQueryResult from './schema/BeerPostQueryResult';
|
||||
|
||||
interface GetBeerPostsByBeerStyleIdArgs {
|
||||
postedById: string;
|
||||
pageSize: number;
|
||||
pageNum: number;
|
||||
}
|
||||
|
||||
const getBeerPostsByPostedById = async ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
postedById,
|
||||
}: GetBeerPostsByBeerStyleIdArgs): Promise<z.infer<typeof BeerPostQueryResult>[]> => {
|
||||
const beers = await DBClient.instance.beerPost.findMany({
|
||||
where: { postedBy: { id: postedById } },
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
ibu: true,
|
||||
abv: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
description: true,
|
||||
postedBy: { select: { username: true, id: true } },
|
||||
brewery: { select: { name: true, id: true } },
|
||||
style: { select: { name: true, id: true, description: true } },
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return beers;
|
||||
};
|
||||
|
||||
export default getBeerPostsByPostedById;
|
||||
@@ -1,65 +0,0 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult';
|
||||
|
||||
import { z } from 'zod';
|
||||
|
||||
interface GetBeerRecommendationsArgs {
|
||||
beerPost: z.infer<typeof BeerPostQueryResult>;
|
||||
pageNum: number;
|
||||
pageSize: number;
|
||||
}
|
||||
|
||||
const getBeerRecommendations = async ({
|
||||
beerPost,
|
||||
pageNum,
|
||||
pageSize,
|
||||
}: GetBeerRecommendationsArgs): Promise<{
|
||||
beerRecommendations: z.infer<typeof BeerPostQueryResult>[];
|
||||
count: number;
|
||||
}> => {
|
||||
const skip = (pageNum - 1) * pageSize;
|
||||
const take = pageSize;
|
||||
|
||||
const beerRecommendations: z.infer<typeof BeerPostQueryResult>[] =
|
||||
await DBClient.instance.beerPost.findMany({
|
||||
where: {
|
||||
OR: [{ styleId: beerPost.style.id }, { breweryId: beerPost.brewery.id }],
|
||||
NOT: { id: beerPost.id },
|
||||
},
|
||||
select: {
|
||||
id: true,
|
||||
name: true,
|
||||
ibu: true,
|
||||
abv: true,
|
||||
description: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
style: { select: { name: true, id: true, description: true } },
|
||||
brewery: { select: { name: true, id: true } },
|
||||
postedBy: { select: { id: true, username: true } },
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
take,
|
||||
skip,
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.beerPost.count({
|
||||
where: {
|
||||
OR: [{ styleId: beerPost.style.id }, { breweryId: beerPost.brewery.id }],
|
||||
NOT: { id: beerPost.id },
|
||||
},
|
||||
});
|
||||
|
||||
return { beerRecommendations, count };
|
||||
};
|
||||
|
||||
export default getBeerRecommendations;
|
||||
276
src/services/posts/beer-post/index.ts
Normal file
276
src/services/posts/beer-post/index.ts
Normal file
@@ -0,0 +1,276 @@
|
||||
import DBClient from '@/prisma/DBClient';
|
||||
import {
|
||||
CreateNewBeerPost,
|
||||
EditBeerPostById,
|
||||
FindOrDeleteBeerPostById,
|
||||
GetAllBeerPosts,
|
||||
GetAllBeerPostsByBreweryId,
|
||||
GetAllBeerPostsByPostedById,
|
||||
GetAllBeerPostsByStyleId,
|
||||
GetBeerRecommendations,
|
||||
} from './types';
|
||||
|
||||
/**
|
||||
* The select object for retrieving beer posts.
|
||||
*
|
||||
* Satisfies the BeerPostQueryResult zod schema.
|
||||
*
|
||||
* @example
|
||||
* const beerPosts = await DBClient.instance.beerPost.findMany({
|
||||
* select: beerPostSelect,
|
||||
* });
|
||||
*/
|
||||
const beerPostSelect = {
|
||||
id: true,
|
||||
name: true,
|
||||
description: true,
|
||||
abv: true,
|
||||
ibu: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
beerImages: {
|
||||
select: {
|
||||
alt: true,
|
||||
path: true,
|
||||
caption: true,
|
||||
id: true,
|
||||
createdAt: true,
|
||||
updatedAt: true,
|
||||
},
|
||||
},
|
||||
brewery: { select: { id: true, name: true } },
|
||||
style: { select: { id: true, name: true, description: true } },
|
||||
postedBy: { select: { id: true, username: true } },
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Creates a new beer post.
|
||||
*
|
||||
* @param params - The parameters object for creating the beer post.
|
||||
* @param params.name - The name of the beer.
|
||||
* @param params.description - The description of the beer.
|
||||
* @param params.abv - The alcohol by volume of the beer.
|
||||
* @param params.ibu - The International Bitterness Units of the beer.
|
||||
* @param params.styleId - The ID of the beer style.
|
||||
* @param params.breweryId - The ID of the brewery.
|
||||
* @param params.userId - The ID of the user who posted the beer.
|
||||
* @returns A promise that resolves to the newly created beer post.
|
||||
*/
|
||||
export const createNewBeerPost: CreateNewBeerPost = ({
|
||||
name,
|
||||
description,
|
||||
abv,
|
||||
ibu,
|
||||
styleId,
|
||||
breweryId,
|
||||
userId,
|
||||
}) => {
|
||||
return DBClient.instance.beerPost.create({
|
||||
data: {
|
||||
name,
|
||||
description,
|
||||
abv,
|
||||
ibu,
|
||||
style: { connect: { id: styleId } },
|
||||
postedBy: { connect: { id: userId } },
|
||||
brewery: { connect: { id: breweryId } },
|
||||
},
|
||||
select: beerPostSelect,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves a beer post by ID.
|
||||
*
|
||||
* @param params - The parameters object for retrieving the beer post.
|
||||
* @param params.beerPostId - The ID of the beer post to retrieve.
|
||||
* @returns A promise that resolves to the beer post.
|
||||
*/
|
||||
export const getBeerPostById: FindOrDeleteBeerPostById = async ({ beerPostId }) => {
|
||||
return DBClient.instance.beerPost.findFirst({
|
||||
where: { id: beerPostId },
|
||||
select: beerPostSelect,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves all beer posts with pagination.
|
||||
*
|
||||
* @param params - The parameters object for retrieving beer posts.
|
||||
* @param params.pageNum The page number to retrieve.
|
||||
* @param params.pageSize The number of beer posts per page.
|
||||
* @returns An object containing the beer posts and the total count.
|
||||
*/
|
||||
export const getAllBeerPostsService: GetAllBeerPosts = async ({ pageNum, pageSize }) => {
|
||||
const beerPosts = await DBClient.instance.beerPost.findMany({
|
||||
select: beerPostSelect,
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
orderBy: { createdAt: 'desc' },
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.beerPost.count();
|
||||
|
||||
return { beerPosts, count };
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves beer posts by beer style ID.
|
||||
*
|
||||
* @param params - The parameters object for retrieving beer posts.
|
||||
* @param params.pageNum - The page number of the results.
|
||||
* @param params.pageSize - The number of results per page.
|
||||
* @param params.styleId - The ID of the beer style.
|
||||
* @returns A promise that resolves to an object containing the beer posts and the total
|
||||
* count.
|
||||
*/
|
||||
export const getBeerPostsByBeerStyleIdService: GetAllBeerPostsByStyleId = async ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
styleId,
|
||||
}) => {
|
||||
const beerPosts = await DBClient.instance.beerPost.findMany({
|
||||
where: { styleId },
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: beerPostSelect,
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.beerPost.count({
|
||||
where: { styleId },
|
||||
});
|
||||
|
||||
return { beerPosts, count };
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves beer posts by brewery ID.
|
||||
*
|
||||
* @param params - The parameters object for retrieving beer posts.
|
||||
* @param params.pageNum - The page number of the results.
|
||||
* @param params.pageSize - The number of beer posts per page.
|
||||
* @param params.breweryId - The ID of the brewery.
|
||||
* @returns A promise that resolves to an object containing the beer posts and the total
|
||||
* count.
|
||||
*/
|
||||
export const getBeerPostsByBreweryIdService: GetAllBeerPostsByBreweryId = async ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
breweryId,
|
||||
}) => {
|
||||
const beerPosts = await DBClient.instance.beerPost.findMany({
|
||||
where: { breweryId },
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: beerPostSelect,
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.beerPost.count({
|
||||
where: { breweryId },
|
||||
});
|
||||
|
||||
return { beerPosts, count };
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves beer posts by the ID of the user who posted them.
|
||||
*
|
||||
* @param params - The parameters object for retrieving beer posts.
|
||||
* @param params.pageNum The page number of the results.
|
||||
* @param params.pageSize The number of results per page.
|
||||
* @param params.postedById The ID of the user who posted the beer posts.
|
||||
* @returns A promise that resolves to an object containing the beer posts and the total
|
||||
* count.
|
||||
*/
|
||||
export const getBeerPostsByPostedByIdService: GetAllBeerPostsByPostedById = async ({
|
||||
pageNum,
|
||||
pageSize,
|
||||
postedById,
|
||||
}) => {
|
||||
const beerPosts = await DBClient.instance.beerPost.findMany({
|
||||
where: { postedById },
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: beerPostSelect,
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.beerPost.count({
|
||||
where: { postedById },
|
||||
});
|
||||
|
||||
return { beerPosts, count };
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieves beer recommendations based on the given parameters.
|
||||
*
|
||||
* @param params - The parameters object for retrieving beer recommendations.
|
||||
* @param params.beerPost - The beer post for which recommendations are requested.
|
||||
* @param params.pageNum - The page number of the recommendations.
|
||||
* @param params.pageSize - The number of recommendations per page.
|
||||
* @returns A promise that resolves to an object containing the beer recommendations and
|
||||
* the total count.
|
||||
*/
|
||||
export const getBeerRecommendationsService: GetBeerRecommendations = async ({
|
||||
beerPost,
|
||||
pageNum,
|
||||
pageSize,
|
||||
}) => {
|
||||
const beerRecommendations = await DBClient.instance.beerPost.findMany({
|
||||
where: {
|
||||
OR: [{ styleId: beerPost.style.id }, { breweryId: beerPost.brewery.id }],
|
||||
NOT: { id: beerPost.id },
|
||||
},
|
||||
take: pageSize,
|
||||
skip: (pageNum - 1) * pageSize,
|
||||
select: beerPostSelect,
|
||||
});
|
||||
|
||||
const count = await DBClient.instance.beerPost.count({
|
||||
where: {
|
||||
OR: [{ styleId: beerPost.style.id }, { breweryId: beerPost.brewery.id }],
|
||||
NOT: { id: beerPost.id },
|
||||
},
|
||||
});
|
||||
|
||||
return { beerRecommendations, count };
|
||||
};
|
||||
|
||||
/**
|
||||
* Service for editing a beer post by ID.
|
||||
*
|
||||
* @param params - The parameters object for editing the beer post.
|
||||
* @param params.beerPostId - The ID of the beer post to edit.
|
||||
* @param params.body - The updated data for the beer post.
|
||||
* @param params.body.abv - The updated ABV (Alcohol By Volume) of the beer.
|
||||
* @param params.body.description - The updated description of the beer.
|
||||
* @param params.body.ibu - The updated IBU (International Bitterness Units) of the beer.
|
||||
* @param params.body.name - The updated name of the beer.
|
||||
* @returns - A promise that resolves to the updated beer post.
|
||||
*/
|
||||
export const editBeerPostByIdService: EditBeerPostById = async ({
|
||||
body: { abv, description, ibu, name },
|
||||
beerPostId,
|
||||
}) => {
|
||||
return DBClient.instance.beerPost.update({
|
||||
where: { id: beerPostId },
|
||||
data: { abv, description, ibu, name },
|
||||
select: beerPostSelect,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Service for deleting a beer post by ID.
|
||||
*
|
||||
* @param params - The parameters object for deleting the beer post.
|
||||
* @param params.beerPostId - The ID of the beer post to delete.
|
||||
* @returns - A promise that resolves to the deleted beer post.
|
||||
*/
|
||||
export const deleteBeerPostByIdService: FindOrDeleteBeerPostById = async ({
|
||||
beerPostId,
|
||||
}) => {
|
||||
return DBClient.instance.beerPost.delete({
|
||||
where: { id: beerPostId },
|
||||
select: beerPostSelect,
|
||||
});
|
||||
};
|
||||
@@ -3,7 +3,7 @@ import CreateBeerPostValidationSchema from './CreateBeerPostValidationSchema';
|
||||
|
||||
const EditBeerPostValidationSchema = CreateBeerPostValidationSchema.omit({
|
||||
breweryId: true,
|
||||
typeId: true,
|
||||
styleId: true,
|
||||
}).extend({ id: z.string().cuid() });
|
||||
|
||||
export default EditBeerPostValidationSchema;
|
||||
|
||||
60
src/services/posts/beer-post/types/index.ts
Normal file
60
src/services/posts/beer-post/types/index.ts
Normal file
@@ -0,0 +1,60 @@
|
||||
import { z } from 'zod';
|
||||
import BeerPostQueryResult from '../schema/BeerPostQueryResult';
|
||||
import EditBeerPostValidationSchema from '../schema/EditBeerPostValidationSchema';
|
||||
import CreateBeerPostValidationSchema from '../schema/CreateBeerPostValidationSchema';
|
||||
|
||||
const CreateSchema = CreateBeerPostValidationSchema.extend({
|
||||
userId: z.string().cuid(),
|
||||
});
|
||||
const EditSchema = EditBeerPostValidationSchema.omit({ id: true });
|
||||
|
||||
type BeerPost = z.infer<typeof BeerPostQueryResult>;
|
||||
|
||||
export type CreateNewBeerPost = (args: z.infer<typeof CreateSchema>) => Promise<BeerPost>;
|
||||
|
||||
export type EditBeerPostById = (args: {
|
||||
beerPostId: string;
|
||||
body: z.infer<typeof EditSchema>;
|
||||
}) => Promise<BeerPost>;
|
||||
|
||||
export type FindOrDeleteBeerPostById = (args: {
|
||||
beerPostId: string;
|
||||
}) => Promise<BeerPost | null>;
|
||||
|
||||
export type GetAllBeerPosts = (args: { pageNum: number; pageSize: number }) => Promise<{
|
||||
beerPosts: BeerPost[];
|
||||
count: number;
|
||||
}>;
|
||||
|
||||
export type GetAllBeerPostsByPostedById = (args: {
|
||||
postedById: string;
|
||||
pageSize: number;
|
||||
pageNum: number;
|
||||
}) => Promise<{
|
||||
beerPosts: BeerPost[];
|
||||
count: number;
|
||||
}>;
|
||||
|
||||
export type GetAllBeerPostsByStyleId = (args: {
|
||||
styleId: string;
|
||||
pageSize: number;
|
||||
pageNum: number;
|
||||
}) => Promise<{
|
||||
beerPosts: BeerPost[];
|
||||
count: number;
|
||||
}>;
|
||||
|
||||
export type GetAllBeerPostsByBreweryId = (args: {
|
||||
breweryId: string;
|
||||
pageSize: number;
|
||||
pageNum: number;
|
||||
}) => Promise<{
|
||||
beerPosts: BeerPost[];
|
||||
count: number;
|
||||
}>;
|
||||
|
||||
export type GetBeerRecommendations = (args: {
|
||||
beerPost: BeerPost;
|
||||
pageNum: number;
|
||||
pageSize: number;
|
||||
}) => Promise<{ beerRecommendations: BeerPost[]; count: number }>;
|
||||
Reference in New Issue
Block a user