From 0353f82c200bf87a88c34fd8e360866147137c0b Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 3 Dec 2023 03:05:34 -0500 Subject: [PATCH 01/21] docs: update documentation for custom data-fetching hooks --- .../beer-comments/useBeerPostComments.ts | 2 +- .../beer-likes/useBeerPostLikeCount.ts | 2 +- .../beer-likes/useCheckIfUserLikesBeerPost.ts | 5 +- .../beer-posts/useBeerPostSearch.ts | 3 +- .../data-fetching/beer-posts/useBeerPosts.ts | 2 +- .../beer-posts/useBeerPostsByBeerStyle.ts | 66 ------------------- .../beer-posts/useBeerPostsByBeerStyles.ts | 17 +++++ .../beer-posts/useBeerPostsByBrewery.ts | 2 +- .../beer-posts/useBeerPostsByUser.ts | 17 +++++ .../beer-posts/useBeerRecommendations.ts | 2 +- .../useBeerStyleComments.ts | 24 ++++++- .../beer-style-likes/useBeerStyleLikeCount.ts | 2 +- .../useCheckIfUserLikesBeerPost.ts | 3 +- .../beer-styles/useBeerStyles.ts | 2 +- .../useBreweryPostComments.ts | 2 +- .../useCheckIfUserLikesBreweryPost.ts | 2 +- .../brewery-posts/useBreweryMapPagePosts.ts | 16 +++++ .../brewery-posts/useBreweryPostsByUser.ts | 17 +++++ .../user-follows/useFollowStatus.ts | 11 ++++ .../user-follows/useGetUsersFollowedByUser.ts | 2 +- .../user-follows/useGetUsersFollowingUser.ts | 5 +- 21 files changed, 115 insertions(+), 89 deletions(-) delete mode 100644 src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyle.ts diff --git a/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts b/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts index 320f167..6ab2bdf 100644 --- a/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts +++ b/src/hooks/data-fetching/beer-comments/useBeerPostComments.ts @@ -10,7 +10,7 @@ interface UseBeerPostCommentsProps { } /** - * A custom React hook that fetches comments for a specific beer post. + * A custom hook to fetch comments for a specific beer post. * * @param props - The props object. * @param props.pageNum - The page number of the comments to fetch. diff --git a/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts b/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts index 2300ef2..5b450bc 100644 --- a/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts +++ b/src/hooks/data-fetching/beer-likes/useBeerPostLikeCount.ts @@ -3,7 +3,7 @@ import { z } from 'zod'; import useSWR from 'swr'; /** - * Custom hook to fetch the like count for a beer post from the server. + * A custom hook to fetch the like count for a beer post from the server. * * @param beerPostId - The ID of the beer post to fetch the like count for. * @returns An object with the following properties: diff --git a/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts b/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts index f95dd5b..9d71518 100644 --- a/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts +++ b/src/hooks/data-fetching/beer-likes/useCheckIfUserLikesBeerPost.ts @@ -5,10 +5,9 @@ import useSWR from 'swr'; import { z } from 'zod'; /** - * A custom React hook that checks if the current user has liked a beer post by fetching - * data from the server. + * A custom hook to check if the current user has liked a beer post. * - * @param beerPostId The ID of the beer post to check for likes. + * @param beerPostId The ID of the beer post. * @returns An object with the following properties: * * - `error`: The error that occurred while fetching the data. diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts b/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts index 85caf98..d94aa00 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts @@ -1,8 +1,9 @@ import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; import useSWR from 'swr'; import { z } from 'zod'; + /** - * A custom React hook that searches for beer posts that match a given query string. + * A custom hook to search for beer posts that match a given query string. * * @param query The search query string to match beer posts against. * @returns An object with the following properties: diff --git a/src/hooks/data-fetching/beer-posts/useBeerPosts.ts b/src/hooks/data-fetching/beer-posts/useBeerPosts.ts index 10c45f6..6210bba 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPosts.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPosts.ts @@ -4,7 +4,7 @@ import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; /** - * A custom hook using SWR to fetch beer posts from the API. + * A custom hook to fetch beer posts from the API. * * @param options The options to use when fetching beer posts. * @param options.pageSize The number of beer posts to fetch per page. diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyle.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyle.ts deleted file mode 100644 index 05879fc..0000000 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyle.ts +++ /dev/null @@ -1,66 +0,0 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; -import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import useSWRInfinite from 'swr/infinite'; -import { z } from 'zod'; - -interface UseBeerPostsByBeerStyleParams { - pageSize: number; - beerStyleId: string; -} - -const useBeerPostsByBeerStyle = ({ - pageSize, - beerStyleId, -}: UseBeerPostsByBeerStyleParams) => { - const fetcher = async (url: string) => { - const response = await fetch(url); - if (!response.ok) { - throw new Error(response.statusText); - } - - const json = await response.json(); - const count = response.headers.get('X-Total-Count'); - - const parsed = APIResponseValidationSchema.safeParse(json); - if (!parsed.success) { - throw new Error('API response validation failed'); - } - - const parsedPayload = z.array(BeerPostQueryResult).safeParse(parsed.data.payload); - if (!parsedPayload.success) { - throw new Error('API response validation failed'); - } - - const pageCount = Math.ceil(parseInt(count as string, 10) / pageSize); - return { - beerPosts: parsedPayload.data, - pageCount, - }; - }; - - const { data, error, isLoading, setSize, size } = useSWRInfinite( - (index) => - `/api/beers/styles/${beerStyleId}/beers?page_num=${ - index + 1 - }&page_size=${pageSize}`, - fetcher, - ); - - const beerPosts = data?.flatMap((d) => d.beerPosts) ?? []; - const pageCount = data?.[0].pageCount ?? 0; - const isLoadingMore = size > 0 && data && typeof data[size - 1] === 'undefined'; - const isAtEnd = !(size < data?.[0].pageCount!); - - return { - beerPosts, - pageCount, - size, - setSize, - isLoading, - isLoadingMore, - isAtEnd, - error: error as unknown, - }; -}; - -export default useBeerPostsByBeerStyle; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts index 05879fc..c6f1dc9 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts @@ -8,6 +8,23 @@ interface UseBeerPostsByBeerStyleParams { beerStyleId: string; } +/** + * A custom hook to fetch beer posts by beer style. + * + * @param options The options for fetching beer posts. + * @param options.pageSize The number of beer posts to fetch per page. + * @param options.beerStyleId The ID of the beer style to fetch beer posts for. + * @returns An object with the following properties: + * + * - `beerPosts`: The beer posts fetched from the API. + * - `error`: The error that occurred while fetching the data. + * - `isAtEnd`: A boolean indicating whether all data has been fetched. + * - `isLoading`: A boolean indicating whether the data is being fetched. + * - `isLoadingMore`: A boolean indicating whether more data is being fetched. + * - `pageCount`: The total number of pages of data. + * - `setSize`: A function to set the size of the data. + * - `size`: The size of the data.` + */ const useBeerPostsByBeerStyle = ({ pageSize, beerStyleId, diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts index 628f022..f8dddaa 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts @@ -9,7 +9,7 @@ interface UseBeerPostsByBreweryParams { } /** - * A custom hook using SWR to fetch beer posts from the API. + * A custom hook to fetch beer posts by brewery. * * @param options The options to use when fetching beer posts. * @param options.pageSize The number of beer posts to fetch per page. diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts index 90a099c..1b74340 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts @@ -8,6 +8,23 @@ interface UseBeerPostsByUserParams { userId: string; } +/** + * A custom hook to fetch beer posts by user. + * + * @param options The options for fetching beer posts. + * @param options.pageSize The number of beer posts to fetch per page. + * @param options.userId The ID of the user to fetch beer posts for. + * @returns An object with the following properties: + * + * - `beerPosts`: The beer posts fetched from the API. + * - `error`: The error that occurred while fetching the data. + * - `isAtEnd`: A boolean indicating whether all data has been fetched. + * - `isLoading`: A boolean indicating whether the data is being fetched. + * - `isLoadingMore`: A boolean indicating whether more data is being fetched. + * - `pageCount`: The total number of pages of data. + * - `setSize`: A function to set the size of the data. + * - `size`: The size of the data.` + */ const useBeerPostsByUser = ({ pageSize, userId }: UseBeerPostsByUserParams) => { const fetcher = async (url: string) => { const response = await fetch(url); diff --git a/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts b/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts index 181c1bc..ab83742 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts @@ -9,7 +9,7 @@ interface UseBeerRecommendationsParams { } /** - * A custom hook using SWR to fetch beer recommendations from the API. + * A custom hook to fetch beer recommendations from the API. * * @param options The options to use when fetching beer recommendations. * @param options.pageSize The number of beer recommendations to fetch per page. diff --git a/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts b/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts index 8e4f4f0..054a031 100644 --- a/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts +++ b/src/hooks/data-fetching/beer-style-comments/useBeerStyleComments.ts @@ -3,13 +3,31 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { z } from 'zod'; import useSWRInfinite from 'swr/infinite'; -interface UseBeerStyleCommentsProps { +interface UseBeerStyleCommentsOptions { id: string; pageSize: number; pageNum: number; } - -const useBeerStyleComments = ({ id, pageSize }: UseBeerStyleCommentsProps) => { +/** + * A custom hook to fetch comments for a beer style post. + * + * @param options The options for fetching comments. + * @param options.id The ID of the beer style to fetch comments for. + * @param options.pageSize The number of comments to fetch per page. + * @param options.pageNum The page number to fetch. + * @returns An object with the following properties: + * + * - `comments`: The comments fetched from the API. + * - `error`: The error that occurred while fetching the data. + * - `isLoading`: A boolean indicating whether the data is being fetched. + * - `isLoadingMore`: A boolean indicating whether more data is being fetched. + * - `isAtEnd`: A boolean indicating whether all data has been fetched. + * - `mutate`: A function to mutate the data. + * - `pageCount`: The total number of pages of data. + * - `setSize`: A function to set the size of the data. + * - `size`: The size of the data. + */ +const useBeerStyleComments = ({ id, pageSize }: UseBeerStyleCommentsOptions) => { const fetcher = async (url: string) => { const response = await fetch(url); diff --git a/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts b/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts index 908fa8f..51c764e 100644 --- a/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts +++ b/src/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount.ts @@ -3,7 +3,7 @@ import { z } from 'zod'; import useSWR from 'swr'; /** - * Custom hook to fetch the like count for a beer style from the server. + * A custom hook to fetch the like count for a beer style post. * * @param beerStyleId - The ID of the beer style to fetch the like count for. * @returns An object with the following properties: diff --git a/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts b/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts index 3f2bd1e..d8f03fc 100644 --- a/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts +++ b/src/hooks/data-fetching/beer-style-likes/useCheckIfUserLikesBeerPost.ts @@ -5,8 +5,7 @@ import useSWR from 'swr'; import { z } from 'zod'; /** - * A custom React hook that checks if the current user has liked a beer style by fetching - * data from the server. + * A custom hook to check if the current user has liked a beer style. * * @param beerStyleId The ID of the beer style to check for likes. * @returns An object with the following properties: diff --git a/src/hooks/data-fetching/beer-styles/useBeerStyles.ts b/src/hooks/data-fetching/beer-styles/useBeerStyles.ts index 7c6bf03..c00b3dd 100644 --- a/src/hooks/data-fetching/beer-styles/useBeerStyles.ts +++ b/src/hooks/data-fetching/beer-styles/useBeerStyles.ts @@ -4,7 +4,7 @@ import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; /** - * A custom hook using SWR to fetch beer types from the API. + * A custom hook to fetch beer styles posts. * * @param options The options to use when fetching beer types. * @param options.pageSize The number of beer types to fetch per page. diff --git a/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts b/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts index 59e7803..4ac90b1 100644 --- a/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts +++ b/src/hooks/data-fetching/brewery-comments/useBreweryPostComments.ts @@ -9,7 +9,7 @@ interface UseBreweryPostCommentsProps { } /** - * A custom React hook that fetches comments for a specific brewery post. + * A custom hook to fetch comments for a specific brewery post. * * @param props - The props object. * @param props.pageNum - The page number of the comments to fetch. diff --git a/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts b/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts index 0cb5b22..29618f8 100644 --- a/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts +++ b/src/hooks/data-fetching/brewery-likes/useCheckIfUserLikesBreweryPost.ts @@ -5,7 +5,7 @@ import useSWR from 'swr'; import { z } from 'zod'; /** - * A custom React hook that checks if the current user likes a given brewery post. + * A custom hook to check if the current user likes a given brewery post. * * @param breweryPostId - The ID of the brewery post to check. * @returns An object with the following properties: diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts b/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts index 544fd10..2ea9fe3 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts @@ -3,6 +3,22 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; +/** + * A custom hook to fetch brewery posts for the map. + * + * @param options The options to use when fetching brewery posts. + * @param options.pageSize The number of brewery posts to fetch per page. + * @returns An object with the following properties: + * + * - `breweryPosts`: The brewery posts fetched from the API. + * - `error`: The error that occurred while fetching the data. + * - `isAtEnd`: A boolean indicating whether all data has been fetched. + * - `isLoading`: A boolean indicating whether the data is being fetched. + * - `isLoadingMore`: A boolean indicating whether more data is being fetched. + * - `pageCount`: The total number of pages of data. + * - `setSize`: A function to set the size of the data. + * - `size`: The size of the data. + */ const useBreweryMapPagePosts = ({ pageSize }: { pageSize: number }) => { const fetcher = async (url: string) => { const response = await fetch(url); diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts b/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts index 656cebd..3c8a5cd 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts @@ -8,6 +8,23 @@ interface UseBreweryPostsByUserParams { userId: string; } +/** + * A custom hook to fetch brewery posts by a specific user. + * + * @param options The options to use when fetching brewery posts. + * @param options.pageSize The number of brewery posts to fetch per page. + * @param options.userId The ID of the user to fetch brewery posts for. + * @returns An object with the following properties: + * + * - `breweryPosts`: The brewery posts fetched from the API. + * - `error`: The error that occurred while fetching the data. + * - `isAtEnd`: A boolean indicating whether all data has been fetched. + * - `isLoading`: A boolean indicating whether the data is being fetched. + * - `isLoadingMore`: A boolean indicating whether more data is being fetched. + * - `pageCount`: The total number of pages of data. + * - `setSize`: A function to set the size of the data. + * - `size`: The size of the data. + */ const useBreweryPostsByUser = ({ pageSize, userId }: UseBreweryPostsByUserParams) => { const fetcher = async (url: string) => { const response = await fetch(url); diff --git a/src/hooks/data-fetching/user-follows/useFollowStatus.ts b/src/hooks/data-fetching/user-follows/useFollowStatus.ts index c750ecf..cee43d7 100644 --- a/src/hooks/data-fetching/user-follows/useFollowStatus.ts +++ b/src/hooks/data-fetching/user-follows/useFollowStatus.ts @@ -2,6 +2,17 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import useSWR from 'swr'; import { z } from 'zod'; +/** + * A custom hook to check if the current user follows a given user. + * + * @param userFollowedId - The ID of the user to check. + * @returns An object with the following properties: + * + * - `isFollowed`: A boolean indicating whether the current user follows the user. + * - `error`: The error that occurred while fetching the data. + * - `isLoading`: A boolean indicating whether the data is being fetched. + * - `mutate`: A function to mutate the data. + */ const useFollowStatus = (userFollowedId: string) => { const { data, error, isLoading, mutate } = useSWR( `/api/users/${userFollowedId}/is-followed`, diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts index dce2bfa..58b28e4 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts @@ -1,5 +1,5 @@ /** - * Custom hook using SWR for fetching users followed by a specific user. + * A custom hook to fetch the users followed by a given user. * * @param options - The options for fetching users. * @param [options.pageSize=5] - The number of users to fetch per page. Default is `5` diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts index fb3eb3d..c5406f7 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts @@ -9,10 +9,7 @@ interface UseGetUsersFollowingUser { } /** - * Custom hook using SWR for fetching users followed by a specific user. - * - * @example - * const { followers, followerCount } = useGetUsersFollowingUser({ userId: '123' }); + * A custom hook to fetch users following a user. * * @param options - The options for fetching users. * @param [options.pageSize=5] - The number of users to fetch per page. Default is `5` From 080eb4c3c360818203a0ae1268b34b9ec71cec6f Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 3 Dec 2023 03:35:46 -0500 Subject: [PATCH 02/21] docs: update documentation for custom auth hooks --- src/hooks/auth/useConfirmUser.ts | 8 ++++++++ src/hooks/auth/useRedirectIfLoggedIn.ts | 8 ++------ src/hooks/auth/useUser.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/hooks/auth/useConfirmUser.ts b/src/hooks/auth/useConfirmUser.ts index 5da709c..32c148a 100644 --- a/src/hooks/auth/useConfirmUser.ts +++ b/src/hooks/auth/useConfirmUser.ts @@ -5,6 +5,14 @@ import { useState, useContext, useEffect } from 'react'; import toast from 'react-hot-toast'; import useSWR from 'swr'; +/** + * A custom hook to confirm a user's account. + * + * @returns An object with the following properties: + * + * - `needsToLogin`: A boolean indicating whether the user needs to log in. + * - `tokenInvalid`: A boolean indicating whether the token is invalid. + */ const useConfirmUser = () => { const router = useRouter(); const { user, mutate } = useContext(UserContext); diff --git a/src/hooks/auth/useRedirectIfLoggedIn.ts b/src/hooks/auth/useRedirectIfLoggedIn.ts index 50e8ac0..56de0e3 100644 --- a/src/hooks/auth/useRedirectIfLoggedIn.ts +++ b/src/hooks/auth/useRedirectIfLoggedIn.ts @@ -3,14 +3,10 @@ import { useRouter } from 'next/router'; import { useContext } from 'react'; /** - * Custom React hook that redirects the user to the home page if they are logged in. + * A custom hook to redirect the user to the home page if they are logged in. * * This hook is used to prevent logged in users from accessing the login and signup pages - * by redirecting them to the home page. - * - * This hook should only be used in a component that is under the UserContext provider. - * - * @returns {void} + * and should only be used in a component that is under the UserContext provider. */ const useRedirectWhenLoggedIn = (): void => { const { user } = useContext(UserContext); diff --git a/src/hooks/auth/useUser.ts b/src/hooks/auth/useUser.ts index 39a98d7..3f5dd52 100644 --- a/src/hooks/auth/useUser.ts +++ b/src/hooks/auth/useUser.ts @@ -3,7 +3,7 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import useSWR from 'swr'; /** - * A custom React hook that fetches the current user's data from the server. + * A custom hook to fetch the current user's data. * * @returns An object with the following properties: * From b45ed857d31f830752897d3db13f4ce5210c989e Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 3 Dec 2023 11:51:54 -0500 Subject: [PATCH 03/21] Update api routes and begin to extract controllers out of routing logic --- .../BreweryPost/CreateBreweryPostForm.tsx | 2 +- src/controllers/beerComments/index.ts | 66 +++++++++++ src/controllers/beerStyleComments/index.ts | 67 +++++++++++ src/controllers/breweryComments/index.ts | 68 +++++++++++ src/controllers/requestTypes/index.ts | 11 ++ src/pages/api/beer-comments/[id].ts | 89 +++------------ src/pages/api/beer-style-comments/[id].ts | 88 ++------------ src/pages/api/beers/[id]/comments/index.ts | 4 +- src/pages/api/beers/[id]/index.ts | 4 +- src/pages/api/brewery-comments/[id].ts | 90 +++------------ src/pages/api/users/[id]/is-followed.ts | 5 +- src/pages/api/users/[id]/profile/index.ts | 108 ------------------ .../api/users/[id]/profile/update-avatar.ts | 69 ++--------- .../api/users/[id]/profile/update-bio.ts | 4 +- .../updateBeerStyleCommentById.ts | 23 ++++ .../UserAccount/UpdateUserAvatarByIdParams.ts | 55 +++++++++ 16 files changed, 345 insertions(+), 408 deletions(-) create mode 100644 src/controllers/beerComments/index.ts create mode 100644 src/controllers/beerStyleComments/index.ts create mode 100644 src/controllers/breweryComments/index.ts create mode 100644 src/controllers/requestTypes/index.ts delete mode 100644 src/pages/api/users/[id]/profile/index.ts create mode 100644 src/services/BeerStyleComment/updateBeerStyleCommentById.ts create mode 100644 src/services/UserAccount/UpdateUserAvatarByIdParams.ts diff --git a/src/components/BreweryPost/CreateBreweryPostForm.tsx b/src/components/BreweryPost/CreateBreweryPostForm.tsx index 72e0424..4e19052 100644 --- a/src/components/BreweryPost/CreateBreweryPostForm.tsx +++ b/src/components/BreweryPost/CreateBreweryPostForm.tsx @@ -29,7 +29,7 @@ import FormTextInput from '../ui/forms/FormTextInput'; import Button from '../ui/forms/Button'; const AddressAutofill = dynamic( - // @ts-ignore + // @ts-expect-error () => import('@mapbox/search-js-react').then((mod) => mod.AddressAutofill), { ssr: false }, ); diff --git a/src/controllers/beerComments/index.ts b/src/controllers/beerComments/index.ts new file mode 100644 index 0000000..8d532e9 --- /dev/null +++ b/src/controllers/beerComments/index.ts @@ -0,0 +1,66 @@ +import ServerError from '@/config/util/ServerError'; +import DBClient from '@/prisma/DBClient'; +import editBeerCommentById from '@/services/BeerComment/editBeerCommentById'; +import findBeerCommentById from '@/services/BeerComment/findBeerCommentById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { NextHandler } from 'next-connect'; +import { z } from 'zod'; +import { CommentRequest, EditCommentRequest } from '../requestTypes'; + +export const checkIfBeerCommentOwner = async ( + req: T, + res: NextApiResponse>, + next: NextHandler, +) => { + const { id } = req.query; + const user = req.user!; + const comment = await findBeerCommentById({ beerCommentId: id }); + + if (!comment) { + throw new ServerError('Comment not found', 404); + } + + if (comment.postedBy.id !== user.id) { + throw new ServerError('You are not authorized to modify this comment', 403); + } + + return next(); +}; + +export const editBeerPostComment = async ( + req: EditCommentRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const updated = await editBeerCommentById({ + content: req.body.content, + rating: req.body.rating, + id, + }); + + res.status(200).json({ + success: true, + message: 'Comment updated successfully', + statusCode: 200, + payload: updated, + }); +}; + +export const deleteBeerPostComment = async ( + req: CommentRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + await DBClient.instance.beerComment.delete({ + where: { id }, + }); + + res.status(200).json({ + success: true, + message: 'Comment deleted successfully', + statusCode: 200, + }); +}; diff --git a/src/controllers/beerStyleComments/index.ts b/src/controllers/beerStyleComments/index.ts new file mode 100644 index 0000000..62c10b0 --- /dev/null +++ b/src/controllers/beerStyleComments/index.ts @@ -0,0 +1,67 @@ +import ServerError from '@/config/util/ServerError'; +import DBClient from '@/prisma/DBClient'; +import updateBeerStyleCommentById from '@/services/BeerStyleComment/updateBeerStyleCommentById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { NextHandler } from 'next-connect'; +import { z } from 'zod'; +import { CommentRequest, EditCommentRequest } from '../requestTypes'; + +export const checkIfBeerStyleCommentOwner = async < + CommentRequestType extends CommentRequest, +>( + req: CommentRequestType, + res: NextApiResponse>, + next: NextHandler, +) => { + const { id } = req.query; + const user = req.user!; + const beerStyleComment = await DBClient.instance.beerStyleComment.findFirst({ + where: { id }, + }); + + if (!beerStyleComment) { + throw new ServerError('Beer style comment not found.', 404); + } + + if (beerStyleComment.postedById !== user.id) { + throw new ServerError( + 'You are not authorized to modify this beer style comment.', + 403, + ); + } + + return next(); +}; + +export const editBeerStyleComment = async ( + req: EditCommentRequest, + res: NextApiResponse>, +) => { + const updated = await updateBeerStyleCommentById({ + id: req.query.id, + body: req.body, + }); + + return res.status(200).json({ + success: true, + message: 'Comment updated successfully', + statusCode: 200, + payload: updated, + }); +}; + +export const deleteBeerStyleComment = async ( + req: CommentRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + await DBClient.instance.beerStyleComment.delete({ where: { id } }); + + res.status(200).json({ + success: true, + message: 'Comment deleted successfully', + statusCode: 200, + }); +}; diff --git a/src/controllers/breweryComments/index.ts b/src/controllers/breweryComments/index.ts new file mode 100644 index 0000000..2a28b45 --- /dev/null +++ b/src/controllers/breweryComments/index.ts @@ -0,0 +1,68 @@ +import ServerError from '@/config/util/ServerError'; +import DBClient from '@/prisma/DBClient'; +import getBreweryCommentById from '@/services/BreweryComment/getBreweryCommentById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { NextHandler } from 'next-connect'; +import { z } from 'zod'; +import { CommentRequest, EditCommentRequest } from '../requestTypes'; + +export const checkIfBreweryCommentOwner = async < + CommentRequestType extends CommentRequest, +>( + req: CommentRequestType, + res: NextApiResponse>, + next: NextHandler, +) => { + const { id } = req.query; + const user = req.user!; + const comment = await getBreweryCommentById(id); + + if (!comment) { + throw new ServerError('Comment not found', 404); + } + + if (comment.postedById !== user.id) { + throw new ServerError('You are not authorized to modify this comment', 403); + } + + return next(); +}; + +export const editBreweryPostComment = async ( + req: EditCommentRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const updated = await DBClient.instance.breweryComment.update({ + where: { id }, + data: { + content: req.body.content, + rating: req.body.rating, + updatedAt: new Date(), + }, + }); + + return res.status(200).json({ + success: true, + message: 'Comment updated successfully', + statusCode: 200, + payload: updated, + }); +}; + +export const deleteBreweryPostComment = async ( + req: CommentRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + await DBClient.instance.breweryComment.delete({ where: { id } }); + + res.status(200).json({ + success: true, + message: 'Comment deleted successfully', + statusCode: 200, + }); +}; diff --git a/src/controllers/requestTypes/index.ts b/src/controllers/requestTypes/index.ts new file mode 100644 index 0000000..7f02e52 --- /dev/null +++ b/src/controllers/requestTypes/index.ts @@ -0,0 +1,11 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; +import { z } from 'zod'; + +export interface CommentRequest extends UserExtendedNextApiRequest { + query: { id: string }; +} + +export interface EditCommentRequest extends CommentRequest { + body: z.infer; +} diff --git a/src/pages/api/beer-comments/[id].ts b/src/pages/api/beer-comments/[id].ts index 9c87b6d..bfead50 100644 --- a/src/pages/api/beer-comments/[id].ts +++ b/src/pages/api/beer-comments/[id].ts @@ -1,85 +1,22 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import findBeerCommentById from '@/services/BeerComment/findBeerCommentById'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import editBeerCommentById from '@/services/BeerComment/editBeerCommentById'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { createRouter, NextHandler } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface DeleteCommentRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} - -interface EditCommentRequest extends UserExtendedNextApiRequest { - query: { id: string }; - body: z.infer; -} - -const checkIfCommentOwner = async ( - req: DeleteCommentRequest | EditCommentRequest, - res: NextApiResponse>, - next: NextHandler, -) => { - const { id } = req.query; - const user = req.user!; - const comment = await findBeerCommentById({ beerCommentId: id }); - - if (!comment) { - throw new ServerError('Comment not found', 404); - } - - if (comment.postedBy.id !== user.id) { - throw new ServerError('You are not authorized to modify this comment', 403); - } - - return next(); -}; - -const editComment = async ( - req: EditCommentRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const updated = await editBeerCommentById({ - content: req.body.content, - rating: req.body.rating, - id, - }); - - res.status(200).json({ - success: true, - message: 'Comment updated successfully', - statusCode: 200, - payload: updated, - }); -}; - -const deleteComment = async ( - req: DeleteCommentRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - await DBClient.instance.beerComment.delete({ - where: { id }, - }); - - res.status(200).json({ - success: true, - message: 'Comment deleted successfully', - statusCode: 200, - }); -}; +import { CommentRequest } from '@/controllers/requestTypes'; +import { + checkIfBeerCommentOwner, + deleteBeerPostComment, + editBeerPostComment, +} from '@/controllers/beerComments'; const router = createRouter< - DeleteCommentRequest, + CommentRequest, NextApiResponse> >(); @@ -87,8 +24,8 @@ router .delete( validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), getCurrentUser, - checkIfCommentOwner, - deleteComment, + checkIfBeerCommentOwner, + deleteBeerPostComment, ) .put( validateRequest({ @@ -96,8 +33,8 @@ router bodySchema: CreateCommentValidationSchema, }), getCurrentUser, - checkIfCommentOwner, - editComment, + checkIfBeerCommentOwner, + editBeerPostComment, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beer-style-comments/[id].ts b/src/pages/api/beer-style-comments/[id].ts index 6e0af5b..835f536 100644 --- a/src/pages/api/beer-style-comments/[id].ts +++ b/src/pages/api/beer-style-comments/[id].ts @@ -1,85 +1,21 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; +import { + checkIfBeerStyleCommentOwner, + deleteBeerStyleComment, + editBeerStyleComment, +} from '@/controllers/beerStyleComments'; +import { CommentRequest } from '@/controllers/requestTypes'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { createRouter, NextHandler } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface DeleteCommentRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} - -interface EditCommentRequest extends UserExtendedNextApiRequest { - query: { id: string }; - body: z.infer; -} - -const checkIfCommentOwner = async ( - req: DeleteCommentRequest | EditCommentRequest, - res: NextApiResponse>, - next: NextHandler, -) => { - const { id } = req.query; - const user = req.user!; - const comment = await DBClient.instance.beerStyleComment.findFirst({ where: { id } }); - - if (!comment) { - throw new ServerError('Comment not found', 404); - } - - if (comment.postedById !== user.id) { - throw new ServerError('You are not authorized to modify this comment', 403); - } - - return next(); -}; - -const editComment = async ( - req: EditCommentRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const updated = await DBClient.instance.beerStyleComment.update({ - where: { id }, - data: { - content: req.body.content, - rating: req.body.rating, - updatedAt: new Date(), - }, - }); - - return res.status(200).json({ - success: true, - message: 'Comment updated successfully', - statusCode: 200, - payload: updated, - }); -}; - -const deleteComment = async ( - req: DeleteCommentRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - await DBClient.instance.beerStyleComment.delete({ where: { id } }); - - res.status(200).json({ - success: true, - message: 'Comment deleted successfully', - statusCode: 200, - }); -}; - const router = createRouter< - DeleteCommentRequest, + CommentRequest, NextApiResponse> >(); @@ -89,8 +25,8 @@ router querySchema: z.object({ id: z.string().cuid() }), }), getCurrentUser, - checkIfCommentOwner, - deleteComment, + checkIfBeerStyleCommentOwner, + deleteBeerStyleComment, ) .put( validateRequest({ @@ -98,8 +34,8 @@ router bodySchema: CreateCommentValidationSchema, }), getCurrentUser, - checkIfCommentOwner, - editComment, + checkIfBeerStyleCommentOwner, + editBeerStyleComment, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/[id]/comments/index.ts b/src/pages/api/beers/[id]/comments/index.ts index 52cb298..596d9d4 100644 --- a/src/pages/api/beers/[id]/comments/index.ts +++ b/src/pages/api/beers/[id]/comments/index.ts @@ -10,7 +10,7 @@ import { createRouter } from 'next-connect'; import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; + import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; interface CreateCommentRequest extends UserExtendedNextApiRequest { @@ -30,7 +30,7 @@ const createComment = async ( const beerPostId = req.query.id; - const newBeerComment: z.infer = await createNewBeerComment({ + const newBeerComment = await createNewBeerComment({ content, rating, beerPostId, diff --git a/src/pages/api/beers/[id]/index.ts b/src/pages/api/beers/[id]/index.ts index aeb526d..a393407 100644 --- a/src/pages/api/beers/[id]/index.ts +++ b/src/pages/api/beers/[id]/index.ts @@ -20,8 +20,8 @@ interface EditBeerPostRequest extends BeerPostRequest { body: z.infer; } -const checkIfBeerPostOwner = async ( - req: BeerPostRequest, +const checkIfBeerPostOwner = async ( + req: BeerPostRequestType, res: NextApiResponse, next: NextHandler, ) => { diff --git a/src/pages/api/brewery-comments/[id].ts b/src/pages/api/brewery-comments/[id].ts index 4d96022..a452e6f 100644 --- a/src/pages/api/brewery-comments/[id].ts +++ b/src/pages/api/brewery-comments/[id].ts @@ -1,86 +1,22 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import getBreweryCommentById from '@/services/BreweryComment/getBreweryCommentById'; +import { checkIfBeerCommentOwner } from '@/controllers/beerComments'; +import { + deleteBreweryPostComment, + editBreweryPostComment, +} from '@/controllers/breweryComments'; +import { CommentRequest } from '@/controllers/requestTypes'; + import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { createRouter, NextHandler } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface DeleteCommentRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} - -interface EditCommentRequest extends UserExtendedNextApiRequest { - query: { id: string }; - body: z.infer; -} - -const checkIfCommentOwner = async ( - req: DeleteCommentRequest | EditCommentRequest, - res: NextApiResponse>, - next: NextHandler, -) => { - const { id } = req.query; - const user = req.user!; - const comment = await getBreweryCommentById(id); - - if (!comment) { - throw new ServerError('Comment not found', 404); - } - - if (comment.postedById !== user.id) { - throw new ServerError('You are not authorized to modify this comment', 403); - } - - return next(); -}; - -const editComment = async ( - req: EditCommentRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const updated = await DBClient.instance.breweryComment.update({ - where: { id }, - data: { - content: req.body.content, - rating: req.body.rating, - updatedAt: new Date(), - }, - }); - - return res.status(200).json({ - success: true, - message: 'Comment updated successfully', - statusCode: 200, - payload: updated, - }); -}; - -const deleteComment = async ( - req: DeleteCommentRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - await DBClient.instance.breweryComment.delete({ where: { id } }); - - res.status(200).json({ - success: true, - message: 'Comment deleted successfully', - statusCode: 200, - }); -}; - const router = createRouter< - DeleteCommentRequest, + CommentRequest, NextApiResponse> >(); @@ -90,8 +26,8 @@ router querySchema: z.object({ id: z.string().cuid() }), }), getCurrentUser, - checkIfCommentOwner, - deleteComment, + checkIfBeerCommentOwner, + deleteBreweryPostComment, ) .put( validateRequest({ @@ -99,8 +35,8 @@ router bodySchema: CreateCommentValidationSchema, }), getCurrentUser, - checkIfCommentOwner, - editComment, + checkIfBeerCommentOwner, + editBreweryPostComment, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/users/[id]/is-followed.ts b/src/pages/api/users/[id]/is-followed.ts index 682b15d..ef6c368 100644 --- a/src/pages/api/users/[id]/is-followed.ts +++ b/src/pages/api/users/[id]/is-followed.ts @@ -35,10 +35,7 @@ const checkIfUserIsFollowedBySessionUser = async ( const currentUser = req.user!; const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ - where: { - followerId: currentUser.id, - followingId: id, - }, + where: { followerId: currentUser.id, followingId: id }, }); if (!userIsFollowedBySessionUser) { diff --git a/src/pages/api/users/[id]/profile/index.ts b/src/pages/api/users/[id]/profile/index.ts deleted file mode 100644 index 9c39a18..0000000 --- a/src/pages/api/users/[id]/profile/index.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import { singleUploadMiddleware } from '@/config/multer/uploadMiddleware'; -import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; - -import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiResponse } from 'next'; -import { createRouter } from 'next-connect'; -import { z } from 'zod'; - -interface UpdateProfileRequest extends UserExtendedNextApiRequest { - file: Express.Multer.File; - body: { - bio: string; - }; -} - -interface UpdateUserProfileByIdParams { - id: string; - data: { - bio: string; - avatar: { - alt: string; - path: string; - caption: string; - }; - }; -} - -const updateUserProfileById = async ({ id, data }: UpdateUserProfileByIdParams) => { - const user: z.infer = await DBClient.instance.user.update({ - where: { id }, - data: { - bio: data.bio, - userAvatar: data.avatar - ? { - upsert: { - create: { - alt: data.avatar.alt, - path: data.avatar.path, - caption: data.avatar.caption, - }, - update: { - alt: data.avatar.alt, - path: data.avatar.path, - caption: data.avatar.caption, - }, - }, - } - : undefined, - }, - select: { - id: true, - username: true, - email: true, - bio: true, - userAvatar: true, - accountIsVerified: true, - createdAt: true, - firstName: true, - lastName: true, - updatedAt: true, - dateOfBirth: true, - role: true, - }, - }); - - return user; -}; - -const updateProfile = async (req: UpdateProfileRequest, res: NextApiResponse) => { - const { file, body, user } = req; - - await updateUserProfileById({ - id: user!.id, - data: { - bio: body.bio, - avatar: { alt: file.originalname, path: file.path, caption: '' }, - }, - }); - res.status(200).json({ - message: 'User confirmed successfully.', - statusCode: 200, - success: true, - }); -}; - -const router = createRouter< - UpdateProfileRequest, - NextApiResponse> ->(); - -router.put( - getCurrentUser, - - // @ts-expect-error - singleUploadMiddleware, - validateRequest({ bodySchema: z.object({ bio: z.string().max(1000) }) }), - - updateProfile, -); - -const handler = router.handler(); - -export default handler; -export const config = { api: { bodyParser: false } }; diff --git a/src/pages/api/users/[id]/profile/update-avatar.ts b/src/pages/api/users/[id]/profile/update-avatar.ts index be6846b..fa25dd7 100644 --- a/src/pages/api/users/[id]/profile/update-avatar.ts +++ b/src/pages/api/users/[id]/profile/update-avatar.ts @@ -3,13 +3,14 @@ import { singleUploadMiddleware } from '@/config/multer/uploadMiddleware'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler, createRouter } from 'next-connect'; import { z } from 'zod'; +import updateUserAvatarById, { + UpdateUserAvatarByIdParams, +} from '@/services/UserAccount/UpdateUserAvatarByIdParams'; interface UpdateProfileRequest extends UserExtendedNextApiRequest { file: Express.Multer.File; @@ -18,57 +19,6 @@ interface UpdateProfileRequest extends UserExtendedNextApiRequest { }; } -interface UpdateUserProfileByIdParams { - id: string; - data: { - avatar: { - alt: string; - path: string; - caption: string; - }; - }; -} - -const updateUserAvatarById = async ({ id, data }: UpdateUserProfileByIdParams) => { - const user: z.infer = await DBClient.instance.user.update({ - where: { id }, - data: { - userAvatar: data.avatar - ? { - upsert: { - create: { - alt: data.avatar.alt, - path: data.avatar.path, - caption: data.avatar.caption, - }, - update: { - alt: data.avatar.alt, - path: data.avatar.path, - caption: data.avatar.caption, - }, - }, - } - : undefined, - }, - select: { - id: true, - username: true, - email: true, - bio: true, - userAvatar: true, - accountIsVerified: true, - createdAt: true, - firstName: true, - lastName: true, - updatedAt: true, - dateOfBirth: true, - role: true, - }, - }); - - return user; -}; - const checkIfUserCanUpdateProfile = async ( req: UpdateProfileRequest, res: NextApiResponse, @@ -86,12 +36,13 @@ const checkIfUserCanUpdateProfile = async ( const updateProfile = async (req: UpdateProfileRequest, res: NextApiResponse) => { const { file, user } = req; - await updateUserAvatarById({ - id: user!.id, - data: { - avatar: { alt: file.originalname, path: file.path, caption: '' }, - }, - }); + const avatar: UpdateUserAvatarByIdParams['data']['avatar'] = { + alt: file.originalname, + path: file.path, + caption: '', + }; + + await updateUserAvatarById({ id: user!.id, data: { avatar } }); res.status(200).json({ message: 'User avatar updated successfully.', statusCode: 200, diff --git a/src/pages/api/users/[id]/profile/update-bio.ts b/src/pages/api/users/[id]/profile/update-bio.ts index c75b91d..1b0645c 100644 --- a/src/pages/api/users/[id]/profile/update-bio.ts +++ b/src/pages/api/users/[id]/profile/update-bio.ts @@ -12,9 +12,7 @@ import { NextHandler, createRouter } from 'next-connect'; import { z } from 'zod'; interface UpdateProfileRequest extends UserExtendedNextApiRequest { - body: { - bio: string; - }; + body: { bio: string }; } interface UpdateUserProfileByIdParams { diff --git a/src/services/BeerStyleComment/updateBeerStyleCommentById.ts b/src/services/BeerStyleComment/updateBeerStyleCommentById.ts new file mode 100644 index 0000000..30fe53d --- /dev/null +++ b/src/services/BeerStyleComment/updateBeerStyleCommentById.ts @@ -0,0 +1,23 @@ +import DBClient from '@/prisma/DBClient'; +import { z } from 'zod'; +import CreateCommentValidationSchema from '../schema/CommentSchema/CreateCommentValidationSchema'; + +interface UpdateBeerStyleCommentByIdParams { + body: z.infer; + id: string; +} + +const updateBeerStyleCommentById = ({ body, id }: UpdateBeerStyleCommentByIdParams) => { + const { content, rating } = body; + + return DBClient.instance.beerStyleComment.update({ + where: { id }, + data: { + content, + rating, + updatedAt: new Date(), + }, + }); +}; + +export default updateBeerStyleCommentById; diff --git a/src/services/UserAccount/UpdateUserAvatarByIdParams.ts b/src/services/UserAccount/UpdateUserAvatarByIdParams.ts new file mode 100644 index 0000000..bf915bf --- /dev/null +++ b/src/services/UserAccount/UpdateUserAvatarByIdParams.ts @@ -0,0 +1,55 @@ +import DBClient from '@/prisma/DBClient'; +import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import { z } from 'zod'; + +export interface UpdateUserAvatarByIdParams { + id: string; + data: { + avatar: { + alt: string; + path: string; + caption: string; + }; + }; +} +const updateUserAvatarById = async ({ id, data }: UpdateUserAvatarByIdParams) => { + const user: z.infer = await DBClient.instance.user.update({ + where: { id }, + data: { + userAvatar: data.avatar + ? { + upsert: { + create: { + alt: data.avatar.alt, + path: data.avatar.path, + caption: data.avatar.caption, + }, + update: { + alt: data.avatar.alt, + path: data.avatar.path, + caption: data.avatar.caption, + }, + }, + } + : undefined, + }, + select: { + id: true, + username: true, + email: true, + bio: true, + userAvatar: true, + accountIsVerified: true, + createdAt: true, + firstName: true, + lastName: true, + updatedAt: true, + dateOfBirth: true, + role: true, + }, + }); + + return user; +}; + +export default updateUserAvatarById; From 57c70c229262430de8d910e9235887d6c65d7051 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 3 Dec 2023 15:01:47 -0500 Subject: [PATCH 04/21] refactor: finish extracting comment controller logic out of router --- .../{ => comments}/beerComments/index.ts | 59 ++++++++++++++- .../{ => comments}/beerStyleComments/index.ts | 63 +++++++++++++++- .../{ => comments}/breweryComments/index.ts | 65 ++++++++++++++++- .../{requestTypes => comments/types}/index.ts | 6 +- src/pages/api/beer-comments/[id].ts | 4 +- src/pages/api/beer-style-comments/[id].ts | 4 +- src/pages/api/beers/[id]/comments/index.ts | 73 ++----------------- .../api/beers/styles/[id]/comments/index.ts | 66 +---------------- .../api/breweries/[id]/comments/index.ts | 73 +------------------ src/pages/api/brewery-comments/[id].ts | 11 +-- 10 files changed, 205 insertions(+), 219 deletions(-) rename src/controllers/{ => comments}/beerComments/index.ts (53%) rename src/controllers/{ => comments}/beerStyleComments/index.ts (51%) rename src/controllers/{ => comments}/breweryComments/index.ts (50%) rename src/controllers/{requestTypes => comments/types}/index.ts (62%) diff --git a/src/controllers/beerComments/index.ts b/src/controllers/comments/beerComments/index.ts similarity index 53% rename from src/controllers/beerComments/index.ts rename to src/controllers/comments/beerComments/index.ts index 8d532e9..25192df 100644 --- a/src/controllers/beerComments/index.ts +++ b/src/controllers/comments/beerComments/index.ts @@ -6,7 +6,13 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest, EditCommentRequest } from '../requestTypes'; +import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; +import getAllBeerComments from '@/services/BeerComment/getAllBeerComments'; +import { + CommentRequest, + EditAndCreateCommentRequest, + GetAllCommentsRequest, +} from '../types'; export const checkIfBeerCommentOwner = async ( req: T, @@ -29,7 +35,7 @@ export const checkIfBeerCommentOwner = async ( }; export const editBeerPostComment = async ( - req: EditCommentRequest, + req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { const { id } = req.query; @@ -64,3 +70,52 @@ export const deleteBeerPostComment = async ( statusCode: 200, }); }; + +export const createBeerPostComment = async ( + req: EditAndCreateCommentRequest, + res: NextApiResponse>, +) => { + const { content, rating } = req.body; + + const beerPostId = req.query.id; + + const newBeerComment = await createNewBeerComment({ + content, + rating, + beerPostId, + userId: req.user!.id, + }); + + res.status(201).json({ + message: 'Beer comment created successfully', + statusCode: 201, + payload: newBeerComment, + success: true, + }); +}; + +export const getAllBeerPostComments = async ( + req: GetAllCommentsRequest, + res: NextApiResponse>, +) => { + const beerPostId = req.query.id; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num } = req.query; + + const comments = await getAllBeerComments({ + beerPostId, + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + }); + + const count = await DBClient.instance.beerComment.count({ where: { beerPostId } }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beer comments fetched successfully', + statusCode: 200, + payload: comments, + success: true, + }); +}; diff --git a/src/controllers/beerStyleComments/index.ts b/src/controllers/comments/beerStyleComments/index.ts similarity index 51% rename from src/controllers/beerStyleComments/index.ts rename to src/controllers/comments/beerStyleComments/index.ts index 62c10b0..a070af8 100644 --- a/src/controllers/beerStyleComments/index.ts +++ b/src/controllers/comments/beerStyleComments/index.ts @@ -5,7 +5,16 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest, EditCommentRequest } from '../requestTypes'; + +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import createNewBeerStyleComment from '@/services/BeerStyleComment/createNewBeerStyleComment'; +import getAllBeerStyleComments from '@/services/BeerStyleComment/getAllBeerStyleComments'; + +import { + CommentRequest, + EditAndCreateCommentRequest, + GetAllCommentsRequest, +} from '../types'; export const checkIfBeerStyleCommentOwner = async < CommentRequestType extends CommentRequest, @@ -35,7 +44,7 @@ export const checkIfBeerStyleCommentOwner = async < }; export const editBeerStyleComment = async ( - req: EditCommentRequest, + req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { const updated = await updateBeerStyleCommentById({ @@ -65,3 +74,53 @@ export const deleteBeerStyleComment = async ( statusCode: 200, }); }; + +export const createComment = async ( + req: EditAndCreateCommentRequest, + res: NextApiResponse>, +) => { + const { content, rating } = req.body; + + const newBeerStyleComment: z.infer = + await createNewBeerStyleComment({ + content, + rating, + beerStyleId: req.query.id, + userId: req.user!.id, + }); + + res.status(201).json({ + message: 'Beer comment created successfully', + statusCode: 201, + payload: newBeerStyleComment, + success: true, + }); +}; + +export const getAll = async ( + req: GetAllCommentsRequest, + res: NextApiResponse>, +) => { + const beerStyleId = req.query.id; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num } = req.query; + + const comments = await getAllBeerStyleComments({ + beerStyleId, + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + }); + + const count = await DBClient.instance.beerStyleComment.count({ + where: { beerStyleId }, + }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beer comments fetched successfully', + statusCode: 200, + payload: comments, + success: true, + }); +}; diff --git a/src/controllers/breweryComments/index.ts b/src/controllers/comments/breweryComments/index.ts similarity index 50% rename from src/controllers/breweryComments/index.ts rename to src/controllers/comments/breweryComments/index.ts index 2a28b45..956e3d0 100644 --- a/src/controllers/breweryComments/index.ts +++ b/src/controllers/comments/breweryComments/index.ts @@ -5,7 +5,14 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest, EditCommentRequest } from '../requestTypes'; +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import createNewBreweryComment from '@/services/BreweryComment/createNewBreweryComment'; +import getAllBreweryComments from '@/services/BreweryComment/getAllBreweryComments'; +import { + CommentRequest, + EditAndCreateCommentRequest, + GetAllCommentsRequest, +} from '../types'; export const checkIfBreweryCommentOwner = async < CommentRequestType extends CommentRequest, @@ -30,7 +37,7 @@ export const checkIfBreweryCommentOwner = async < }; export const editBreweryPostComment = async ( - req: EditCommentRequest, + req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { const { id } = req.query; @@ -66,3 +73,57 @@ export const deleteBreweryPostComment = async ( statusCode: 200, }); }; + +export const createComment = async ( + req: EditAndCreateCommentRequest, + res: NextApiResponse>, +) => { + const { content, rating } = req.body; + + const breweryPostId = req.query.id; + + const user = req.user!; + + const newBreweryComment: z.infer = + await createNewBreweryComment({ + content, + rating, + breweryPostId, + userId: user.id, + }); + + res.status(201).json({ + message: 'Beer comment created successfully', + statusCode: 201, + payload: newBreweryComment, + success: true, + }); +}; + +export const getAll = async ( + req: GetAllCommentsRequest, + res: NextApiResponse>, +) => { + const breweryPostId = req.query.id; + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num } = req.query; + + const comments = await getAllBreweryComments({ + id: breweryPostId, + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + }); + + const count = await DBClient.instance.breweryComment.count({ + where: { breweryPostId }, + }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beer comments fetched successfully', + statusCode: 200, + payload: comments, + success: true, + }); +}; diff --git a/src/controllers/requestTypes/index.ts b/src/controllers/comments/types/index.ts similarity index 62% rename from src/controllers/requestTypes/index.ts rename to src/controllers/comments/types/index.ts index 7f02e52..f56f153 100644 --- a/src/controllers/requestTypes/index.ts +++ b/src/controllers/comments/types/index.ts @@ -6,6 +6,10 @@ export interface CommentRequest extends UserExtendedNextApiRequest { query: { id: string }; } -export interface EditCommentRequest extends CommentRequest { +export interface EditAndCreateCommentRequest extends CommentRequest { body: z.infer; } + +export interface GetAllCommentsRequest extends UserExtendedNextApiRequest { + query: { id: string; page_size: string; page_num: string }; +} diff --git a/src/pages/api/beer-comments/[id].ts b/src/pages/api/beer-comments/[id].ts index bfead50..93ae8ab 100644 --- a/src/pages/api/beer-comments/[id].ts +++ b/src/pages/api/beer-comments/[id].ts @@ -8,12 +8,12 @@ import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { CommentRequest } from '@/controllers/requestTypes'; +import { CommentRequest } from '@/controllers/comments/types'; import { checkIfBeerCommentOwner, deleteBeerPostComment, editBeerPostComment, -} from '@/controllers/beerComments'; +} from '@/controllers/comments/beerComments'; const router = createRouter< CommentRequest, diff --git a/src/pages/api/beer-style-comments/[id].ts b/src/pages/api/beer-style-comments/[id].ts index 835f536..61d7680 100644 --- a/src/pages/api/beer-style-comments/[id].ts +++ b/src/pages/api/beer-style-comments/[id].ts @@ -5,8 +5,8 @@ import { checkIfBeerStyleCommentOwner, deleteBeerStyleComment, editBeerStyleComment, -} from '@/controllers/beerStyleComments'; -import { CommentRequest } from '@/controllers/requestTypes'; +} from '@/controllers/comments/beerStyleComments'; +import { CommentRequest } from '@/controllers/comments/types'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/beers/[id]/comments/index.ts b/src/pages/api/beers/[id]/comments/index.ts index 596d9d4..a9a5c87 100644 --- a/src/pages/api/beers/[id]/comments/index.ts +++ b/src/pages/api/beers/[id]/comments/index.ts @@ -1,78 +1,19 @@ -import DBClient from '@/prisma/DBClient'; -import getAllBeerComments from '@/services/BeerComment/getAllBeerComments'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; - import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; - -interface CreateCommentRequest extends UserExtendedNextApiRequest { - body: z.infer; - query: { id: string }; -} - -interface GetAllCommentsRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - -const createComment = async ( - req: CreateCommentRequest, - res: NextApiResponse>, -) => { - const { content, rating } = req.body; - - const beerPostId = req.query.id; - - const newBeerComment = await createNewBeerComment({ - content, - rating, - beerPostId, - userId: req.user!.id, - }); - - res.status(201).json({ - message: 'Beer comment created successfully', - statusCode: 201, - payload: newBeerComment, - success: true, - }); -}; - -const getAll = async ( - req: GetAllCommentsRequest, - res: NextApiResponse>, -) => { - const beerPostId = req.query.id; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num } = req.query; - - const comments = await getAllBeerComments({ - beerPostId, - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - }); - - const count = await DBClient.instance.beerComment.count({ where: { beerPostId } }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beer comments fetched successfully', - statusCode: 200, - payload: comments, - success: true, - }); -}; +import { + createBeerPostComment, + getAllBeerPostComments, +} from '@/controllers/comments/beerComments'; const router = createRouter< - // I don't want to use any, but I can't figure out how to get the types to work + // @TODO: Fix this any type any, NextApiResponse> >(); @@ -83,7 +24,7 @@ router.post( querySchema: z.object({ id: z.string().cuid() }), }), getCurrentUser, - createComment, + createBeerPostComment, ); router.get( @@ -94,7 +35,7 @@ router.get( page_num: z.coerce.number().int().positive(), }), }), - getAll, + getAllBeerPostComments, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/styles/[id]/comments/index.ts b/src/pages/api/beers/styles/[id]/comments/index.ts index 4e44ac2..2a88610 100644 --- a/src/pages/api/beers/styles/[id]/comments/index.ts +++ b/src/pages/api/beers/styles/[id]/comments/index.ts @@ -1,77 +1,13 @@ -import DBClient from '@/prisma/DBClient'; - import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import createNewBeerStyleComment from '@/services/BeerStyleComment/createNewBeerStyleComment'; -import getAllBeerStyleComments from '@/services/BeerStyleComment/getAllBeerStyleComments'; - -interface CreateCommentRequest extends UserExtendedNextApiRequest { - body: z.infer; - query: { id: string }; -} - -interface GetAllCommentsRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - -const createComment = async ( - req: CreateCommentRequest, - res: NextApiResponse>, -) => { - const { content, rating } = req.body; - - const newBeerStyleComment: z.infer = - await createNewBeerStyleComment({ - content, - rating, - beerStyleId: req.query.id, - userId: req.user!.id, - }); - - res.status(201).json({ - message: 'Beer comment created successfully', - statusCode: 201, - payload: newBeerStyleComment, - success: true, - }); -}; - -const getAll = async ( - req: GetAllCommentsRequest, - res: NextApiResponse>, -) => { - const beerStyleId = req.query.id; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num } = req.query; - - const comments = await getAllBeerStyleComments({ - beerStyleId, - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - }); - - const count = await DBClient.instance.beerStyleComment.count({ - where: { beerStyleId }, - }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beer comments fetched successfully', - statusCode: 200, - payload: comments, - success: true, - }); -}; +import { createComment, getAll } from '@/controllers/comments/beerStyleComments'; const router = createRouter< // I don't want to use any, but I can't figure out how to get the types to work diff --git a/src/pages/api/breweries/[id]/comments/index.ts b/src/pages/api/breweries/[id]/comments/index.ts index 00f4e12..a2ae7b9 100644 --- a/src/pages/api/breweries/[id]/comments/index.ts +++ b/src/pages/api/breweries/[id]/comments/index.ts @@ -1,11 +1,5 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import DBClient from '@/prisma/DBClient'; - -import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; - import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { createRouter } from 'next-connect'; @@ -13,73 +7,8 @@ import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import getAllBreweryComments from '@/services/BreweryComment/getAllBreweryComments'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import createNewBreweryComment from '@/services/BreweryComment/createNewBreweryComment'; - -interface CreateCommentRequest extends UserExtendedNextApiRequest { - body: z.infer; - query: { id: string }; -} - -interface GetAllCommentsRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - -const createComment = async ( - req: CreateCommentRequest, - res: NextApiResponse>, -) => { - const { content, rating } = req.body; - - const breweryPostId = req.query.id; - - const user = req.user!; - - const newBreweryComment: z.infer = - await createNewBreweryComment({ - content, - rating, - breweryPostId, - userId: user.id, - }); - - res.status(201).json({ - message: 'Beer comment created successfully', - statusCode: 201, - payload: newBreweryComment, - success: true, - }); -}; - -const getAll = async ( - req: GetAllCommentsRequest, - res: NextApiResponse>, -) => { - const breweryPostId = req.query.id; - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num } = req.query; - - const comments = await getAllBreweryComments({ - id: breweryPostId, - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - }); - - const count = await DBClient.instance.breweryComment.count({ - where: { breweryPostId }, - }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beer comments fetched successfully', - statusCode: 200, - payload: comments, - success: true, - }); -}; +import { createComment, getAll } from '@/controllers/comments/breweryComments'; const router = createRouter< // I don't want to use any, but I can't figure out how to get the types to work diff --git a/src/pages/api/brewery-comments/[id].ts b/src/pages/api/brewery-comments/[id].ts index a452e6f..ae26802 100644 --- a/src/pages/api/brewery-comments/[id].ts +++ b/src/pages/api/brewery-comments/[id].ts @@ -1,12 +1,13 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import { checkIfBeerCommentOwner } from '@/controllers/beerComments'; + import { + checkIfBreweryCommentOwner, deleteBreweryPostComment, editBreweryPostComment, -} from '@/controllers/breweryComments'; -import { CommentRequest } from '@/controllers/requestTypes'; +} from '@/controllers/comments/breweryComments'; +import { CommentRequest } from '@/controllers/comments/types'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; @@ -26,7 +27,7 @@ router querySchema: z.object({ id: z.string().cuid() }), }), getCurrentUser, - checkIfBeerCommentOwner, + checkIfBreweryCommentOwner, deleteBreweryPostComment, ) .put( @@ -35,7 +36,7 @@ router bodySchema: CreateCommentValidationSchema, }), getCurrentUser, - checkIfBeerCommentOwner, + checkIfBreweryCommentOwner, editBreweryPostComment, ); From da8d5806bceb68e5d4023938d2d29dcd99672e5a Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 3 Dec 2023 22:19:27 -0500 Subject: [PATCH 05/21] Extract beer post, beer image, and beer like controller logic --- src/controllers/beerImages/index.ts | 34 +++++ src/controllers/beerImages/types/index.ts | 9 ++ src/controllers/beerPostLikes/index.ts | 77 +++++++++++ src/controllers/beerPosts/index.ts | 143 ++++++++++++++++++++ src/controllers/beerPosts/types/index.ts | 25 ++++ src/pages/api/beers/[id]/images/index.ts | 40 +----- src/pages/api/beers/[id]/index.ts | 74 ++-------- src/pages/api/beers/[id]/like/index.ts | 59 +------- src/pages/api/beers/[id]/like/is-liked.ts | 18 +-- src/pages/api/beers/[id]/recommendations.ts | 45 +----- src/pages/api/beers/create.ts | 33 +---- src/pages/api/beers/index.ts | 33 +---- 12 files changed, 317 insertions(+), 273 deletions(-) create mode 100644 src/controllers/beerImages/index.ts create mode 100644 src/controllers/beerImages/types/index.ts create mode 100644 src/controllers/beerPostLikes/index.ts create mode 100644 src/controllers/beerPosts/index.ts create mode 100644 src/controllers/beerPosts/types/index.ts diff --git a/src/controllers/beerImages/index.ts b/src/controllers/beerImages/index.ts new file mode 100644 index 0000000..13835b3 --- /dev/null +++ b/src/controllers/beerImages/index.ts @@ -0,0 +1,34 @@ +import ServerError from '@/config/util/ServerError'; +import addBeerImageToDB from '@/services/BeerImage/addBeerImageToDB'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { z } from 'zod'; +import { UploadBeerPostImagesRequest } from './types'; + +// eslint-disable-next-line import/prefer-default-export +export const processBeerImageData = async ( + req: UploadBeerPostImagesRequest, + res: NextApiResponse>, +) => { + const { files, user, body } = req; + + if (!files || !files.length) { + throw new ServerError('No images uploaded', 400); + } + + const beerImages = await addBeerImageToDB({ + alt: body.alt, + caption: body.caption, + beerPostId: req.query.id, + userId: user!.id, + files, + }); + + res.status(200).json({ + success: true, + message: `Successfully uploaded ${beerImages.length} image${ + beerImages.length > 1 ? 's' : '' + }`, + statusCode: 200, + }); +}; diff --git a/src/controllers/beerImages/types/index.ts b/src/controllers/beerImages/types/index.ts new file mode 100644 index 0000000..bf8e8dd --- /dev/null +++ b/src/controllers/beerImages/types/index.ts @@ -0,0 +1,9 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; +import { z } from 'zod'; + +export interface UploadBeerPostImagesRequest extends UserExtendedNextApiRequest { + files?: Express.Multer.File[]; + query: { id: string }; + body: z.infer; +} diff --git a/src/controllers/beerPostLikes/index.ts b/src/controllers/beerPostLikes/index.ts new file mode 100644 index 0000000..ab32af2 --- /dev/null +++ b/src/controllers/beerPostLikes/index.ts @@ -0,0 +1,77 @@ +import { UserExtendedNextApiRequest } from "@/config/auth/types"; +import ServerError from "@/config/util/ServerError"; +import getBeerPostById from "@/services/BeerPost/getBeerPostById"; +import createBeerPostLike from "@/services/BeerPostLike/createBeerPostLike"; +import findBeerPostLikeById from "@/services/BeerPostLike/findBeerPostLikeById"; +import getBeerPostLikeCount from "@/services/BeerPostLike/getBeerPostLikeCount"; +import removeBeerPostLikeById from "@/services/BeerPostLike/removeBeerPostLikeById"; +import APIResponseValidationSchema from "@/validation/APIResponseValidationSchema"; +import { NextApiResponse, NextApiRequest } from "next"; +import { z } from "zod"; + +export const sendLikeRequest = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, +) => { + const user = req.user!; + const id = req.query.id as string; + + const beer = await getBeerPostById(id); + if (!beer) { + throw new ServerError('Could not find a beer post with that id', 404); + } + + const alreadyLiked = await findBeerPostLikeById({ + beerPostId: beer.id, + likedById: user.id, + }); + + const jsonResponse = { + success: true as const, + message: '', + statusCode: 200 as const, + }; + + if (alreadyLiked) { + await removeBeerPostLikeById({ beerLikeId: alreadyLiked.id }); + jsonResponse.message = 'Successfully unliked beer post'; + } else { + await createBeerPostLike({ id, user }); + jsonResponse.message = 'Successfully liked beer post'; + } + + res.status(200).json(jsonResponse); +}; + +export const getLikeCount = async ( + req: NextApiRequest, + res: NextApiResponse>, +) => { + const id = req.query.id as string; + + const likeCount = await getBeerPostLikeCount({ beerPostId: id }); + + res.status(200).json({ + success: true, + message: 'Successfully retrieved like count.', + statusCode: 200, + payload: { likeCount }, + }); +}; + +export const checkIfLiked = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, +) => { + const user = req.user!; + const beerPostId = req.query.id as string; + + const alreadyLiked = await findBeerPostLikeById({ beerPostId, likedById: user.id }); + + res.status(200).json({ + success: true, + message: alreadyLiked ? 'Beer post is liked.' : 'Beer post is not liked.', + statusCode: 200, + payload: { isLiked: !!alreadyLiked }, + }); +}; diff --git a/src/controllers/beerPosts/index.ts b/src/controllers/beerPosts/index.ts new file mode 100644 index 0000000..fc1f866 --- /dev/null +++ b/src/controllers/beerPosts/index.ts @@ -0,0 +1,143 @@ +import ServerError from '@/config/util/ServerError'; +import deleteBeerPostById from '@/services/BeerPost/deleteBeerPostById'; +import editBeerPostById from '@/services/BeerPost/editBeerPostById'; +import getBeerPostById from '@/services/BeerPost/getBeerPostById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { NextHandler } from 'next-connect'; +import { z } from 'zod'; +import getBeerRecommendations from '@/services/BeerPost/getBeerRecommendations'; +import getAllBeerPosts from '@/services/BeerPost/getAllBeerPosts'; +import DBClient from '@/prisma/DBClient'; +import createNewBeerPost from '@/services/BeerPost/createNewBeerPost'; +import { + BeerPostRequest, + CreateBeerPostRequest, + EditBeerPostRequest, + GetAllBeerPostsRequest, + GetBeerRecommendationsRequest, +} from './types'; + +export const checkIfBeerPostOwner = async ( + req: BeerPostRequestType, + res: NextApiResponse, + next: NextHandler, +) => { + const { user, query } = req; + const { id } = query; + + const beerPost = await getBeerPostById(id); + + if (!beerPost) { + throw new ServerError('Beer post not found', 404); + } + + if (beerPost.postedBy.id !== user!.id) { + throw new ServerError('You cannot edit that beer post.', 403); + } + + return next(); +}; + +export const editBeerPost = async ( + req: EditBeerPostRequest, + res: NextApiResponse>, +) => { + await editBeerPostById({ id: req.query.id, data: req.body }); + + res.status(200).json({ + message: 'Beer post updated successfully', + success: true, + statusCode: 200, + }); +}; + +export const deleteBeerPost = async (req: BeerPostRequest, res: NextApiResponse) => { + const { id } = req.query; + + const deleted = await deleteBeerPostById({ beerPostId: id }); + if (!deleted) { + throw new ServerError('Beer post not found', 404); + } + + res.status(200).json({ + message: 'Beer post deleted successfully', + success: true, + statusCode: 200, + }); +}; + +export const getBeerPostRecommendations = async ( + req: GetBeerRecommendationsRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const beerPost = await getBeerPostById(id); + + if (!beerPost) { + throw new ServerError('Beer post not found', 404); + } + + const pageNum = parseInt(req.query.page_num as string, 10); + const pageSize = parseInt(req.query.page_size as string, 10); + + const { count, beerRecommendations } = await getBeerRecommendations({ + beerPost, + pageNum, + pageSize, + }); + + res.setHeader('X-Total-Count', count); + res.status(200).json({ + success: true, + message: 'Recommendations fetched successfully', + statusCode: 200, + payload: beerRecommendations, + }); +}; + +export const getBeerPosts = async ( + req: GetAllBeerPostsRequest, + res: NextApiResponse>, +) => { + const pageNum = parseInt(req.query.page_num, 10); + const pageSize = parseInt(req.query.page_size, 10); + + const beerPosts = await getAllBeerPosts({ pageNum, pageSize }); + + const beerPostCount = await DBClient.instance.beerPost.count(); + + res.setHeader('X-Total-Count', beerPostCount); + + res.status(200).json({ + message: 'Beer posts retrieved successfully', + statusCode: 200, + payload: beerPosts, + success: true, + }); +}; + +export const createBeerPost = async ( + req: CreateBeerPostRequest, + res: NextApiResponse>, +) => { + const { name, description, styleId: typeId, abv, ibu, breweryId } = req.body; + + const newBeerPost = await createNewBeerPost({ + name, + description, + abv, + ibu, + styleId: typeId, + breweryId, + userId: req.user!.id, + }); + + res.status(201).json({ + message: 'Beer post created successfully', + statusCode: 201, + payload: newBeerPost, + success: true, + }); +}; diff --git a/src/controllers/beerPosts/types/index.ts b/src/controllers/beerPosts/types/index.ts new file mode 100644 index 0000000..a7b32aa --- /dev/null +++ b/src/controllers/beerPosts/types/index.ts @@ -0,0 +1,25 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import CreateBeerPostValidationSchema from '@/services/BeerPost/schema/CreateBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import { NextApiRequest } from 'next'; +import { z } from 'zod'; + +export interface BeerPostRequest extends UserExtendedNextApiRequest { + query: { id: string }; +} + +export interface EditBeerPostRequest extends BeerPostRequest { + body: z.infer; +} + +export interface GetAllBeerPostsRequest extends NextApiRequest { + query: { page_num: string; page_size: string }; +} + +export interface GetBeerRecommendationsRequest extends BeerPostRequest { + query: { id: string; page_num: string; page_size: string }; +} + +export interface CreateBeerPostRequest extends UserExtendedNextApiRequest { + body: z.infer; +} diff --git a/src/pages/api/beers/[id]/images/index.ts b/src/pages/api/beers/[id]/images/index.ts index 69a245f..743e041 100644 --- a/src/pages/api/beers/[id]/images/index.ts +++ b/src/pages/api/beers/[id]/images/index.ts @@ -1,50 +1,16 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { createRouter } from 'next-connect'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import ServerError from '@/config/util/ServerError'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import addBeerImageToDB from '@/services/BeerImage/addBeerImageToDB'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; import { uploadMiddlewareMultiple } from '@/config/multer/uploadMiddleware'; - -interface UploadBeerPostImagesRequest extends UserExtendedNextApiRequest { - files?: Express.Multer.File[]; - query: { id: string }; - body: z.infer; -} - -const processImageData = async ( - req: UploadBeerPostImagesRequest, - res: NextApiResponse>, -) => { - const { files, user, body } = req; - - if (!files || !files.length) { - throw new ServerError('No images uploaded', 400); - } - - const beerImages = await addBeerImageToDB({ - alt: body.alt, - caption: body.caption, - beerPostId: req.query.id, - userId: user!.id, - files, - }); - - res.status(200).json({ - success: true, - message: `Successfully uploaded ${beerImages.length} image${ - beerImages.length > 1 ? 's' : '' - }`, - statusCode: 200, - }); -}; +import { UploadBeerPostImagesRequest } from '@/controllers/beerImages/types'; +import { processBeerImageData } from '@/controllers/beerImages'; const router = createRouter< UploadBeerPostImagesRequest, @@ -56,7 +22,7 @@ router.post( // @ts-expect-error uploadMiddlewareMultiple, validateRequest({ bodySchema: ImageMetadataValidationSchema }), - processImageData, + processBeerImageData, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/[id]/index.ts b/src/pages/api/beers/[id]/index.ts index a393407..43ae6b9 100644 --- a/src/pages/api/beers/[id]/index.ts +++ b/src/pages/api/beers/[id]/index.ts @@ -1,73 +1,21 @@ -import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import editBeerPostById from '@/services/BeerPost/editBeerPostById'; -import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; -import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { createRouter, NextHandler } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -import ServerError from '@/config/util/ServerError'; + +import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import deleteBeerPostById from '@/services/BeerPost/deleteBeerPostById'; -interface BeerPostRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} +import { EditBeerPostRequest } from '@/controllers/beerPosts/types'; +import { + checkIfBeerPostOwner, + editBeerPost, + deleteBeerPost, +} from '@/controllers/beerPosts'; -interface EditBeerPostRequest extends BeerPostRequest { - body: z.infer; -} +import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; -const checkIfBeerPostOwner = async ( - req: BeerPostRequestType, - res: NextApiResponse, - next: NextHandler, -) => { - const { user, query } = req; - const { id } = query; - - const beerPost = await getBeerPostById(id); - - if (!beerPost) { - throw new ServerError('Beer post not found', 404); - } - - if (beerPost.postedBy.id !== user!.id) { - throw new ServerError('You cannot edit that beer post.', 403); - } - - return next(); -}; - -const editBeerPost = async ( - req: EditBeerPostRequest, - res: NextApiResponse>, -) => { - await editBeerPostById({ id: req.query.id, data: req.body }); - - res.status(200).json({ - message: 'Beer post updated successfully', - success: true, - statusCode: 200, - }); -}; - -const deleteBeerPost = async (req: BeerPostRequest, res: NextApiResponse) => { - const { id } = req.query; - - const deleted = await deleteBeerPostById({ beerPostId: id }); - if (!deleted) { - throw new ServerError('Beer post not found', 404); - } - - res.status(200).json({ - message: 'Beer post deleted successfully', - success: true, - statusCode: 200, - }); -}; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; const router = createRouter< EditBeerPostRequest, diff --git a/src/pages/api/beers/[id]/like/index.ts b/src/pages/api/beers/[id]/like/index.ts index b85dc25..1a6ff46 100644 --- a/src/pages/api/beers/[id]/like/index.ts +++ b/src/pages/api/beers/[id]/like/index.ts @@ -1,67 +1,12 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { NextApiRequest, NextApiResponse } from 'next'; -import ServerError from '@/config/util/ServerError'; -import createBeerPostLike from '@/services/BeerPostLike/createBeerPostLike'; -import removeBeerPostLikeById from '@/services/BeerPostLike/removeBeerPostLikeById'; -import findBeerPostLikeById from '@/services/BeerPostLike/findBeerPostLikeById'; +import { NextApiResponse } from 'next'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import getBeerPostLikeCount from '@/services/BeerPostLike/getBeerPostLikeCount'; - -const sendLikeRequest = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse>, -) => { - const user = req.user!; - const id = req.query.id as string; - - const beer = await getBeerPostById(id); - if (!beer) { - throw new ServerError('Could not find a beer post with that id', 404); - } - - const alreadyLiked = await findBeerPostLikeById({ - beerPostId: beer.id, - likedById: user.id, - }); - - const jsonResponse = { - success: true as const, - message: '', - statusCode: 200 as const, - }; - - if (alreadyLiked) { - await removeBeerPostLikeById({ beerLikeId: alreadyLiked.id }); - jsonResponse.message = 'Successfully unliked beer post'; - } else { - await createBeerPostLike({ id, user }); - jsonResponse.message = 'Successfully liked beer post'; - } - - res.status(200).json(jsonResponse); -}; - -const getLikeCount = async ( - req: NextApiRequest, - res: NextApiResponse>, -) => { - const id = req.query.id as string; - - const likeCount = await getBeerPostLikeCount({ beerPostId: id }); - - res.status(200).json({ - success: true, - message: 'Successfully retrieved like count.', - statusCode: 200, - payload: { likeCount }, - }); -}; +import { sendLikeRequest, getLikeCount } from '@/controllers/beerPostLikes'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/beers/[id]/like/is-liked.ts b/src/pages/api/beers/[id]/like/is-liked.ts index 811cd9e..95bdfd1 100644 --- a/src/pages/api/beers/[id]/like/is-liked.ts +++ b/src/pages/api/beers/[id]/like/is-liked.ts @@ -6,24 +6,8 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import findBeerPostLikeById from '@/services/BeerPostLike/findBeerPostLikeById'; -const checkIfLiked = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse>, -) => { - const user = req.user!; - const beerPostId = req.query.id as string; - - const alreadyLiked = await findBeerPostLikeById({ beerPostId, likedById: user.id }); - - res.status(200).json({ - success: true, - message: alreadyLiked ? 'Beer post is liked.' : 'Beer post is not liked.', - statusCode: 200, - payload: { isLiked: !!alreadyLiked }, - }); -}; +import { checkIfLiked } from '@/controllers/beerPostLikes'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/beers/[id]/recommendations.ts b/src/pages/api/beers/[id]/recommendations.ts index bdcef88..0ea869b 100644 --- a/src/pages/api/beers/[id]/recommendations.ts +++ b/src/pages/api/beers/[id]/recommendations.ts @@ -1,52 +1,17 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; -import getBeerRecommendations from '@/services/BeerPost/getBeerRecommendations'; +import { getBeerPostRecommendations } from '@/controllers/beerPosts'; +import { GetBeerRecommendationsRequest } from '@/controllers/beerPosts/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface BeerPostRequest extends NextApiRequest { - query: { id: string; page_num: string; page_size: string }; -} - const router = createRouter< - BeerPostRequest, + GetBeerRecommendationsRequest, NextApiResponse> >(); -const getBeerRecommendationsRequest = async ( - req: BeerPostRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const beerPost = await getBeerPostById(id); - - if (!beerPost) { - throw new ServerError('Beer post not found', 404); - } - - const pageNum = parseInt(req.query.page_num as string, 10); - const pageSize = parseInt(req.query.page_size as string, 10); - - const { count, beerRecommendations } = await getBeerRecommendations({ - beerPost, - pageNum, - pageSize, - }); - - res.setHeader('X-Total-Count', count); - res.status(200).json({ - success: true, - message: 'Recommendations fetched successfully', - statusCode: 200, - payload: beerRecommendations, - }); -}; - router.get( validateRequest({ querySchema: z.object({ @@ -55,7 +20,7 @@ router.get( page_size: z.string().regex(/^[0-9]+$/), }), }), - getBeerRecommendationsRequest, + getBeerPostRecommendations, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/create.ts b/src/pages/api/beers/create.ts index bd9ea15..bb9a0ce 100644 --- a/src/pages/api/beers/create.ts +++ b/src/pages/api/beers/create.ts @@ -1,41 +1,14 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { createRouter } from 'next-connect'; -import createNewBeerPost from '@/services/BeerPost/createNewBeerPost'; + import CreateBeerPostValidationSchema from '@/services/BeerPost/schema/CreateBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; - -interface CreateBeerPostRequest extends UserExtendedNextApiRequest { - body: z.infer; -} - -const createBeerPost = async ( - req: CreateBeerPostRequest, - res: NextApiResponse>, -) => { - const { name, description, styleId: typeId, abv, ibu, breweryId } = req.body; - - const newBeerPost = await createNewBeerPost({ - name, - description, - abv, - ibu, - styleId: typeId, - breweryId, - userId: req.user!.id, - }); - - res.status(201).json({ - message: 'Beer post created successfully', - statusCode: 201, - payload: newBeerPost, - success: true, - }); -}; +import { createBeerPost } from '@/controllers/beerPosts'; +import { CreateBeerPostRequest } from '@/controllers/beerPosts/types'; const router = createRouter< CreateBeerPostRequest, diff --git a/src/pages/api/beers/index.ts b/src/pages/api/beers/index.ts index 6a5aa0a..da14773 100644 --- a/src/pages/api/beers/index.ts +++ b/src/pages/api/beers/index.ts @@ -1,40 +1,15 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import getAllBeerPosts from '@/services/BeerPost/getAllBeerPosts'; +import { getBeerPosts } from '@/controllers/beerPosts'; +import { GetAllBeerPostsRequest } from '@/controllers/beerPosts/types'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetBeerPostsRequest extends NextApiRequest { - query: z.infer; -} - -const getBeerPosts = async ( - req: GetBeerPostsRequest, - res: NextApiResponse>, -) => { - const pageNum = parseInt(req.query.page_num, 10); - const pageSize = parseInt(req.query.page_size, 10); - - const beerPosts = await getAllBeerPosts({ pageNum, pageSize }); - - const beerPostCount = await DBClient.instance.beerPost.count(); - - res.setHeader('X-Total-Count', beerPostCount); - - res.status(200).json({ - message: 'Beer posts retrieved successfully', - statusCode: 200, - payload: beerPosts, - success: true, - }); -}; - const router = createRouter< - GetBeerPostsRequest, + GetAllBeerPostsRequest, NextApiResponse> >(); From 4b2ce394c1e527f0438536918deb037b08385450 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Mon, 4 Dec 2023 00:59:13 -0500 Subject: [PATCH 06/21] Refactor: further extract controller logic from routers --- package-lock.json | 38 ++++-- package.json | 17 +-- .../{ => images}/beerImages/index.ts | 0 .../{ => images}/beerImages/types/index.ts | 0 .../{ => likes}/beerPostLikes/index.ts | 31 ++--- src/controllers/likes/beerStyleLikes/index.ts | 76 ++++++++++++ src/controllers/likes/types/index.ts | 5 + .../{ => posts}/beerPosts/index.ts | 0 .../{ => posts}/beerPosts/types/index.ts | 0 src/controllers/posts/beerStyles/index.ts | 116 ++++++++++++++++++ .../posts/beerStyles/types/index.ts | 17 +++ src/controllers/posts/types/index.ts | 5 + src/pages/api/beers/[id]/images/index.ts | 4 +- src/pages/api/beers/[id]/index.ts | 4 +- src/pages/api/beers/[id]/like/index.ts | 14 ++- src/pages/api/beers/[id]/like/is-liked.ts | 4 +- src/pages/api/beers/[id]/recommendations.ts | 4 +- src/pages/api/beers/create.ts | 4 +- src/pages/api/beers/index.ts | 4 +- .../api/beers/styles/[id]/beers/index.ts | 28 +---- src/pages/api/beers/styles/[id]/index.ts | 25 +--- src/pages/api/beers/styles/[id]/like/index.ts | 70 ++--------- .../api/beers/styles/[id]/like/is-liked.ts | 34 +---- src/pages/api/beers/styles/create.ts | 88 +------------ src/pages/api/beers/styles/index.ts | 33 +---- .../Account/sendUpdateUserAvatarRequest.ts | 4 +- .../BeerPost/getBeerPostsByBreweryId.ts | 4 +- .../BeerPostLike/getBeerPostLikeCount.ts | 4 +- 28 files changed, 325 insertions(+), 308 deletions(-) rename src/controllers/{ => images}/beerImages/index.ts (100%) rename src/controllers/{ => images}/beerImages/types/index.ts (100%) rename src/controllers/{ => likes}/beerPostLikes/index.ts (61%) create mode 100644 src/controllers/likes/beerStyleLikes/index.ts create mode 100644 src/controllers/likes/types/index.ts rename src/controllers/{ => posts}/beerPosts/index.ts (100%) rename src/controllers/{ => posts}/beerPosts/types/index.ts (100%) create mode 100644 src/controllers/posts/beerStyles/index.ts create mode 100644 src/controllers/posts/beerStyles/types/index.ts create mode 100644 src/controllers/posts/types/index.ts diff --git a/package-lock.json b/package-lock.json index 65f5dbc..d0db80d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "@react-email/components": "^0.0.11", "@react-email/render": "^0.0.9", "@react-email/tailwind": "^0.0.12", - "@types/express": "^4.17.21", "@vercel/analytics": "^1.1.0", "argon2": "^0.31.1", "cloudinary": "^1.41.0", @@ -54,6 +53,7 @@ "devDependencies": { "@faker-js/faker": "^8.3.1", "@types/cookie": "^0.5.1", + "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.2", "@types/lodash": "^4.14.195", "@types/mapbox__mapbox-sdk": "^0.13.4", @@ -2061,6 +2061,7 @@ "version": "1.19.3", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -2087,6 +2088,7 @@ "version": "3.4.36", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -2110,6 +2112,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2121,6 +2124,7 @@ "version": "4.17.37", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -2141,7 +2145,8 @@ "node_modules/@types/http-errors": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.13", @@ -2216,7 +2221,8 @@ "node_modules/@types/mime": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.3", @@ -2310,12 +2316,14 @@ "node_modules/@types/qs": { "version": "6.9.8", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", + "dev": true }, "node_modules/@types/react": { "version": "18.2.25", @@ -2393,6 +2401,7 @@ "version": "0.17.2", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", + "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -2402,6 +2411,7 @@ "version": "1.15.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", + "dev": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -12133,6 +12143,7 @@ "version": "1.19.3", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", + "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -12159,6 +12170,7 @@ "version": "3.4.36", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dev": true, "requires": { "@types/node": "*" } @@ -12182,6 +12194,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -12193,6 +12206,7 @@ "version": "4.17.37", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", + "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -12213,7 +12227,8 @@ "@types/http-errors": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", + "dev": true }, "@types/json-schema": { "version": "7.0.13", @@ -12288,7 +12303,8 @@ "@types/mime": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", + "dev": true }, "@types/minimist": { "version": "1.2.3", @@ -12381,12 +12397,14 @@ "@types/qs": { "version": "6.9.8", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "dev": true }, "@types/range-parser": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", + "dev": true }, "@types/react": { "version": "18.2.25", @@ -12463,6 +12481,7 @@ "version": "0.17.2", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", + "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -12472,6 +12491,7 @@ "version": "1.15.3", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", + "dev": true, "requires": { "@types/http-errors": "*", "@types/mime": "*", diff --git a/package.json b/package.json index 25ef716..b4c8e9c 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "next dev", "build": "next build", + "prestart": "npm run build", "start": "next start", "lint": "next lint", "clear-db": "npx ts-node ./src/prisma/seed/clear/index.ts", @@ -25,7 +26,6 @@ "@react-email/components": "^0.0.11", "@react-email/render": "^0.0.9", "@react-email/tailwind": "^0.0.12", - "@types/express": "^4.17.21", "@vercel/analytics": "^1.1.0", "argon2": "^0.31.1", "cloudinary": "^1.41.0", @@ -36,13 +36,12 @@ "lodash": "^4.17.21", "mapbox-gl": "^2.15.0", "multer": "^1.4.5-lts.1", - "next": "^14.0.3", "next-cloudinary": "^5.10.0", "next-connect": "^1.0.0-next.3", - "passport": "^0.6.0", + "next": "^14.0.3", "passport-local": "^1.0.0", + "passport": "^0.6.0", "pino": "^8.14.1", - "react": "^18.2.0", "react-daisyui": "^4.1.2", "react-dom": "^18.2.0", "react-email": "^1.9.5", @@ -52,6 +51,7 @@ "react-intersection-observer": "^9.5.2", "react-map-gl": "^7.1.2", "react-responsive-carousel": "^3.2.23", + "react": "^18.2.0", "swr": "^2.2.0", "theme-change": "^2.5.0", "zod": "^3.21.4" @@ -59,34 +59,35 @@ "devDependencies": { "@faker-js/faker": "^8.3.1", "@types/cookie": "^0.5.1", + "@types/express": "^4.17.21", "@types/jsonwebtoken": "^9.0.2", "@types/lodash": "^4.14.195", "@types/mapbox__mapbox-sdk": "^0.13.4", "@types/multer": "^1.4.7", "@types/node": "^20.4.2", "@types/passport-local": "^1.0.35", - "@types/react": "^18.2.15", "@types/react-dom": "^18.2.7", + "@types/react": "^18.2.15", "@types/sparkpost": "^2.1.5", "@vercel/fetch": "^7.0.0", "autoprefixer": "^10.4.14", "daisyui": "^3.9.2", "dotenv-cli": "^7.2.1", - "eslint": "^8.51.0", "eslint-config-airbnb-base": "15.0.0", "eslint-config-airbnb-typescript": "17.1.0", "eslint-config-next": "^13.5.4", "eslint-config-prettier": "^9.0.0", "eslint-plugin-react": "^7.33.2", + "eslint": "^8.51.0", "generate-password": "^1.7.1", "onchange": "^7.1.0", "postcss": "^8.4.26", - "prettier": "^3.0.0", "prettier-plugin-jsdoc": "^1.0.2", "prettier-plugin-tailwindcss": "^0.5.7", + "prettier": "^3.0.0", "prisma": "^5.6.0", - "tailwindcss": "^3.3.3", "tailwindcss-animate": "^1.0.6", + "tailwindcss": "^3.3.3", "ts-node": "^10.9.1", "typescript": "^5.3.2" }, diff --git a/src/controllers/beerImages/index.ts b/src/controllers/images/beerImages/index.ts similarity index 100% rename from src/controllers/beerImages/index.ts rename to src/controllers/images/beerImages/index.ts diff --git a/src/controllers/beerImages/types/index.ts b/src/controllers/images/beerImages/types/index.ts similarity index 100% rename from src/controllers/beerImages/types/index.ts rename to src/controllers/images/beerImages/types/index.ts diff --git a/src/controllers/beerPostLikes/index.ts b/src/controllers/likes/beerPostLikes/index.ts similarity index 61% rename from src/controllers/beerPostLikes/index.ts rename to src/controllers/likes/beerPostLikes/index.ts index ab32af2..dca294d 100644 --- a/src/controllers/beerPostLikes/index.ts +++ b/src/controllers/likes/beerPostLikes/index.ts @@ -1,16 +1,17 @@ -import { UserExtendedNextApiRequest } from "@/config/auth/types"; -import ServerError from "@/config/util/ServerError"; -import getBeerPostById from "@/services/BeerPost/getBeerPostById"; -import createBeerPostLike from "@/services/BeerPostLike/createBeerPostLike"; -import findBeerPostLikeById from "@/services/BeerPostLike/findBeerPostLikeById"; -import getBeerPostLikeCount from "@/services/BeerPostLike/getBeerPostLikeCount"; -import removeBeerPostLikeById from "@/services/BeerPostLike/removeBeerPostLikeById"; -import APIResponseValidationSchema from "@/validation/APIResponseValidationSchema"; -import { NextApiResponse, NextApiRequest } from "next"; -import { z } from "zod"; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import ServerError from '@/config/util/ServerError'; +import getBeerPostById from '@/services/BeerPost/getBeerPostById'; +import createBeerPostLike from '@/services/BeerPostLike/createBeerPostLike'; +import findBeerPostLikeById from '@/services/BeerPostLike/findBeerPostLikeById'; +import getBeerPostLikeCountByBeerPostId from '@/services/BeerPostLike/getBeerPostLikeCount'; +import removeBeerPostLikeById from '@/services/BeerPostLike/removeBeerPostLikeById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse, NextApiRequest } from 'next'; +import { z } from 'zod'; +import { LikeRequest } from '../types'; -export const sendLikeRequest = async ( - req: UserExtendedNextApiRequest, +export const sendBeerPostLikeRequest = async ( + req: LikeRequest, res: NextApiResponse>, ) => { const user = req.user!; @@ -43,13 +44,13 @@ export const sendLikeRequest = async ( res.status(200).json(jsonResponse); }; -export const getLikeCount = async ( +export const getBeerPostLikeCount = async ( req: NextApiRequest, res: NextApiResponse>, ) => { const id = req.query.id as string; - const likeCount = await getBeerPostLikeCount({ beerPostId: id }); + const likeCount = await getBeerPostLikeCountByBeerPostId({ beerPostId: id }); res.status(200).json({ success: true, @@ -59,7 +60,7 @@ export const getLikeCount = async ( }); }; -export const checkIfLiked = async ( +export const checkIfBeerPostIsLiked = async ( req: UserExtendedNextApiRequest, res: NextApiResponse>, ) => { diff --git a/src/controllers/likes/beerStyleLikes/index.ts b/src/controllers/likes/beerStyleLikes/index.ts new file mode 100644 index 0000000..6586113 --- /dev/null +++ b/src/controllers/likes/beerStyleLikes/index.ts @@ -0,0 +1,76 @@ +import ServerError from '@/config/util/ServerError'; +import createBeerStyleLike from '@/services/BeerStyleLike/createBeerStyleLike'; +import findBeerStyleLikeById from '@/services/BeerStyleLike/findBeerStyleLikeById'; +import getBeerStyleLikeCount from '@/services/BeerStyleLike/getBeerStyleLikeCount'; +import removeBeerStyleLikeById from '@/services/BeerStyleLike/removeBeerStyleLikeById'; +import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse, NextApiRequest } from 'next'; +import { z } from 'zod'; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import { LikeRequest } from '../types'; + +export const sendBeerStyleLikeRequest = async ( + req: LikeRequest, + res: NextApiResponse>, +) => { + const user = req.user!; + const { id } = req.query; + + const beerStyle = await getBeerStyleById(id); + if (!beerStyle) { + throw new ServerError('Could not find a beer style with that id.', 404); + } + + const beerStyleLike = await findBeerStyleLikeById({ + beerStyleId: beerStyle.id, + likedById: user.id, + }); + + if (beerStyleLike) { + await removeBeerStyleLikeById({ beerStyleLikeId: beerStyleLike.id }); + res.status(200).json({ + message: 'Successfully unliked beer style.', + success: true, + statusCode: 200, + }); + } else { + await createBeerStyleLike({ beerStyleId: beerStyle.id, user }); + res.status(200).json({ + message: 'Successfully liked beer style.', + success: true, + statusCode: 200, + }); + } +}; + +export const getBeerStyleLikeCountRequest = async ( + req: NextApiRequest, + res: NextApiResponse>, +) => { + const id = req.query.id as string; + const likeCount = await getBeerStyleLikeCount({ beerStyleId: id }); + + res.status(200).json({ + success: true, + message: 'Successfully retrieved like count.', + statusCode: 200, + payload: { likeCount }, + }); +}; + +export const checkIfBeerStyleIsLiked = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, +) => { + const user = req.user!; + const beerStyleId = req.query.id as string; + + const alreadyLiked = await findBeerStyleLikeById({ beerStyleId, likedById: user.id }); + res.status(200).json({ + success: true, + message: alreadyLiked ? 'Beer style is liked.' : 'Beer style is not liked.', + statusCode: 200, + payload: { isLiked: !!alreadyLiked }, + }); +}; diff --git a/src/controllers/likes/types/index.ts b/src/controllers/likes/types/index.ts new file mode 100644 index 0000000..424a4e4 --- /dev/null +++ b/src/controllers/likes/types/index.ts @@ -0,0 +1,5 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; + +export interface LikeRequest extends UserExtendedNextApiRequest { + query: { id: string }; +} diff --git a/src/controllers/beerPosts/index.ts b/src/controllers/posts/beerPosts/index.ts similarity index 100% rename from src/controllers/beerPosts/index.ts rename to src/controllers/posts/beerPosts/index.ts diff --git a/src/controllers/beerPosts/types/index.ts b/src/controllers/posts/beerPosts/types/index.ts similarity index 100% rename from src/controllers/beerPosts/types/index.ts rename to src/controllers/posts/beerPosts/types/index.ts diff --git a/src/controllers/posts/beerStyles/index.ts b/src/controllers/posts/beerStyles/index.ts new file mode 100644 index 0000000..91eac09 --- /dev/null +++ b/src/controllers/posts/beerStyles/index.ts @@ -0,0 +1,116 @@ +import { NextApiResponse } from 'next'; + +import { z } from 'zod'; +import DBClient from '@/prisma/DBClient'; + +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; + +import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; +import getBeerPostsByBeerStyleId from '@/services/BeerPost/getBeerPostsByBeerStyleId'; +import getAllBeerStyles from '@/services/BeerStyles/getAllBeerStyles'; + +import ServerError from '@/config/util/ServerError'; +import { + CreateBeerStyleRequest, + GetAllBeersByBeerStyleRequest, + GetBeerStyleByIdRequest, +} from './types'; + +import { GetAllPostsRequest } from '../types'; + +export const getBeerStyle = async ( + req: GetBeerStyleByIdRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const beerStyle = await getBeerStyleById(id); + + res.status(200).json({ + message: 'Beer style retrieved successfully.', + statusCode: 200, + payload: beerStyle, + success: true, + }); +}; + +export const getAllBeersByBeerStyle = async ( + req: GetAllBeersByBeerStyleRequest, + res: NextApiResponse>, +) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num, id } = req.query; + + const beers = await getBeerPostsByBeerStyleId({ + pageNum: parseInt(page_num, 10), + pageSize: parseInt(page_size, 10), + styleId: id, + }); + + const count = await DBClient.instance.beerPost.count({ where: { styleId: id } }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: `Beers with style id ${id} retrieved successfully.`, + statusCode: 200, + payload: beers, + success: true, + }); +}; + +export const getBeerStyles = async ( + req: GetAllPostsRequest, + res: NextApiResponse>, +) => { + const pageNum = parseInt(req.query.page_num, 10); + const pageSize = parseInt(req.query.page_size, 10); + + const beerStyles = await getAllBeerStyles({ pageNum, pageSize }); + const beerStyleCount = await DBClient.instance.beerStyle.count(); + + res.setHeader('X-Total-Count', beerStyleCount); + + res.status(200).json({ + message: 'Beer styles retrieved successfully.', + statusCode: 200, + payload: beerStyles, + success: true, + }); +}; + +export const createBeerStyle = async ( + req: CreateBeerStyleRequest, + res: NextApiResponse>, +) => { + const { abvRange, description, glasswareId, ibuRange, name } = req.body; + + const user = req.user!; + + const glassware = await DBClient.instance.glassware.findUnique({ + where: { id: glasswareId }, + select: { id: true }, + }); + + if (!glassware) { + throw new ServerError('Glassware not found.', 404); + } + + const beerStyle = await DBClient.instance.beerStyle.create({ + data: { + abvRange, + description, + glassware: { connect: { id: glasswareId } }, + ibuRange, + name, + postedBy: { connect: { id: user.id } }, + }, + }); + + res.json({ + message: 'Beer style created successfully.', + statusCode: 200, + payload: beerStyle, + success: true, + }); +}; diff --git a/src/controllers/posts/beerStyles/types/index.ts b/src/controllers/posts/beerStyles/types/index.ts new file mode 100644 index 0000000..9ffc675 --- /dev/null +++ b/src/controllers/posts/beerStyles/types/index.ts @@ -0,0 +1,17 @@ +import { NextApiRequest } from 'next'; + +import { GetAllPostsRequest } from '@/controllers/posts/types'; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import { z } from 'zod'; +import CreateBeerStyleValidationSchema from '@/services/BeerStyles/schema/CreateBeerStyleValidationSchema'; + +export interface GetBeerStyleByIdRequest extends NextApiRequest { + query: { id: string }; +} + +export interface GetAllBeersByBeerStyleRequest extends GetAllPostsRequest { + query: { page_size: string; page_num: string; id: string }; +} +export interface CreateBeerStyleRequest extends UserExtendedNextApiRequest { + body: z.infer; +} diff --git a/src/controllers/posts/types/index.ts b/src/controllers/posts/types/index.ts new file mode 100644 index 0000000..ec53d99 --- /dev/null +++ b/src/controllers/posts/types/index.ts @@ -0,0 +1,5 @@ +import { NextApiRequest } from 'next'; + +export interface GetAllPostsRequest extends NextApiRequest { + query: { page_size: string; page_num: string }; +} diff --git a/src/pages/api/beers/[id]/images/index.ts b/src/pages/api/beers/[id]/images/index.ts index 743e041..ba2fb31 100644 --- a/src/pages/api/beers/[id]/images/index.ts +++ b/src/pages/api/beers/[id]/images/index.ts @@ -9,8 +9,8 @@ import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; import { uploadMiddlewareMultiple } from '@/config/multer/uploadMiddleware'; -import { UploadBeerPostImagesRequest } from '@/controllers/beerImages/types'; -import { processBeerImageData } from '@/controllers/beerImages'; +import { UploadBeerPostImagesRequest } from '@/controllers/images/beerImages/types'; +import { processBeerImageData } from '@/controllers/images/beerImages'; const router = createRouter< UploadBeerPostImagesRequest, diff --git a/src/pages/api/beers/[id]/index.ts b/src/pages/api/beers/[id]/index.ts index 43ae6b9..a5a40ca 100644 --- a/src/pages/api/beers/[id]/index.ts +++ b/src/pages/api/beers/[id]/index.ts @@ -6,12 +6,12 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import { EditBeerPostRequest } from '@/controllers/beerPosts/types'; +import { EditBeerPostRequest } from '@/controllers/posts/beerPosts/types'; import { checkIfBeerPostOwner, editBeerPost, deleteBeerPost, -} from '@/controllers/beerPosts'; +} from '@/controllers/posts/beerPosts'; import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; diff --git a/src/pages/api/beers/[id]/like/index.ts b/src/pages/api/beers/[id]/like/index.ts index 1a6ff46..22e600c 100644 --- a/src/pages/api/beers/[id]/like/index.ts +++ b/src/pages/api/beers/[id]/like/index.ts @@ -1,27 +1,31 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; + import { createRouter } from 'next-connect'; import { z } from 'zod'; import { NextApiResponse } from 'next'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import { sendLikeRequest, getLikeCount } from '@/controllers/beerPostLikes'; +import { + sendBeerPostLikeRequest, + getBeerPostLikeCount, +} from '@/controllers/likes/beerPostLikes'; +import { LikeRequest } from '@/controllers/likes/types'; const router = createRouter< - UserExtendedNextApiRequest, + LikeRequest, NextApiResponse> >(); router.post( getCurrentUser, validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - sendLikeRequest, + sendBeerPostLikeRequest, ); router.get( validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - getLikeCount, + getBeerPostLikeCount, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/[id]/like/is-liked.ts b/src/pages/api/beers/[id]/like/is-liked.ts index 95bdfd1..7d44bc2 100644 --- a/src/pages/api/beers/[id]/like/is-liked.ts +++ b/src/pages/api/beers/[id]/like/is-liked.ts @@ -7,7 +7,7 @@ import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { checkIfLiked } from '@/controllers/beerPostLikes'; +import { checkIfBeerPostIsLiked } from '@/controllers/likes/beerPostLikes'; const router = createRouter< UserExtendedNextApiRequest, @@ -17,7 +17,7 @@ const router = createRouter< router.get( getCurrentUser, validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - checkIfLiked, + checkIfBeerPostIsLiked, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/[id]/recommendations.ts b/src/pages/api/beers/[id]/recommendations.ts index 0ea869b..0766a32 100644 --- a/src/pages/api/beers/[id]/recommendations.ts +++ b/src/pages/api/beers/[id]/recommendations.ts @@ -1,7 +1,7 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBeerPostRecommendations } from '@/controllers/beerPosts'; -import { GetBeerRecommendationsRequest } from '@/controllers/beerPosts/types'; +import { getBeerPostRecommendations } from '@/controllers/posts/beerPosts'; +import { GetBeerRecommendationsRequest } from '@/controllers/posts/beerPosts/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; diff --git a/src/pages/api/beers/create.ts b/src/pages/api/beers/create.ts index bb9a0ce..0787d82 100644 --- a/src/pages/api/beers/create.ts +++ b/src/pages/api/beers/create.ts @@ -7,8 +7,8 @@ import { NextApiResponse } from 'next'; import { z } from 'zod'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import { createBeerPost } from '@/controllers/beerPosts'; -import { CreateBeerPostRequest } from '@/controllers/beerPosts/types'; +import { createBeerPost } from '@/controllers/posts/beerPosts'; +import { CreateBeerPostRequest } from '@/controllers/posts/beerPosts/types'; const router = createRouter< CreateBeerPostRequest, diff --git a/src/pages/api/beers/index.ts b/src/pages/api/beers/index.ts index da14773..2d3fe0f 100644 --- a/src/pages/api/beers/index.ts +++ b/src/pages/api/beers/index.ts @@ -1,6 +1,6 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBeerPosts } from '@/controllers/beerPosts'; -import { GetAllBeerPostsRequest } from '@/controllers/beerPosts/types'; +import { getBeerPosts } from '@/controllers/posts/beerPosts'; +import { GetAllBeerPostsRequest } from '@/controllers/posts/beerPosts/types'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/beers/styles/[id]/beers/index.ts b/src/pages/api/beers/styles/[id]/beers/index.ts index 18f82d8..73492de 100644 --- a/src/pages/api/beers/styles/[id]/beers/index.ts +++ b/src/pages/api/beers/styles/[id]/beers/index.ts @@ -1,7 +1,6 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import getBeerPostsByBeerStyleId from '@/services/BeerPost/getBeerPostsByBeerStyleId'; +import { getAllBeersByBeerStyle } from '@/controllers/posts/beerStyles'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiRequest, NextApiResponse } from 'next'; @@ -12,31 +11,6 @@ interface GetAllBeersByBeerStyleRequest extends NextApiRequest { query: { page_size: string; page_num: string; id: string }; } -const getAllBeersByBeerStyle = async ( - req: GetAllBeersByBeerStyleRequest, - res: NextApiResponse>, -) => { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num, id } = req.query; - - const beers = await getBeerPostsByBeerStyleId({ - pageNum: parseInt(page_num, 10), - pageSize: parseInt(page_size, 10), - styleId: id, - }); - - const count = await DBClient.instance.beerPost.count({ where: { styleId: id } }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beers fetched successfully', - statusCode: 200, - payload: beers, - success: true, - }); -}; - const router = createRouter< GetAllBeersByBeerStyleRequest, NextApiResponse> diff --git a/src/pages/api/beers/styles/[id]/index.ts b/src/pages/api/beers/styles/[id]/index.ts index e72e8c1..82cc746 100644 --- a/src/pages/api/beers/styles/[id]/index.ts +++ b/src/pages/api/beers/styles/[id]/index.ts @@ -1,31 +1,12 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; +import { getBeerStyle } from '@/controllers/posts/beerStyles'; +import { GetBeerStyleByIdRequest } from '@/controllers/posts/beerStyles/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetBeerStyleByIdRequest extends NextApiRequest { - query: { id: string }; -} - -const getBeerStyle = async ( - req: GetBeerStyleByIdRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const beerStyle = await getBeerStyleById(id); - - res.status(200).json({ - message: 'Beer types retrieved successfully', - statusCode: 200, - payload: beerStyle, - success: true, - }); -}; - const router = createRouter< GetBeerStyleByIdRequest, NextApiResponse> diff --git a/src/pages/api/beers/styles/[id]/like/index.ts b/src/pages/api/beers/styles/[id]/like/index.ts index 7562d42..aa078af 100644 --- a/src/pages/api/beers/styles/[id]/like/index.ts +++ b/src/pages/api/beers/styles/[id]/like/index.ts @@ -1,84 +1,32 @@ import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import ServerError from '@/config/util/ServerError'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; - -import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; -import findBeerStyleLikeById from '@/services/BeerStyleLike/findBeerStyleLikeById'; -import getBeerStyleLikeCount from '@/services/BeerStyleLike/getBeerStyleLikeCount'; -import createBeerStyleLike from '@/services/BeerStyleLike/createBeerStyleLike'; -import removeBeerStyleLikeById from '@/services/BeerStyleLike/removeBeerStyleLikeById'; - -const sendLikeRequest = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse>, -) => { - const user = req.user!; - const id = req.query.id as string; - - const beerStyle = await getBeerStyleById(id); - if (!beerStyle) { - throw new ServerError('Could not find a beer style with that id', 404); - } - - const alreadyLiked = await findBeerStyleLikeById({ - beerStyleId: beerStyle.id, - likedById: user.id, - }); - - const jsonResponse = { - success: true as const, - message: '', - statusCode: 200 as const, - }; - - if (alreadyLiked) { - await removeBeerStyleLikeById({ beerStyleLikeId: alreadyLiked.id }); - jsonResponse.message = 'Successfully unliked beer style.'; - } else { - await createBeerStyleLike({ beerStyleId: beerStyle.id, user }); - jsonResponse.message = 'Successfully liked beer style.'; - } - - res.status(200).json(jsonResponse); -}; - -const getLikeCount = async ( - req: NextApiRequest, - res: NextApiResponse>, -) => { - const id = req.query.id as string; - - const likeCount = await getBeerStyleLikeCount({ beerStyleId: id }); - res.status(200).json({ - success: true, - message: 'Successfully retrieved like count.', - statusCode: 200, - payload: { likeCount }, - }); -}; +import { + getBeerStyleLikeCountRequest, + sendBeerStyleLikeRequest, +} from '@/controllers/likes/beerStyleLikes'; +import { LikeRequest } from '@/controllers/likes/types'; const router = createRouter< - UserExtendedNextApiRequest, + LikeRequest, NextApiResponse> >(); router.post( getCurrentUser, validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - sendLikeRequest, + sendBeerStyleLikeRequest, ); router.get( validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - getLikeCount, + getBeerStyleLikeCountRequest, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/styles/[id]/like/is-liked.ts b/src/pages/api/beers/styles/[id]/like/is-liked.ts index ad7679a..74e5067 100644 --- a/src/pages/api/beers/styles/[id]/like/is-liked.ts +++ b/src/pages/api/beers/styles/[id]/like/is-liked.ts @@ -6,37 +6,7 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import DBClient from '@/prisma/DBClient'; - -interface FindBeerStyleLikeByIdArgs { - beerStyleId: string; - likedById: string; -} - -const findBeerStyleLikeById = async ({ - beerStyleId, - likedById, -}: FindBeerStyleLikeByIdArgs) => { - return DBClient.instance.beerStyleLike.findFirst({ - where: { beerStyleId, likedById }, - }); -}; - -const checkIfLiked = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse>, -) => { - const user = req.user!; - const beerStyleId = req.query.id as string; - - const alreadyLiked = await findBeerStyleLikeById({ beerStyleId, likedById: user.id }); - res.status(200).json({ - success: true, - message: alreadyLiked ? 'Beer style is liked.' : 'Beer style is not liked.', - statusCode: 200, - payload: { isLiked: !!alreadyLiked }, - }); -}; +import { checkIfBeerStyleIsLiked } from '@/controllers/likes/beerStyleLikes'; const router = createRouter< UserExtendedNextApiRequest, @@ -46,7 +16,7 @@ const router = createRouter< router.get( getCurrentUser, validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - checkIfLiked, + checkIfBeerStyleIsLiked, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/beers/styles/create.ts b/src/pages/api/beers/styles/create.ts index 8ec7fff..80ecf3b 100644 --- a/src/pages/api/beers/styles/create.ts +++ b/src/pages/api/beers/styles/create.ts @@ -1,97 +1,19 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; - +import { createBeerStyle } from '@/controllers/posts/beerStyles'; +import { CreateBeerStyleRequest } from '@/controllers/posts/beerStyles/types'; +import CreateBeerStyleValidationSchema from '@/services/BeerStyles/schema/CreateBeerStyleValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -const BeerStyleValidationSchema = z.object({ - id: z.string().cuid(), - name: z.string(), - postedBy: z.object({ - id: z.string().cuid(), - username: z.string(), - }), - glassware: z.object({ - id: z.string().cuid(), - name: z.string(), - description: z.string(), - }), - description: z.string(), - createdAt: z.date(), - updatedAt: z.date().nullable(), -}); - -const CreateBeerStyleValidationSchema = BeerStyleValidationSchema.omit({ - id: true, - postedBy: true, - createdAt: true, - updatedAt: true, - glassware: true, -}).extend({ - glasswareId: z.string().cuid(), -}); - -interface CreateBeerStyleRequest extends UserExtendedNextApiRequest { - body: z.infer; -} - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -interface GetBeerStyleRequest extends NextApiRequest { - query: { - id: string; - }; -} - -const createBeerStyle = async ( - req: CreateBeerStyleRequest, - res: NextApiResponse>, -) => { - const user = req.user!; - const { name, description, glasswareId } = req.body; - - const glassware = await DBClient.instance.glassware.findUnique({ - where: { id: glasswareId }, - }); - - if (!glassware) { - throw new ServerError('Glassware not found', 404); - } - - const newBeerStyle = await DBClient.instance.beerStyle.create({ - data: { - description, - name, - postedBy: { connect: { id: user.id } }, - glassware: { connect: { id: glassware.id } }, - }, - select: { - id: true, - name: true, - postedBy: { select: { id: true, username: true } }, - createdAt: true, - updatedAt: true, - }, - }); - - res.status(200).json({ - message: 'Beer posts retrieved successfully', - statusCode: 200, - payload: newBeerStyle, - success: true, - }); -}; - const router = createRouter< CreateBeerStyleRequest, NextApiResponse> >(); -router.get( +router.post( validateRequest({ bodySchema: CreateBeerStyleValidationSchema }), getCurrentUser, createBeerStyle, diff --git a/src/pages/api/beers/styles/index.ts b/src/pages/api/beers/styles/index.ts index 20901bb..9acc879 100644 --- a/src/pages/api/beers/styles/index.ts +++ b/src/pages/api/beers/styles/index.ts @@ -1,39 +1,16 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import getAllBeerStyles from '@/services/BeerStyles/getAllBeerStyles'; +import { getBeerStyles } from '@/controllers/posts/beerStyles'; +import { GetAllPostsRequest } from '@/controllers/posts/types'; + import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetBeerStylesRequest extends NextApiRequest { - query: z.infer; -} - -const getBeerStyles = async ( - req: GetBeerStylesRequest, - res: NextApiResponse>, -) => { - const pageNum = parseInt(req.query.page_num, 10); - const pageSize = parseInt(req.query.page_size, 10); - - const beerStyles = await getAllBeerStyles({ pageNum, pageSize }); - const beerStyleCount = await DBClient.instance.beerStyle.count(); - - res.setHeader('X-Total-Count', beerStyleCount); - - res.status(200).json({ - message: 'Beer types retrieved successfully', - statusCode: 200, - payload: beerStyles, - success: true, - }); -}; - const router = createRouter< - GetBeerStylesRequest, + GetAllPostsRequest, NextApiResponse> >(); diff --git a/src/requests/Account/sendUpdateUserAvatarRequest.ts b/src/requests/Account/sendUpdateUserAvatarRequest.ts index 8ce2c6c..298fce0 100644 --- a/src/requests/Account/sendUpdateUserAvatarRequest.ts +++ b/src/requests/Account/sendUpdateUserAvatarRequest.ts @@ -8,9 +8,9 @@ const sendUpdateUserAvatarRequest = async ({ userId, }: UpdateProfileRequestParams) => { const formData = new FormData(); - formData.append('file', file); + formData.append('image', file); - const response = await fetch(`/api/users/${userId}/`, { + const response = await fetch(`/api/users/${userId}/profile/update-avatar`, { method: 'PUT', body: formData, }); diff --git a/src/services/BeerPost/getBeerPostsByBreweryId.ts b/src/services/BeerPost/getBeerPostsByBreweryId.ts index 2d69ecb..1bbbc58 100644 --- a/src/services/BeerPost/getBeerPostsByBreweryId.ts +++ b/src/services/BeerPost/getBeerPostsByBreweryId.ts @@ -8,7 +8,7 @@ interface GetBeerPostsByBeerStyleIdArgs { pageNum: number; } -const getBeerPostsByBeerStyleId = async ({ +const getAllBeerPostsByBreweryId = async ({ pageNum, pageSize, breweryId, @@ -44,4 +44,4 @@ const getBeerPostsByBeerStyleId = async ({ return beers; }; -export default getBeerPostsByBeerStyleId; +export default getAllBeerPostsByBreweryId; diff --git a/src/services/BeerPostLike/getBeerPostLikeCount.ts b/src/services/BeerPostLike/getBeerPostLikeCount.ts index 14389b9..57886cc 100644 --- a/src/services/BeerPostLike/getBeerPostLikeCount.ts +++ b/src/services/BeerPostLike/getBeerPostLikeCount.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; -const getBeerPostLikeCount = async ({ beerPostId }: { beerPostId: string }) => +const getBeerPostLikeCountByBeerPostId = async ({ beerPostId }: { beerPostId: string }) => DBClient.instance.beerPostLike.count({ where: { beerPostId } }); -export default getBeerPostLikeCount; +export default getBeerPostLikeCountByBeerPostId; From 2ff39613cdb6bb64dbbb86fbf35ebaafbd9d2017 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Tue, 5 Dec 2023 22:36:53 -0500 Subject: [PATCH 07/21] begin extracting user controllers out of routes --- src/config/jwt/index.ts | 2 +- src/controllers/auth/index.ts | 167 ++++++++++++++++++ src/controllers/auth/types/index.ts | 17 ++ src/pages/api/users/confirm.ts | 39 +--- src/pages/api/users/forgot-password.ts | 61 +------ src/pages/api/users/login.ts | 36 +--- src/pages/api/users/logout.ts | 16 +- src/pages/api/users/register.ts | 59 +------ .../User/schema/TokenValidationSchema.ts | 7 + src/services/User/sendResetPasswordEmail.ts | 30 ++++ 10 files changed, 246 insertions(+), 188 deletions(-) create mode 100644 src/controllers/auth/index.ts create mode 100644 src/controllers/auth/types/index.ts create mode 100644 src/services/User/schema/TokenValidationSchema.ts create mode 100644 src/services/User/sendResetPasswordEmail.ts diff --git a/src/config/jwt/index.ts b/src/config/jwt/index.ts index d7d7aad..ba60a70 100644 --- a/src/config/jwt/index.ts +++ b/src/config/jwt/index.ts @@ -15,7 +15,7 @@ export const verifyConfirmationToken = async (token: string) => { const parsed = BasicUserInfoSchema.safeParse(decoded); if (!parsed.success) { - throw new Error('Invalid token'); + throw new ServerError('Invalid token.', 401); } return parsed.data; diff --git a/src/controllers/auth/index.ts b/src/controllers/auth/index.ts new file mode 100644 index 0000000..8008a75 --- /dev/null +++ b/src/controllers/auth/index.ts @@ -0,0 +1,167 @@ +import { removeTokenCookie } from '@/config/auth/cookie'; +import localStrat from '@/config/auth/localStrat'; +import { getLoginSession, setLoginSession } from '@/config/auth/session'; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import ServerError from '@/config/util/ServerError'; +import createNewUser from '@/services/User/createNewUser'; +import findUserByEmail from '@/services/User/findUserByEmail'; +import { NextApiRequest, NextApiResponse } from 'next'; +import { expressWrapper } from 'next-connect'; +import passport from 'passport'; +import { z } from 'zod'; + +import findUserByUsername from '@/services/User/findUserByUsername'; +import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import sendConfirmationEmail from '@/services/User/sendConfirmationEmail'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import type { NextFunction } from 'express'; +import { verifyConfirmationToken } from '@/config/jwt'; +import updateUserToBeConfirmedById from '@/services/User/updateUserToBeConfirmedById'; +import DBClient from '@/prisma/DBClient'; +import sendResetPasswordEmail from '@/services/User/sendResetPasswordEmail'; +import { + RegisterUserRequest, + ResetPasswordRequest, + TokenValidationRequest, +} from './types'; + +export const authenticateUser = expressWrapper( + async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, + next: NextFunction, + ) => { + passport.initialize(); + passport.use(localStrat); + passport.authenticate( + 'local', + { session: false }, + (error: unknown, token: z.infer) => { + if (error) { + next(error); + return; + } + req.user = token; + next(); + }, + )(req, res, next); + }, +); + +export const loginUser = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, +) => { + const user = req.user!; + await setLoginSession(res, user); + + res.status(200).json({ + message: 'Login successful.', + payload: user, + statusCode: 200, + success: true, + }); +}; + +export const logoutUser = async ( + req: NextApiRequest, + res: NextApiResponse>, +) => { + const session = await getLoginSession(req); + + if (!session) { + throw new ServerError('You are not logged in.', 400); + } + + removeTokenCookie(res); + + res.redirect('/'); +}; + +export const registerUser = async ( + req: RegisterUserRequest, + res: NextApiResponse>, +) => { + const [usernameTaken, emailTaken] = await Promise.all([ + findUserByUsername(req.body.username), + findUserByEmail(req.body.email), + ]); + + if (usernameTaken) { + throw new ServerError( + 'Could not register a user with that username as it is already taken.', + 409, + ); + } + + if (emailTaken) { + throw new ServerError( + 'Could not register a user with that email as it is already taken.', + 409, + ); + } + + const user = await createNewUser(req.body); + + await setLoginSession(res, { + id: user.id, + username: user.username, + }); + + await sendConfirmationEmail(user); + + res.status(201).json({ + success: true, + statusCode: 201, + message: 'User registered successfully.', + payload: user, + }); +}; + +export const confirmUser = async ( + req: TokenValidationRequest, + res: NextApiResponse>, +) => { + const { token } = req.query; + + const user = req.user!; + const { id } = await verifyConfirmationToken(token); + + if (user.accountIsVerified) { + throw new ServerError('Your account is already verified.', 400); + } + + if (user.id !== id) { + throw new ServerError('Could not confirm user.', 401); + } + + await updateUserToBeConfirmedById(id); + + res.status(200).json({ + message: 'User confirmed successfully.', + statusCode: 200, + success: true, + }); +}; + +export const resetPassword = async ( + req: ResetPasswordRequest, + res: NextApiResponse>, +) => { + const { email } = req.body; + + const user = await DBClient.instance.user.findUnique({ + where: { email }, + }); + + if (user) { + await sendResetPasswordEmail(user); + } + + res.status(200).json({ + statusCode: 200, + success: true, + message: + 'If an account with that email exists, we have sent you an email to reset your password.', + }); +}; diff --git a/src/controllers/auth/types/index.ts b/src/controllers/auth/types/index.ts new file mode 100644 index 0000000..b11984f --- /dev/null +++ b/src/controllers/auth/types/index.ts @@ -0,0 +1,17 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import { CreateUserValidationSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import TokenValidationSchema from '@/services/User/schema/TokenValidationSchema'; +import { NextApiRequest } from 'next'; +import { z } from 'zod'; + +export interface RegisterUserRequest extends NextApiRequest { + body: z.infer; +} + +export interface TokenValidationRequest extends UserExtendedNextApiRequest { + query: z.infer; +} + +export interface ResetPasswordRequest extends NextApiRequest { + body: { email: string }; +} diff --git a/src/pages/api/users/confirm.ts b/src/pages/api/users/confirm.ts index 9186631..165a41b 100644 --- a/src/pages/api/users/confirm.ts +++ b/src/pages/api/users/confirm.ts @@ -1,53 +1,24 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import { verifyConfirmationToken } from '@/config/jwt'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import ServerError from '@/config/util/ServerError'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import updateUserToBeConfirmedById from '@/services/User/updateUserToBeConfirmedById'; -const ConfirmUserValidationSchema = z.object({ token: z.string() }); - -interface ConfirmUserRequest extends UserExtendedNextApiRequest { - query: z.infer; -} - -const confirmUser = async (req: ConfirmUserRequest, res: NextApiResponse) => { - const { token } = req.query; - - const user = req.user!; - const { id } = await verifyConfirmationToken(token); - - if (user.accountIsVerified) { - throw new ServerError('Your account is already verified.', 400); - } - - if (user.id !== id) { - throw new ServerError('Could not confirm user.', 401); - } - - await updateUserToBeConfirmedById(id); - - res.status(200).json({ - message: 'User confirmed successfully.', - statusCode: 200, - success: true, - }); -}; +import { TokenValidationRequest } from '@/controllers/auth/types'; +import { confirmUser } from '@/controllers/auth'; +import TokenValidationSchema from '@/services/User/schema/TokenValidationSchema'; const router = createRouter< - ConfirmUserRequest, + TokenValidationRequest, NextApiResponse> >(); router.get( getCurrentUser, - validateRequest({ querySchema: ConfirmUserValidationSchema }), + validateRequest({ querySchema: TokenValidationSchema }), confirmUser, ); diff --git a/src/pages/api/users/forgot-password.ts b/src/pages/api/users/forgot-password.ts index 156a5ec..e892acc 100644 --- a/src/pages/api/users/forgot-password.ts +++ b/src/pages/api/users/forgot-password.ts @@ -1,65 +1,12 @@ -import { generateResetPasswordToken } from '@/config/jwt'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import sendEmail from '@/config/sparkpost/sendEmail'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import DBClient from '@/prisma/DBClient'; -import { render } from '@react-email/render'; -import ForgotEmail from '@/emails/ForgotEmail'; -import { ReactElement } from 'react'; -import { User } from '@prisma/client'; -import { BASE_URL } from '@/config/env'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; - -interface ResetPasswordRequest extends NextApiRequest { - body: { email: string }; -} - -const sendResetPasswordEmail = async (user: User) => { - const token = generateResetPasswordToken({ id: user.id, username: user.username }); - - const url = `${BASE_URL}/users/reset-password?token=${token}`; - - const component = ForgotEmail({ name: user.username, url })! as ReactElement< - unknown, - string - >; - - const html = render(component); - const text = render(component, { plainText: true }); - - await sendEmail({ - address: user.email, - subject: 'Reset Password', - html, - text, - }); -}; - -const forgetPassword = async ( - req: ResetPasswordRequest, - res: NextApiResponse>, -) => { - const { email } = req.body; - - const user = await DBClient.instance.user.findUnique({ - where: { email }, - }); - - if (user) { - await sendResetPasswordEmail(user); - } - - res.status(200).json({ - statusCode: 200, - success: true, - message: - 'If an account with that email exists, we have sent you an email to reset your password.', - }); -}; +import { resetPassword } from '@/controllers/auth'; +import { ResetPasswordRequest } from '@/controllers/auth/types'; const router = createRouter< ResetPasswordRequest, @@ -68,7 +15,7 @@ const router = createRouter< router.post( validateRequest({ bodySchema: z.object({ email: z.string().email() }) }), - forgetPassword, + resetPassword, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/users/login.ts b/src/pages/api/users/login.ts index 525e337..5d9abbc 100644 --- a/src/pages/api/users/login.ts +++ b/src/pages/api/users/login.ts @@ -1,15 +1,12 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import passport from 'passport'; -import { createRouter, expressWrapper } from 'next-connect'; -import localStrat from '@/config/auth/localStrat'; -import { setLoginSession } from '@/config/auth/session'; +import { createRouter } from 'next-connect'; import { NextApiResponse } from 'next'; import { z } from 'zod'; import LoginValidationSchema from '@/services/User/schema/LoginValidationSchema'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import { authenticateUser, loginUser } from '@/controllers/auth'; const router = createRouter< UserExtendedNextApiRequest, @@ -18,33 +15,8 @@ const router = createRouter< router.post( validateRequest({ bodySchema: LoginValidationSchema }), - expressWrapper(async (req, res, next) => { - passport.initialize(); - passport.use(localStrat); - passport.authenticate( - 'local', - { session: false }, - (error: unknown, token: z.infer) => { - if (error) { - next(error); - return; - } - req.user = token; - next(); - }, - )(req, res, next); - }), - async (req, res) => { - const user = req.user!; - await setLoginSession(res, user); - - res.status(200).json({ - message: 'Login successful.', - payload: user, - statusCode: 200, - success: true, - }); - }, + authenticateUser, + loginUser, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/users/logout.ts b/src/pages/api/users/logout.ts index 3b33d6e..ef198b8 100644 --- a/src/pages/api/users/logout.ts +++ b/src/pages/api/users/logout.ts @@ -1,28 +1,16 @@ -import { getLoginSession } from '@/config/auth/session'; -import { removeTokenCookie } from '@/config/auth/cookie'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiRequest, NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import ServerError from '@/config/util/ServerError'; +import { logoutUser } from '@/controllers/auth'; const router = createRouter< NextApiRequest, NextApiResponse> >(); -router.all(async (req, res) => { - const session = await getLoginSession(req); - - if (!session) { - throw new ServerError('You are not logged in.', 400); - } - - removeTokenCookie(res); - - res.redirect('/'); -}); +router.all(logoutUser); const handler = router.handler(NextConnectOptions); export default handler; diff --git a/src/pages/api/users/register.ts b/src/pages/api/users/register.ts index 51b93a6..0960df3 100644 --- a/src/pages/api/users/register.ts +++ b/src/pages/api/users/register.ts @@ -1,65 +1,24 @@ -import { setLoginSession } from '@/config/auth/session'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { z } from 'zod'; -import ServerError from '@/config/util/ServerError'; import { createRouter } from 'next-connect'; -import createNewUser from '@/services/User/createNewUser'; import { CreateUserValidationSchema } from '@/services/User/schema/CreateUserValidationSchemas'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import findUserByUsername from '@/services/User/findUserByUsername'; -import findUserByEmail from '@/services/User/findUserByEmail'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; - -import sendConfirmationEmail from '@/services/User/sendConfirmationEmail'; - -interface RegisterUserRequest extends NextApiRequest { - body: z.infer; -} - -const registerUser = async (req: RegisterUserRequest, res: NextApiResponse) => { - const [usernameTaken, emailTaken] = await Promise.all([ - findUserByUsername(req.body.username), - findUserByEmail(req.body.email), - ]); - - if (usernameTaken) { - throw new ServerError( - 'Could not register a user with that username as it is already taken.', - 409, - ); - } - - if (emailTaken) { - throw new ServerError( - 'Could not register a user with that email as it is already taken.', - 409, - ); - } - - const user = await createNewUser(req.body); - - await setLoginSession(res, { - id: user.id, - username: user.username, - }); - - await sendConfirmationEmail(user); - - res.status(201).json({ - success: true, - statusCode: 201, - message: 'User registered successfully.', - payload: user, - }); -}; +import { registerUser } from '@/controllers/auth'; +import { RegisterUserRequest } from '@/controllers/auth/types'; const router = createRouter< RegisterUserRequest, NextApiResponse> >(); -router.post(validateRequest({ bodySchema: CreateUserValidationSchema }), registerUser); +router.post( + validateRequest({ + bodySchema: CreateUserValidationSchema, + }), + registerUser, +); const handler = router.handler(NextConnectOptions); export default handler; diff --git a/src/services/User/schema/TokenValidationSchema.ts b/src/services/User/schema/TokenValidationSchema.ts new file mode 100644 index 0000000..3589cd9 --- /dev/null +++ b/src/services/User/schema/TokenValidationSchema.ts @@ -0,0 +1,7 @@ +import z from 'zod'; + +const TokenValidationSchema = z.object({ + token: z.string(), +}); + +export default TokenValidationSchema; diff --git a/src/services/User/sendResetPasswordEmail.ts b/src/services/User/sendResetPasswordEmail.ts new file mode 100644 index 0000000..a6410db --- /dev/null +++ b/src/services/User/sendResetPasswordEmail.ts @@ -0,0 +1,30 @@ +import { BASE_URL } from '@/config/env'; +import { generateResetPasswordToken } from '@/config/jwt'; +import sendEmail from '@/config/sparkpost/sendEmail'; +import ForgotEmail from '@/emails/ForgotEmail'; +import { User } from '@prisma/client'; +import type { ReactElement } from 'react'; +import { render } from '@react-email/render'; + +const sendResetPasswordEmail = async (user: User) => { + const token = generateResetPasswordToken({ id: user.id, username: user.username }); + + const url = `${BASE_URL}/users/reset-password?token=${token}`; + + const component = ForgotEmail({ name: user.username, url })! as ReactElement< + unknown, + string + >; + + const html = render(component); + const text = render(component, { plainText: true }); + + await sendEmail({ + address: user.email, + subject: 'Reset Password', + html, + text, + }); +}; + +export default sendResetPasswordEmail; From c7d5c65ffbeebf7834dcc12776d0f52d305f39f2 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Wed, 6 Dec 2023 20:30:11 -0500 Subject: [PATCH 08/21] continue extracting user controllers out of routes --- src/controllers/posts/beerPosts/index.ts | 31 +++ src/controllers/posts/breweries/index.ts | 36 +++ src/controllers/posts/types/index.ts | 4 + src/controllers/{ => users}/auth/index.ts | 138 ++++++++++ .../{ => users}/auth/types/index.ts | 16 +- src/controllers/users/profile/index.ts | 237 ++++++++++++++++++ src/controllers/users/profile/types/index.ts | 23 ++ src/pages/api/users/[id]/follow-user.ts | 53 +--- src/pages/api/users/[id]/followers.ts | 47 +--- src/pages/api/users/[id]/following.ts | 41 +-- src/pages/api/users/[id]/index.ts | 111 +------- src/pages/api/users/[id]/is-followed.ts | 57 +---- src/pages/api/users/[id]/posts/beers.ts | 41 +-- src/pages/api/users/[id]/posts/breweries.ts | 45 +--- .../api/users/[id]/profile/update-avatar.ts | 4 +- .../api/users/[id]/profile/update-bio.ts | 68 +---- src/pages/api/users/check-email.ts | 28 +-- src/pages/api/users/check-username.ts | 27 +- src/pages/api/users/confirm.ts | 4 +- src/pages/api/users/current.ts | 11 +- src/pages/api/users/edit-password.ts | 28 +-- src/pages/api/users/forgot-password.ts | 4 +- src/pages/api/users/login.ts | 2 +- src/pages/api/users/logout.ts | 2 +- src/pages/api/users/register.ts | 4 +- src/pages/api/users/resend-confirmation.ts | 16 +- .../BeerPost/getBeerPostsByBeerStyleId.ts | 2 +- .../BeerPost/getBeerPostsByBreweryId.ts | 2 +- .../BeerPost/getBeerPostsByPostedById.ts | 2 +- src/services/User/schema/EditUserSchema.ts | 10 + src/services/User/updateUserProfileById.ts | 33 +++ 31 files changed, 584 insertions(+), 543 deletions(-) create mode 100644 src/controllers/posts/breweries/index.ts rename src/controllers/{ => users}/auth/index.ts (56%) rename src/controllers/{ => users}/auth/types/index.ts (55%) create mode 100644 src/controllers/users/profile/index.ts create mode 100644 src/controllers/users/profile/types/index.ts create mode 100644 src/services/User/schema/EditUserSchema.ts create mode 100644 src/services/User/updateUserProfileById.ts diff --git a/src/controllers/posts/beerPosts/index.ts b/src/controllers/posts/beerPosts/index.ts index fc1f866..600318b 100644 --- a/src/controllers/posts/beerPosts/index.ts +++ b/src/controllers/posts/beerPosts/index.ts @@ -10,6 +10,7 @@ import getBeerRecommendations from '@/services/BeerPost/getBeerRecommendations'; import getAllBeerPosts from '@/services/BeerPost/getAllBeerPosts'; import DBClient from '@/prisma/DBClient'; import createNewBeerPost from '@/services/BeerPost/createNewBeerPost'; +import getBeerPostsByPostedById from '@/services/BeerPost/getBeerPostsByPostedById'; import { BeerPostRequest, CreateBeerPostRequest, @@ -17,6 +18,7 @@ import { GetAllBeerPostsRequest, GetBeerRecommendationsRequest, } from './types'; +import { GetPostsByUserIdRequest } from '../types'; export const checkIfBeerPostOwner = async ( req: BeerPostRequestType, @@ -141,3 +143,32 @@ export const createBeerPost = async ( success: true, }); }; + +export const getBeerPostsByUserId = async ( + req: GetPostsByUserIdRequest, + res: NextApiResponse>, +) => { + 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, + }); +}; diff --git a/src/controllers/posts/breweries/index.ts b/src/controllers/posts/breweries/index.ts new file mode 100644 index 0000000..e3b7c0c --- /dev/null +++ b/src/controllers/posts/breweries/index.ts @@ -0,0 +1,36 @@ +import DBClient from '@/prisma/DBClient'; +import getAllBreweryPostsByPostedById from '@/services/BreweryPost/getAllBreweryPostsByPostedById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { z } from 'zod'; +import { GetPostsByUserIdRequest } from '../types'; + +// eslint-disable-next-line import/prefer-default-export +export const getBreweryPostsByUserId = async ( + req: GetPostsByUserIdRequest, + res: NextApiResponse>, +) => { + 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, + }); +}; diff --git a/src/controllers/posts/types/index.ts b/src/controllers/posts/types/index.ts index ec53d99..e6578ac 100644 --- a/src/controllers/posts/types/index.ts +++ b/src/controllers/posts/types/index.ts @@ -3,3 +3,7 @@ import { NextApiRequest } from 'next'; export interface GetAllPostsRequest extends NextApiRequest { query: { page_size: string; page_num: string }; } + +export interface GetPostsByUserIdRequest extends NextApiRequest { + query: { id: string; page_size: string; page_num: string }; +} diff --git a/src/controllers/auth/index.ts b/src/controllers/users/auth/index.ts similarity index 56% rename from src/controllers/auth/index.ts rename to src/controllers/users/auth/index.ts index 8008a75..9b401e7 100644 --- a/src/controllers/auth/index.ts +++ b/src/controllers/users/auth/index.ts @@ -19,11 +19,17 @@ import { verifyConfirmationToken } from '@/config/jwt'; import updateUserToBeConfirmedById from '@/services/User/updateUserToBeConfirmedById'; import DBClient from '@/prisma/DBClient'; import sendResetPasswordEmail from '@/services/User/sendResetPasswordEmail'; +import { hashPassword } from '@/config/auth/passwordFns'; +import deleteUserById from '@/services/User/deleteUserById'; import { + CheckEmailRequest, + CheckUsernameRequest, RegisterUserRequest, ResetPasswordRequest, TokenValidationRequest, + UpdatePasswordRequest, } from './types'; +import { EditUserRequest, UserRouteRequest } from '../profile/types'; export const authenticateUser = expressWrapper( async ( @@ -165,3 +171,135 @@ export const resetPassword = async ( 'If an account with that email exists, we have sent you an email to reset your password.', }); }; + +export const sendCurrentUser = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse, +) => { + const { user } = req; + res.status(200).json({ + message: `Currently logged in as ${user!.username}`, + statusCode: 200, + success: true, + payload: user, + }); +}; + +export const checkEmail = async (req: CheckEmailRequest, res: NextApiResponse) => { + const { email: emailToCheck } = req.query; + + const email = await findUserByEmail(emailToCheck); + + res.json({ + success: true, + payload: { emailIsTaken: !!email }, + statusCode: 200, + message: 'Getting email availability.', + }); +}; + +export const checkUsername = async (req: CheckUsernameRequest, res: NextApiResponse) => { + const { username: usernameToCheck } = req.query; + + const username = await findUserByUsername(usernameToCheck); + + res.json({ + success: true, + payload: { usernameIsTaken: !!username }, + statusCode: 200, + message: username ? 'Username is taken.' : 'Username is available.', + }); +}; + +export const updatePassword = async ( + req: UpdatePasswordRequest, + res: NextApiResponse>, +) => { + const { password } = req.body; + const hash = await hashPassword(password); + + const user = req.user!; + await DBClient.instance.user.update({ + data: { hash }, + where: { id: user.id }, + }); + + res.json({ + message: 'Updated user password.', + statusCode: 200, + success: true, + }); +}; + +export const resendConfirmation = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse, +) => { + const user = req.user!; + + await sendConfirmationEmail(user); + res.status(200).json({ + message: `Resent the confirmation email for ${user.username}.`, + statusCode: 200, + success: true, + }); +}; + +export const editUserInfo = async ( + req: EditUserRequest, + res: NextApiResponse>, +) => { + const { email, firstName, lastName, username } = req.body; + + const [usernameIsTaken, emailIsTaken] = await Promise.all([ + findUserByUsername(username), + findUserByEmail(email), + ]); + + const emailChanged = req.user!.email !== email; + const usernameChanged = req.user!.username !== username; + + if (emailIsTaken && emailChanged) { + throw new ServerError('Email is already taken', 400); + } + + if (usernameIsTaken && usernameChanged) { + throw new ServerError('Username is already taken', 400); + } + + const updatedUser = await DBClient.instance.user.update({ + where: { id: req.user!.id }, + data: { + email, + firstName, + lastName, + username, + accountIsVerified: emailChanged ? false : undefined, + }, + }); + + res.json({ + message: 'User edited successfully', + payload: updatedUser, + success: true, + statusCode: 200, + }); +}; + +export const deleteAccount = async ( + req: UserRouteRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + const deletedUser = await deleteUserById(id); + + if (!deletedUser) { + throw new ServerError('Could not find a user with that id.', 400); + } + + res.send({ + message: 'Successfully deleted user.', + statusCode: 200, + success: true, + }); +}; diff --git a/src/controllers/auth/types/index.ts b/src/controllers/users/auth/types/index.ts similarity index 55% rename from src/controllers/auth/types/index.ts rename to src/controllers/users/auth/types/index.ts index b11984f..adcadc4 100644 --- a/src/controllers/auth/types/index.ts +++ b/src/controllers/users/auth/types/index.ts @@ -1,5 +1,8 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import { CreateUserValidationSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { + CreateUserValidationSchema, + UpdatePasswordSchema, +} from '@/services/User/schema/CreateUserValidationSchemas'; import TokenValidationSchema from '@/services/User/schema/TokenValidationSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; @@ -15,3 +18,14 @@ export interface TokenValidationRequest extends UserExtendedNextApiRequest { export interface ResetPasswordRequest extends NextApiRequest { body: { email: string }; } + +export interface UpdatePasswordRequest extends UserExtendedNextApiRequest { + body: z.infer; +} +export interface CheckEmailRequest extends NextApiRequest { + query: { email: string }; +} + +export interface CheckUsernameRequest extends NextApiRequest { + query: { username: string }; +} diff --git a/src/controllers/users/profile/index.ts b/src/controllers/users/profile/index.ts new file mode 100644 index 0000000..dbe4989 --- /dev/null +++ b/src/controllers/users/profile/index.ts @@ -0,0 +1,237 @@ +import ServerError from '@/config/util/ServerError'; +import DBClient from '@/prisma/DBClient'; +import findUserById from '@/services/User/findUserById'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { z } from 'zod'; +import getUsersFollowingUser from '@/services/UserFollows/getUsersFollowingUser'; +import getUsersFollowedByUser from '@/services/UserFollows/getUsersFollowedByUser'; +import { NextHandler } from 'next-connect'; +import updateUserAvatarById, { + UpdateUserAvatarByIdParams, +} from '@/services/UserAccount/UpdateUserAvatarByIdParams'; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import updateUserProfileById from '@/services/User/updateUserProfileById'; +import { + UserRouteRequest, + GetUserFollowInfoRequest, + EditUserRequest, + UpdateAvatarRequest, + UpdateProfileRequest, +} from './types'; + +export const followUser = async ( + req: UserRouteRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const user = await findUserById(id); + if (!user) { + throw new ServerError('User not found', 404); + } + + const currentUser = req.user!; + const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ + where: { + followerId: currentUser.id, + followingId: id, + }, + }); + + if (!userIsFollowedBySessionUser) { + await DBClient.instance.userFollow.create({ + data: { followerId: currentUser.id, followingId: id }, + }); + + res.status(200).json({ + message: 'Now following user.', + success: true, + statusCode: 200, + }); + + return; + } + + await DBClient.instance.userFollow.delete({ + where: { + followerId_followingId: { + followerId: currentUser.id, + followingId: id, + }, + }, + }); + + res.status(200).json({ + message: 'No longer following user.', + success: true, + statusCode: 200, + }); +}; + +export const getUserFollowers = async ( + req: GetUserFollowInfoRequest, + res: NextApiResponse>, +) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { id, page_num, page_size } = req.query; + + const user = await findUserById(id); + if (!user) { + throw new ServerError('User not found', 404); + } + + const pageNum = parseInt(page_num, 10); + const pageSize = parseInt(page_size, 10); + + const following = await getUsersFollowingUser({ + userId: id, + pageNum, + pageSize, + }); + const followingCount = await DBClient.instance.userFollow.count({ + where: { following: { id } }, + }); + + res.setHeader('X-Total-Count', followingCount); + + res.json({ + message: 'Retrieved users that are followed by queried user', + payload: following, + success: true, + statusCode: 200, + }); +}; + +export const getUsersFollowed = async ( + req: GetUserFollowInfoRequest, + res: NextApiResponse>, +) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { id, page_num, page_size } = req.query; + + const user = await findUserById(id); + if (!user) { + throw new ServerError('User not found', 404); + } + + const pageNum = parseInt(page_num, 10); + const pageSize = parseInt(page_size, 10); + + const following = await getUsersFollowedByUser({ + userId: id, + pageNum, + pageSize, + }); + const followingCount = await DBClient.instance.userFollow.count({ + where: { follower: { id } }, + }); + + res.setHeader('X-Total-Count', followingCount); + + res.json({ + message: 'Retrieved users that are followed by queried user', + payload: following, + success: true, + statusCode: 200, + }); +}; + +export const checkIfUserIsFollowedBySessionUser = async ( + req: GetUserFollowInfoRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + const user = await findUserById(id); + if (!user) { + throw new ServerError('User not found', 404); + } + + const currentUser = req.user!; + + const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ + where: { followerId: currentUser.id, followingId: id }, + }); + + if (!userIsFollowedBySessionUser) { + res.status(200).json({ + message: 'User is not followed by the current user.', + success: true, + statusCode: 200, + payload: { isFollowed: false }, + }); + + return; + } + + res.status(200).json({ + message: 'User is followed by the current user.', + success: true, + statusCode: 200, + payload: { isFollowed: true }, + }); +}; + +export const checkIfUserCanEditUser = async ( + req: EditUserRequest, + res: NextApiResponse, + next: NextHandler, +) => { + const authenticatedUser = req.user!; + + const userToUpdate = await findUserById(req.query.id); + if (!userToUpdate) { + throw new ServerError('User not found', 404); + } + + if (authenticatedUser.id !== userToUpdate.id) { + throw new ServerError('You are not permitted to modify this user', 403); + } + + return next(); +}; + +export const checkIfUserCanUpdateProfile = async ( + req: T, + res: NextApiResponse, + next: NextHandler, +) => { + const user = req.user!; + + if (user.id !== req.query.id) { + throw new ServerError('You can only update your own profile.', 403); + } + + await next(); +}; + +export const updateAvatar = async (req: UpdateAvatarRequest, res: NextApiResponse) => { + const { file, user } = req; + + const avatar: UpdateUserAvatarByIdParams['data']['avatar'] = { + alt: file.originalname, + path: file.path, + caption: '', + }; + + await updateUserAvatarById({ id: user!.id, data: { avatar } }); + res.status(200).json({ + message: 'User avatar updated successfully.', + statusCode: 200, + success: true, + }); +}; + +export const updateProfile = async (req: UpdateProfileRequest, res: NextApiResponse) => { + const user = req.user!; + const { body } = req; + + await updateUserProfileById({ id: user!.id, data: { bio: body.bio } }); + + res.status(200).json({ + message: 'Profile updated successfully.', + statusCode: 200, + success: true, + }); +}; diff --git a/src/controllers/users/profile/types/index.ts b/src/controllers/users/profile/types/index.ts new file mode 100644 index 0000000..b80838b --- /dev/null +++ b/src/controllers/users/profile/types/index.ts @@ -0,0 +1,23 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import EditUserSchema from '@/services/User/schema/EditUserSchema'; +import { z } from 'zod'; + +export interface UserRouteRequest extends UserExtendedNextApiRequest { + query: { id: string }; +} + +export interface GetUserFollowInfoRequest extends UserExtendedNextApiRequest { + query: { id: string; page_size: string; page_num: string }; +} + +export interface EditUserRequest extends UserRouteRequest { + body: z.infer; +} + +export interface UpdateAvatarRequest extends UserExtendedNextApiRequest { + file: Express.Multer.File; +} + +export interface UpdateProfileRequest extends UserExtendedNextApiRequest { + body: { bio: string }; +} diff --git a/src/pages/api/users/[id]/follow-user.ts b/src/pages/api/users/[id]/follow-user.ts index 0bb438e..866f40e 100644 --- a/src/pages/api/users/[id]/follow-user.ts +++ b/src/pages/api/users/[id]/follow-user.ts @@ -2,9 +2,7 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/User/findUserById'; +import { followUser } from '@/controllers/users/profile'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; @@ -21,55 +19,6 @@ const router = createRouter< NextApiResponse> >(); -const followUser = async ( - req: GetUserFollowInfoRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const user = await findUserById(id); - if (!user) { - throw new ServerError('User not found', 404); - } - - const currentUser = req.user!; - const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ - where: { - followerId: currentUser.id, - followingId: id, - }, - }); - - if (!userIsFollowedBySessionUser) { - await DBClient.instance.userFollow.create({ - data: { followerId: currentUser.id, followingId: id }, - }); - - res.status(200).json({ - message: 'Now following user.', - success: true, - statusCode: 200, - }); - - return; - } - - await DBClient.instance.userFollow.delete({ - where: { - followerId_followingId: { - followerId: currentUser.id, - followingId: id, - }, - }, - }); - - res.status(200).json({ - message: 'No longer following user.', - success: true, - statusCode: 200, - }); -}; - router.post( validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), getCurrentUser, diff --git a/src/pages/api/users/[id]/followers.ts b/src/pages/api/users/[id]/followers.ts index 2917802..761e1a3 100644 --- a/src/pages/api/users/[id]/followers.ts +++ b/src/pages/api/users/[id]/followers.ts @@ -1,59 +1,18 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/User/findUserById'; -import getUsersFollowingUser from '@/services/UserFollows/getUsersFollowingUser'; +import { getUserFollowers } from '@/controllers/users/profile'; +import { GetUserFollowInfoRequest } from '@/controllers/users/profile/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetUserFollowInfoRequest extends UserExtendedNextApiRequest { - query: { id: string; page_size: string; page_num: string }; -} - const router = createRouter< GetUserFollowInfoRequest, NextApiResponse> >(); -const getFollowingInfo = async ( - req: GetUserFollowInfoRequest, - res: NextApiResponse>, -) => { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { id, page_num, page_size } = req.query; - - const user = await findUserById(id); - if (!user) { - throw new ServerError('User not found', 404); - } - - const pageNum = parseInt(page_num, 10); - const pageSize = parseInt(page_size, 10); - - const following = await getUsersFollowingUser({ - userId: id, - pageNum, - pageSize, - }); - const followingCount = await DBClient.instance.userFollow.count({ - where: { following: { id } }, - }); - - res.setHeader('X-Total-Count', followingCount); - - res.json({ - message: 'Retrieved users that are followed by queried user', - payload: following, - success: true, - statusCode: 200, - }); -}; - router.get( validateRequest({ querySchema: z.object({ @@ -62,7 +21,7 @@ router.get( page_num: z.string().regex(/^\d+$/), }), }), - getFollowingInfo, + getUserFollowers, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/users/[id]/following.ts b/src/pages/api/users/[id]/following.ts index 1c3fa61..9e99111 100644 --- a/src/pages/api/users/[id]/following.ts +++ b/src/pages/api/users/[id]/following.ts @@ -1,10 +1,7 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/User/findUserById'; -import getUsersFollowedByUser from '@/services/UserFollows/getUsersFollowedByUser'; +import { getUsersFollowed } from '@/controllers/users/profile'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; @@ -20,40 +17,6 @@ const router = createRouter< NextApiResponse> >(); -const getFollowingInfo = async ( - req: GetUserFollowInfoRequest, - res: NextApiResponse>, -) => { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { id, page_num, page_size } = req.query; - - const user = await findUserById(id); - if (!user) { - throw new ServerError('User not found', 404); - } - - const pageNum = parseInt(page_num, 10); - const pageSize = parseInt(page_size, 10); - - const following = await getUsersFollowedByUser({ - userId: id, - pageNum, - pageSize, - }); - const followingCount = await DBClient.instance.userFollow.count({ - where: { follower: { id } }, - }); - - res.setHeader('X-Total-Count', followingCount); - - res.json({ - message: 'Retrieved users that are followed by queried user', - payload: following, - success: true, - statusCode: 200, - }); -}; - router.get( validateRequest({ querySchema: z.object({ @@ -62,7 +25,7 @@ router.get( page_num: z.string().regex(/^\d+$/), }), }), - getFollowingInfo, + getUsersFollowed, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/users/[id]/index.ts b/src/pages/api/users/[id]/index.ts index d0da141..afa2179 100644 --- a/src/pages/api/users/[id]/index.ts +++ b/src/pages/api/users/[id]/index.ts @@ -1,113 +1,16 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import deleteUserById from '@/services/User/deleteUserById'; -import findUserByEmail from '@/services/User/findUserByEmail'; -import findUserById from '@/services/User/findUserById'; -import findUserByUsername from '@/services/User/findUserByUsername'; -import { BaseCreateUserSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { editUserInfo, deleteAccount } from '@/controllers/users/auth'; +import { checkIfUserCanEditUser } from '@/controllers/users/profile'; +import { EditUserRequest } from '@/controllers/users/profile/types'; +import EditUserSchema from '@/services/User/schema/EditUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { NextHandler, createRouter } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -const EditUserSchema = BaseCreateUserSchema.pick({ - username: true, - email: true, - firstName: true, - lastName: true, -}); - -interface UserRouteRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} - -interface EditUserRequest extends UserRouteRequest { - body: z.infer; -} - -const checkIfUserCanEditUser = async ( - req: EditUserRequest, - res: NextApiResponse, - next: NextHandler, -) => { - const authenticatedUser = req.user!; - - const userToUpdate = await findUserById(req.query.id); - if (!userToUpdate) { - throw new ServerError('User not found', 404); - } - - if (authenticatedUser.id !== userToUpdate.id) { - throw new ServerError('You are not permitted to modify this user', 403); - } - - return next(); -}; - -const editUser = async ( - req: EditUserRequest, - res: NextApiResponse>, -) => { - const { email, firstName, lastName, username } = req.body; - - const [usernameIsTaken, emailIsTaken] = await Promise.all([ - findUserByUsername(username), - findUserByEmail(email), - ]); - - const emailChanged = req.user!.email !== email; - const usernameChanged = req.user!.username !== username; - - if (emailIsTaken && emailChanged) { - throw new ServerError('Email is already taken', 400); - } - - if (usernameIsTaken && usernameChanged) { - throw new ServerError('Username is already taken', 400); - } - - const updatedUser = await DBClient.instance.user.update({ - where: { id: req.user!.id }, - data: { - email, - firstName, - lastName, - username, - accountIsVerified: emailChanged ? false : undefined, - }, - }); - - res.json({ - message: 'User edited successfully', - payload: updatedUser, - success: true, - statusCode: 200, - }); -}; - -const deleteUser = async ( - req: UserRouteRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - const deletedUser = await deleteUserById(id); - - if (!deletedUser) { - throw new ServerError('Could not find a user with that id.', 400); - } - - res.send({ - message: 'Successfully deleted user.', - statusCode: 200, - success: true, - }); -}; - const router = createRouter< EditUserRequest, NextApiResponse> @@ -120,7 +23,7 @@ router.put( querySchema: z.object({ id: z.string().cuid() }), }), checkIfUserCanEditUser, - editUser, + editUserInfo, ); router.delete( @@ -129,7 +32,7 @@ router.delete( querySchema: z.object({ id: z.string().cuid() }), }), checkIfUserCanEditUser, - deleteUser, + deleteAccount, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/users/[id]/is-followed.ts b/src/pages/api/users/[id]/is-followed.ts index ef6c368..a53ed42 100644 --- a/src/pages/api/users/[id]/is-followed.ts +++ b/src/pages/api/users/[id]/is-followed.ts @@ -1,62 +1,21 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/User/findUserById'; - -import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; - import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetUserFollowInfoRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} +import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; +import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; +import validateRequest from '@/config/nextConnect/middleware/validateRequest'; + +import { checkIfUserIsFollowedBySessionUser } from '@/controllers/users/profile'; +import { GetUserFollowInfoRequest } from '@/controllers/users/profile/types'; + +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; const router = createRouter< GetUserFollowInfoRequest, NextApiResponse> >(); -const checkIfUserIsFollowedBySessionUser = async ( - req: GetUserFollowInfoRequest, - res: NextApiResponse>, -) => { - const { id } = req.query; - - const user = await findUserById(id); - if (!user) { - throw new ServerError('User not found', 404); - } - - const currentUser = req.user!; - - const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ - where: { followerId: currentUser.id, followingId: id }, - }); - - if (!userIsFollowedBySessionUser) { - res.status(200).json({ - message: 'User is not followed by the current user.', - success: true, - statusCode: 200, - payload: { isFollowed: false }, - }); - - return; - } - - res.status(200).json({ - message: 'User is followed by the current user.', - success: true, - statusCode: 200, - payload: { isFollowed: true }, - }); -}; - router.get( validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), getCurrentUser, diff --git a/src/pages/api/users/[id]/posts/beers.ts b/src/pages/api/users/[id]/posts/beers.ts index 040e64b..a710d6b 100644 --- a/src/pages/api/users/[id]/posts/beers.ts +++ b/src/pages/api/users/[id]/posts/beers.ts @@ -1,48 +1,15 @@ -import { NextApiRequest, NextApiResponse } from 'next'; +import { 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>, -) => { - 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, - }); -}; +import { GetPostsByUserIdRequest } from '@/controllers/posts/types'; +import { getBeerPostsByUserId } from '@/controllers/posts/beerPosts'; const router = createRouter< - GetBeerPostsRequest, + GetPostsByUserIdRequest, NextApiResponse> >(); diff --git a/src/pages/api/users/[id]/posts/breweries.ts b/src/pages/api/users/[id]/posts/breweries.ts index 1b8975f..dcc79b8 100644 --- a/src/pages/api/users/[id]/posts/breweries.ts +++ b/src/pages/api/users/[id]/posts/breweries.ts @@ -1,52 +1,15 @@ -import { NextApiRequest, NextApiResponse } from 'next'; +import { 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>, -) => { - 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, - }); -}; +import { getBreweryPostsByUserId } from '@/controllers/posts/breweries'; +import { GetPostsByUserIdRequest } from '@/controllers/posts/types'; const router = createRouter< - GetBreweryPostsRequest, + GetPostsByUserIdRequest, NextApiResponse> >(); diff --git a/src/pages/api/users/[id]/profile/update-avatar.ts b/src/pages/api/users/[id]/profile/update-avatar.ts index fa25dd7..c08de09 100644 --- a/src/pages/api/users/[id]/profile/update-avatar.ts +++ b/src/pages/api/users/[id]/profile/update-avatar.ts @@ -33,7 +33,7 @@ const checkIfUserCanUpdateProfile = async ( await next(); }; -const updateProfile = async (req: UpdateProfileRequest, res: NextApiResponse) => { +const updateAvatar = async (req: UpdateProfileRequest, res: NextApiResponse) => { const { file, user } = req; const avatar: UpdateUserAvatarByIdParams['data']['avatar'] = { @@ -60,7 +60,7 @@ router.put( checkIfUserCanUpdateProfile, // @ts-expect-error singleUploadMiddleware, - updateProfile, + updateAvatar, ); const handler = router.handler(); diff --git a/src/pages/api/users/[id]/profile/update-bio.ts b/src/pages/api/users/[id]/profile/update-bio.ts index 1b0645c..65c0b68 100644 --- a/src/pages/api/users/[id]/profile/update-bio.ts +++ b/src/pages/api/users/[id]/profile/update-bio.ts @@ -1,75 +1,13 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; - import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import { checkIfUserCanUpdateProfile, updateProfile } from '@/controllers/users/profile'; +import { UpdateProfileRequest } from '@/controllers/users/profile/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { NextHandler, createRouter } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface UpdateProfileRequest extends UserExtendedNextApiRequest { - body: { bio: string }; -} - -interface UpdateUserProfileByIdParams { - id: string; - data: { bio: string }; -} - -const updateUserProfileById = async ({ id, data }: UpdateUserProfileByIdParams) => { - const user: z.infer = await DBClient.instance.user.update({ - where: { id }, - data: { bio: data.bio }, - select: { - id: true, - username: true, - email: true, - bio: true, - userAvatar: true, - accountIsVerified: true, - createdAt: true, - firstName: true, - lastName: true, - updatedAt: true, - dateOfBirth: true, - role: true, - }, - }); - - return user; -}; - -const updateProfile = async (req: UpdateProfileRequest, res: NextApiResponse) => { - const user = req.user!; - const { body } = req; - - await updateUserProfileById({ id: user!.id, data: { bio: body.bio } }); - - res.status(200).json({ - message: 'Profile updated successfully.', - statusCode: 200, - success: true, - }); -}; - -const checkIfUserCanUpdateProfile = async ( - req: UpdateProfileRequest, - res: NextApiResponse, - next: NextHandler, -) => { - const user = req.user!; - - if (user.id !== req.query.id) { - throw new ServerError('You can only update your own profile.', 403); - } - - await next(); -}; - const router = createRouter< UpdateProfileRequest, NextApiResponse> diff --git a/src/pages/api/users/check-email.ts b/src/pages/api/users/check-email.ts index 4d03c37..b48a3b7 100644 --- a/src/pages/api/users/check-email.ts +++ b/src/pages/api/users/check-email.ts @@ -1,38 +1,18 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import findUserByEmail from '@/services/User/findUserByEmail'; - -const CheckEmailRequestQuerySchema = z.object({ - email: z.string(), -}); - -interface CheckEmailRequestSchema extends NextApiRequest { - query: z.infer; -} +import { CheckEmailRequest } from '@/controllers/users/auth/types'; +import { checkEmail } from '@/controllers/users/auth'; const router = createRouter< - CheckEmailRequestSchema, + CheckEmailRequest, NextApiResponse> >(); -const checkEmail = async (req: NextApiRequest, res: NextApiResponse) => { - const { email: emailToCheck } = req.query; - - const email = await findUserByEmail(emailToCheck as string); - - res.json({ - success: true, - payload: { emailIsTaken: !!email }, - statusCode: 200, - message: 'Getting email availability.', - }); -}; - router.get( validateRequest({ querySchema: z.object({ email: z.string().email() }) }), checkEmail, diff --git a/src/pages/api/users/check-username.ts b/src/pages/api/users/check-username.ts index ebf4f60..5c2e79b 100644 --- a/src/pages/api/users/check-username.ts +++ b/src/pages/api/users/check-username.ts @@ -1,38 +1,19 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import findUserByUsername from '@/services/User/findUserByUsername'; -const CheckUsernameRequestQuerySchema = z.object({ - username: z.string(), -}); - -interface CheckUsernameRequestSchema extends NextApiRequest { - query: z.infer; -} +import { CheckUsernameRequest } from '@/controllers/users/auth/types'; +import { checkUsername } from '@/controllers/users/auth'; const router = createRouter< - CheckUsernameRequestSchema, + CheckUsernameRequest, NextApiResponse> >(); -const checkUsername = async (req: NextApiRequest, res: NextApiResponse) => { - const { username: usernameToCheck } = req.query; - - const user = await findUserByUsername(usernameToCheck as string); - - res.json({ - success: true, - payload: { usernameIsTaken: !!user }, - statusCode: 200, - message: 'Getting username availability.', - }); -}; - router.get( validateRequest({ querySchema: z.object({ username: z.string() }) }), checkUsername, diff --git a/src/pages/api/users/confirm.ts b/src/pages/api/users/confirm.ts index 165a41b..274cb0a 100644 --- a/src/pages/api/users/confirm.ts +++ b/src/pages/api/users/confirm.ts @@ -7,8 +7,8 @@ import { createRouter } from 'next-connect'; import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { TokenValidationRequest } from '@/controllers/auth/types'; -import { confirmUser } from '@/controllers/auth'; +import { TokenValidationRequest } from '@/controllers/users/auth/types'; +import { confirmUser } from '@/controllers/users/auth'; import TokenValidationSchema from '@/services/User/schema/TokenValidationSchema'; const router = createRouter< diff --git a/src/pages/api/users/current.ts b/src/pages/api/users/current.ts index aff2a35..ba7fd7c 100644 --- a/src/pages/api/users/current.ts +++ b/src/pages/api/users/current.ts @@ -5,16 +5,7 @@ import { NextApiResponse } from 'next'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { createRouter } from 'next-connect'; import { z } from 'zod'; - -const sendCurrentUser = async (req: UserExtendedNextApiRequest, res: NextApiResponse) => { - const { user } = req; - res.status(200).json({ - message: `Currently logged in as ${user!.username}`, - statusCode: 200, - success: true, - payload: user, - }); -}; +import { sendCurrentUser } from '@/controllers/users/auth'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/users/edit-password.ts b/src/pages/api/users/edit-password.ts index d62f21c..899b2f9 100644 --- a/src/pages/api/users/edit-password.ts +++ b/src/pages/api/users/edit-password.ts @@ -1,38 +1,14 @@ -import { hashPassword } from '@/config/auth/passwordFns'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; +import { updatePassword } from '@/controllers/users/auth'; +import { UpdatePasswordRequest } from '@/controllers/users/auth/types'; import { UpdatePasswordSchema } from '@/services/User/schema/CreateUserValidationSchemas'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface UpdatePasswordRequest extends UserExtendedNextApiRequest { - body: z.infer; -} - -const updatePassword = async ( - req: UpdatePasswordRequest, - res: NextApiResponse>, -) => { - const { password } = req.body; - const hash = await hashPassword(password); - - const user = req.user!; - await DBClient.instance.user.update({ - data: { hash }, - where: { id: user.id }, - }); - - res.json({ - message: 'Updated user password.', - statusCode: 200, - success: true, - }); -}; const router = createRouter< UpdatePasswordRequest, NextApiResponse> diff --git a/src/pages/api/users/forgot-password.ts b/src/pages/api/users/forgot-password.ts index e892acc..a1789aa 100644 --- a/src/pages/api/users/forgot-password.ts +++ b/src/pages/api/users/forgot-password.ts @@ -5,8 +5,8 @@ import { createRouter } from 'next-connect'; import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { resetPassword } from '@/controllers/auth'; -import { ResetPasswordRequest } from '@/controllers/auth/types'; +import { resetPassword } from '@/controllers/users/auth'; +import { ResetPasswordRequest } from '@/controllers/users/auth/types'; const router = createRouter< ResetPasswordRequest, diff --git a/src/pages/api/users/login.ts b/src/pages/api/users/login.ts index 5d9abbc..4648f44 100644 --- a/src/pages/api/users/login.ts +++ b/src/pages/api/users/login.ts @@ -6,7 +6,7 @@ import { z } from 'zod'; import LoginValidationSchema from '@/services/User/schema/LoginValidationSchema'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { authenticateUser, loginUser } from '@/controllers/auth'; +import { authenticateUser, loginUser } from '@/controllers/users/auth'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/users/logout.ts b/src/pages/api/users/logout.ts index ef198b8..0e23889 100644 --- a/src/pages/api/users/logout.ts +++ b/src/pages/api/users/logout.ts @@ -3,7 +3,7 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiRequest, NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { logoutUser } from '@/controllers/auth'; +import { logoutUser } from '@/controllers/users/auth'; const router = createRouter< NextApiRequest, diff --git a/src/pages/api/users/register.ts b/src/pages/api/users/register.ts index 0960df3..8ee065e 100644 --- a/src/pages/api/users/register.ts +++ b/src/pages/api/users/register.ts @@ -5,8 +5,8 @@ import { CreateUserValidationSchema } from '@/services/User/schema/CreateUserVal import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { registerUser } from '@/controllers/auth'; -import { RegisterUserRequest } from '@/controllers/auth/types'; +import { registerUser } from '@/controllers/users/auth'; +import { RegisterUserRequest } from '@/controllers/users/auth/types'; const router = createRouter< RegisterUserRequest, diff --git a/src/pages/api/users/resend-confirmation.ts b/src/pages/api/users/resend-confirmation.ts index d422c29..56c92ab 100644 --- a/src/pages/api/users/resend-confirmation.ts +++ b/src/pages/api/users/resend-confirmation.ts @@ -5,21 +5,7 @@ import { NextApiResponse } from 'next'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import sendConfirmationEmail from '@/services/User/sendConfirmationEmail'; - -const resendConfirmation = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse, -) => { - const user = req.user!; - - await sendConfirmationEmail(user); - res.status(200).json({ - message: `Resent the confirmation email for ${user.username}.`, - statusCode: 200, - success: true, - }); -}; +import { resendConfirmation } from '@/controllers/users/auth'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/services/BeerPost/getBeerPostsByBeerStyleId.ts b/src/services/BeerPost/getBeerPostsByBeerStyleId.ts index 6fabe91..ccc089f 100644 --- a/src/services/BeerPost/getBeerPostsByBeerStyleId.ts +++ b/src/services/BeerPost/getBeerPostsByBeerStyleId.ts @@ -16,7 +16,7 @@ const getBeerPostsByBeerStyleId = async ({ const beers = await DBClient.instance.beerPost.findMany({ where: { styleId }, take: pageSize, - skip: pageNum * pageSize, + skip: (pageNum - 1) * pageSize, select: { id: true, name: true, diff --git a/src/services/BeerPost/getBeerPostsByBreweryId.ts b/src/services/BeerPost/getBeerPostsByBreweryId.ts index 1bbbc58..4c7946a 100644 --- a/src/services/BeerPost/getBeerPostsByBreweryId.ts +++ b/src/services/BeerPost/getBeerPostsByBreweryId.ts @@ -16,7 +16,7 @@ const getAllBeerPostsByBreweryId = async ({ const beers = await DBClient.instance.beerPost.findMany({ where: { breweryId }, take: pageSize, - skip: pageNum * pageSize, + skip: (pageNum - 1) * pageSize, select: { id: true, name: true, diff --git a/src/services/BeerPost/getBeerPostsByPostedById.ts b/src/services/BeerPost/getBeerPostsByPostedById.ts index 31ce792..1d6589d 100644 --- a/src/services/BeerPost/getBeerPostsByPostedById.ts +++ b/src/services/BeerPost/getBeerPostsByPostedById.ts @@ -16,7 +16,7 @@ const getBeerPostsByPostedById = async ({ const beers = await DBClient.instance.beerPost.findMany({ where: { postedBy: { id: postedById } }, take: pageSize, - skip: pageNum * pageSize, + skip: (pageNum - 1) * pageSize, select: { id: true, name: true, diff --git a/src/services/User/schema/EditUserSchema.ts b/src/services/User/schema/EditUserSchema.ts new file mode 100644 index 0000000..f9d4bad --- /dev/null +++ b/src/services/User/schema/EditUserSchema.ts @@ -0,0 +1,10 @@ +import { BaseCreateUserSchema } from './CreateUserValidationSchemas'; + +const EditUserSchema = BaseCreateUserSchema.pick({ + username: true, + email: true, + firstName: true, + lastName: true, +}); + +export default EditUserSchema; diff --git a/src/services/User/updateUserProfileById.ts b/src/services/User/updateUserProfileById.ts new file mode 100644 index 0000000..204aba9 --- /dev/null +++ b/src/services/User/updateUserProfileById.ts @@ -0,0 +1,33 @@ +import DBClient from '@/prisma/DBClient'; +import { z } from 'zod'; +import GetUserSchema from './schema/GetUserSchema'; + +interface UpdateUserProfileByIdParams { + id: string; + data: { bio: string }; +} + +const updateUserProfileById = async ({ id, data }: UpdateUserProfileByIdParams) => { + const user: z.infer = await DBClient.instance.user.update({ + where: { id }, + data: { bio: data.bio }, + select: { + id: true, + username: true, + email: true, + bio: true, + userAvatar: true, + accountIsVerified: true, + createdAt: true, + firstName: true, + lastName: true, + updatedAt: true, + dateOfBirth: true, + role: true, + }, + }); + + return user; +}; + +export default updateUserProfileById; From 01a9bfaf4e4b5fff462fb3797e3d5489c5d9aa5b Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Thu, 7 Dec 2023 21:12:17 -0500 Subject: [PATCH 09/21] fix update-avatar --- .../api/users/[id]/profile/update-avatar.ts | 48 ++----------------- .../{update-bio.ts => update-profile.ts} | 0 ....ts.ts => sendUpdateUserProfileRequest.ts} | 2 +- 3 files changed, 4 insertions(+), 46 deletions(-) rename src/pages/api/users/[id]/profile/{update-bio.ts => update-profile.ts} (100%) rename src/requests/Account/{sendUpdateUserProfileRequest.ts.ts => sendUpdateUserProfileRequest.ts} (97%) diff --git a/src/pages/api/users/[id]/profile/update-avatar.ts b/src/pages/api/users/[id]/profile/update-avatar.ts index c08de09..7cc918e 100644 --- a/src/pages/api/users/[id]/profile/update-avatar.ts +++ b/src/pages/api/users/[id]/profile/update-avatar.ts @@ -1,54 +1,12 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { singleUploadMiddleware } from '@/config/multer/uploadMiddleware'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; - -import ServerError from '@/config/util/ServerError'; +import { checkIfUserCanUpdateProfile, updateAvatar } from '@/controllers/users/profile'; +import { UpdateProfileRequest } from '@/controllers/users/profile/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { NextHandler, createRouter } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -import updateUserAvatarById, { - UpdateUserAvatarByIdParams, -} from '@/services/UserAccount/UpdateUserAvatarByIdParams'; - -interface UpdateProfileRequest extends UserExtendedNextApiRequest { - file: Express.Multer.File; - body: { - bio: string; - }; -} - -const checkIfUserCanUpdateProfile = async ( - req: UpdateProfileRequest, - res: NextApiResponse, - next: NextHandler, -) => { - const user = req.user!; - - if (user.id !== req.query.id) { - throw new ServerError('You can only update your own profile.', 403); - } - - await next(); -}; - -const updateAvatar = async (req: UpdateProfileRequest, res: NextApiResponse) => { - const { file, user } = req; - - const avatar: UpdateUserAvatarByIdParams['data']['avatar'] = { - alt: file.originalname, - path: file.path, - caption: '', - }; - - await updateUserAvatarById({ id: user!.id, data: { avatar } }); - res.status(200).json({ - message: 'User avatar updated successfully.', - statusCode: 200, - success: true, - }); -}; const router = createRouter< UpdateProfileRequest, diff --git a/src/pages/api/users/[id]/profile/update-bio.ts b/src/pages/api/users/[id]/profile/update-profile.ts similarity index 100% rename from src/pages/api/users/[id]/profile/update-bio.ts rename to src/pages/api/users/[id]/profile/update-profile.ts diff --git a/src/requests/Account/sendUpdateUserProfileRequest.ts.ts b/src/requests/Account/sendUpdateUserProfileRequest.ts similarity index 97% rename from src/requests/Account/sendUpdateUserProfileRequest.ts.ts rename to src/requests/Account/sendUpdateUserProfileRequest.ts index 8d421d6..b55fb8a 100644 --- a/src/requests/Account/sendUpdateUserProfileRequest.ts.ts +++ b/src/requests/Account/sendUpdateUserProfileRequest.ts @@ -10,7 +10,7 @@ const sendUpdateUserProfileRequest = async ({ bio, userId, }: UpdateProfileRequestParams) => { - const response = await fetch(`/api/users/${userId}/profile/update-bio`, { + const response = await fetch(`/api/users/${userId}/profile/update-profile`, { method: 'PUT', body: JSON.stringify({ bio }), headers: { 'Content-Type': 'application/json' }, From 38ecd3a5fb83b83715b288b9696828a8fe95cd10 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Thu, 7 Dec 2023 22:00:18 -0500 Subject: [PATCH 10/21] Fix brewery creation --- .../BreweryPost/CreateBreweryPostForm.tsx | 10 +++++++--- src/pages/breweries/create.tsx | 15 +++++++++++---- src/pages/users/account/edit-profile.tsx | 2 +- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/components/BreweryPost/CreateBreweryPostForm.tsx b/src/components/BreweryPost/CreateBreweryPostForm.tsx index 4e19052..19ca318 100644 --- a/src/components/BreweryPost/CreateBreweryPostForm.tsx +++ b/src/components/BreweryPost/CreateBreweryPostForm.tsx @@ -108,7 +108,8 @@ const LocationSection: FC<{ errors: FieldErrors>; isSubmitting: boolean; setValue: UseFormSetValue>; -}> = ({ register, errors, isSubmitting, setValue }) => { + mapboxAccessToken: string; +}> = ({ register, errors, isSubmitting, setValue, mapboxAccessToken }) => { const onAutoCompleteChange = (address: string) => { setValue('address', address); }; @@ -133,7 +134,7 @@ const LocationSection: FC<{ @@ -201,7 +202,9 @@ const LocationSection: FC<{ ); }; -const CreateBreweryPostForm: FC = () => { +const CreateBreweryPostForm: FC<{ + mapboxAccessToken: string; +}> = ({ mapboxAccessToken }) => { const { register, handleSubmit, @@ -268,6 +271,7 @@ const CreateBreweryPostForm: FC = () => { register={register} errors={errors} isSubmitting={isSubmitting} + mapboxAccessToken={mapboxAccessToken} /> diff --git a/src/pages/breweries/create.tsx b/src/pages/breweries/create.tsx index d8cd0ec..6b7a988 100644 --- a/src/pages/breweries/create.tsx +++ b/src/pages/breweries/create.tsx @@ -1,12 +1,17 @@ import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import withPageAuthRequired from '@/util/withPageAuthRequired'; -import { GetServerSideProps, NextPage } from 'next'; +import { NextPage } from 'next'; import Head from 'next/head'; import { FaBeer } from 'react-icons/fa'; import CreateBreweryPostForm from '@/components/BreweryPost/CreateBreweryPostForm'; +import { MAPBOX_ACCESS_TOKEN } from '@/config/env'; -const CreateBreweryPage: NextPage = () => { +interface CreateBreweryPageProps { + mapboxAccessToken: string; +} + +const CreateBreweryPage: NextPage = ({ mapboxAccessToken }) => { return ( <> @@ -20,7 +25,7 @@ const CreateBreweryPage: NextPage = () => { headingText="Create Brewery" headingIcon={FaBeer} > - + @@ -30,4 +35,6 @@ const CreateBreweryPage: NextPage = () => { export default CreateBreweryPage; -export const getServerSideProps: GetServerSideProps = withPageAuthRequired(); +export const getServerSideProps = withPageAuthRequired( + async () => ({ props: { mapboxAccessToken: MAPBOX_ACCESS_TOKEN } }), +); diff --git a/src/pages/users/account/edit-profile.tsx b/src/pages/users/account/edit-profile.tsx index bb04dad..230399b 100644 --- a/src/pages/users/account/edit-profile.tsx +++ b/src/pages/users/account/edit-profile.tsx @@ -23,7 +23,7 @@ import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetU import UpdateProfileSchema from '@/services/User/schema/UpdateProfileSchema'; import sendUpdateUserAvatarRequest from '@/requests/Account/sendUpdateUserAvatarRequest'; -import sendUpdateUserProfileRequest from '@/requests/Account/sendUpdateUserProfileRequest.ts'; +import sendUpdateUserProfileRequest from '@/requests/Account/sendUpdateUserProfileRequest'; import Spinner from '@/components/ui/Spinner'; const ProfilePage: NextPage = () => { From 830e9dc8453c5241b322bc26574d69ac8aad3add Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 10 Dec 2023 12:47:09 -0500 Subject: [PATCH 11/21] Update eslint config, brewery post controllers --- .eslintrc.json | 4 +- src/controllers/images/beerImages/index.ts | 4 +- src/controllers/images/breweryImages/index.ts | 34 ++++ .../images/{beerImages => }/types/index.ts | 2 +- .../likes/breweryPostLikes/index.ts | 94 ++++++++++ src/controllers/posts/beerPosts/index.ts | 4 +- src/controllers/posts/beerStyles/index.ts | 11 +- .../posts/beerStyles/types/index.ts | 4 - src/controllers/posts/breweries/index.ts | 163 +++++++++++++++++- .../posts/breweries/types/index.ts | 13 ++ src/controllers/posts/types/index.ts | 31 +++- src/pages/api/beers/[id]/images/index.ts | 4 +- src/pages/api/breweries/[id]/beers/index.ts | 65 +------ src/pages/api/breweries/[id]/images/index.ts | 42 +---- src/pages/api/breweries/[id]/like/index.ts | 78 +-------- src/pages/api/breweries/[id]/like/is-liked.ts | 27 +-- src/pages/api/breweries/create.ts | 6 +- src/pages/api/breweries/index.ts | 29 +--- src/pages/api/breweries/map/index.ts | 4 +- src/pages/api/users/[id]/posts/beers.ts | 4 +- src/pages/api/users/[id]/posts/breweries.ts | 4 +- 21 files changed, 372 insertions(+), 255 deletions(-) create mode 100644 src/controllers/images/breweryImages/index.ts rename src/controllers/images/{beerImages => }/types/index.ts (79%) create mode 100644 src/controllers/likes/breweryPostLikes/index.ts create mode 100644 src/controllers/posts/breweries/types/index.ts diff --git a/.eslintrc.json b/.eslintrc.json index ea29278..0ad70c2 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -2,7 +2,9 @@ "extends": ["next/core-web-vitals", "airbnb-base", "airbnb-typescript", "prettier"], "rules": { "arrow-body-style": "off", - "import/extensions": "off" + "import/extensions": "warn", + "import/order": "warn", + "import/no-extraneous-dependencies": ["error", { "devDependencies": true }] }, "parserOptions": { "project": ["./tsconfig.json"] diff --git a/src/controllers/images/beerImages/index.ts b/src/controllers/images/beerImages/index.ts index 13835b3..cd996f7 100644 --- a/src/controllers/images/beerImages/index.ts +++ b/src/controllers/images/beerImages/index.ts @@ -3,11 +3,11 @@ import addBeerImageToDB from '@/services/BeerImage/addBeerImageToDB'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import { UploadBeerPostImagesRequest } from './types'; +import { UploadImagesRequest } from '../types'; // eslint-disable-next-line import/prefer-default-export export const processBeerImageData = async ( - req: UploadBeerPostImagesRequest, + req: UploadImagesRequest, res: NextApiResponse>, ) => { const { files, user, body } = req; diff --git a/src/controllers/images/breweryImages/index.ts b/src/controllers/images/breweryImages/index.ts new file mode 100644 index 0000000..8f7b33b --- /dev/null +++ b/src/controllers/images/breweryImages/index.ts @@ -0,0 +1,34 @@ +import ServerError from '@/config/util/ServerError'; +import addBreweryImageToDB from '@/services/BreweryImage/addBreweryImageToDB'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { z } from 'zod'; +import { UploadImagesRequest } from '../types'; + +// eslint-disable-next-line import/prefer-default-export +export const processBreweryImageData = async ( + req: UploadImagesRequest, + res: NextApiResponse>, +) => { + const { files, user, body } = req; + + if (!files || !files.length) { + throw new ServerError('No images uploaded', 400); + } + + const breweryImages = await addBreweryImageToDB({ + alt: body.alt, + caption: body.caption, + breweryPostId: req.query.id, + userId: user!.id, + files, + }); + + res.status(200).json({ + success: true, + message: `Successfully uploaded ${breweryImages.length} image${ + breweryImages.length > 1 ? 's' : '' + }`, + statusCode: 200, + }); +}; diff --git a/src/controllers/images/beerImages/types/index.ts b/src/controllers/images/types/index.ts similarity index 79% rename from src/controllers/images/beerImages/types/index.ts rename to src/controllers/images/types/index.ts index bf8e8dd..f91a095 100644 --- a/src/controllers/images/beerImages/types/index.ts +++ b/src/controllers/images/types/index.ts @@ -2,7 +2,7 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; import { z } from 'zod'; -export interface UploadBeerPostImagesRequest extends UserExtendedNextApiRequest { +export interface UploadImagesRequest extends UserExtendedNextApiRequest { files?: Express.Multer.File[]; query: { id: string }; body: z.infer; diff --git a/src/controllers/likes/breweryPostLikes/index.ts b/src/controllers/likes/breweryPostLikes/index.ts new file mode 100644 index 0000000..d09ac56 --- /dev/null +++ b/src/controllers/likes/breweryPostLikes/index.ts @@ -0,0 +1,94 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import ServerError from '@/config/util/ServerError'; +import DBClient from '@/prisma/DBClient'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse, NextApiRequest } from 'next'; +import { z } from 'zod'; + +export const sendBreweryPostLikeRequest = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, +) => { + const id = req.query.id! as string; + const user = req.user!; + + const breweryPost = await DBClient.instance.breweryPost.findUnique({ + where: { id }, + }); + + if (!breweryPost) { + throw new ServerError('Could not find a brewery post with that id', 404); + } + + const alreadyLiked = await DBClient.instance.breweryPostLike.findFirst({ + where: { breweryPostId: breweryPost.id, likedById: user.id }, + }); + + const jsonResponse = { + success: true as const, + message: '', + statusCode: 200 as const, + }; + + if (alreadyLiked) { + await DBClient.instance.breweryPostLike.delete({ + where: { id: alreadyLiked.id }, + }); + jsonResponse.message = 'Successfully unliked brewery post'; + } else { + await DBClient.instance.breweryPostLike.create({ + data: { breweryPostId: breweryPost.id, likedById: user.id }, + }); + jsonResponse.message = 'Successfully liked brewery post'; + } + + res.status(200).json(jsonResponse); +}; + +export const getBreweryPostLikeCount = async ( + req: NextApiRequest, + res: NextApiResponse>, +) => { + const id = req.query.id! as string; + + const breweryPost = await DBClient.instance.breweryPost.findUnique({ + where: { id }, + }); + + if (!breweryPost) { + throw new ServerError('Could not find a brewery post with that id', 404); + } + + const likeCount = await DBClient.instance.breweryPostLike.count({ + where: { breweryPostId: breweryPost.id }, + }); + + res.status(200).json({ + success: true, + message: 'Successfully retrieved like count', + statusCode: 200, + payload: { likeCount }, + }); +}; + +export const getBreweryPostLikeStatus = async ( + req: UserExtendedNextApiRequest, + res: NextApiResponse>, +) => { + const user = req.user!; + const id = req.query.id as string; + + const alreadyLiked = await DBClient.instance.breweryPostLike.findFirst({ + where: { + breweryPostId: id, + likedById: user.id, + }, + }); + + res.status(200).json({ + success: true, + message: alreadyLiked ? 'Brewery post is liked.' : 'Brewery post is not liked.', + statusCode: 200, + payload: { isLiked: !!alreadyLiked }, + }); +}; diff --git a/src/controllers/posts/beerPosts/index.ts b/src/controllers/posts/beerPosts/index.ts index 600318b..9daf865 100644 --- a/src/controllers/posts/beerPosts/index.ts +++ b/src/controllers/posts/beerPosts/index.ts @@ -18,7 +18,7 @@ import { GetAllBeerPostsRequest, GetBeerRecommendationsRequest, } from './types'; -import { GetPostsByUserIdRequest } from '../types'; +import { GetAllPostsByConnectedPostId } from '../types'; export const checkIfBeerPostOwner = async ( req: BeerPostRequestType, @@ -145,7 +145,7 @@ export const createBeerPost = async ( }; export const getBeerPostsByUserId = async ( - req: GetPostsByUserIdRequest, + req: GetAllPostsByConnectedPostId, res: NextApiResponse>, ) => { const pageNum = parseInt(req.query.page_num, 10); diff --git a/src/controllers/posts/beerStyles/index.ts b/src/controllers/posts/beerStyles/index.ts index 91eac09..a49ea42 100644 --- a/src/controllers/posts/beerStyles/index.ts +++ b/src/controllers/posts/beerStyles/index.ts @@ -10,13 +10,8 @@ import getBeerPostsByBeerStyleId from '@/services/BeerPost/getBeerPostsByBeerSty import getAllBeerStyles from '@/services/BeerStyles/getAllBeerStyles'; import ServerError from '@/config/util/ServerError'; -import { - CreateBeerStyleRequest, - GetAllBeersByBeerStyleRequest, - GetBeerStyleByIdRequest, -} from './types'; - -import { GetAllPostsRequest } from '../types'; +import { CreateBeerStyleRequest, GetBeerStyleByIdRequest } from './types'; +import { GetAllPostsByConnectedPostId, GetAllPostsRequest } from '../types'; export const getBeerStyle = async ( req: GetBeerStyleByIdRequest, @@ -35,7 +30,7 @@ export const getBeerStyle = async ( }; export const getAllBeersByBeerStyle = async ( - req: GetAllBeersByBeerStyleRequest, + req: GetAllPostsByConnectedPostId, res: NextApiResponse>, ) => { // eslint-disable-next-line @typescript-eslint/naming-convention diff --git a/src/controllers/posts/beerStyles/types/index.ts b/src/controllers/posts/beerStyles/types/index.ts index 9ffc675..edb0042 100644 --- a/src/controllers/posts/beerStyles/types/index.ts +++ b/src/controllers/posts/beerStyles/types/index.ts @@ -1,6 +1,5 @@ import { NextApiRequest } from 'next'; -import { GetAllPostsRequest } from '@/controllers/posts/types'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { z } from 'zod'; import CreateBeerStyleValidationSchema from '@/services/BeerStyles/schema/CreateBeerStyleValidationSchema'; @@ -9,9 +8,6 @@ export interface GetBeerStyleByIdRequest extends NextApiRequest { query: { id: string }; } -export interface GetAllBeersByBeerStyleRequest extends GetAllPostsRequest { - query: { page_size: string; page_num: string; id: string }; -} export interface CreateBeerStyleRequest extends UserExtendedNextApiRequest { body: z.infer; } diff --git a/src/controllers/posts/breweries/index.ts b/src/controllers/posts/breweries/index.ts index e3b7c0c..05de01b 100644 --- a/src/controllers/posts/breweries/index.ts +++ b/src/controllers/posts/breweries/index.ts @@ -3,11 +3,17 @@ import getAllBreweryPostsByPostedById from '@/services/BreweryPost/getAllBrewery import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import { GetPostsByUserIdRequest } from '../types'; +import getAllBreweryPosts from '@/services/BreweryPost/getAllBreweryPosts'; +import createNewBreweryPost from '@/services/BreweryPost/createNewBreweryPost'; +import geocode from '@/config/mapbox/geocoder'; +import ServerError from '@/config/util/ServerError'; +import BreweryPostMapQueryResult from '@/services/BreweryPost/schema/BreweryPostMapQueryResult'; +import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import { CreateBreweryPostRequest, GetBreweryPostsRequest } from './types'; +import { GetAllPostsByConnectedPostId } from '../types'; -// eslint-disable-next-line import/prefer-default-export export const getBreweryPostsByUserId = async ( - req: GetPostsByUserIdRequest, + req: GetAllPostsByConnectedPostId, res: NextApiResponse>, ) => { const pageNum = parseInt(req.query.page_num, 10); @@ -34,3 +40,154 @@ export const getBreweryPostsByUserId = async ( success: true, }); }; + +export const getBreweryPosts = async ( + req: GetBreweryPostsRequest, + res: NextApiResponse>, +) => { + const pageNum = parseInt(req.query.page_num, 10); + const pageSize = parseInt(req.query.page_size, 10); + + const breweryPosts = await getAllBreweryPosts({ pageNum, pageSize }); + const breweryPostCount = await DBClient.instance.breweryPost.count(); + + res.setHeader('X-Total-Count', breweryPostCount); + res.status(200).json({ + message: 'Brewery posts retrieved successfully', + statusCode: 200, + payload: breweryPosts, + success: true, + }); +}; + +export const createBreweryPost = async ( + req: CreateBreweryPostRequest, + res: NextApiResponse>, +) => { + const { name, description, dateEstablished, address, city, country, region } = req.body; + const userId = req.user!.id; + + const fullAddress = `${address}, ${city}, ${region}, ${country}`; + + const geocoded = await geocode(fullAddress); + + if (!geocoded) { + throw new ServerError('Address is not valid', 400); + } + + const [latitude, longitude] = geocoded.center; + + const location = await DBClient.instance.breweryLocation.create({ + data: { + address, + city, + country, + stateOrProvince: region, + coordinates: [latitude, longitude], + postedBy: { connect: { id: userId } }, + }, + select: { id: true }, + }); + + const newBreweryPost = await createNewBreweryPost({ + name, + description, + locationId: location.id, + dateEstablished, + userId, + }); + + res.status(201).json({ + message: 'Brewery post created successfully', + statusCode: 201, + payload: newBreweryPost, + success: true, + }); +}; + +export const getMapBreweryPosts = async ( + req: GetBreweryPostsRequest, + res: NextApiResponse>, +) => { + const pageNum = parseInt(req.query.page_num, 10); + const pageSize = parseInt(req.query.page_size, 10); + + const skip = (pageNum - 1) * pageSize; + const take = pageSize; + + const breweryPosts: z.infer[] = + await DBClient.instance.breweryPost.findMany({ + select: { + location: { + select: { coordinates: true, city: true, country: true, stateOrProvince: true }, + }, + id: true, + name: true, + }, + skip, + take, + }); + const breweryPostCount = await DBClient.instance.breweryPost.count(); + + res.setHeader('X-Total-Count', breweryPostCount); + + res.status(200).json({ + message: 'Brewery posts retrieved successfully', + statusCode: 200, + payload: breweryPosts, + success: true, + }); +}; + +export const getAllBeersByBrewery = async ( + req: GetAllPostsByConnectedPostId, + res: NextApiResponse>, +) => { + // eslint-disable-next-line @typescript-eslint/naming-convention + const { page_size, page_num, id } = req.query; + + const pageNum = parseInt(page_num, 10); + const pageSize = parseInt(page_size, 10); + + const beers: z.infer[] = + await DBClient.instance.beerPost.findMany({ + where: { breweryId: id }, + skip: (pageNum - 1) * pageSize, + take: 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, + }, + }, + }, + }); + + const count = await DBClient.instance.beerPost.count({ + where: { breweryId: id }, + }); + + res.setHeader('X-Total-Count', count); + + res.status(200).json({ + message: 'Beers fetched successfully', + statusCode: 200, + payload: beers, + success: true, + }); +}; diff --git a/src/controllers/posts/breweries/types/index.ts b/src/controllers/posts/breweries/types/index.ts new file mode 100644 index 0000000..cfed9f8 --- /dev/null +++ b/src/controllers/posts/breweries/types/index.ts @@ -0,0 +1,13 @@ +import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import CreateBreweryPostSchema from '@/services/BreweryPost/schema/CreateBreweryPostSchema'; +import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; +import { NextApiRequest } from 'next'; +import { z } from 'zod'; + +export interface GetBreweryPostsRequest extends NextApiRequest { + query: z.infer; +} + +export interface CreateBreweryPostRequest extends UserExtendedNextApiRequest { + body: z.infer; +} diff --git a/src/controllers/posts/types/index.ts b/src/controllers/posts/types/index.ts index e6578ac..e98c03f 100644 --- a/src/controllers/posts/types/index.ts +++ b/src/controllers/posts/types/index.ts @@ -1,9 +1,38 @@ import { NextApiRequest } from 'next'; +/** Represents the request object for getting all posts. */ export interface GetAllPostsRequest extends NextApiRequest { query: { page_size: string; page_num: string }; } -export interface GetPostsByUserIdRequest extends NextApiRequest { +/** + * Represents the request object for getting all posts by a connected post ID. + * + * This may include: + * + * - All beers by a brewery ID + * - All beers by a beer style ID + * - All beer styles by a user ID + * - And more... + * + * @example + * const getAllBeersByBeerStyle = async ( + * req: GetAllPostsByConnectedPostId, + * res: NextApiResponse>, + * ) => { + * const { page_size, page_num, id } = req.query; + * // ... + * }; + * + * @example + * const getAllBeersByUserId = async ( + * req: GetAllPostsByConnectedPostId, + * res: NextApiResponse>, + * ) => { + * const { page_size, page_num, id } = req.query; + * // ... + * }; + */ +export interface GetAllPostsByConnectedPostId extends NextApiRequest { query: { id: string; page_size: string; page_num: string }; } diff --git a/src/pages/api/beers/[id]/images/index.ts b/src/pages/api/beers/[id]/images/index.ts index ba2fb31..10739f2 100644 --- a/src/pages/api/beers/[id]/images/index.ts +++ b/src/pages/api/beers/[id]/images/index.ts @@ -9,11 +9,11 @@ import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; import { uploadMiddlewareMultiple } from '@/config/multer/uploadMiddleware'; -import { UploadBeerPostImagesRequest } from '@/controllers/images/beerImages/types'; +import { UploadImagesRequest } from '@/controllers/images/types'; import { processBeerImageData } from '@/controllers/images/beerImages'; const router = createRouter< - UploadBeerPostImagesRequest, + UploadImagesRequest, NextApiResponse> >(); diff --git a/src/pages/api/breweries/[id]/beers/index.ts b/src/pages/api/breweries/[id]/beers/index.ts index b2bcb59..c50ebe4 100644 --- a/src/pages/api/breweries/[id]/beers/index.ts +++ b/src/pages/api/breweries/[id]/beers/index.ts @@ -1,71 +1,14 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import { getAllBeersByBrewery } from '@/controllers/posts/breweries'; +import { GetAllPostsByConnectedPostId } from '@/controllers/posts/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetAllBeersByBreweryRequest extends NextApiRequest { - query: { page_size: string; page_num: string; id: string }; -} - -const getAllBeersByBrewery = async ( - req: GetAllBeersByBreweryRequest, - res: NextApiResponse>, -) => { - // eslint-disable-next-line @typescript-eslint/naming-convention - const { page_size, page_num, id } = req.query; - - const pageNum = parseInt(page_num, 10); - const pageSize = parseInt(page_size, 10); - - const beers: z.infer[] = - await DBClient.instance.beerPost.findMany({ - where: { breweryId: id }, - skip: (pageNum - 1) * pageSize, - take: 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, - }, - }, - }, - }); - - const count = await DBClient.instance.beerPost.count({ - where: { breweryId: id }, - }); - - res.setHeader('X-Total-Count', count); - - res.status(200).json({ - message: 'Beers fetched successfully', - statusCode: 200, - payload: beers, - success: true, - }); -}; - const router = createRouter< - GetAllBeersByBreweryRequest, + GetAllPostsByConnectedPostId, NextApiResponse> >(); diff --git a/src/pages/api/breweries/[id]/images/index.ts b/src/pages/api/breweries/[id]/images/index.ts index ad056ef..02f88f0 100644 --- a/src/pages/api/breweries/[id]/images/index.ts +++ b/src/pages/api/breweries/[id]/images/index.ts @@ -1,53 +1,19 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { createRouter } from 'next-connect'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import ServerError from '@/config/util/ServerError'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; -import addBreweryImageToDB from '@/services/BreweryImage/addBreweryImageToDB'; import { uploadMiddlewareMultiple } from '@/config/multer/uploadMiddleware'; - -interface UploadBreweryPostImagesRequest extends UserExtendedNextApiRequest { - files?: Express.Multer.File[]; - query: { id: string }; - body: z.infer; -} - -const processImageData = async ( - req: UploadBreweryPostImagesRequest, - res: NextApiResponse>, -) => { - const { files, user, body } = req; - - if (!files || !files.length) { - throw new ServerError('No images uploaded', 400); - } - - const breweryImages = await addBreweryImageToDB({ - alt: body.alt, - caption: body.caption, - breweryPostId: req.query.id, - userId: user!.id, - files, - }); - - res.status(200).json({ - success: true, - message: `Successfully uploaded ${breweryImages.length} image${ - breweryImages.length > 1 ? 's' : '' - }`, - statusCode: 200, - }); -}; +import { UploadImagesRequest } from '@/controllers/images/types'; +import { processBreweryImageData } from '@/controllers/images/breweryImages'; const router = createRouter< - UploadBreweryPostImagesRequest, + UploadImagesRequest, NextApiResponse> >(); @@ -56,7 +22,7 @@ router.post( // @ts-expect-error uploadMiddlewareMultiple, validateRequest({ bodySchema: ImageMetadataValidationSchema }), - processImageData, + processBreweryImageData, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/breweries/[id]/like/index.ts b/src/pages/api/breweries/[id]/like/index.ts index d567dd6..3ac2890 100644 --- a/src/pages/api/breweries/[id]/like/index.ts +++ b/src/pages/api/breweries/[id]/like/index.ts @@ -2,80 +2,16 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; +import { + sendBreweryPostLikeRequest, + getBreweryPostLikeCount, +} from '@/controllers/likes/breweryPostLikes'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -const sendLikeRequest = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse>, -) => { - const id = req.query.id! as string; - const user = req.user!; - - const breweryPost = await DBClient.instance.breweryPost.findUnique({ - where: { id }, - }); - - if (!breweryPost) { - throw new ServerError('Could not find a brewery post with that id', 404); - } - - const alreadyLiked = await DBClient.instance.breweryPostLike.findFirst({ - where: { breweryPostId: breweryPost.id, likedById: user.id }, - }); - - const jsonResponse = { - success: true as const, - message: '', - statusCode: 200 as const, - }; - - if (alreadyLiked) { - await DBClient.instance.breweryPostLike.delete({ - where: { id: alreadyLiked.id }, - }); - jsonResponse.message = 'Successfully unliked brewery post'; - } else { - await DBClient.instance.breweryPostLike.create({ - data: { breweryPostId: breweryPost.id, likedById: user.id }, - }); - jsonResponse.message = 'Successfully liked brewery post'; - } - - res.status(200).json(jsonResponse); -}; - -const getLikeCount = async ( - req: NextApiRequest, - res: NextApiResponse>, -) => { - const id = req.query.id! as string; - - const breweryPost = await DBClient.instance.breweryPost.findUnique({ - where: { id }, - }); - - if (!breweryPost) { - throw new ServerError('Could not find a brewery post with that id', 404); - } - - const likeCount = await DBClient.instance.breweryPostLike.count({ - where: { breweryPostId: breweryPost.id }, - }); - - res.status(200).json({ - success: true, - message: 'Successfully retrieved like count', - statusCode: 200, - payload: { likeCount }, - }); -}; - const router = createRouter< UserExtendedNextApiRequest, NextApiResponse> @@ -84,12 +20,12 @@ const router = createRouter< router.post( getCurrentUser, validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - sendLikeRequest, + sendBreweryPostLikeRequest, ); router.get( validateRequest({ querySchema: z.object({ id: z.string().cuid() }) }), - getLikeCount, + getBreweryPostLikeCount, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/breweries/[id]/like/is-liked.ts b/src/pages/api/breweries/[id]/like/is-liked.ts index 00dc7eb..aa59509 100644 --- a/src/pages/api/breweries/[id]/like/is-liked.ts +++ b/src/pages/api/breweries/[id]/like/is-liked.ts @@ -2,34 +2,13 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; +import { getBreweryPostLikeStatus } from '@/controllers/likes/breweryPostLikes'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -const checkIfLiked = async ( - req: UserExtendedNextApiRequest, - res: NextApiResponse>, -) => { - const user = req.user!; - const id = req.query.id as string; - - const alreadyLiked = await DBClient.instance.breweryPostLike.findFirst({ - where: { - breweryPostId: id, - likedById: user.id, - }, - }); - - res.status(200).json({ - success: true, - message: alreadyLiked ? 'Brewery post is liked.' : 'Brewery post is not liked.', - statusCode: 200, - payload: { isLiked: !!alreadyLiked }, - }); -}; - const router = createRouter< UserExtendedNextApiRequest, NextApiResponse> @@ -42,7 +21,7 @@ router.get( id: z.string().cuid(), }), }), - checkIfLiked, + getBreweryPostLikeStatus, ); const handler = router.handler(NextConnectOptions); diff --git a/src/pages/api/breweries/create.ts b/src/pages/api/breweries/create.ts index 8cf3e04..12edf2d 100644 --- a/src/pages/api/breweries/create.ts +++ b/src/pages/api/breweries/create.ts @@ -1,4 +1,3 @@ -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { createRouter } from 'next-connect'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; @@ -11,10 +10,7 @@ import createNewBreweryPost from '@/services/BreweryPost/createNewBreweryPost'; import geocode from '@/config/mapbox/geocoder'; import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; - -interface CreateBreweryPostRequest extends UserExtendedNextApiRequest { - body: z.infer; -} +import { CreateBreweryPostRequest } from '@/controllers/posts/breweries/types'; const createBreweryPost = async ( req: CreateBreweryPostRequest, diff --git a/src/pages/api/breweries/index.ts b/src/pages/api/breweries/index.ts index d8814fa..1bffcd2 100644 --- a/src/pages/api/breweries/index.ts +++ b/src/pages/api/breweries/index.ts @@ -1,36 +1,13 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import getAllBreweryPosts from '@/services/BreweryPost/getAllBreweryPosts'; +import { getBreweryPosts } from '@/controllers/posts/breweries'; +import { GetBreweryPostsRequest } from '@/controllers/posts/breweries/types'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetBreweryPostsRequest extends NextApiRequest { - query: z.infer; -} - -const getBreweryPosts = async ( - req: GetBreweryPostsRequest, - res: NextApiResponse>, -) => { - const pageNum = parseInt(req.query.page_num, 10); - const pageSize = parseInt(req.query.page_size, 10); - - const breweryPosts = await getAllBreweryPosts({ pageNum, pageSize }); - const breweryPostCount = await DBClient.instance.breweryPost.count(); - - res.setHeader('X-Total-Count', breweryPostCount); - res.status(200).json({ - message: 'Brewery posts retrieved successfully', - statusCode: 200, - payload: breweryPosts, - success: true, - }); -}; - const router = createRouter< GetBreweryPostsRequest, NextApiResponse> diff --git a/src/pages/api/breweries/map/index.ts b/src/pages/api/breweries/map/index.ts index 1696faf..7c5f6d6 100644 --- a/src/pages/api/breweries/map/index.ts +++ b/src/pages/api/breweries/map/index.ts @@ -12,7 +12,7 @@ interface GetBreweryPostsRequest extends NextApiRequest { query: z.infer; } -const getBreweryPosts = async ( +const getMapBreweryPosts = async ( req: GetBreweryPostsRequest, res: NextApiResponse>, ) => { @@ -53,7 +53,7 @@ const router = createRouter< router.get( validateRequest({ querySchema: PaginatedQueryResponseSchema }), - getBreweryPosts, + getMapBreweryPosts, ); const handler = router.handler(); diff --git a/src/pages/api/users/[id]/posts/beers.ts b/src/pages/api/users/[id]/posts/beers.ts index a710d6b..7bdd47e 100644 --- a/src/pages/api/users/[id]/posts/beers.ts +++ b/src/pages/api/users/[id]/posts/beers.ts @@ -5,11 +5,11 @@ import { z } from 'zod'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { GetPostsByUserIdRequest } from '@/controllers/posts/types'; +import { GetAllPostsByConnectedPostId } from '@/controllers/posts/types'; import { getBeerPostsByUserId } from '@/controllers/posts/beerPosts'; const router = createRouter< - GetPostsByUserIdRequest, + GetAllPostsByConnectedPostId, NextApiResponse> >(); diff --git a/src/pages/api/users/[id]/posts/breweries.ts b/src/pages/api/users/[id]/posts/breweries.ts index dcc79b8..5ff73da 100644 --- a/src/pages/api/users/[id]/posts/breweries.ts +++ b/src/pages/api/users/[id]/posts/breweries.ts @@ -6,10 +6,10 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { getBreweryPostsByUserId } from '@/controllers/posts/breweries'; -import { GetPostsByUserIdRequest } from '@/controllers/posts/types'; +import { GetAllPostsByConnectedPostId } from '@/controllers/posts/types'; const router = createRouter< - GetPostsByUserIdRequest, + GetAllPostsByConnectedPostId, NextApiResponse> >(); From fd641c36ab23d573daca2b2f2f4872fe7e588e68 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 10 Dec 2023 14:11:49 -0500 Subject: [PATCH 12/21] Refactor: begin reorganizing services dir. - Renamed files and directories to reflect the new structure - Moved comment-related services to the 'comments' directory - Moved image-related services to the 'images' directory - Moved like-related services to the 'likes' directory - Moved post-related services to the 'posts' directory - Moved user-related services to the 'users' directory --- src/components/Account/AccountInfo.tsx | 2 +- src/components/Account/Security.tsx | 2 +- src/components/Account/UpdateProfileForm.tsx | 4 ++-- src/components/Account/UserAvatar.tsx | 2 +- src/components/BeerById/BeerCommentForm.tsx | 2 +- src/components/BeerById/BeerInfoHeader.tsx | 2 +- .../BeerById/BeerPostCommentsSection.tsx | 2 +- src/components/BeerById/BeerRecommendations.tsx | 2 +- src/components/BeerIndex/BeerCard.tsx | 2 +- .../BeerStyleById/BeerStyleBeerSection.tsx | 2 +- .../BeerStyleById/BeerStyleCommentForm.tsx | 2 +- .../BeerStyleById/BeerStyleCommentSection.tsx | 2 +- src/components/BeerStyleById/BeerStyleHeader.tsx | 2 +- src/components/BeerStyleIndex/BeerStyleCard.tsx | 2 +- .../BreweryById/BreweryBeerSection.tsx | 2 +- .../BreweryById/BreweryCommentForm.tsx | 2 +- .../BreweryById/BreweryCommentsSection.tsx | 2 +- src/components/BreweryById/BreweryInfoHeader.tsx | 2 +- src/components/BreweryIndex/BreweryCard.tsx | 2 +- .../BreweryPost/CreateBreweryPostForm.tsx | 2 +- src/components/CreateBeerPostForm.tsx | 4 ++-- src/components/EditBeerPostForm.tsx | 2 +- src/components/Login/LoginForm.tsx | 2 +- src/components/RegisterUserForm.tsx | 2 +- src/components/UserPage/UserFollowButton.tsx | 2 +- src/components/UserPage/UserHeader.tsx | 2 +- src/config/auth/localStrat.ts | 2 +- src/config/auth/types.ts | 2 +- .../nextConnect/middleware/getCurrentUser.ts | 2 +- src/contexts/UserContext.tsx | 2 +- src/controllers/comments/beerComments/index.ts | 8 ++++---- .../comments/beerStyleComments/index.ts | 6 +++--- .../comments/breweryComments/index.ts | 6 +++--- src/controllers/images/beerImages/index.ts | 2 +- src/controllers/images/breweryImages/index.ts | 2 +- src/controllers/likes/beerPostLikes/index.ts | 10 +++++----- src/controllers/likes/beerStyleLikes/index.ts | 10 +++++----- src/controllers/posts/beerPosts/index.ts | 14 +++++++------- src/controllers/posts/beerPosts/types/index.ts | 4 ++-- src/controllers/posts/beerStyles/index.ts | 6 +++--- src/controllers/posts/beerStyles/types/index.ts | 2 +- src/controllers/posts/breweries/index.ts | 10 +++++----- src/controllers/posts/breweries/types/index.ts | 2 +- src/controllers/users/auth/index.ts | 16 ++++++++-------- src/controllers/users/auth/types/index.ts | 4 ++-- src/controllers/users/profile/index.ts | 10 +++++----- src/controllers/users/profile/types/index.ts | 2 +- src/hooks/auth/useUser.ts | 2 +- .../beer-posts/useBeerPostSearch.ts | 2 +- .../data-fetching/beer-posts/useBeerPosts.ts | 2 +- .../beer-posts/useBeerPostsByBeerStyles.ts | 2 +- .../beer-posts/useBeerPostsByBrewery.ts | 2 +- .../beer-posts/useBeerPostsByUser.ts | 2 +- .../beer-posts/useBeerRecommendations.ts | 2 +- .../data-fetching/beer-styles/useBeerStyles.ts | 2 +- .../brewery-posts/useBreweryMapPagePosts.ts | 2 +- .../brewery-posts/useBreweryPosts.ts | 2 +- .../brewery-posts/useBreweryPostsByUser.ts | 2 +- .../user-follows/useGetUsersFollowedByUser.ts | 2 +- .../user-follows/useGetUsersFollowingUser.ts | 2 +- src/pages/api/beers/[id]/index.ts | 2 +- src/pages/api/beers/create.ts | 2 +- src/pages/api/beers/search.ts | 2 +- src/pages/api/beers/styles/create.ts | 2 +- src/pages/api/breweries/[id]/index.ts | 4 ++-- src/pages/api/breweries/create.ts | 4 ++-- src/pages/api/breweries/map/index.ts | 2 +- src/pages/api/users/[id]/index.ts | 2 +- src/pages/api/users/confirm.ts | 2 +- src/pages/api/users/edit-password.ts | 2 +- src/pages/api/users/login.ts | 2 +- src/pages/api/users/register.ts | 2 +- src/pages/beers/[id]/edit.tsx | 4 ++-- src/pages/beers/[id]/index.tsx | 4 ++-- src/pages/beers/styles/[id]/index.tsx | 4 ++-- src/pages/breweries/[id]/beers/create.tsx | 4 ++-- src/pages/breweries/[id]/edit.tsx | 6 +++--- src/pages/breweries/[id]/index.tsx | 4 ++-- src/pages/breweries/index.tsx | 2 +- src/pages/breweries/map.tsx | 2 +- src/pages/users/[id].tsx | 4 ++-- src/pages/users/account/edit-profile.tsx | 2 +- src/pages/users/forgot-password.tsx | 2 +- src/pages/users/reset-password.tsx | 2 +- src/prisma/seed/create/createAdminUser.ts | 2 +- .../Account/sendUpdateUserProfileRequest.ts | 2 +- .../BeerImage/sendUploadBeerImageRequest.ts | 2 +- .../BeerPost/sendCreateBeerPostRequest.ts | 4 ++-- src/requests/BeerPost/sendEditBeerPostRequest.ts | 2 +- .../sendUploadBreweryImageRequest.ts | 2 +- .../BreweryPost/sendCreateBreweryPostRequest.ts | 4 ++-- src/requests/User/sendEditUserRequest.ts | 2 +- src/requests/User/sendRegisterUserRequest.ts | 4 ++-- src/requests/User/sendUpdatePasswordRequest.ts | 2 +- .../BeerComment/createNewBeerComment.ts | 4 ++-- .../BeerComment/editBeerCommentById.ts | 2 +- .../BeerComment/findBeerCommentById.ts | 2 +- .../BeerComment/getAllBeerComments.ts | 2 +- .../BeerComment/getBeerCommentCount.ts | 0 .../createNewBeerStyleComment.ts | 4 ++-- .../BeerStyleComment/getAllBeerStyleComments.ts | 2 +- .../BeerStyleComment/getBeerStyleCommentCount.ts | 0 .../updateBeerStyleCommentById.ts | 2 +- .../BreweryComment/createNewBreweryComment.ts | 4 ++-- .../BreweryComment/getAllBreweryComments.ts | 2 +- .../BreweryComment/getBreweryCommentById.ts | 0 .../{ => images}/BeerImage/addBeerImageToDB.ts | 2 +- .../BreweryImage/addBreweryImageToDB.ts | 2 +- .../BeerPostLike/createBeerPostLike.ts | 2 +- .../BeerPostLike/findBeerPostLikeById.ts | 0 .../BeerPostLike/getBeerPostLikeCount.ts | 0 .../BeerPostLike/removeBeerPostLikeById.ts | 0 .../BeerStyleLike/createBeerStyleLike.ts | 2 +- .../BeerStyleLike/findBeerStyleLikeById.ts | 0 .../BeerStyleLike/getBeerStyleLikeCount.ts | 0 .../BeerStyleLike/removeBeerStyleLikeById.ts | 0 .../{ => posts}/BeerPost/createNewBeerPost.ts | 0 .../{ => posts}/BeerPost/deleteBeerPostById.ts | 0 .../{ => posts}/BeerPost/editBeerPostById.ts | 0 .../{ => posts}/BeerPost/getAllBeerPosts.ts | 2 +- .../{ => posts}/BeerPost/getBeerPostById.ts | 2 +- .../BeerPost/getBeerPostsByBeerStyleId.ts | 0 .../BeerPost/getBeerPostsByBreweryId.ts | 0 .../BeerPost/getBeerPostsByPostedById.ts | 0 .../BeerPost/getBeerRecommendations.ts | 2 +- .../BeerPost/schema/BeerPostQueryResult.ts | 0 .../schema/CreateBeerPostValidationSchema.ts | 0 .../schema/EditBeerPostValidationSchema.ts | 0 .../BeerStyles/deleteBeerStyleById.ts | 0 .../{ => posts}/BeerStyles/editBeerStyleById.ts | 0 .../{ => posts}/BeerStyles/getAllBeerStyles.ts | 0 .../{ => posts}/BeerStyles/getBeerStyleById.ts | 0 .../BeerStyles/schema/BeerStyleQueryResult.ts | 0 .../schema/CreateBeerStyleValidationSchema.ts | 0 .../BreweryPost/createNewBreweryPost.ts | 0 .../BreweryPost/getAllBreweryPosts.ts | 2 +- .../getAllBreweryPostsByPostedById.ts | 2 +- .../BreweryPost/getBreweryPostById.ts | 2 +- .../schema/BreweryPostMapQueryResult.ts | 0 .../BreweryPost/schema/BreweryPostQueryResult.ts | 0 .../schema/CreateBreweryPostSchema.ts | 0 .../schema/EditBreweryPostValidationSchema.ts | 0 src/services/{ => users}/User/createNewUser.ts | 0 src/services/{ => users}/User/deleteUserById.ts | 0 src/services/{ => users}/User/findUserByEmail.ts | 2 +- src/services/{ => users}/User/findUserById.ts | 0 .../{ => users}/User/findUserByIdPublic.ts | 0 .../{ => users}/User/findUserByUsername.ts | 2 +- .../User/schema/CreateUserValidationSchemas.ts | 0 .../{ => users}/User/schema/EditUserSchema.ts | 0 .../{ => users}/User/schema/GetUserSchema.ts | 0 .../User/schema/LoginValidationSchema.ts | 0 .../{ => users}/User/schema/PublicUserSchema.ts | 2 +- .../User/schema/TokenValidationSchema.ts | 0 .../User/schema/UpdateProfileSchema.ts | 0 .../{ => users}/User/sendConfirmationEmail.ts | 0 .../{ => users}/User/sendResetPasswordEmail.ts | 0 .../{ => users}/User/updateUserProfileById.ts | 0 .../User/updateUserToBeConfirmedById.ts | 2 +- .../UserAccount/UpdateUserAvatarByIdParams.ts | 2 +- .../UserFollows/getUsersFollowedByUser.ts | 0 .../UserFollows/getUsersFollowingUser.ts | 0 .../UserFollows/schema/FollowInfoSchema.ts | 2 +- 163 files changed, 177 insertions(+), 177 deletions(-) rename src/services/{ => comments}/BeerComment/createNewBeerComment.ts (83%) rename src/services/{ => comments}/BeerComment/editBeerCommentById.ts (89%) rename src/services/{ => comments}/BeerComment/findBeerCommentById.ts (88%) rename src/services/{ => comments}/BeerComment/getAllBeerComments.ts (90%) rename src/services/{ => comments}/BeerComment/getBeerCommentCount.ts (100%) rename src/services/{ => comments}/BeerStyleComment/createNewBeerStyleComment.ts (84%) rename src/services/{ => comments}/BeerStyleComment/getAllBeerStyleComments.ts (90%) rename src/services/{ => comments}/BeerStyleComment/getBeerStyleCommentCount.ts (100%) rename src/services/{ => comments}/BeerStyleComment/updateBeerStyleCommentById.ts (83%) rename src/services/{ => comments}/BreweryComment/createNewBreweryComment.ts (83%) rename src/services/{ => comments}/BreweryComment/getAllBreweryComments.ts (90%) rename src/services/{ => comments}/BreweryComment/getBreweryCommentById.ts (100%) rename src/services/{ => images}/BeerImage/addBeerImageToDB.ts (90%) rename src/services/{ => images}/BreweryImage/addBreweryImageToDB.ts (90%) rename src/services/{ => likes}/BeerPostLike/createBeerPostLike.ts (85%) rename src/services/{ => likes}/BeerPostLike/findBeerPostLikeById.ts (100%) rename src/services/{ => likes}/BeerPostLike/getBeerPostLikeCount.ts (100%) rename src/services/{ => likes}/BeerPostLike/removeBeerPostLikeById.ts (100%) rename src/services/{ => likes}/BeerStyleLike/createBeerStyleLike.ts (85%) rename src/services/{ => likes}/BeerStyleLike/findBeerStyleLikeById.ts (100%) rename src/services/{ => likes}/BeerStyleLike/getBeerStyleLikeCount.ts (100%) rename src/services/{ => likes}/BeerStyleLike/removeBeerStyleLikeById.ts (100%) rename src/services/{ => posts}/BeerPost/createNewBeerPost.ts (100%) rename src/services/{ => posts}/BeerPost/deleteBeerPostById.ts (100%) rename src/services/{ => posts}/BeerPost/editBeerPostById.ts (100%) rename src/services/{ => posts}/BeerPost/getAllBeerPosts.ts (92%) rename src/services/{ => posts}/BeerPost/getBeerPostById.ts (90%) rename src/services/{ => posts}/BeerPost/getBeerPostsByBeerStyleId.ts (100%) rename src/services/{ => posts}/BeerPost/getBeerPostsByBreweryId.ts (100%) rename src/services/{ => posts}/BeerPost/getBeerPostsByPostedById.ts (100%) rename src/services/{ => posts}/BeerPost/getBeerRecommendations.ts (94%) rename src/services/{ => posts}/BeerPost/schema/BeerPostQueryResult.ts (100%) rename src/services/{ => posts}/BeerPost/schema/CreateBeerPostValidationSchema.ts (100%) rename src/services/{ => posts}/BeerPost/schema/EditBeerPostValidationSchema.ts (100%) rename src/services/{ => posts}/BeerStyles/deleteBeerStyleById.ts (100%) rename src/services/{ => posts}/BeerStyles/editBeerStyleById.ts (100%) rename src/services/{ => posts}/BeerStyles/getAllBeerStyles.ts (100%) rename src/services/{ => posts}/BeerStyles/getBeerStyleById.ts (100%) rename src/services/{ => posts}/BeerStyles/schema/BeerStyleQueryResult.ts (100%) rename src/services/{ => posts}/BeerStyles/schema/CreateBeerStyleValidationSchema.ts (100%) rename src/services/{ => posts}/BreweryPost/createNewBreweryPost.ts (100%) rename src/services/{ => posts}/BreweryPost/getAllBreweryPosts.ts (92%) rename src/services/{ => posts}/BreweryPost/getAllBreweryPostsByPostedById.ts (93%) rename src/services/{ => posts}/BreweryPost/getBreweryPostById.ts (91%) rename src/services/{ => posts}/BreweryPost/schema/BreweryPostMapQueryResult.ts (100%) rename src/services/{ => posts}/BreweryPost/schema/BreweryPostQueryResult.ts (100%) rename src/services/{ => posts}/BreweryPost/schema/CreateBreweryPostSchema.ts (100%) rename src/services/{ => posts}/BreweryPost/schema/EditBreweryPostValidationSchema.ts (100%) rename src/services/{ => users}/User/createNewUser.ts (100%) rename src/services/{ => users}/User/deleteUserById.ts (100%) rename src/services/{ => users}/User/findUserByEmail.ts (82%) rename src/services/{ => users}/User/findUserById.ts (100%) rename src/services/{ => users}/User/findUserByIdPublic.ts (100%) rename src/services/{ => users}/User/findUserByUsername.ts (82%) rename src/services/{ => users}/User/schema/CreateUserValidationSchemas.ts (100%) rename src/services/{ => users}/User/schema/EditUserSchema.ts (100%) rename src/services/{ => users}/User/schema/GetUserSchema.ts (100%) rename src/services/{ => users}/User/schema/LoginValidationSchema.ts (100%) rename src/services/{ => users}/User/schema/PublicUserSchema.ts (69%) rename src/services/{ => users}/User/schema/TokenValidationSchema.ts (100%) rename src/services/{ => users}/User/schema/UpdateProfileSchema.ts (100%) rename src/services/{ => users}/User/sendConfirmationEmail.ts (100%) rename src/services/{ => users}/User/sendResetPasswordEmail.ts (100%) rename src/services/{ => users}/User/updateUserProfileById.ts (100%) rename src/services/{ => users}/User/updateUserToBeConfirmedById.ts (91%) rename src/services/{ => users}/UserAccount/UpdateUserAvatarByIdParams.ts (94%) rename src/services/{ => users}/UserFollows/getUsersFollowedByUser.ts (100%) rename src/services/{ => users}/UserFollows/getUsersFollowingUser.ts (100%) rename src/services/{ => users}/UserFollows/schema/FollowInfoSchema.ts (65%) diff --git a/src/components/Account/AccountInfo.tsx b/src/components/Account/AccountInfo.tsx index 0652075..01b1cb9 100644 --- a/src/components/Account/AccountInfo.tsx +++ b/src/components/Account/AccountInfo.tsx @@ -1,6 +1,6 @@ import validateEmailRequest from '@/requests/User/validateEmailRequest'; import validateUsernameRequest from '@/requests/validateUsernameRequest'; -import { BaseCreateUserSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { BaseCreateUserSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; import { Switch } from '@headlessui/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Dispatch, FC, useContext } from 'react'; diff --git a/src/components/Account/Security.tsx b/src/components/Account/Security.tsx index 4be98ce..cde42bd 100644 --- a/src/components/Account/Security.tsx +++ b/src/components/Account/Security.tsx @@ -3,7 +3,7 @@ import { Dispatch, FunctionComponent } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { UpdatePasswordSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { UpdatePasswordSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; import sendUpdatePasswordRequest from '@/requests/User/sendUpdatePasswordRequest'; import { AccountPageState, AccountPageAction } from '@/reducers/accountPageReducer'; import toast from 'react-hot-toast'; diff --git a/src/components/Account/UpdateProfileForm.tsx b/src/components/Account/UpdateProfileForm.tsx index 87ea529..effbcb7 100644 --- a/src/components/Account/UpdateProfileForm.tsx +++ b/src/components/Account/UpdateProfileForm.tsx @@ -5,7 +5,7 @@ import FormSegment from '@/components/ui/forms/FormSegment'; import Link from 'next/link'; import FormTextArea from '@/components/ui/forms/FormTextArea'; import { FC } from 'react'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import type { UseFormHandleSubmit, SubmitHandler, @@ -13,7 +13,7 @@ import type { UseFormRegister, } from 'react-hook-form'; import { z } from 'zod'; -import UpdateProfileSchema from '../../services/User/schema/UpdateProfileSchema'; +import UpdateProfileSchema from '../../services/users/User/schema/UpdateProfileSchema'; type UpdateProfileSchemaT = z.infer; diff --git a/src/components/Account/UserAvatar.tsx b/src/components/Account/UserAvatar.tsx index 9c4df15..1696881 100644 --- a/src/components/Account/UserAvatar.tsx +++ b/src/components/Account/UserAvatar.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { CldImage } from 'next-cloudinary'; import { z } from 'zod'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import { FaUser } from 'react-icons/fa'; interface UserAvatarProps { diff --git a/src/components/BeerById/BeerCommentForm.tsx b/src/components/BeerById/BeerCommentForm.tsx index 9f58b50..19fd302 100644 --- a/src/components/BeerById/BeerCommentForm.tsx +++ b/src/components/BeerById/BeerCommentForm.tsx @@ -1,6 +1,6 @@ import sendCreateBeerCommentRequest from '@/requests/BeerComment/sendCreateBeerCommentRequest'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { zodResolver } from '@hookform/resolvers/zod'; import { FunctionComponent } from 'react'; diff --git a/src/components/BeerById/BeerInfoHeader.tsx b/src/components/BeerById/BeerInfoHeader.tsx index fae2384..73381c3 100644 --- a/src/components/BeerById/BeerInfoHeader.tsx +++ b/src/components/BeerById/BeerInfoHeader.tsx @@ -4,7 +4,7 @@ import { FC, useContext } from 'react'; import UserContext from '@/contexts/UserContext'; import { FaRegEdit } from 'react-icons/fa'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { z } from 'zod'; import useGetBeerPostLikeCount from '@/hooks/data-fetching/beer-likes/useBeerPostLikeCount'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; diff --git a/src/components/BeerById/BeerPostCommentsSection.tsx b/src/components/BeerById/BeerPostCommentsSection.tsx index 8143923..fe53bf2 100644 --- a/src/components/BeerById/BeerPostCommentsSection.tsx +++ b/src/components/BeerById/BeerPostCommentsSection.tsx @@ -1,6 +1,6 @@ import UserContext from '@/contexts/UserContext'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { FC, MutableRefObject, useContext, useRef } from 'react'; import { z } from 'zod'; diff --git a/src/components/BeerById/BeerRecommendations.tsx b/src/components/BeerById/BeerRecommendations.tsx index edb81c4..66c3154 100644 --- a/src/components/BeerById/BeerRecommendations.tsx +++ b/src/components/BeerById/BeerRecommendations.tsx @@ -3,7 +3,7 @@ import { FC, MutableRefObject, useRef } from 'react'; import { useInView } from 'react-intersection-observer'; import { z } from 'zod'; import useBeerRecommendations from '@/hooks/data-fetching/beer-posts/useBeerRecommendations'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import debounce from 'lodash/debounce'; import BeerRecommendationLoadingComponent from './BeerRecommendationLoadingComponent'; diff --git a/src/components/BeerIndex/BeerCard.tsx b/src/components/BeerIndex/BeerCard.tsx index b79413c..df0ff8d 100644 --- a/src/components/BeerIndex/BeerCard.tsx +++ b/src/components/BeerIndex/BeerCard.tsx @@ -1,7 +1,7 @@ import Link from 'next/link'; import { FC, useContext } from 'react'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { z } from 'zod'; import UserContext from '@/contexts/UserContext'; import useGetBeerPostLikeCount from '@/hooks/data-fetching/beer-likes/useBeerPostLikeCount'; diff --git a/src/components/BeerStyleById/BeerStyleBeerSection.tsx b/src/components/BeerStyleById/BeerStyleBeerSection.tsx index c0c4d45..38e6d3a 100644 --- a/src/components/BeerStyleById/BeerStyleBeerSection.tsx +++ b/src/components/BeerStyleById/BeerStyleBeerSection.tsx @@ -3,7 +3,7 @@ import { FC, MutableRefObject, useRef } from 'react'; import { useInView } from 'react-intersection-observer'; import { z } from 'zod'; -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import useBeerPostsByBeerStyle from '@/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles'; import BeerRecommendationLoadingComponent from '../BeerById/BeerRecommendationLoadingComponent'; diff --git a/src/components/BeerStyleById/BeerStyleCommentForm.tsx b/src/components/BeerStyleById/BeerStyleCommentForm.tsx index 1ffe005..0436428 100644 --- a/src/components/BeerStyleById/BeerStyleCommentForm.tsx +++ b/src/components/BeerStyleById/BeerStyleCommentForm.tsx @@ -8,7 +8,7 @@ import CreateCommentValidationSchema from '@/services/schema/CommentSchema/Creat import toast from 'react-hot-toast'; import createErrorToast from '@/util/createErrorToast'; -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import useBeerStyleComments from '@/hooks/data-fetching/beer-style-comments/useBeerStyleComments'; import sendCreateBeerStyleCommentRequest from '@/requests/BeerStyleComment/sendCreateBeerStyleCommentRequest'; import CommentForm from '../ui/CommentForm'; diff --git a/src/components/BeerStyleById/BeerStyleCommentSection.tsx b/src/components/BeerStyleById/BeerStyleCommentSection.tsx index 96f8554..7d1d665 100644 --- a/src/components/BeerStyleById/BeerStyleCommentSection.tsx +++ b/src/components/BeerStyleById/BeerStyleCommentSection.tsx @@ -5,7 +5,7 @@ import { z } from 'zod'; import { useRouter } from 'next/router'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import useBeerStyleComments from '@/hooks/data-fetching/beer-style-comments/useBeerStyleComments'; import LoadingComponent from '../BeerById/LoadingComponent'; import CommentsComponent from '../ui/CommentsComponent'; diff --git a/src/components/BeerStyleById/BeerStyleHeader.tsx b/src/components/BeerStyleById/BeerStyleHeader.tsx index e479b52..c68312a 100644 --- a/src/components/BeerStyleById/BeerStyleHeader.tsx +++ b/src/components/BeerStyleById/BeerStyleHeader.tsx @@ -7,7 +7,7 @@ import { FaRegEdit } from 'react-icons/fa'; import { z } from 'zod'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import useBeerStyleLikeCount from '@/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount'; import BeerStyleLikeButton from './BeerStyleLikeButton'; diff --git a/src/components/BeerStyleIndex/BeerStyleCard.tsx b/src/components/BeerStyleIndex/BeerStyleCard.tsx index 331c68b..bd76c95 100644 --- a/src/components/BeerStyleIndex/BeerStyleCard.tsx +++ b/src/components/BeerStyleIndex/BeerStyleCard.tsx @@ -1,4 +1,4 @@ -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import Link from 'next/link'; import { FC } from 'react'; diff --git a/src/components/BreweryById/BreweryBeerSection.tsx b/src/components/BreweryById/BreweryBeerSection.tsx index 9abfaf9..7d11225 100644 --- a/src/components/BreweryById/BreweryBeerSection.tsx +++ b/src/components/BreweryById/BreweryBeerSection.tsx @@ -1,5 +1,5 @@ import UseBeerPostsByBrewery from '@/hooks/data-fetching/beer-posts/useBeerPostsByBrewery'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import Link from 'next/link'; import { FC, MutableRefObject, useContext, useRef } from 'react'; import { useInView } from 'react-intersection-observer'; diff --git a/src/components/BreweryById/BreweryCommentForm.tsx b/src/components/BreweryById/BreweryCommentForm.tsx index fcaf4ee..aa58d4a 100644 --- a/src/components/BreweryById/BreweryCommentForm.tsx +++ b/src/components/BreweryById/BreweryCommentForm.tsx @@ -1,5 +1,5 @@ import useBreweryPostComments from '@/hooks/data-fetching/brewery-comments/useBreweryPostComments'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; import { zodResolver } from '@hookform/resolvers/zod'; import { FC } from 'react'; diff --git a/src/components/BreweryById/BreweryCommentsSection.tsx b/src/components/BreweryById/BreweryCommentsSection.tsx index 8afaae9..f87ec82 100644 --- a/src/components/BreweryById/BreweryCommentsSection.tsx +++ b/src/components/BreweryById/BreweryCommentsSection.tsx @@ -1,5 +1,5 @@ import UserContext from '@/contexts/UserContext'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { FC, MutableRefObject, useContext, useRef } from 'react'; import { z } from 'zod'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; diff --git a/src/components/BreweryById/BreweryInfoHeader.tsx b/src/components/BreweryById/BreweryInfoHeader.tsx index 262fbe7..c2fcb00 100644 --- a/src/components/BreweryById/BreweryInfoHeader.tsx +++ b/src/components/BreweryById/BreweryInfoHeader.tsx @@ -1,7 +1,7 @@ import UserContext from '@/contexts/UserContext'; import useGetBreweryPostLikeCount from '@/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { format } from 'date-fns'; import { FC, useContext } from 'react'; diff --git a/src/components/BreweryIndex/BreweryCard.tsx b/src/components/BreweryIndex/BreweryCard.tsx index 357fda5..39cda05 100644 --- a/src/components/BreweryIndex/BreweryCard.tsx +++ b/src/components/BreweryIndex/BreweryCard.tsx @@ -1,6 +1,6 @@ import UserContext from '@/contexts/UserContext'; import useGetBreweryPostLikeCount from '@/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { FC, useContext } from 'react'; import Link from 'next/link'; import { z } from 'zod'; diff --git a/src/components/BreweryPost/CreateBreweryPostForm.tsx b/src/components/BreweryPost/CreateBreweryPostForm.tsx index 19ca318..d2dbb24 100644 --- a/src/components/BreweryPost/CreateBreweryPostForm.tsx +++ b/src/components/BreweryPost/CreateBreweryPostForm.tsx @@ -1,6 +1,6 @@ import sendUploadBreweryImagesRequest from '@/requests/BreweryImage/sendUploadBreweryImageRequest'; import sendCreateBreweryPostRequest from '@/requests/BreweryPost/sendCreateBreweryPostRequest'; -import CreateBreweryPostSchema from '@/services/BreweryPost/schema/CreateBreweryPostSchema'; +import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; import UploadImageValidationSchema from '@/services/schema/ImageSchema/UploadImageValidationSchema'; import createErrorToast from '@/util/createErrorToast'; import { Tab } from '@headlessui/react'; diff --git a/src/components/CreateBeerPostForm.tsx b/src/components/CreateBeerPostForm.tsx index 3f2eea7..5156154 100644 --- a/src/components/CreateBeerPostForm.tsx +++ b/src/components/CreateBeerPostForm.tsx @@ -4,8 +4,8 @@ import router from 'next/router'; import { FunctionComponent } from 'react'; import { useForm, SubmitHandler, FieldError } from 'react-hook-form'; import { z } from 'zod'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; -import CreateBeerPostValidationSchema from '@/services/BeerPost/schema/CreateBeerPostValidationSchema'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; import sendCreateBeerPostRequest from '@/requests/BeerPost/sendCreateBeerPostRequest'; import UploadImageValidationSchema from '@/services/schema/ImageSchema/UploadImageValidationSchema'; import sendUploadBeerImagesRequest from '@/requests/BeerImage/sendUploadBeerImageRequest'; diff --git a/src/components/EditBeerPostForm.tsx b/src/components/EditBeerPostForm.tsx index 8e60360..d78604f 100644 --- a/src/components/EditBeerPostForm.tsx +++ b/src/components/EditBeerPostForm.tsx @@ -7,7 +7,7 @@ import { useForm, SubmitHandler } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import deleteBeerPostRequest from '@/requests/BeerPost/deleteBeerPostRequest'; -import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; import sendEditBeerPostRequest from '@/requests/BeerPost/sendEditBeerPostRequest'; import createErrorToast from '@/util/createErrorToast'; import Button from './ui/forms/Button'; diff --git a/src/components/Login/LoginForm.tsx b/src/components/Login/LoginForm.tsx index a9d5443..d25f687 100644 --- a/src/components/Login/LoginForm.tsx +++ b/src/components/Login/LoginForm.tsx @@ -1,5 +1,5 @@ import sendLoginUserRequest from '@/requests/User/sendLoginUserRequest'; -import LoginValidationSchema from '@/services/User/schema/LoginValidationSchema'; +import LoginValidationSchema from '@/services/users/User/schema/LoginValidationSchema'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/router'; import { useContext } from 'react'; diff --git a/src/components/RegisterUserForm.tsx b/src/components/RegisterUserForm.tsx index 7102ee0..1589cd0 100644 --- a/src/components/RegisterUserForm.tsx +++ b/src/components/RegisterUserForm.tsx @@ -1,5 +1,5 @@ import sendRegisterUserRequest from '@/requests/User/sendRegisterUserRequest'; -import { CreateUserValidationSchemaWithUsernameAndEmailCheck } from '@/services/User/schema/CreateUserValidationSchemas'; +import { CreateUserValidationSchemaWithUsernameAndEmailCheck } from '@/services/users/User/schema/CreateUserValidationSchemas'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/router'; import { FC } from 'react'; diff --git a/src/components/UserPage/UserFollowButton.tsx b/src/components/UserPage/UserFollowButton.tsx index 59c4050..4813639 100644 --- a/src/components/UserPage/UserFollowButton.tsx +++ b/src/components/UserPage/UserFollowButton.tsx @@ -2,7 +2,7 @@ import useFollowStatus from '@/hooks/data-fetching/user-follows/useFollowStatus' import useGetUsersFollowedByUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowedByUser'; import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowingUser'; import sendUserFollowRequest from '@/requests/UserFollow/sendUserFollowRequest'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import { FC, useState } from 'react'; import { FaUserCheck, FaUserPlus } from 'react-icons/fa'; import { z } from 'zod'; diff --git a/src/components/UserPage/UserHeader.tsx b/src/components/UserPage/UserHeader.tsx index 7715b41..cf0481c 100644 --- a/src/components/UserPage/UserHeader.tsx +++ b/src/components/UserPage/UserHeader.tsx @@ -3,7 +3,7 @@ import useTimeDistance from '@/hooks/utilities/useTimeDistance'; import { FC, useContext } from 'react'; import { z } from 'zod'; import { format } from 'date-fns'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import useGetUsersFollowedByUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowedByUser'; import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowingUser'; import UserContext from '@/contexts/UserContext'; diff --git a/src/config/auth/localStrat.ts b/src/config/auth/localStrat.ts index 4417f51..d74efb6 100644 --- a/src/config/auth/localStrat.ts +++ b/src/config/auth/localStrat.ts @@ -1,4 +1,4 @@ -import findUserByUsername from '@/services/User/findUserByUsername'; +import findUserByUsername from '@/services/users/User/findUserByUsername'; import Local from 'passport-local'; import ServerError from '../util/ServerError'; import { validatePassword } from './passwordFns'; diff --git a/src/config/auth/types.ts b/src/config/auth/types.ts index c02fb94..96e4962 100644 --- a/src/config/auth/types.ts +++ b/src/config/auth/types.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import { IncomingMessage } from 'http'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/config/nextConnect/middleware/getCurrentUser.ts b/src/config/nextConnect/middleware/getCurrentUser.ts index 10bae13..e7aba93 100644 --- a/src/config/nextConnect/middleware/getCurrentUser.ts +++ b/src/config/nextConnect/middleware/getCurrentUser.ts @@ -1,6 +1,6 @@ import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; -import findUserById from '@/services/User/findUserById'; +import findUserById from '@/services/users/User/findUserById'; import ServerError from '@/config/util/ServerError'; import { getLoginSession } from '../../auth/session'; import { UserExtendedNextApiRequest } from '../../auth/types'; diff --git a/src/contexts/UserContext.tsx b/src/contexts/UserContext.tsx index 2cf7213..f1cc76f 100644 --- a/src/contexts/UserContext.tsx +++ b/src/contexts/UserContext.tsx @@ -1,5 +1,5 @@ import useUser from '@/hooks/auth/useUser'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import { ReactNode, createContext } from 'react'; import { z } from 'zod'; diff --git a/src/controllers/comments/beerComments/index.ts b/src/controllers/comments/beerComments/index.ts index 25192df..35b1df0 100644 --- a/src/controllers/comments/beerComments/index.ts +++ b/src/controllers/comments/beerComments/index.ts @@ -1,13 +1,13 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import editBeerCommentById from '@/services/BeerComment/editBeerCommentById'; -import findBeerCommentById from '@/services/BeerComment/findBeerCommentById'; +import editBeerCommentById from '@/services/comments/BeerComment/editBeerCommentById'; +import findBeerCommentById from '@/services/comments/BeerComment/findBeerCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import createNewBeerComment from '@/services/BeerComment/createNewBeerComment'; -import getAllBeerComments from '@/services/BeerComment/getAllBeerComments'; +import createNewBeerComment from '@/services/comments/BeerComment/createNewBeerComment'; +import getAllBeerComments from '@/services/comments/BeerComment/getAllBeerComments'; import { CommentRequest, EditAndCreateCommentRequest, diff --git a/src/controllers/comments/beerStyleComments/index.ts b/src/controllers/comments/beerStyleComments/index.ts index a070af8..5e88f76 100644 --- a/src/controllers/comments/beerStyleComments/index.ts +++ b/src/controllers/comments/beerStyleComments/index.ts @@ -1,14 +1,14 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import updateBeerStyleCommentById from '@/services/BeerStyleComment/updateBeerStyleCommentById'; +import updateBeerStyleCommentById from '@/services/comments/BeerStyleComment/updateBeerStyleCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import createNewBeerStyleComment from '@/services/BeerStyleComment/createNewBeerStyleComment'; -import getAllBeerStyleComments from '@/services/BeerStyleComment/getAllBeerStyleComments'; +import createNewBeerStyleComment from '@/services/comments/BeerStyleComment/createNewBeerStyleComment'; +import getAllBeerStyleComments from '@/services/comments/BeerStyleComment/getAllBeerStyleComments'; import { CommentRequest, diff --git a/src/controllers/comments/breweryComments/index.ts b/src/controllers/comments/breweryComments/index.ts index 956e3d0..8251814 100644 --- a/src/controllers/comments/breweryComments/index.ts +++ b/src/controllers/comments/breweryComments/index.ts @@ -1,13 +1,13 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import getBreweryCommentById from '@/services/BreweryComment/getBreweryCommentById'; +import getBreweryCommentById from '@/services/comments/BreweryComment/getBreweryCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import createNewBreweryComment from '@/services/BreweryComment/createNewBreweryComment'; -import getAllBreweryComments from '@/services/BreweryComment/getAllBreweryComments'; +import createNewBreweryComment from '@/services/comments/BreweryComment/createNewBreweryComment'; +import getAllBreweryComments from '@/services/comments/BreweryComment/getAllBreweryComments'; import { CommentRequest, EditAndCreateCommentRequest, diff --git a/src/controllers/images/beerImages/index.ts b/src/controllers/images/beerImages/index.ts index cd996f7..afce7d5 100644 --- a/src/controllers/images/beerImages/index.ts +++ b/src/controllers/images/beerImages/index.ts @@ -1,5 +1,5 @@ import ServerError from '@/config/util/ServerError'; -import addBeerImageToDB from '@/services/BeerImage/addBeerImageToDB'; +import addBeerImageToDB from '@/services/images/BeerImage/addBeerImageToDB'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/images/breweryImages/index.ts b/src/controllers/images/breweryImages/index.ts index 8f7b33b..eb217d6 100644 --- a/src/controllers/images/breweryImages/index.ts +++ b/src/controllers/images/breweryImages/index.ts @@ -1,5 +1,5 @@ import ServerError from '@/config/util/ServerError'; -import addBreweryImageToDB from '@/services/BreweryImage/addBreweryImageToDB'; +import addBreweryImageToDB from '@/services/images/BreweryImage/addBreweryImageToDB'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/likes/beerPostLikes/index.ts b/src/controllers/likes/beerPostLikes/index.ts index dca294d..9a77de9 100644 --- a/src/controllers/likes/beerPostLikes/index.ts +++ b/src/controllers/likes/beerPostLikes/index.ts @@ -1,10 +1,10 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; -import createBeerPostLike from '@/services/BeerPostLike/createBeerPostLike'; -import findBeerPostLikeById from '@/services/BeerPostLike/findBeerPostLikeById'; -import getBeerPostLikeCountByBeerPostId from '@/services/BeerPostLike/getBeerPostLikeCount'; -import removeBeerPostLikeById from '@/services/BeerPostLike/removeBeerPostLikeById'; +import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; +import createBeerPostLike from '@/services/likes/BeerPostLike/createBeerPostLike'; +import findBeerPostLikeById from '@/services/likes/BeerPostLike/findBeerPostLikeById'; +import getBeerPostLikeCountByBeerPostId from '@/services/likes/BeerPostLike/getBeerPostLikeCount'; +import removeBeerPostLikeById from '@/services/likes/BeerPostLike/removeBeerPostLikeById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/likes/beerStyleLikes/index.ts b/src/controllers/likes/beerStyleLikes/index.ts index 6586113..3f18705 100644 --- a/src/controllers/likes/beerStyleLikes/index.ts +++ b/src/controllers/likes/beerStyleLikes/index.ts @@ -1,9 +1,9 @@ import ServerError from '@/config/util/ServerError'; -import createBeerStyleLike from '@/services/BeerStyleLike/createBeerStyleLike'; -import findBeerStyleLikeById from '@/services/BeerStyleLike/findBeerStyleLikeById'; -import getBeerStyleLikeCount from '@/services/BeerStyleLike/getBeerStyleLikeCount'; -import removeBeerStyleLikeById from '@/services/BeerStyleLike/removeBeerStyleLikeById'; -import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; +import createBeerStyleLike from '@/services/likes/BeerStyleLike/createBeerStyleLike'; +import findBeerStyleLikeById from '@/services/likes/BeerStyleLike/findBeerStyleLikeById'; +import getBeerStyleLikeCount from '@/services/likes/BeerStyleLike/getBeerStyleLikeCount'; +import removeBeerStyleLikeById from '@/services/likes/BeerStyleLike/removeBeerStyleLikeById'; +import getBeerStyleById from '@/services/posts/BeerStyles/getBeerStyleById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/posts/beerPosts/index.ts b/src/controllers/posts/beerPosts/index.ts index 9daf865..decce5c 100644 --- a/src/controllers/posts/beerPosts/index.ts +++ b/src/controllers/posts/beerPosts/index.ts @@ -1,16 +1,16 @@ import ServerError from '@/config/util/ServerError'; -import deleteBeerPostById from '@/services/BeerPost/deleteBeerPostById'; -import editBeerPostById from '@/services/BeerPost/editBeerPostById'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; +import deleteBeerPostById from '@/services/posts/BeerPost/deleteBeerPostById'; +import editBeerPostById from '@/services/posts/BeerPost/editBeerPostById'; +import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import getBeerRecommendations from '@/services/BeerPost/getBeerRecommendations'; -import getAllBeerPosts from '@/services/BeerPost/getAllBeerPosts'; +import getBeerRecommendations from '@/services/posts/BeerPost/getBeerRecommendations'; +import getAllBeerPosts from '@/services/posts/BeerPost/getAllBeerPosts'; import DBClient from '@/prisma/DBClient'; -import createNewBeerPost from '@/services/BeerPost/createNewBeerPost'; -import getBeerPostsByPostedById from '@/services/BeerPost/getBeerPostsByPostedById'; +import createNewBeerPost from '@/services/posts/BeerPost/createNewBeerPost'; +import getBeerPostsByPostedById from '@/services/posts/BeerPost/getBeerPostsByPostedById'; import { BeerPostRequest, CreateBeerPostRequest, diff --git a/src/controllers/posts/beerPosts/types/index.ts b/src/controllers/posts/beerPosts/types/index.ts index a7b32aa..9bfca22 100644 --- a/src/controllers/posts/beerPosts/types/index.ts +++ b/src/controllers/posts/beerPosts/types/index.ts @@ -1,6 +1,6 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import CreateBeerPostValidationSchema from '@/services/BeerPost/schema/CreateBeerPostValidationSchema'; -import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/posts/beerStyles/index.ts b/src/controllers/posts/beerStyles/index.ts index a49ea42..3cebe50 100644 --- a/src/controllers/posts/beerStyles/index.ts +++ b/src/controllers/posts/beerStyles/index.ts @@ -5,9 +5,9 @@ import DBClient from '@/prisma/DBClient'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; -import getBeerPostsByBeerStyleId from '@/services/BeerPost/getBeerPostsByBeerStyleId'; -import getAllBeerStyles from '@/services/BeerStyles/getAllBeerStyles'; +import getBeerStyleById from '@/services/posts/BeerStyles/getBeerStyleById'; +import getBeerPostsByBeerStyleId from '@/services/posts/BeerPost/getBeerPostsByBeerStyleId'; +import getAllBeerStyles from '@/services/posts/BeerStyles/getAllBeerStyles'; import ServerError from '@/config/util/ServerError'; import { CreateBeerStyleRequest, GetBeerStyleByIdRequest } from './types'; diff --git a/src/controllers/posts/beerStyles/types/index.ts b/src/controllers/posts/beerStyles/types/index.ts index edb0042..d4deb87 100644 --- a/src/controllers/posts/beerStyles/types/index.ts +++ b/src/controllers/posts/beerStyles/types/index.ts @@ -2,7 +2,7 @@ import { NextApiRequest } from 'next'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { z } from 'zod'; -import CreateBeerStyleValidationSchema from '@/services/BeerStyles/schema/CreateBeerStyleValidationSchema'; +import CreateBeerStyleValidationSchema from '@/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema'; export interface GetBeerStyleByIdRequest extends NextApiRequest { query: { id: string }; diff --git a/src/controllers/posts/breweries/index.ts b/src/controllers/posts/breweries/index.ts index 05de01b..59fa617 100644 --- a/src/controllers/posts/breweries/index.ts +++ b/src/controllers/posts/breweries/index.ts @@ -1,14 +1,14 @@ import DBClient from '@/prisma/DBClient'; -import getAllBreweryPostsByPostedById from '@/services/BreweryPost/getAllBreweryPostsByPostedById'; +import getAllBreweryPostsByPostedById from '@/services/posts/BreweryPost/getAllBreweryPostsByPostedById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import getAllBreweryPosts from '@/services/BreweryPost/getAllBreweryPosts'; -import createNewBreweryPost from '@/services/BreweryPost/createNewBreweryPost'; +import getAllBreweryPosts from '@/services/posts/BreweryPost/getAllBreweryPosts'; +import createNewBreweryPost from '@/services/posts/BreweryPost/createNewBreweryPost'; import geocode from '@/config/mapbox/geocoder'; import ServerError from '@/config/util/ServerError'; -import BreweryPostMapQueryResult from '@/services/BreweryPost/schema/BreweryPostMapQueryResult'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { CreateBreweryPostRequest, GetBreweryPostsRequest } from './types'; import { GetAllPostsByConnectedPostId } from '../types'; diff --git a/src/controllers/posts/breweries/types/index.ts b/src/controllers/posts/breweries/types/index.ts index cfed9f8..c37b558 100644 --- a/src/controllers/posts/breweries/types/index.ts +++ b/src/controllers/posts/breweries/types/index.ts @@ -1,5 +1,5 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import CreateBreweryPostSchema from '@/services/BreweryPost/schema/CreateBreweryPostSchema'; +import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/users/auth/index.ts b/src/controllers/users/auth/index.ts index 9b401e7..a056c59 100644 --- a/src/controllers/users/auth/index.ts +++ b/src/controllers/users/auth/index.ts @@ -3,24 +3,24 @@ import localStrat from '@/config/auth/localStrat'; import { getLoginSession, setLoginSession } from '@/config/auth/session'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import createNewUser from '@/services/User/createNewUser'; -import findUserByEmail from '@/services/User/findUserByEmail'; +import createNewUser from '@/services/users/User/createNewUser'; +import findUserByEmail from '@/services/users/User/findUserByEmail'; import { NextApiRequest, NextApiResponse } from 'next'; import { expressWrapper } from 'next-connect'; import passport from 'passport'; import { z } from 'zod'; -import findUserByUsername from '@/services/User/findUserByUsername'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; -import sendConfirmationEmail from '@/services/User/sendConfirmationEmail'; +import findUserByUsername from '@/services/users/User/findUserByUsername'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import sendConfirmationEmail from '@/services/users/User/sendConfirmationEmail'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import type { NextFunction } from 'express'; import { verifyConfirmationToken } from '@/config/jwt'; -import updateUserToBeConfirmedById from '@/services/User/updateUserToBeConfirmedById'; +import updateUserToBeConfirmedById from '@/services/users/User/updateUserToBeConfirmedById'; import DBClient from '@/prisma/DBClient'; -import sendResetPasswordEmail from '@/services/User/sendResetPasswordEmail'; +import sendResetPasswordEmail from '@/services/users/User/sendResetPasswordEmail'; import { hashPassword } from '@/config/auth/passwordFns'; -import deleteUserById from '@/services/User/deleteUserById'; +import deleteUserById from '@/services/users/User/deleteUserById'; import { CheckEmailRequest, CheckUsernameRequest, diff --git a/src/controllers/users/auth/types/index.ts b/src/controllers/users/auth/types/index.ts index adcadc4..48d51fd 100644 --- a/src/controllers/users/auth/types/index.ts +++ b/src/controllers/users/auth/types/index.ts @@ -2,8 +2,8 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { CreateUserValidationSchema, UpdatePasswordSchema, -} from '@/services/User/schema/CreateUserValidationSchemas'; -import TokenValidationSchema from '@/services/User/schema/TokenValidationSchema'; +} from '@/services/users/User/schema/CreateUserValidationSchemas'; +import TokenValidationSchema from '@/services/users/User/schema/TokenValidationSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/users/profile/index.ts b/src/controllers/users/profile/index.ts index dbe4989..c5db3b4 100644 --- a/src/controllers/users/profile/index.ts +++ b/src/controllers/users/profile/index.ts @@ -1,17 +1,17 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/User/findUserById'; +import findUserById from '@/services/users/User/findUserById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import getUsersFollowingUser from '@/services/UserFollows/getUsersFollowingUser'; -import getUsersFollowedByUser from '@/services/UserFollows/getUsersFollowedByUser'; +import getUsersFollowingUser from '@/services/users/UserFollows/getUsersFollowingUser'; +import getUsersFollowedByUser from '@/services/users/UserFollows/getUsersFollowedByUser'; import { NextHandler } from 'next-connect'; import updateUserAvatarById, { UpdateUserAvatarByIdParams, -} from '@/services/UserAccount/UpdateUserAvatarByIdParams'; +} from '@/services/users/UserAccount/UpdateUserAvatarByIdParams'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import updateUserProfileById from '@/services/User/updateUserProfileById'; +import updateUserProfileById from '@/services/users/User/updateUserProfileById'; import { UserRouteRequest, GetUserFollowInfoRequest, diff --git a/src/controllers/users/profile/types/index.ts b/src/controllers/users/profile/types/index.ts index b80838b..7daf5c3 100644 --- a/src/controllers/users/profile/types/index.ts +++ b/src/controllers/users/profile/types/index.ts @@ -1,5 +1,5 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import EditUserSchema from '@/services/User/schema/EditUserSchema'; +import EditUserSchema from '@/services/users/User/schema/EditUserSchema'; import { z } from 'zod'; export interface UserRouteRequest extends UserExtendedNextApiRequest { diff --git a/src/hooks/auth/useUser.ts b/src/hooks/auth/useUser.ts index 3f5dd52..0c82de9 100644 --- a/src/hooks/auth/useUser.ts +++ b/src/hooks/auth/useUser.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWR from 'swr'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts b/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts index d94aa00..c81e4d3 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import useSWR from 'swr'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPosts.ts b/src/hooks/data-fetching/beer-posts/useBeerPosts.ts index 6210bba..f72764c 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPosts.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPosts.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts index c6f1dc9..9585bdf 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts index f8dddaa..33875d6 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts index 1b74340..7422ad5 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts b/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts index ab83742..ec9aacb 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-styles/useBeerStyles.ts b/src/hooks/data-fetching/beer-styles/useBeerStyles.ts index c00b3dd..21581b8 100644 --- a/src/hooks/data-fetching/beer-styles/useBeerStyles.ts +++ b/src/hooks/data-fetching/beer-styles/useBeerStyles.ts @@ -1,4 +1,4 @@ -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts b/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts index 2ea9fe3..4a905d4 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts @@ -1,4 +1,4 @@ -import BreweryPostMapQueryResult from '@/services/BreweryPost/schema/BreweryPostMapQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts b/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts index 7ce0517..4c3725e 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts @@ -1,4 +1,4 @@ -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts b/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts index 3c8a5cd..ecf34ab 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts @@ -1,4 +1,4 @@ -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts index 58b28e4..58365b8 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts @@ -17,7 +17,7 @@ * - `mutate` A function to mutate the data. * - `error` The error object, if any. */ -import FollowInfoSchema from '@/services/UserFollows/schema/FollowInfoSchema'; +import FollowInfoSchema from '@/services/users/UserFollows/schema/FollowInfoSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts index c5406f7..85f57f2 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts @@ -1,4 +1,4 @@ -import FollowInfoSchema from '@/services/UserFollows/schema/FollowInfoSchema'; +import FollowInfoSchema from '@/services/users/UserFollows/schema/FollowInfoSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/pages/api/beers/[id]/index.ts b/src/pages/api/beers/[id]/index.ts index a5a40ca..1a82fc1 100644 --- a/src/pages/api/beers/[id]/index.ts +++ b/src/pages/api/beers/[id]/index.ts @@ -13,7 +13,7 @@ import { deleteBeerPost, } from '@/controllers/posts/beerPosts'; -import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/beers/create.ts b/src/pages/api/beers/create.ts index 0787d82..29c0bb9 100644 --- a/src/pages/api/beers/create.ts +++ b/src/pages/api/beers/create.ts @@ -1,7 +1,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { createRouter } from 'next-connect'; -import CreateBeerPostValidationSchema from '@/services/BeerPost/schema/CreateBeerPostValidationSchema'; +import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; diff --git a/src/pages/api/beers/search.ts b/src/pages/api/beers/search.ts index e088143..dd2cca1 100644 --- a/src/pages/api/beers/search.ts +++ b/src/pages/api/beers/search.ts @@ -5,7 +5,7 @@ import { NextApiRequest, NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; const SearchSchema = z.object({ search: z.string().min(1), diff --git a/src/pages/api/beers/styles/create.ts b/src/pages/api/beers/styles/create.ts index 80ecf3b..5c51c89 100644 --- a/src/pages/api/beers/styles/create.ts +++ b/src/pages/api/beers/styles/create.ts @@ -2,7 +2,7 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { createBeerStyle } from '@/controllers/posts/beerStyles'; import { CreateBeerStyleRequest } from '@/controllers/posts/beerStyles/types'; -import CreateBeerStyleValidationSchema from '@/services/BeerStyles/schema/CreateBeerStyleValidationSchema'; +import CreateBeerStyleValidationSchema from '@/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; diff --git a/src/pages/api/breweries/[id]/index.ts b/src/pages/api/breweries/[id]/index.ts index f491ea6..b359552 100644 --- a/src/pages/api/breweries/[id]/index.ts +++ b/src/pages/api/breweries/[id]/index.ts @@ -7,8 +7,8 @@ import { createRouter, NextHandler } from 'next-connect'; import { z } from 'zod'; import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import getBreweryPostById from '@/services/BreweryPost/getBreweryPostById'; -import EditBreweryPostValidationSchema from '@/services/BreweryPost/schema/EditBreweryPostValidationSchema'; +import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; +import EditBreweryPostValidationSchema from '@/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema'; interface BreweryPostRequest extends UserExtendedNextApiRequest { query: { id: string }; diff --git a/src/pages/api/breweries/create.ts b/src/pages/api/breweries/create.ts index 12edf2d..0291b4e 100644 --- a/src/pages/api/breweries/create.ts +++ b/src/pages/api/breweries/create.ts @@ -5,8 +5,8 @@ import { NextApiResponse } from 'next'; import { z } from 'zod'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import CreateBreweryPostSchema from '@/services/BreweryPost/schema/CreateBreweryPostSchema'; -import createNewBreweryPost from '@/services/BreweryPost/createNewBreweryPost'; +import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; +import createNewBreweryPost from '@/services/posts/BreweryPost/createNewBreweryPost'; import geocode from '@/config/mapbox/geocoder'; import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; diff --git a/src/pages/api/breweries/map/index.ts b/src/pages/api/breweries/map/index.ts index 7c5f6d6..8781c54 100644 --- a/src/pages/api/breweries/map/index.ts +++ b/src/pages/api/breweries/map/index.ts @@ -1,6 +1,6 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import DBClient from '@/prisma/DBClient'; -import BreweryPostMapQueryResult from '@/services/BreweryPost/schema/BreweryPostMapQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/users/[id]/index.ts b/src/pages/api/users/[id]/index.ts index afa2179..5572129 100644 --- a/src/pages/api/users/[id]/index.ts +++ b/src/pages/api/users/[id]/index.ts @@ -4,7 +4,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { editUserInfo, deleteAccount } from '@/controllers/users/auth'; import { checkIfUserCanEditUser } from '@/controllers/users/profile'; import { EditUserRequest } from '@/controllers/users/profile/types'; -import EditUserSchema from '@/services/User/schema/EditUserSchema'; +import EditUserSchema from '@/services/users/User/schema/EditUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; diff --git a/src/pages/api/users/confirm.ts b/src/pages/api/users/confirm.ts index 274cb0a..8e7cff3 100644 --- a/src/pages/api/users/confirm.ts +++ b/src/pages/api/users/confirm.ts @@ -9,7 +9,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { TokenValidationRequest } from '@/controllers/users/auth/types'; import { confirmUser } from '@/controllers/users/auth'; -import TokenValidationSchema from '@/services/User/schema/TokenValidationSchema'; +import TokenValidationSchema from '@/services/users/User/schema/TokenValidationSchema'; const router = createRouter< TokenValidationRequest, diff --git a/src/pages/api/users/edit-password.ts b/src/pages/api/users/edit-password.ts index 899b2f9..7701184 100644 --- a/src/pages/api/users/edit-password.ts +++ b/src/pages/api/users/edit-password.ts @@ -3,7 +3,7 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { updatePassword } from '@/controllers/users/auth'; import { UpdatePasswordRequest } from '@/controllers/users/auth/types'; -import { UpdatePasswordSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { UpdatePasswordSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; diff --git a/src/pages/api/users/login.ts b/src/pages/api/users/login.ts index 4648f44..7fef08c 100644 --- a/src/pages/api/users/login.ts +++ b/src/pages/api/users/login.ts @@ -3,7 +3,7 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { createRouter } from 'next-connect'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import LoginValidationSchema from '@/services/User/schema/LoginValidationSchema'; +import LoginValidationSchema from '@/services/users/User/schema/LoginValidationSchema'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { authenticateUser, loginUser } from '@/controllers/users/auth'; diff --git a/src/pages/api/users/register.ts b/src/pages/api/users/register.ts index 8ee065e..5ee8ef1 100644 --- a/src/pages/api/users/register.ts +++ b/src/pages/api/users/register.ts @@ -1,7 +1,7 @@ import { NextApiResponse } from 'next'; import { z } from 'zod'; import { createRouter } from 'next-connect'; -import { CreateUserValidationSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { CreateUserValidationSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/beers/[id]/edit.tsx b/src/pages/beers/[id]/edit.tsx index c153afa..30c2fdf 100644 --- a/src/pages/beers/[id]/edit.tsx +++ b/src/pages/beers/[id]/edit.tsx @@ -3,8 +3,8 @@ import Head from 'next/head'; import React from 'react'; import withPageAuthRequired from '@/util/withPageAuthRequired'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import EditBeerPostForm from '@/components/EditBeerPostForm'; import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import { BiBeer } from 'react-icons/bi'; diff --git a/src/pages/beers/[id]/index.tsx b/src/pages/beers/[id]/index.tsx index 3bf7bb3..dc79abc 100644 --- a/src/pages/beers/[id]/index.tsx +++ b/src/pages/beers/[id]/index.tsx @@ -1,8 +1,8 @@ import { NextPage, GetServerSideProps } from 'next'; import Head from 'next/head'; -import getBeerPostById from '@/services/BeerPost/getBeerPostById'; +import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { z } from 'zod'; diff --git a/src/pages/beers/styles/[id]/index.tsx b/src/pages/beers/styles/[id]/index.tsx index ea81bb0..3d652e8 100644 --- a/src/pages/beers/styles/[id]/index.tsx +++ b/src/pages/beers/styles/[id]/index.tsx @@ -5,9 +5,9 @@ import { z } from 'zod'; import useMediaQuery from '@/hooks/utilities/useMediaQuery'; import { Tab } from '@headlessui/react'; -import getBeerStyleById from '@/services/BeerStyles/getBeerStyleById'; +import getBeerStyleById from '@/services/posts/BeerStyles/getBeerStyleById'; import BeerStyleHeader from '@/components/BeerStyleById/BeerStyleHeader'; -import BeerStyleQueryResult from '@/services/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; import BeerStyleCommentSection from '@/components/BeerStyleById/BeerStyleCommentSection'; import BeerStyleBeerSection from '@/components/BeerStyleById/BeerStyleBeerSection'; diff --git a/src/pages/breweries/[id]/beers/create.tsx b/src/pages/breweries/[id]/beers/create.tsx index 4374e24..a55190c 100644 --- a/src/pages/breweries/[id]/beers/create.tsx +++ b/src/pages/breweries/[id]/beers/create.tsx @@ -3,12 +3,12 @@ import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { BeerStyle } from '@prisma/client'; import { NextPage } from 'next'; import { BiBeer } from 'react-icons/bi'; import { z } from 'zod'; -import getBreweryPostById from '@/services/BreweryPost/getBreweryPostById'; +import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; interface CreateBeerPageProps { brewery: z.infer; diff --git a/src/pages/breweries/[id]/edit.tsx b/src/pages/breweries/[id]/edit.tsx index 171d980..11d5807 100644 --- a/src/pages/breweries/[id]/edit.tsx +++ b/src/pages/breweries/[id]/edit.tsx @@ -5,9 +5,9 @@ import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import FormSegment from '@/components/ui/forms/FormSegment'; import FormTextArea from '@/components/ui/forms/FormTextArea'; import FormTextInput from '@/components/ui/forms/FormTextInput'; -import getBreweryPostById from '@/services/BreweryPost/getBreweryPostById'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; -import EditBreweryPostValidationSchema from '@/services/BreweryPost/schema/EditBreweryPostValidationSchema'; +import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import EditBreweryPostValidationSchema from '@/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import { zodResolver } from '@hookform/resolvers/zod'; import { NextPage } from 'next'; diff --git a/src/pages/breweries/[id]/index.tsx b/src/pages/breweries/[id]/index.tsx index 4665c2b..7dc3998 100644 --- a/src/pages/breweries/[id]/index.tsx +++ b/src/pages/breweries/[id]/index.tsx @@ -1,5 +1,5 @@ -import getBreweryPostById from '@/services/BreweryPost/getBreweryPostById'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { GetServerSideProps, NextPage } from 'next'; import { z } from 'zod'; diff --git a/src/pages/breweries/index.tsx b/src/pages/breweries/index.tsx index 2b6dae2..65e720f 100644 --- a/src/pages/breweries/index.tsx +++ b/src/pages/breweries/index.tsx @@ -3,7 +3,7 @@ import LoadingCard from '@/components/ui/LoadingCard'; import Spinner from '@/components/ui/Spinner'; import UserContext from '@/contexts/UserContext'; import useBreweryPosts from '@/hooks/data-fetching/brewery-posts/useBreweryPosts'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { NextPage } from 'next'; import Head from 'next/head'; import { useContext, MutableRefObject, useRef } from 'react'; diff --git a/src/pages/breweries/map.tsx b/src/pages/breweries/map.tsx index 61b0c20..4033493 100644 --- a/src/pages/breweries/map.tsx +++ b/src/pages/breweries/map.tsx @@ -7,7 +7,7 @@ import LocationMarker from '@/components/ui/LocationMarker'; import Link from 'next/link'; import Head from 'next/head'; import useGeolocation from '@/hooks/utilities/useGeolocation'; -import BreweryPostMapQueryResult from '@/services/BreweryPost/schema/BreweryPostMapQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; import { z } from 'zod'; import useBreweryMapPagePosts from '@/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts'; import ControlPanel from '@/components/ui/maps/ControlPanel'; diff --git a/src/pages/users/[id].tsx b/src/pages/users/[id].tsx index 66c2d5d..7c2f05d 100644 --- a/src/pages/users/[id].tsx +++ b/src/pages/users/[id].tsx @@ -1,6 +1,6 @@ import useMediaQuery from '@/hooks/utilities/useMediaQuery'; -import findUserById from '@/services/User/findUserById'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import findUserById from '@/services/users/User/findUserById'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import Head from 'next/head'; import { FC } from 'react'; diff --git a/src/pages/users/account/edit-profile.tsx b/src/pages/users/account/edit-profile.tsx index 230399b..1d69c9c 100644 --- a/src/pages/users/account/edit-profile.tsx +++ b/src/pages/users/account/edit-profile.tsx @@ -21,7 +21,7 @@ import UpdateProfileForm from '@/components/Account/UpdateProfileForm'; import useGetUsersFollowedByUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowedByUser'; import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowingUser'; -import UpdateProfileSchema from '@/services/User/schema/UpdateProfileSchema'; +import UpdateProfileSchema from '@/services/users/User/schema/UpdateProfileSchema'; import sendUpdateUserAvatarRequest from '@/requests/Account/sendUpdateUserAvatarRequest'; import sendUpdateUserProfileRequest from '@/requests/Account/sendUpdateUserProfileRequest'; import Spinner from '@/components/ui/Spinner'; diff --git a/src/pages/users/forgot-password.tsx b/src/pages/users/forgot-password.tsx index 1307b01..72023cd 100644 --- a/src/pages/users/forgot-password.tsx +++ b/src/pages/users/forgot-password.tsx @@ -4,7 +4,7 @@ import FormInfo from '@/components/ui/forms/FormInfo'; import FormLabel from '@/components/ui/forms/FormLabel'; import FormSegment from '@/components/ui/forms/FormSegment'; import FormTextInput from '@/components/ui/forms/FormTextInput'; -import { BaseCreateUserSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { BaseCreateUserSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; import createErrorToast from '@/util/createErrorToast'; import { zodResolver } from '@hookform/resolvers/zod'; import { NextPage } from 'next'; diff --git a/src/pages/users/reset-password.tsx b/src/pages/users/reset-password.tsx index f51ae9f..e464987 100644 --- a/src/pages/users/reset-password.tsx +++ b/src/pages/users/reset-password.tsx @@ -1,7 +1,7 @@ import { setLoginSession } from '@/config/auth/session'; import { verifyResetPasswordToken } from '@/config/jwt'; import ServerError from '@/config/util/ServerError'; -import findUserById from '@/services/User/findUserById'; +import findUserById from '@/services/users/User/findUserById'; import { GetServerSideProps, NextApiResponse, NextPage } from 'next'; diff --git a/src/prisma/seed/create/createAdminUser.ts b/src/prisma/seed/create/createAdminUser.ts index 07b3d96..d81db79 100644 --- a/src/prisma/seed/create/createAdminUser.ts +++ b/src/prisma/seed/create/createAdminUser.ts @@ -4,7 +4,7 @@ import { hashPassword } from '../../../config/auth/passwordFns'; import { ADMIN_PASSWORD } from '../../../config/env'; import DBClient from '../../DBClient'; -import GetUserSchema from '../../../services/User/schema/GetUserSchema'; +import GetUserSchema from '../../../services/users/User/schema/GetUserSchema'; import imageUrls from '../util/imageUrls'; const createAdminUser = async () => { diff --git a/src/requests/Account/sendUpdateUserProfileRequest.ts b/src/requests/Account/sendUpdateUserProfileRequest.ts index b55fb8a..5846156 100644 --- a/src/requests/Account/sendUpdateUserProfileRequest.ts +++ b/src/requests/Account/sendUpdateUserProfileRequest.ts @@ -1,4 +1,4 @@ -import UpdateProfileSchema from '@/services/User/schema/UpdateProfileSchema'; +import UpdateProfileSchema from '@/services/users/User/schema/UpdateProfileSchema'; import { z } from 'zod'; interface UpdateProfileRequestParams { diff --git a/src/requests/BeerImage/sendUploadBeerImageRequest.ts b/src/requests/BeerImage/sendUploadBeerImageRequest.ts index de1906c..67b2e8c 100644 --- a/src/requests/BeerImage/sendUploadBeerImageRequest.ts +++ b/src/requests/BeerImage/sendUploadBeerImageRequest.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/BeerPost/sendCreateBeerPostRequest.ts b/src/requests/BeerPost/sendCreateBeerPostRequest.ts index 960e75a..9e04ada 100644 --- a/src/requests/BeerPost/sendCreateBeerPostRequest.ts +++ b/src/requests/BeerPost/sendCreateBeerPostRequest.ts @@ -1,5 +1,5 @@ -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; -import CreateBeerPostValidationSchema from '@/services/BeerPost/schema/CreateBeerPostValidationSchema'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/BeerPost/sendEditBeerPostRequest.ts b/src/requests/BeerPost/sendEditBeerPostRequest.ts index f85d615..37d0366 100644 --- a/src/requests/BeerPost/sendEditBeerPostRequest.ts +++ b/src/requests/BeerPost/sendEditBeerPostRequest.ts @@ -1,4 +1,4 @@ -import EditBeerPostValidationSchema from '@/services/BeerPost/schema/EditBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts b/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts index 7875d68..0821c6d 100644 --- a/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts +++ b/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts @@ -1,4 +1,4 @@ -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { z } from 'zod'; interface SendUploadBeerImagesRequestArgs { diff --git a/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts b/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts index 2da3ed5..9b14b74 100644 --- a/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts +++ b/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts @@ -1,5 +1,5 @@ -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; -import CreateBreweryPostSchema from '@/services/BreweryPost/schema/CreateBreweryPostSchema'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/User/sendEditUserRequest.ts b/src/requests/User/sendEditUserRequest.ts index 17eb453..7a0ecbf 100644 --- a/src/requests/User/sendEditUserRequest.ts +++ b/src/requests/User/sendEditUserRequest.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/User/sendRegisterUserRequest.ts b/src/requests/User/sendRegisterUserRequest.ts index b29b5e5..66cc069 100644 --- a/src/requests/User/sendRegisterUserRequest.ts +++ b/src/requests/User/sendRegisterUserRequest.ts @@ -1,5 +1,5 @@ -import { CreateUserValidationSchema } from '@/services/User/schema/CreateUserValidationSchemas'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import { CreateUserValidationSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/User/sendUpdatePasswordRequest.ts b/src/requests/User/sendUpdatePasswordRequest.ts index 01b55c3..407e8e7 100644 --- a/src/requests/User/sendUpdatePasswordRequest.ts +++ b/src/requests/User/sendUpdatePasswordRequest.ts @@ -1,4 +1,4 @@ -import { UpdatePasswordSchema } from '@/services/User/schema/CreateUserValidationSchemas'; +import { UpdatePasswordSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/services/BeerComment/createNewBeerComment.ts b/src/services/comments/BeerComment/createNewBeerComment.ts similarity index 83% rename from src/services/BeerComment/createNewBeerComment.ts rename to src/services/comments/BeerComment/createNewBeerComment.ts index 9abba2b..664e19e 100644 --- a/src/services/BeerComment/createNewBeerComment.ts +++ b/src/services/comments/BeerComment/createNewBeerComment.ts @@ -1,7 +1,7 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CreateCommentValidationSchema from '../schema/CommentSchema/CreateCommentValidationSchema'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; const CreateNewBeerCommentServiceSchema = CreateCommentValidationSchema.extend({ userId: z.string().cuid(), diff --git a/src/services/BeerComment/editBeerCommentById.ts b/src/services/comments/BeerComment/editBeerCommentById.ts similarity index 89% rename from src/services/BeerComment/editBeerCommentById.ts rename to src/services/comments/BeerComment/editBeerCommentById.ts index 2aa4e3c..5449bf4 100644 --- a/src/services/BeerComment/editBeerCommentById.ts +++ b/src/services/comments/BeerComment/editBeerCommentById.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; interface EditBeerCommentByIdArgs { id: string; diff --git a/src/services/BeerComment/findBeerCommentById.ts b/src/services/comments/BeerComment/findBeerCommentById.ts similarity index 88% rename from src/services/BeerComment/findBeerCommentById.ts rename to src/services/comments/BeerComment/findBeerCommentById.ts index f985414..e27acff 100644 --- a/src/services/BeerComment/findBeerCommentById.ts +++ b/src/services/comments/BeerComment/findBeerCommentById.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; interface FindBeerCommentArgs { beerCommentId: string; diff --git a/src/services/BeerComment/getAllBeerComments.ts b/src/services/comments/BeerComment/getAllBeerComments.ts similarity index 90% rename from src/services/BeerComment/getAllBeerComments.ts rename to src/services/comments/BeerComment/getAllBeerComments.ts index c7a30bd..26c5e1d 100644 --- a/src/services/BeerComment/getAllBeerComments.ts +++ b/src/services/comments/BeerComment/getAllBeerComments.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; interface GetAllBeerCommentsArgs { beerPostId: string; diff --git a/src/services/BeerComment/getBeerCommentCount.ts b/src/services/comments/BeerComment/getBeerCommentCount.ts similarity index 100% rename from src/services/BeerComment/getBeerCommentCount.ts rename to src/services/comments/BeerComment/getBeerCommentCount.ts diff --git a/src/services/BeerStyleComment/createNewBeerStyleComment.ts b/src/services/comments/BeerStyleComment/createNewBeerStyleComment.ts similarity index 84% rename from src/services/BeerStyleComment/createNewBeerStyleComment.ts rename to src/services/comments/BeerStyleComment/createNewBeerStyleComment.ts index 9d29ee2..8197438 100644 --- a/src/services/BeerStyleComment/createNewBeerStyleComment.ts +++ b/src/services/comments/BeerStyleComment/createNewBeerStyleComment.ts @@ -1,7 +1,7 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CreateCommentValidationSchema from '../schema/CommentSchema/CreateCommentValidationSchema'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; const CreateNewBeerStyleCommentServiceSchema = CreateCommentValidationSchema.extend({ userId: z.string().cuid(), diff --git a/src/services/BeerStyleComment/getAllBeerStyleComments.ts b/src/services/comments/BeerStyleComment/getAllBeerStyleComments.ts similarity index 90% rename from src/services/BeerStyleComment/getAllBeerStyleComments.ts rename to src/services/comments/BeerStyleComment/getAllBeerStyleComments.ts index 77deced..08219bf 100644 --- a/src/services/BeerStyleComment/getAllBeerStyleComments.ts +++ b/src/services/comments/BeerStyleComment/getAllBeerStyleComments.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; interface GetAllBeerStyleCommentArgs { beerStyleId: string; diff --git a/src/services/BeerStyleComment/getBeerStyleCommentCount.ts b/src/services/comments/BeerStyleComment/getBeerStyleCommentCount.ts similarity index 100% rename from src/services/BeerStyleComment/getBeerStyleCommentCount.ts rename to src/services/comments/BeerStyleComment/getBeerStyleCommentCount.ts diff --git a/src/services/BeerStyleComment/updateBeerStyleCommentById.ts b/src/services/comments/BeerStyleComment/updateBeerStyleCommentById.ts similarity index 83% rename from src/services/BeerStyleComment/updateBeerStyleCommentById.ts rename to src/services/comments/BeerStyleComment/updateBeerStyleCommentById.ts index 30fe53d..a457043 100644 --- a/src/services/BeerStyleComment/updateBeerStyleCommentById.ts +++ b/src/services/comments/BeerStyleComment/updateBeerStyleCommentById.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CreateCommentValidationSchema from '../schema/CommentSchema/CreateCommentValidationSchema'; +import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; interface UpdateBeerStyleCommentByIdParams { body: z.infer; diff --git a/src/services/BreweryComment/createNewBreweryComment.ts b/src/services/comments/BreweryComment/createNewBreweryComment.ts similarity index 83% rename from src/services/BreweryComment/createNewBreweryComment.ts rename to src/services/comments/BreweryComment/createNewBreweryComment.ts index d161292..ea8de7b 100644 --- a/src/services/BreweryComment/createNewBreweryComment.ts +++ b/src/services/comments/BreweryComment/createNewBreweryComment.ts @@ -1,7 +1,7 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CreateCommentValidationSchema from '../schema/CommentSchema/CreateCommentValidationSchema'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; const CreateNewBreweryCommentServiceSchema = CreateCommentValidationSchema.extend({ userId: z.string().cuid(), diff --git a/src/services/BreweryComment/getAllBreweryComments.ts b/src/services/comments/BreweryComment/getAllBreweryComments.ts similarity index 90% rename from src/services/BreweryComment/getAllBreweryComments.ts rename to src/services/comments/BreweryComment/getAllBreweryComments.ts index 766f68d..5c8a1a7 100644 --- a/src/services/BreweryComment/getAllBreweryComments.ts +++ b/src/services/comments/BreweryComment/getAllBreweryComments.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import CommentQueryResult from '../schema/CommentSchema/CommentQueryResult'; +import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; const getAllBreweryComments = async ({ id, diff --git a/src/services/BreweryComment/getBreweryCommentById.ts b/src/services/comments/BreweryComment/getBreweryCommentById.ts similarity index 100% rename from src/services/BreweryComment/getBreweryCommentById.ts rename to src/services/comments/BreweryComment/getBreweryCommentById.ts diff --git a/src/services/BeerImage/addBeerImageToDB.ts b/src/services/images/BeerImage/addBeerImageToDB.ts similarity index 90% rename from src/services/BeerImage/addBeerImageToDB.ts rename to src/services/images/BeerImage/addBeerImageToDB.ts index 0ca896b..e4e472a 100644 --- a/src/services/BeerImage/addBeerImageToDB.ts +++ b/src/services/images/BeerImage/addBeerImageToDB.ts @@ -1,7 +1,7 @@ import DBClient from '@/prisma/DBClient'; import { BeerImage } from '@prisma/client'; import { z } from 'zod'; -import ImageMetadataValidationSchema from '../schema/ImageSchema/ImageMetadataValidationSchema'; +import ImageMetadataValidationSchema from '../../schema/ImageSchema/ImageMetadataValidationSchema'; interface ProcessImageDataArgs { files: Express.Multer.File[]; diff --git a/src/services/BreweryImage/addBreweryImageToDB.ts b/src/services/images/BreweryImage/addBreweryImageToDB.ts similarity index 90% rename from src/services/BreweryImage/addBreweryImageToDB.ts rename to src/services/images/BreweryImage/addBreweryImageToDB.ts index e4b5499..99992f8 100644 --- a/src/services/BreweryImage/addBreweryImageToDB.ts +++ b/src/services/images/BreweryImage/addBreweryImageToDB.ts @@ -1,7 +1,7 @@ import DBClient from '@/prisma/DBClient'; import { BreweryImage } from '@prisma/client'; import { z } from 'zod'; -import ImageMetadataValidationSchema from '../schema/ImageSchema/ImageMetadataValidationSchema'; +import ImageMetadataValidationSchema from '../../schema/ImageSchema/ImageMetadataValidationSchema'; interface ProcessImageDataArgs { files: Express.Multer.File[]; diff --git a/src/services/BeerPostLike/createBeerPostLike.ts b/src/services/likes/BeerPostLike/createBeerPostLike.ts similarity index 85% rename from src/services/BeerPostLike/createBeerPostLike.ts rename to src/services/likes/BeerPostLike/createBeerPostLike.ts index f086321..6c2ebe8 100644 --- a/src/services/BeerPostLike/createBeerPostLike.ts +++ b/src/services/likes/BeerPostLike/createBeerPostLike.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import GetUserSchema from '../User/schema/GetUserSchema'; +import GetUserSchema from '../../users/User/schema/GetUserSchema'; interface CreateBeerPostLikeArgs { id: string; diff --git a/src/services/BeerPostLike/findBeerPostLikeById.ts b/src/services/likes/BeerPostLike/findBeerPostLikeById.ts similarity index 100% rename from src/services/BeerPostLike/findBeerPostLikeById.ts rename to src/services/likes/BeerPostLike/findBeerPostLikeById.ts diff --git a/src/services/BeerPostLike/getBeerPostLikeCount.ts b/src/services/likes/BeerPostLike/getBeerPostLikeCount.ts similarity index 100% rename from src/services/BeerPostLike/getBeerPostLikeCount.ts rename to src/services/likes/BeerPostLike/getBeerPostLikeCount.ts diff --git a/src/services/BeerPostLike/removeBeerPostLikeById.ts b/src/services/likes/BeerPostLike/removeBeerPostLikeById.ts similarity index 100% rename from src/services/BeerPostLike/removeBeerPostLikeById.ts rename to src/services/likes/BeerPostLike/removeBeerPostLikeById.ts diff --git a/src/services/BeerStyleLike/createBeerStyleLike.ts b/src/services/likes/BeerStyleLike/createBeerStyleLike.ts similarity index 85% rename from src/services/BeerStyleLike/createBeerStyleLike.ts rename to src/services/likes/BeerStyleLike/createBeerStyleLike.ts index 9d4652b..6af1e71 100644 --- a/src/services/BeerStyleLike/createBeerStyleLike.ts +++ b/src/services/likes/BeerStyleLike/createBeerStyleLike.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; interface CreateBeerStyleLikeArgs { beerStyleId: string; diff --git a/src/services/BeerStyleLike/findBeerStyleLikeById.ts b/src/services/likes/BeerStyleLike/findBeerStyleLikeById.ts similarity index 100% rename from src/services/BeerStyleLike/findBeerStyleLikeById.ts rename to src/services/likes/BeerStyleLike/findBeerStyleLikeById.ts diff --git a/src/services/BeerStyleLike/getBeerStyleLikeCount.ts b/src/services/likes/BeerStyleLike/getBeerStyleLikeCount.ts similarity index 100% rename from src/services/BeerStyleLike/getBeerStyleLikeCount.ts rename to src/services/likes/BeerStyleLike/getBeerStyleLikeCount.ts diff --git a/src/services/BeerStyleLike/removeBeerStyleLikeById.ts b/src/services/likes/BeerStyleLike/removeBeerStyleLikeById.ts similarity index 100% rename from src/services/BeerStyleLike/removeBeerStyleLikeById.ts rename to src/services/likes/BeerStyleLike/removeBeerStyleLikeById.ts diff --git a/src/services/BeerPost/createNewBeerPost.ts b/src/services/posts/BeerPost/createNewBeerPost.ts similarity index 100% rename from src/services/BeerPost/createNewBeerPost.ts rename to src/services/posts/BeerPost/createNewBeerPost.ts diff --git a/src/services/BeerPost/deleteBeerPostById.ts b/src/services/posts/BeerPost/deleteBeerPostById.ts similarity index 100% rename from src/services/BeerPost/deleteBeerPostById.ts rename to src/services/posts/BeerPost/deleteBeerPostById.ts diff --git a/src/services/BeerPost/editBeerPostById.ts b/src/services/posts/BeerPost/editBeerPostById.ts similarity index 100% rename from src/services/BeerPost/editBeerPostById.ts rename to src/services/posts/BeerPost/editBeerPostById.ts diff --git a/src/services/BeerPost/getAllBeerPosts.ts b/src/services/posts/BeerPost/getAllBeerPosts.ts similarity index 92% rename from src/services/BeerPost/getAllBeerPosts.ts rename to src/services/posts/BeerPost/getAllBeerPosts.ts index 483f02c..dd37b8d 100644 --- a/src/services/BeerPost/getAllBeerPosts.ts +++ b/src/services/posts/BeerPost/getAllBeerPosts.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { z } from 'zod'; const prisma = DBClient.instance; diff --git a/src/services/BeerPost/getBeerPostById.ts b/src/services/posts/BeerPost/getBeerPostById.ts similarity index 90% rename from src/services/BeerPost/getBeerPostById.ts rename to src/services/posts/BeerPost/getBeerPostById.ts index 407c143..36fd1a2 100644 --- a/src/services/BeerPost/getBeerPostById.ts +++ b/src/services/posts/BeerPost/getBeerPostById.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { z } from 'zod'; const prisma = DBClient.instance; diff --git a/src/services/BeerPost/getBeerPostsByBeerStyleId.ts b/src/services/posts/BeerPost/getBeerPostsByBeerStyleId.ts similarity index 100% rename from src/services/BeerPost/getBeerPostsByBeerStyleId.ts rename to src/services/posts/BeerPost/getBeerPostsByBeerStyleId.ts diff --git a/src/services/BeerPost/getBeerPostsByBreweryId.ts b/src/services/posts/BeerPost/getBeerPostsByBreweryId.ts similarity index 100% rename from src/services/BeerPost/getBeerPostsByBreweryId.ts rename to src/services/posts/BeerPost/getBeerPostsByBreweryId.ts diff --git a/src/services/BeerPost/getBeerPostsByPostedById.ts b/src/services/posts/BeerPost/getBeerPostsByPostedById.ts similarity index 100% rename from src/services/BeerPost/getBeerPostsByPostedById.ts rename to src/services/posts/BeerPost/getBeerPostsByPostedById.ts diff --git a/src/services/BeerPost/getBeerRecommendations.ts b/src/services/posts/BeerPost/getBeerRecommendations.ts similarity index 94% rename from src/services/BeerPost/getBeerRecommendations.ts rename to src/services/posts/BeerPost/getBeerRecommendations.ts index 2fce906..6353e06 100644 --- a/src/services/BeerPost/getBeerRecommendations.ts +++ b/src/services/posts/BeerPost/getBeerRecommendations.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; import { z } from 'zod'; diff --git a/src/services/BeerPost/schema/BeerPostQueryResult.ts b/src/services/posts/BeerPost/schema/BeerPostQueryResult.ts similarity index 100% rename from src/services/BeerPost/schema/BeerPostQueryResult.ts rename to src/services/posts/BeerPost/schema/BeerPostQueryResult.ts diff --git a/src/services/BeerPost/schema/CreateBeerPostValidationSchema.ts b/src/services/posts/BeerPost/schema/CreateBeerPostValidationSchema.ts similarity index 100% rename from src/services/BeerPost/schema/CreateBeerPostValidationSchema.ts rename to src/services/posts/BeerPost/schema/CreateBeerPostValidationSchema.ts diff --git a/src/services/BeerPost/schema/EditBeerPostValidationSchema.ts b/src/services/posts/BeerPost/schema/EditBeerPostValidationSchema.ts similarity index 100% rename from src/services/BeerPost/schema/EditBeerPostValidationSchema.ts rename to src/services/posts/BeerPost/schema/EditBeerPostValidationSchema.ts diff --git a/src/services/BeerStyles/deleteBeerStyleById.ts b/src/services/posts/BeerStyles/deleteBeerStyleById.ts similarity index 100% rename from src/services/BeerStyles/deleteBeerStyleById.ts rename to src/services/posts/BeerStyles/deleteBeerStyleById.ts diff --git a/src/services/BeerStyles/editBeerStyleById.ts b/src/services/posts/BeerStyles/editBeerStyleById.ts similarity index 100% rename from src/services/BeerStyles/editBeerStyleById.ts rename to src/services/posts/BeerStyles/editBeerStyleById.ts diff --git a/src/services/BeerStyles/getAllBeerStyles.ts b/src/services/posts/BeerStyles/getAllBeerStyles.ts similarity index 100% rename from src/services/BeerStyles/getAllBeerStyles.ts rename to src/services/posts/BeerStyles/getAllBeerStyles.ts diff --git a/src/services/BeerStyles/getBeerStyleById.ts b/src/services/posts/BeerStyles/getBeerStyleById.ts similarity index 100% rename from src/services/BeerStyles/getBeerStyleById.ts rename to src/services/posts/BeerStyles/getBeerStyleById.ts diff --git a/src/services/BeerStyles/schema/BeerStyleQueryResult.ts b/src/services/posts/BeerStyles/schema/BeerStyleQueryResult.ts similarity index 100% rename from src/services/BeerStyles/schema/BeerStyleQueryResult.ts rename to src/services/posts/BeerStyles/schema/BeerStyleQueryResult.ts diff --git a/src/services/BeerStyles/schema/CreateBeerStyleValidationSchema.ts b/src/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema.ts similarity index 100% rename from src/services/BeerStyles/schema/CreateBeerStyleValidationSchema.ts rename to src/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema.ts diff --git a/src/services/BreweryPost/createNewBreweryPost.ts b/src/services/posts/BreweryPost/createNewBreweryPost.ts similarity index 100% rename from src/services/BreweryPost/createNewBreweryPost.ts rename to src/services/posts/BreweryPost/createNewBreweryPost.ts diff --git a/src/services/BreweryPost/getAllBreweryPosts.ts b/src/services/posts/BreweryPost/getAllBreweryPosts.ts similarity index 92% rename from src/services/BreweryPost/getAllBreweryPosts.ts rename to src/services/posts/BreweryPost/getAllBreweryPosts.ts index c83883c..39db838 100644 --- a/src/services/BreweryPost/getAllBreweryPosts.ts +++ b/src/services/posts/BreweryPost/getAllBreweryPosts.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { z } from 'zod'; diff --git a/src/services/BreweryPost/getAllBreweryPostsByPostedById.ts b/src/services/posts/BreweryPost/getAllBreweryPostsByPostedById.ts similarity index 93% rename from src/services/BreweryPost/getAllBreweryPostsByPostedById.ts rename to src/services/posts/BreweryPost/getAllBreweryPostsByPostedById.ts index 9b70cd8..d8a3dc7 100644 --- a/src/services/BreweryPost/getAllBreweryPostsByPostedById.ts +++ b/src/services/posts/BreweryPost/getAllBreweryPostsByPostedById.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { z } from 'zod'; diff --git a/src/services/BreweryPost/getBreweryPostById.ts b/src/services/posts/BreweryPost/getBreweryPostById.ts similarity index 91% rename from src/services/BreweryPost/getBreweryPostById.ts rename to src/services/posts/BreweryPost/getBreweryPostById.ts index 51b5db9..0c8399b 100644 --- a/src/services/BreweryPost/getBreweryPostById.ts +++ b/src/services/posts/BreweryPost/getBreweryPostById.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; import { z } from 'zod'; const prisma = DBClient.instance; diff --git a/src/services/BreweryPost/schema/BreweryPostMapQueryResult.ts b/src/services/posts/BreweryPost/schema/BreweryPostMapQueryResult.ts similarity index 100% rename from src/services/BreweryPost/schema/BreweryPostMapQueryResult.ts rename to src/services/posts/BreweryPost/schema/BreweryPostMapQueryResult.ts diff --git a/src/services/BreweryPost/schema/BreweryPostQueryResult.ts b/src/services/posts/BreweryPost/schema/BreweryPostQueryResult.ts similarity index 100% rename from src/services/BreweryPost/schema/BreweryPostQueryResult.ts rename to src/services/posts/BreweryPost/schema/BreweryPostQueryResult.ts diff --git a/src/services/BreweryPost/schema/CreateBreweryPostSchema.ts b/src/services/posts/BreweryPost/schema/CreateBreweryPostSchema.ts similarity index 100% rename from src/services/BreweryPost/schema/CreateBreweryPostSchema.ts rename to src/services/posts/BreweryPost/schema/CreateBreweryPostSchema.ts diff --git a/src/services/BreweryPost/schema/EditBreweryPostValidationSchema.ts b/src/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema.ts similarity index 100% rename from src/services/BreweryPost/schema/EditBreweryPostValidationSchema.ts rename to src/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema.ts diff --git a/src/services/User/createNewUser.ts b/src/services/users/User/createNewUser.ts similarity index 100% rename from src/services/User/createNewUser.ts rename to src/services/users/User/createNewUser.ts diff --git a/src/services/User/deleteUserById.ts b/src/services/users/User/deleteUserById.ts similarity index 100% rename from src/services/User/deleteUserById.ts rename to src/services/users/User/deleteUserById.ts diff --git a/src/services/User/findUserByEmail.ts b/src/services/users/User/findUserByEmail.ts similarity index 82% rename from src/services/User/findUserByEmail.ts rename to src/services/users/User/findUserByEmail.ts index 1fa85d4..6e505e1 100644 --- a/src/services/User/findUserByEmail.ts +++ b/src/services/users/User/findUserByEmail.ts @@ -1,4 +1,4 @@ -import DBClient from '../../prisma/DBClient'; +import DBClient from '../../../prisma/DBClient'; const findUserByEmail = async (email: string) => DBClient.instance.user.findFirst({ diff --git a/src/services/User/findUserById.ts b/src/services/users/User/findUserById.ts similarity index 100% rename from src/services/User/findUserById.ts rename to src/services/users/User/findUserById.ts diff --git a/src/services/User/findUserByIdPublic.ts b/src/services/users/User/findUserByIdPublic.ts similarity index 100% rename from src/services/User/findUserByIdPublic.ts rename to src/services/users/User/findUserByIdPublic.ts diff --git a/src/services/User/findUserByUsername.ts b/src/services/users/User/findUserByUsername.ts similarity index 82% rename from src/services/User/findUserByUsername.ts rename to src/services/users/User/findUserByUsername.ts index 1669e71..b4a57ca 100644 --- a/src/services/User/findUserByUsername.ts +++ b/src/services/users/User/findUserByUsername.ts @@ -1,4 +1,4 @@ -import DBClient from '../../prisma/DBClient'; +import DBClient from '../../../prisma/DBClient'; const findUserByUsername = async (username: string) => DBClient.instance.user.findFirst({ diff --git a/src/services/User/schema/CreateUserValidationSchemas.ts b/src/services/users/User/schema/CreateUserValidationSchemas.ts similarity index 100% rename from src/services/User/schema/CreateUserValidationSchemas.ts rename to src/services/users/User/schema/CreateUserValidationSchemas.ts diff --git a/src/services/User/schema/EditUserSchema.ts b/src/services/users/User/schema/EditUserSchema.ts similarity index 100% rename from src/services/User/schema/EditUserSchema.ts rename to src/services/users/User/schema/EditUserSchema.ts diff --git a/src/services/User/schema/GetUserSchema.ts b/src/services/users/User/schema/GetUserSchema.ts similarity index 100% rename from src/services/User/schema/GetUserSchema.ts rename to src/services/users/User/schema/GetUserSchema.ts diff --git a/src/services/User/schema/LoginValidationSchema.ts b/src/services/users/User/schema/LoginValidationSchema.ts similarity index 100% rename from src/services/User/schema/LoginValidationSchema.ts rename to src/services/users/User/schema/LoginValidationSchema.ts diff --git a/src/services/User/schema/PublicUserSchema.ts b/src/services/users/User/schema/PublicUserSchema.ts similarity index 69% rename from src/services/User/schema/PublicUserSchema.ts rename to src/services/users/User/schema/PublicUserSchema.ts index 59e85aa..08895f3 100644 --- a/src/services/User/schema/PublicUserSchema.ts +++ b/src/services/users/User/schema/PublicUserSchema.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; const PublicUserSchema = GetUserSchema.pick({ id: true, diff --git a/src/services/User/schema/TokenValidationSchema.ts b/src/services/users/User/schema/TokenValidationSchema.ts similarity index 100% rename from src/services/User/schema/TokenValidationSchema.ts rename to src/services/users/User/schema/TokenValidationSchema.ts diff --git a/src/services/User/schema/UpdateProfileSchema.ts b/src/services/users/User/schema/UpdateProfileSchema.ts similarity index 100% rename from src/services/User/schema/UpdateProfileSchema.ts rename to src/services/users/User/schema/UpdateProfileSchema.ts diff --git a/src/services/User/sendConfirmationEmail.ts b/src/services/users/User/sendConfirmationEmail.ts similarity index 100% rename from src/services/User/sendConfirmationEmail.ts rename to src/services/users/User/sendConfirmationEmail.ts diff --git a/src/services/User/sendResetPasswordEmail.ts b/src/services/users/User/sendResetPasswordEmail.ts similarity index 100% rename from src/services/User/sendResetPasswordEmail.ts rename to src/services/users/User/sendResetPasswordEmail.ts diff --git a/src/services/User/updateUserProfileById.ts b/src/services/users/User/updateUserProfileById.ts similarity index 100% rename from src/services/User/updateUserProfileById.ts rename to src/services/users/User/updateUserProfileById.ts diff --git a/src/services/User/updateUserToBeConfirmedById.ts b/src/services/users/User/updateUserToBeConfirmedById.ts similarity index 91% rename from src/services/User/updateUserToBeConfirmedById.ts rename to src/services/users/User/updateUserToBeConfirmedById.ts index 4a8e7f3..650b42d 100644 --- a/src/services/User/updateUserToBeConfirmedById.ts +++ b/src/services/users/User/updateUserToBeConfirmedById.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; diff --git a/src/services/UserAccount/UpdateUserAvatarByIdParams.ts b/src/services/users/UserAccount/UpdateUserAvatarByIdParams.ts similarity index 94% rename from src/services/UserAccount/UpdateUserAvatarByIdParams.ts rename to src/services/users/UserAccount/UpdateUserAvatarByIdParams.ts index bf915bf..9002c47 100644 --- a/src/services/UserAccount/UpdateUserAvatarByIdParams.ts +++ b/src/services/users/UserAccount/UpdateUserAvatarByIdParams.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; import { z } from 'zod'; export interface UpdateUserAvatarByIdParams { diff --git a/src/services/UserFollows/getUsersFollowedByUser.ts b/src/services/users/UserFollows/getUsersFollowedByUser.ts similarity index 100% rename from src/services/UserFollows/getUsersFollowedByUser.ts rename to src/services/users/UserFollows/getUsersFollowedByUser.ts diff --git a/src/services/UserFollows/getUsersFollowingUser.ts b/src/services/users/UserFollows/getUsersFollowingUser.ts similarity index 100% rename from src/services/UserFollows/getUsersFollowingUser.ts rename to src/services/users/UserFollows/getUsersFollowingUser.ts diff --git a/src/services/UserFollows/schema/FollowInfoSchema.ts b/src/services/users/UserFollows/schema/FollowInfoSchema.ts similarity index 65% rename from src/services/UserFollows/schema/FollowInfoSchema.ts rename to src/services/users/UserFollows/schema/FollowInfoSchema.ts index 86ff7d4..7151448 100644 --- a/src/services/UserFollows/schema/FollowInfoSchema.ts +++ b/src/services/users/UserFollows/schema/FollowInfoSchema.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; const FollowInfoSchema = GetUserSchema.pick({ userAvatar: true, From 8b0d182cb34752efba3a8f991d9c5352a5895d7c Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 10 Dec 2023 18:15:35 -0500 Subject: [PATCH 13/21] Update casing for services and controllers directories. --- src/components/Account/AccountInfo.tsx | 2 +- src/components/Account/Security.tsx | 2 +- src/components/Account/UpdateProfileForm.tsx | 4 ++-- src/components/Account/UserAvatar.tsx | 2 +- src/components/BeerById/BeerCommentForm.tsx | 2 +- src/components/BeerById/BeerInfoHeader.tsx | 2 +- .../BeerById/BeerPostCommentsSection.tsx | 2 +- src/components/BeerById/BeerRecommendations.tsx | 2 +- src/components/BeerIndex/BeerCard.tsx | 2 +- .../BeerStyleById/BeerStyleBeerSection.tsx | 2 +- .../BeerStyleById/BeerStyleCommentForm.tsx | 2 +- .../BeerStyleById/BeerStyleCommentSection.tsx | 2 +- src/components/BeerStyleById/BeerStyleHeader.tsx | 2 +- src/components/BeerStyleIndex/BeerStyleCard.tsx | 2 +- .../BreweryById/BreweryBeerSection.tsx | 2 +- .../BreweryById/BreweryCommentForm.tsx | 2 +- .../BreweryById/BreweryCommentsSection.tsx | 2 +- src/components/BreweryById/BreweryInfoHeader.tsx | 2 +- src/components/BreweryIndex/BreweryCard.tsx | 2 +- .../BreweryPost/CreateBreweryPostForm.tsx | 2 +- src/components/CreateBeerPostForm.tsx | 4 ++-- src/components/EditBeerPostForm.tsx | 2 +- src/components/Login/LoginForm.tsx | 2 +- src/components/RegisterUserForm.tsx | 2 +- src/components/UserPage/UserFollowButton.tsx | 2 +- src/components/UserPage/UserHeader.tsx | 2 +- src/config/auth/localStrat.ts | 2 +- src/config/auth/types.ts | 2 +- .../nextConnect/middleware/getCurrentUser.ts | 2 +- src/contexts/UserContext.tsx | 2 +- .../{beerComments => beer-comments}/index.ts | 8 ++++---- .../index.ts | 6 +++--- .../index.ts | 6 +++--- .../images/{beerImages => beer-images}/index.ts | 2 +- .../{breweryImages => brewery-images}/index.ts | 2 +- .../{beerPostLikes => beer-posts-likes}/index.ts | 10 +++++----- .../index.ts | 10 +++++----- .../index.ts | 0 .../posts/{beerPosts => beer-posts}/index.ts | 14 +++++++------- .../{beerPosts => beer-posts}/types/index.ts | 4 ++-- .../posts/{beerStyles => beer-styles}/index.ts | 6 +++--- .../{beerStyles => beer-styles}/types/index.ts | 2 +- src/controllers/posts/breweries/index.ts | 10 +++++----- src/controllers/posts/breweries/types/index.ts | 2 +- src/controllers/users/auth/index.ts | 16 ++++++++-------- src/controllers/users/auth/types/index.ts | 4 ++-- src/controllers/users/profile/index.ts | 11 ++++++----- src/controllers/users/profile/types/index.ts | 2 +- src/hooks/auth/useUser.ts | 2 +- .../beer-posts/useBeerPostSearch.ts | 2 +- .../data-fetching/beer-posts/useBeerPosts.ts | 2 +- .../beer-posts/useBeerPostsByBeerStyles.ts | 2 +- .../beer-posts/useBeerPostsByBrewery.ts | 2 +- .../beer-posts/useBeerPostsByUser.ts | 2 +- .../beer-posts/useBeerRecommendations.ts | 2 +- .../data-fetching/beer-styles/useBeerStyles.ts | 2 +- .../brewery-posts/useBreweryMapPagePosts.ts | 2 +- .../brewery-posts/useBreweryPosts.ts | 2 +- .../brewery-posts/useBreweryPostsByUser.ts | 2 +- .../user-follows/useGetUsersFollowedByUser.ts | 2 +- .../user-follows/useGetUsersFollowingUser.ts | 2 +- src/pages/api/beer-comments/[id].ts | 2 +- src/pages/api/beer-style-comments/[id].ts | 2 +- src/pages/api/beers/[id]/comments/index.ts | 2 +- src/pages/api/beers/[id]/images/index.ts | 2 +- src/pages/api/beers/[id]/index.ts | 6 +++--- src/pages/api/beers/[id]/like/index.ts | 2 +- src/pages/api/beers/[id]/like/is-liked.ts | 2 +- src/pages/api/beers/[id]/recommendations.ts | 4 ++-- src/pages/api/beers/create.ts | 6 +++--- src/pages/api/beers/index.ts | 4 ++-- src/pages/api/beers/search.ts | 2 +- src/pages/api/beers/styles/[id]/beers/index.ts | 2 +- .../api/beers/styles/[id]/comments/index.ts | 2 +- src/pages/api/beers/styles/[id]/index.ts | 4 ++-- src/pages/api/beers/styles/[id]/like/index.ts | 2 +- src/pages/api/beers/styles/[id]/like/is-liked.ts | 2 +- src/pages/api/beers/styles/create.ts | 6 +++--- src/pages/api/beers/styles/index.ts | 2 +- src/pages/api/breweries/[id]/comments/index.ts | 2 +- src/pages/api/breweries/[id]/images/index.ts | 2 +- src/pages/api/breweries/[id]/index.ts | 4 ++-- src/pages/api/breweries/[id]/like/index.ts | 2 +- src/pages/api/breweries/[id]/like/is-liked.ts | 2 +- src/pages/api/breweries/create.ts | 4 ++-- src/pages/api/breweries/map/index.ts | 2 +- src/pages/api/brewery-comments/[id].ts | 2 +- src/pages/api/users/[id]/index.ts | 3 ++- src/pages/api/users/[id]/posts/beers.ts | 2 +- src/pages/api/users/confirm.ts | 2 +- src/pages/api/users/edit-password.ts | 3 ++- src/pages/api/users/login.ts | 3 ++- src/pages/api/users/register.ts | 3 ++- src/pages/beers/[id]/edit.tsx | 4 ++-- src/pages/beers/[id]/index.tsx | 4 ++-- src/pages/beers/styles/[id]/index.tsx | 4 ++-- src/pages/breweries/[id]/beers/create.tsx | 4 ++-- src/pages/breweries/[id]/edit.tsx | 6 +++--- src/pages/breweries/[id]/index.tsx | 4 ++-- src/pages/breweries/index.tsx | 2 +- src/pages/breweries/map.tsx | 2 +- src/pages/users/[id].tsx | 4 ++-- src/pages/users/account/edit-profile.tsx | 2 +- src/pages/users/forgot-password.tsx | 2 +- src/pages/users/reset-password.tsx | 2 +- src/prisma/seed/create/createAdminUser.ts | 2 +- .../Account/sendUpdateUserProfileRequest.ts | 2 +- .../BeerImage/sendUploadBeerImageRequest.ts | 2 +- .../BeerPost/sendCreateBeerPostRequest.ts | 4 ++-- src/requests/BeerPost/sendEditBeerPostRequest.ts | 2 +- .../sendUploadBreweryImageRequest.ts | 2 +- .../BreweryPost/sendCreateBreweryPostRequest.ts | 4 ++-- src/requests/User/sendEditUserRequest.ts | 2 +- src/requests/User/sendRegisterUserRequest.ts | 4 ++-- src/requests/User/sendUpdatePasswordRequest.ts | 2 +- .../createNewBeerComment.ts | 0 .../editBeerCommentById.ts | 0 .../findBeerCommentById.ts | 0 .../getAllBeerComments.ts | 0 .../getBeerCommentCount.ts | 0 .../createNewBeerStyleComment.ts | 0 .../getAllBeerStyleComments.ts | 0 .../getBeerStyleCommentCount.ts | 0 .../updateBeerStyleCommentById.ts | 0 .../createNewBreweryComment.ts | 0 .../getAllBreweryComments.ts | 0 .../getBreweryCommentById.ts | 0 .../addBeerImageToDB.ts | 0 .../addBreweryImageToDB.ts | 0 .../createBeerPostLike.ts | 2 +- .../findBeerPostLikeById.ts | 0 .../getBeerPostLikeCount.ts | 0 .../removeBeerPostLikeById.ts | 0 .../createBeerStyleLike.ts | 2 +- .../findBeerStyleLikeById.ts | 0 .../getBeerStyleLikeCount.ts | 0 .../removeBeerStyleLikeById.ts | 0 .../{BeerPost => beer-post}/createNewBeerPost.ts | 0 .../deleteBeerPostById.ts | 0 .../{BeerPost => beer-post}/editBeerPostById.ts | 0 .../{BeerPost => beer-post}/getAllBeerPosts.ts | 2 +- .../{BeerPost => beer-post}/getBeerPostById.ts | 2 +- .../getBeerPostsByBeerStyleId.ts | 0 .../getBeerPostsByBreweryId.ts | 0 .../getBeerPostsByPostedById.ts | 0 .../getBeerRecommendations.ts | 2 +- .../schema/BeerPostQueryResult.ts | 0 .../schema/CreateBeerPostValidationSchema.ts | 0 .../schema/EditBeerPostValidationSchema.ts | 0 .../deleteBeerStyleById.ts | 0 .../editBeerStyleById.ts | 0 .../getAllBeerStyles.ts | 0 .../getBeerStyleById.ts | 0 .../schema/BeerStyleQueryResult.ts | 0 .../schema/CreateBeerStyleValidationSchema.ts | 0 .../createNewBreweryPost.ts | 0 .../getAllBreweryPosts.ts | 2 +- .../getAllBreweryPostsByPostedById.ts | 2 +- .../getBreweryPostById.ts | 2 +- .../schema/BreweryPostMapQueryResult.ts | 0 .../schema/BreweryPostQueryResult.ts | 0 .../schema/CreateBreweryPostSchema.ts | 0 .../schema/EditBreweryPostValidationSchema.ts | 0 .../UpdateUserAvatarByIdParams.ts | 2 +- .../users/{User => auth}/createNewUser.ts | 0 .../users/{User => auth}/deleteUserById.ts | 0 .../users/{User => auth}/findUserByEmail.ts | 0 .../users/{User => auth}/findUserById.ts | 0 .../users/{User => auth}/findUserByIdPublic.ts | 0 .../users/{User => auth}/findUserByUsername.ts | 0 .../schema/CreateUserValidationSchemas.ts | 0 .../{User => auth}/schema/EditUserSchema.ts | 0 .../users/{User => auth}/schema/GetUserSchema.ts | 0 .../schema/LoginValidationSchema.ts | 0 .../{User => auth}/schema/PublicUserSchema.ts | 2 +- .../schema/TokenValidationSchema.ts | 0 .../{User => auth}/schema/UpdateProfileSchema.ts | 0 .../{User => auth}/sendConfirmationEmail.ts | 0 .../{User => auth}/sendResetPasswordEmail.ts | 0 .../{User => auth}/updateUserProfileById.ts | 0 .../updateUserToBeConfirmedById.ts | 2 +- .../getUsersFollowedByUser.ts | 0 .../getUsersFollowingUser.ts | 0 .../schema/FollowInfoSchema.ts | 2 +- 184 files changed, 195 insertions(+), 190 deletions(-) rename src/controllers/comments/{beerComments => beer-comments}/index.ts (89%) rename src/controllers/comments/{beerStyleComments => beer-style-comments}/index.ts (91%) rename src/controllers/comments/{breweryComments => brewery-comments}/index.ts (91%) rename src/controllers/images/{beerImages => beer-images}/index.ts (92%) rename src/controllers/images/{breweryImages => brewery-images}/index.ts (91%) rename src/controllers/likes/{beerPostLikes => beer-posts-likes}/index.ts (82%) rename src/controllers/likes/{beerStyleLikes => beer-style-likes}/index.ts (82%) rename src/controllers/likes/{breweryPostLikes => brewery-post-likes}/index.ts (100%) rename src/controllers/posts/{beerPosts => beer-posts}/index.ts (88%) rename src/controllers/posts/{beerPosts => beer-posts}/types/index.ts (77%) rename src/controllers/posts/{beerStyles => beer-styles}/index.ts (91%) rename src/controllers/posts/{beerStyles => beer-styles}/types/index.ts (75%) rename src/services/comments/{BeerComment => beer-comment}/createNewBeerComment.ts (100%) rename src/services/comments/{BeerComment => beer-comment}/editBeerCommentById.ts (100%) rename src/services/comments/{BeerComment => beer-comment}/findBeerCommentById.ts (100%) rename src/services/comments/{BeerComment => beer-comment}/getAllBeerComments.ts (100%) rename src/services/comments/{BeerComment => beer-comment}/getBeerCommentCount.ts (100%) rename src/services/comments/{BeerStyleComment => beer-style-comment}/createNewBeerStyleComment.ts (100%) rename src/services/comments/{BeerStyleComment => beer-style-comment}/getAllBeerStyleComments.ts (100%) rename src/services/comments/{BeerStyleComment => beer-style-comment}/getBeerStyleCommentCount.ts (100%) rename src/services/comments/{BeerStyleComment => beer-style-comment}/updateBeerStyleCommentById.ts (100%) rename src/services/comments/{BreweryComment => brewery-comment}/createNewBreweryComment.ts (100%) rename src/services/comments/{BreweryComment => brewery-comment}/getAllBreweryComments.ts (100%) rename src/services/comments/{BreweryComment => brewery-comment}/getBreweryCommentById.ts (100%) rename src/services/images/{BeerImage => beer-image}/addBeerImageToDB.ts (100%) rename src/services/images/{BreweryImage => brewery-image}/addBreweryImageToDB.ts (100%) rename src/services/likes/{BeerPostLike => beer-post-like}/createBeerPostLike.ts (86%) rename src/services/likes/{BeerPostLike => beer-post-like}/findBeerPostLikeById.ts (100%) rename src/services/likes/{BeerPostLike => beer-post-like}/getBeerPostLikeCount.ts (100%) rename src/services/likes/{BeerPostLike => beer-post-like}/removeBeerPostLikeById.ts (100%) rename src/services/likes/{BeerStyleLike => beer-style-like}/createBeerStyleLike.ts (86%) rename src/services/likes/{BeerStyleLike => beer-style-like}/findBeerStyleLikeById.ts (100%) rename src/services/likes/{BeerStyleLike => beer-style-like}/getBeerStyleLikeCount.ts (100%) rename src/services/likes/{BeerStyleLike => beer-style-like}/removeBeerStyleLikeById.ts (100%) rename src/services/posts/{BeerPost => beer-post}/createNewBeerPost.ts (100%) rename src/services/posts/{BeerPost => beer-post}/deleteBeerPostById.ts (100%) rename src/services/posts/{BeerPost => beer-post}/editBeerPostById.ts (100%) rename src/services/posts/{BeerPost => beer-post}/getAllBeerPosts.ts (91%) rename src/services/posts/{BeerPost => beer-post}/getBeerPostById.ts (90%) rename src/services/posts/{BeerPost => beer-post}/getBeerPostsByBeerStyleId.ts (100%) rename src/services/posts/{BeerPost => beer-post}/getBeerPostsByBreweryId.ts (100%) rename src/services/posts/{BeerPost => beer-post}/getBeerPostsByPostedById.ts (100%) rename src/services/posts/{BeerPost => beer-post}/getBeerRecommendations.ts (94%) rename src/services/posts/{BeerPost => beer-post}/schema/BeerPostQueryResult.ts (100%) rename src/services/posts/{BeerPost => beer-post}/schema/CreateBeerPostValidationSchema.ts (100%) rename src/services/posts/{BeerPost => beer-post}/schema/EditBeerPostValidationSchema.ts (100%) rename src/services/posts/{BeerStyles => beer-style-post}/deleteBeerStyleById.ts (100%) rename src/services/posts/{BeerStyles => beer-style-post}/editBeerStyleById.ts (100%) rename src/services/posts/{BeerStyles => beer-style-post}/getAllBeerStyles.ts (100%) rename src/services/posts/{BeerStyles => beer-style-post}/getBeerStyleById.ts (100%) rename src/services/posts/{BeerStyles => beer-style-post}/schema/BeerStyleQueryResult.ts (100%) rename src/services/posts/{BeerStyles => beer-style-post}/schema/CreateBeerStyleValidationSchema.ts (100%) rename src/services/posts/{BreweryPost => brewery-post}/createNewBreweryPost.ts (100%) rename src/services/posts/{BreweryPost => brewery-post}/getAllBreweryPosts.ts (92%) rename src/services/posts/{BreweryPost => brewery-post}/getAllBreweryPostsByPostedById.ts (93%) rename src/services/posts/{BreweryPost => brewery-post}/getBreweryPostById.ts (91%) rename src/services/posts/{BreweryPost => brewery-post}/schema/BreweryPostMapQueryResult.ts (100%) rename src/services/posts/{BreweryPost => brewery-post}/schema/BreweryPostQueryResult.ts (100%) rename src/services/posts/{BreweryPost => brewery-post}/schema/CreateBreweryPostSchema.ts (100%) rename src/services/posts/{BreweryPost => brewery-post}/schema/EditBreweryPostValidationSchema.ts (100%) rename src/services/users/{UserAccount => account}/UpdateUserAvatarByIdParams.ts (95%) rename src/services/users/{User => auth}/createNewUser.ts (100%) rename src/services/users/{User => auth}/deleteUserById.ts (100%) rename src/services/users/{User => auth}/findUserByEmail.ts (100%) rename src/services/users/{User => auth}/findUserById.ts (100%) rename src/services/users/{User => auth}/findUserByIdPublic.ts (100%) rename src/services/users/{User => auth}/findUserByUsername.ts (100%) rename src/services/users/{User => auth}/schema/CreateUserValidationSchemas.ts (100%) rename src/services/users/{User => auth}/schema/EditUserSchema.ts (100%) rename src/services/users/{User => auth}/schema/GetUserSchema.ts (100%) rename src/services/users/{User => auth}/schema/LoginValidationSchema.ts (100%) rename src/services/users/{User => auth}/schema/PublicUserSchema.ts (72%) rename src/services/users/{User => auth}/schema/TokenValidationSchema.ts (100%) rename src/services/users/{User => auth}/schema/UpdateProfileSchema.ts (100%) rename src/services/users/{User => auth}/sendConfirmationEmail.ts (100%) rename src/services/users/{User => auth}/sendResetPasswordEmail.ts (100%) rename src/services/users/{User => auth}/updateUserProfileById.ts (100%) rename src/services/users/{User => auth}/updateUserToBeConfirmedById.ts (92%) rename src/services/users/{UserFollows => follows}/getUsersFollowedByUser.ts (100%) rename src/services/users/{UserFollows => follows}/getUsersFollowingUser.ts (100%) rename src/services/users/{UserFollows => follows}/schema/FollowInfoSchema.ts (69%) diff --git a/src/components/Account/AccountInfo.tsx b/src/components/Account/AccountInfo.tsx index 01b1cb9..63cf7c5 100644 --- a/src/components/Account/AccountInfo.tsx +++ b/src/components/Account/AccountInfo.tsx @@ -1,6 +1,6 @@ import validateEmailRequest from '@/requests/User/validateEmailRequest'; import validateUsernameRequest from '@/requests/validateUsernameRequest'; -import { BaseCreateUserSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import { BaseCreateUserSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; import { Switch } from '@headlessui/react'; import { zodResolver } from '@hookform/resolvers/zod'; import { Dispatch, FC, useContext } from 'react'; diff --git a/src/components/Account/Security.tsx b/src/components/Account/Security.tsx index cde42bd..f9e0b79 100644 --- a/src/components/Account/Security.tsx +++ b/src/components/Account/Security.tsx @@ -3,7 +3,7 @@ import { Dispatch, FunctionComponent } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; -import { UpdatePasswordSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import { UpdatePasswordSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; import sendUpdatePasswordRequest from '@/requests/User/sendUpdatePasswordRequest'; import { AccountPageState, AccountPageAction } from '@/reducers/accountPageReducer'; import toast from 'react-hot-toast'; diff --git a/src/components/Account/UpdateProfileForm.tsx b/src/components/Account/UpdateProfileForm.tsx index effbcb7..039626a 100644 --- a/src/components/Account/UpdateProfileForm.tsx +++ b/src/components/Account/UpdateProfileForm.tsx @@ -5,7 +5,7 @@ import FormSegment from '@/components/ui/forms/FormSegment'; import Link from 'next/link'; import FormTextArea from '@/components/ui/forms/FormTextArea'; import { FC } from 'react'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import type { UseFormHandleSubmit, SubmitHandler, @@ -13,7 +13,7 @@ import type { UseFormRegister, } from 'react-hook-form'; import { z } from 'zod'; -import UpdateProfileSchema from '../../services/users/User/schema/UpdateProfileSchema'; +import UpdateProfileSchema from '@/services/users/auth/schema/UpdateProfileSchema'; type UpdateProfileSchemaT = z.infer; diff --git a/src/components/Account/UserAvatar.tsx b/src/components/Account/UserAvatar.tsx index 1696881..470d8eb 100644 --- a/src/components/Account/UserAvatar.tsx +++ b/src/components/Account/UserAvatar.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { CldImage } from 'next-cloudinary'; import { z } from 'zod'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import { FaUser } from 'react-icons/fa'; interface UserAvatarProps { diff --git a/src/components/BeerById/BeerCommentForm.tsx b/src/components/BeerById/BeerCommentForm.tsx index 19fd302..ce7d752 100644 --- a/src/components/BeerById/BeerCommentForm.tsx +++ b/src/components/BeerById/BeerCommentForm.tsx @@ -1,6 +1,6 @@ import sendCreateBeerCommentRequest from '@/requests/BeerComment/sendCreateBeerCommentRequest'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { zodResolver } from '@hookform/resolvers/zod'; import { FunctionComponent } from 'react'; diff --git a/src/components/BeerById/BeerInfoHeader.tsx b/src/components/BeerById/BeerInfoHeader.tsx index 73381c3..c44d027 100644 --- a/src/components/BeerById/BeerInfoHeader.tsx +++ b/src/components/BeerById/BeerInfoHeader.tsx @@ -4,7 +4,7 @@ import { FC, useContext } from 'react'; import UserContext from '@/contexts/UserContext'; import { FaRegEdit } from 'react-icons/fa'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { z } from 'zod'; import useGetBeerPostLikeCount from '@/hooks/data-fetching/beer-likes/useBeerPostLikeCount'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; diff --git a/src/components/BeerById/BeerPostCommentsSection.tsx b/src/components/BeerById/BeerPostCommentsSection.tsx index fe53bf2..5f83c91 100644 --- a/src/components/BeerById/BeerPostCommentsSection.tsx +++ b/src/components/BeerById/BeerPostCommentsSection.tsx @@ -1,6 +1,6 @@ import UserContext from '@/contexts/UserContext'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { FC, MutableRefObject, useContext, useRef } from 'react'; import { z } from 'zod'; diff --git a/src/components/BeerById/BeerRecommendations.tsx b/src/components/BeerById/BeerRecommendations.tsx index 66c3154..96d0887 100644 --- a/src/components/BeerById/BeerRecommendations.tsx +++ b/src/components/BeerById/BeerRecommendations.tsx @@ -3,7 +3,7 @@ import { FC, MutableRefObject, useRef } from 'react'; import { useInView } from 'react-intersection-observer'; import { z } from 'zod'; import useBeerRecommendations from '@/hooks/data-fetching/beer-posts/useBeerRecommendations'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import debounce from 'lodash/debounce'; import BeerRecommendationLoadingComponent from './BeerRecommendationLoadingComponent'; diff --git a/src/components/BeerIndex/BeerCard.tsx b/src/components/BeerIndex/BeerCard.tsx index df0ff8d..3f27613 100644 --- a/src/components/BeerIndex/BeerCard.tsx +++ b/src/components/BeerIndex/BeerCard.tsx @@ -1,7 +1,7 @@ import Link from 'next/link'; import { FC, useContext } from 'react'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { z } from 'zod'; import UserContext from '@/contexts/UserContext'; import useGetBeerPostLikeCount from '@/hooks/data-fetching/beer-likes/useBeerPostLikeCount'; diff --git a/src/components/BeerStyleById/BeerStyleBeerSection.tsx b/src/components/BeerStyleById/BeerStyleBeerSection.tsx index 38e6d3a..bed62c4 100644 --- a/src/components/BeerStyleById/BeerStyleBeerSection.tsx +++ b/src/components/BeerStyleById/BeerStyleBeerSection.tsx @@ -3,7 +3,7 @@ import { FC, MutableRefObject, useRef } from 'react'; import { useInView } from 'react-intersection-observer'; import { z } from 'zod'; -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import useBeerPostsByBeerStyle from '@/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles'; import BeerRecommendationLoadingComponent from '../BeerById/BeerRecommendationLoadingComponent'; diff --git a/src/components/BeerStyleById/BeerStyleCommentForm.tsx b/src/components/BeerStyleById/BeerStyleCommentForm.tsx index 0436428..7e9f0e4 100644 --- a/src/components/BeerStyleById/BeerStyleCommentForm.tsx +++ b/src/components/BeerStyleById/BeerStyleCommentForm.tsx @@ -8,7 +8,7 @@ import CreateCommentValidationSchema from '@/services/schema/CommentSchema/Creat import toast from 'react-hot-toast'; import createErrorToast from '@/util/createErrorToast'; -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import useBeerStyleComments from '@/hooks/data-fetching/beer-style-comments/useBeerStyleComments'; import sendCreateBeerStyleCommentRequest from '@/requests/BeerStyleComment/sendCreateBeerStyleCommentRequest'; import CommentForm from '../ui/CommentForm'; diff --git a/src/components/BeerStyleById/BeerStyleCommentSection.tsx b/src/components/BeerStyleById/BeerStyleCommentSection.tsx index 7d1d665..5716327 100644 --- a/src/components/BeerStyleById/BeerStyleCommentSection.tsx +++ b/src/components/BeerStyleById/BeerStyleCommentSection.tsx @@ -5,7 +5,7 @@ import { z } from 'zod'; import { useRouter } from 'next/router'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import useBeerStyleComments from '@/hooks/data-fetching/beer-style-comments/useBeerStyleComments'; import LoadingComponent from '../BeerById/LoadingComponent'; import CommentsComponent from '../ui/CommentsComponent'; diff --git a/src/components/BeerStyleById/BeerStyleHeader.tsx b/src/components/BeerStyleById/BeerStyleHeader.tsx index c68312a..7285ae8 100644 --- a/src/components/BeerStyleById/BeerStyleHeader.tsx +++ b/src/components/BeerStyleById/BeerStyleHeader.tsx @@ -7,7 +7,7 @@ import { FaRegEdit } from 'react-icons/fa'; import { z } from 'zod'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import useBeerStyleLikeCount from '@/hooks/data-fetching/beer-style-likes/useBeerStyleLikeCount'; import BeerStyleLikeButton from './BeerStyleLikeButton'; diff --git a/src/components/BeerStyleIndex/BeerStyleCard.tsx b/src/components/BeerStyleIndex/BeerStyleCard.tsx index bd76c95..6ce2fe2 100644 --- a/src/components/BeerStyleIndex/BeerStyleCard.tsx +++ b/src/components/BeerStyleIndex/BeerStyleCard.tsx @@ -1,4 +1,4 @@ -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import Link from 'next/link'; import { FC } from 'react'; diff --git a/src/components/BreweryById/BreweryBeerSection.tsx b/src/components/BreweryById/BreweryBeerSection.tsx index 7d11225..843efb5 100644 --- a/src/components/BreweryById/BreweryBeerSection.tsx +++ b/src/components/BreweryById/BreweryBeerSection.tsx @@ -1,5 +1,5 @@ import UseBeerPostsByBrewery from '@/hooks/data-fetching/beer-posts/useBeerPostsByBrewery'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import Link from 'next/link'; import { FC, MutableRefObject, useContext, useRef } from 'react'; import { useInView } from 'react-intersection-observer'; diff --git a/src/components/BreweryById/BreweryCommentForm.tsx b/src/components/BreweryById/BreweryCommentForm.tsx index aa58d4a..162302c 100644 --- a/src/components/BreweryById/BreweryCommentForm.tsx +++ b/src/components/BreweryById/BreweryCommentForm.tsx @@ -1,5 +1,5 @@ import useBreweryPostComments from '@/hooks/data-fetching/brewery-comments/useBreweryPostComments'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; import { zodResolver } from '@hookform/resolvers/zod'; import { FC } from 'react'; diff --git a/src/components/BreweryById/BreweryCommentsSection.tsx b/src/components/BreweryById/BreweryCommentsSection.tsx index f87ec82..e7b6c2e 100644 --- a/src/components/BreweryById/BreweryCommentsSection.tsx +++ b/src/components/BreweryById/BreweryCommentsSection.tsx @@ -1,5 +1,5 @@ import UserContext from '@/contexts/UserContext'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { FC, MutableRefObject, useContext, useRef } from 'react'; import { z } from 'zod'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; diff --git a/src/components/BreweryById/BreweryInfoHeader.tsx b/src/components/BreweryById/BreweryInfoHeader.tsx index c2fcb00..e5d3b81 100644 --- a/src/components/BreweryById/BreweryInfoHeader.tsx +++ b/src/components/BreweryById/BreweryInfoHeader.tsx @@ -1,7 +1,7 @@ import UserContext from '@/contexts/UserContext'; import useGetBreweryPostLikeCount from '@/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount'; import useTimeDistance from '@/hooks/utilities/useTimeDistance'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { format } from 'date-fns'; import { FC, useContext } from 'react'; diff --git a/src/components/BreweryIndex/BreweryCard.tsx b/src/components/BreweryIndex/BreweryCard.tsx index 39cda05..39ae8e2 100644 --- a/src/components/BreweryIndex/BreweryCard.tsx +++ b/src/components/BreweryIndex/BreweryCard.tsx @@ -1,6 +1,6 @@ import UserContext from '@/contexts/UserContext'; import useGetBreweryPostLikeCount from '@/hooks/data-fetching/brewery-likes/useGetBreweryPostLikeCount'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { FC, useContext } from 'react'; import Link from 'next/link'; import { z } from 'zod'; diff --git a/src/components/BreweryPost/CreateBreweryPostForm.tsx b/src/components/BreweryPost/CreateBreweryPostForm.tsx index d2dbb24..4b1d2b6 100644 --- a/src/components/BreweryPost/CreateBreweryPostForm.tsx +++ b/src/components/BreweryPost/CreateBreweryPostForm.tsx @@ -1,6 +1,6 @@ import sendUploadBreweryImagesRequest from '@/requests/BreweryImage/sendUploadBreweryImageRequest'; import sendCreateBreweryPostRequest from '@/requests/BreweryPost/sendCreateBreweryPostRequest'; -import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; +import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; import UploadImageValidationSchema from '@/services/schema/ImageSchema/UploadImageValidationSchema'; import createErrorToast from '@/util/createErrorToast'; import { Tab } from '@headlessui/react'; diff --git a/src/components/CreateBeerPostForm.tsx b/src/components/CreateBeerPostForm.tsx index 5156154..fdba62f 100644 --- a/src/components/CreateBeerPostForm.tsx +++ b/src/components/CreateBeerPostForm.tsx @@ -4,8 +4,8 @@ import router from 'next/router'; import { FunctionComponent } from 'react'; import { useForm, SubmitHandler, FieldError } from 'react-hook-form'; import { z } from 'zod'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; -import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; +import CreateBeerPostValidationSchema from '@/services/posts/beer-post/schema/CreateBeerPostValidationSchema'; import sendCreateBeerPostRequest from '@/requests/BeerPost/sendCreateBeerPostRequest'; import UploadImageValidationSchema from '@/services/schema/ImageSchema/UploadImageValidationSchema'; import sendUploadBeerImagesRequest from '@/requests/BeerImage/sendUploadBeerImageRequest'; diff --git a/src/components/EditBeerPostForm.tsx b/src/components/EditBeerPostForm.tsx index d78604f..63727a8 100644 --- a/src/components/EditBeerPostForm.tsx +++ b/src/components/EditBeerPostForm.tsx @@ -7,7 +7,7 @@ import { useForm, SubmitHandler } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import deleteBeerPostRequest from '@/requests/BeerPost/deleteBeerPostRequest'; -import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/beer-post/schema/EditBeerPostValidationSchema'; import sendEditBeerPostRequest from '@/requests/BeerPost/sendEditBeerPostRequest'; import createErrorToast from '@/util/createErrorToast'; import Button from './ui/forms/Button'; diff --git a/src/components/Login/LoginForm.tsx b/src/components/Login/LoginForm.tsx index d25f687..1c7fec9 100644 --- a/src/components/Login/LoginForm.tsx +++ b/src/components/Login/LoginForm.tsx @@ -1,5 +1,5 @@ import sendLoginUserRequest from '@/requests/User/sendLoginUserRequest'; -import LoginValidationSchema from '@/services/users/User/schema/LoginValidationSchema'; +import LoginValidationSchema from '@/services/users/auth/schema/LoginValidationSchema'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/router'; import { useContext } from 'react'; diff --git a/src/components/RegisterUserForm.tsx b/src/components/RegisterUserForm.tsx index 1589cd0..588338e 100644 --- a/src/components/RegisterUserForm.tsx +++ b/src/components/RegisterUserForm.tsx @@ -1,5 +1,5 @@ import sendRegisterUserRequest from '@/requests/User/sendRegisterUserRequest'; -import { CreateUserValidationSchemaWithUsernameAndEmailCheck } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import { CreateUserValidationSchemaWithUsernameAndEmailCheck } from '@/services/users/auth/schema/CreateUserValidationSchemas'; import { zodResolver } from '@hookform/resolvers/zod'; import { useRouter } from 'next/router'; import { FC } from 'react'; diff --git a/src/components/UserPage/UserFollowButton.tsx b/src/components/UserPage/UserFollowButton.tsx index 4813639..1f1dc58 100644 --- a/src/components/UserPage/UserFollowButton.tsx +++ b/src/components/UserPage/UserFollowButton.tsx @@ -2,7 +2,7 @@ import useFollowStatus from '@/hooks/data-fetching/user-follows/useFollowStatus' import useGetUsersFollowedByUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowedByUser'; import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowingUser'; import sendUserFollowRequest from '@/requests/UserFollow/sendUserFollowRequest'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import { FC, useState } from 'react'; import { FaUserCheck, FaUserPlus } from 'react-icons/fa'; import { z } from 'zod'; diff --git a/src/components/UserPage/UserHeader.tsx b/src/components/UserPage/UserHeader.tsx index cf0481c..bf17d5a 100644 --- a/src/components/UserPage/UserHeader.tsx +++ b/src/components/UserPage/UserHeader.tsx @@ -3,7 +3,7 @@ import useTimeDistance from '@/hooks/utilities/useTimeDistance'; import { FC, useContext } from 'react'; import { z } from 'zod'; import { format } from 'date-fns'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import useGetUsersFollowedByUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowedByUser'; import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowingUser'; import UserContext from '@/contexts/UserContext'; diff --git a/src/config/auth/localStrat.ts b/src/config/auth/localStrat.ts index d74efb6..614bd45 100644 --- a/src/config/auth/localStrat.ts +++ b/src/config/auth/localStrat.ts @@ -1,4 +1,4 @@ -import findUserByUsername from '@/services/users/User/findUserByUsername'; +import findUserByUsername from '@/services/users/auth/findUserByUsername'; import Local from 'passport-local'; import ServerError from '../util/ServerError'; import { validatePassword } from './passwordFns'; diff --git a/src/config/auth/types.ts b/src/config/auth/types.ts index 96e4962..0a28928 100644 --- a/src/config/auth/types.ts +++ b/src/config/auth/types.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import { IncomingMessage } from 'http'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/config/nextConnect/middleware/getCurrentUser.ts b/src/config/nextConnect/middleware/getCurrentUser.ts index e7aba93..24f5f43 100644 --- a/src/config/nextConnect/middleware/getCurrentUser.ts +++ b/src/config/nextConnect/middleware/getCurrentUser.ts @@ -1,6 +1,6 @@ import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; -import findUserById from '@/services/users/User/findUserById'; +import findUserById from '@/services/users/auth/findUserById'; import ServerError from '@/config/util/ServerError'; import { getLoginSession } from '../../auth/session'; import { UserExtendedNextApiRequest } from '../../auth/types'; diff --git a/src/contexts/UserContext.tsx b/src/contexts/UserContext.tsx index f1cc76f..00e1506 100644 --- a/src/contexts/UserContext.tsx +++ b/src/contexts/UserContext.tsx @@ -1,5 +1,5 @@ import useUser from '@/hooks/auth/useUser'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import { ReactNode, createContext } from 'react'; import { z } from 'zod'; diff --git a/src/controllers/comments/beerComments/index.ts b/src/controllers/comments/beer-comments/index.ts similarity index 89% rename from src/controllers/comments/beerComments/index.ts rename to src/controllers/comments/beer-comments/index.ts index 35b1df0..d2fbf4c 100644 --- a/src/controllers/comments/beerComments/index.ts +++ b/src/controllers/comments/beer-comments/index.ts @@ -1,13 +1,13 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import editBeerCommentById from '@/services/comments/BeerComment/editBeerCommentById'; -import findBeerCommentById from '@/services/comments/BeerComment/findBeerCommentById'; +import editBeerCommentById from '@/services/comments/beer-comment/editBeerCommentById'; +import findBeerCommentById from '@/services/comments/beer-comment/findBeerCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import createNewBeerComment from '@/services/comments/BeerComment/createNewBeerComment'; -import getAllBeerComments from '@/services/comments/BeerComment/getAllBeerComments'; +import createNewBeerComment from '@/services/comments/beer-comment/createNewBeerComment'; +import getAllBeerComments from '@/services/comments/beer-comment/getAllBeerComments'; import { CommentRequest, EditAndCreateCommentRequest, diff --git a/src/controllers/comments/beerStyleComments/index.ts b/src/controllers/comments/beer-style-comments/index.ts similarity index 91% rename from src/controllers/comments/beerStyleComments/index.ts rename to src/controllers/comments/beer-style-comments/index.ts index 5e88f76..f50dc59 100644 --- a/src/controllers/comments/beerStyleComments/index.ts +++ b/src/controllers/comments/beer-style-comments/index.ts @@ -1,14 +1,14 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import updateBeerStyleCommentById from '@/services/comments/BeerStyleComment/updateBeerStyleCommentById'; +import updateBeerStyleCommentById from '@/services/comments/beer-style-comment/updateBeerStyleCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import createNewBeerStyleComment from '@/services/comments/BeerStyleComment/createNewBeerStyleComment'; -import getAllBeerStyleComments from '@/services/comments/BeerStyleComment/getAllBeerStyleComments'; +import createNewBeerStyleComment from '@/services/comments/beer-style-comment/createNewBeerStyleComment'; +import getAllBeerStyleComments from '@/services/comments/beer-style-comment/getAllBeerStyleComments'; import { CommentRequest, diff --git a/src/controllers/comments/breweryComments/index.ts b/src/controllers/comments/brewery-comments/index.ts similarity index 91% rename from src/controllers/comments/breweryComments/index.ts rename to src/controllers/comments/brewery-comments/index.ts index 8251814..86484fc 100644 --- a/src/controllers/comments/breweryComments/index.ts +++ b/src/controllers/comments/brewery-comments/index.ts @@ -1,13 +1,13 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import getBreweryCommentById from '@/services/comments/BreweryComment/getBreweryCommentById'; +import getBreweryCommentById from '@/services/comments/brewery-comment/getBreweryCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import createNewBreweryComment from '@/services/comments/BreweryComment/createNewBreweryComment'; -import getAllBreweryComments from '@/services/comments/BreweryComment/getAllBreweryComments'; +import createNewBreweryComment from '@/services/comments/brewery-comment/createNewBreweryComment'; +import getAllBreweryComments from '@/services/comments/brewery-comment/getAllBreweryComments'; import { CommentRequest, EditAndCreateCommentRequest, diff --git a/src/controllers/images/beerImages/index.ts b/src/controllers/images/beer-images/index.ts similarity index 92% rename from src/controllers/images/beerImages/index.ts rename to src/controllers/images/beer-images/index.ts index afce7d5..92ce733 100644 --- a/src/controllers/images/beerImages/index.ts +++ b/src/controllers/images/beer-images/index.ts @@ -1,5 +1,5 @@ import ServerError from '@/config/util/ServerError'; -import addBeerImageToDB from '@/services/images/BeerImage/addBeerImageToDB'; +import addBeerImageToDB from '@/services/images/beer-image/addBeerImageToDB'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/images/breweryImages/index.ts b/src/controllers/images/brewery-images/index.ts similarity index 91% rename from src/controllers/images/breweryImages/index.ts rename to src/controllers/images/brewery-images/index.ts index eb217d6..3c7c910 100644 --- a/src/controllers/images/breweryImages/index.ts +++ b/src/controllers/images/brewery-images/index.ts @@ -1,5 +1,5 @@ import ServerError from '@/config/util/ServerError'; -import addBreweryImageToDB from '@/services/images/BreweryImage/addBreweryImageToDB'; +import addBreweryImageToDB from '@/services/images/brewery-image/addBreweryImageToDB'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/likes/beerPostLikes/index.ts b/src/controllers/likes/beer-posts-likes/index.ts similarity index 82% rename from src/controllers/likes/beerPostLikes/index.ts rename to src/controllers/likes/beer-posts-likes/index.ts index 9a77de9..9b21e2d 100644 --- a/src/controllers/likes/beerPostLikes/index.ts +++ b/src/controllers/likes/beer-posts-likes/index.ts @@ -1,10 +1,10 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; -import createBeerPostLike from '@/services/likes/BeerPostLike/createBeerPostLike'; -import findBeerPostLikeById from '@/services/likes/BeerPostLike/findBeerPostLikeById'; -import getBeerPostLikeCountByBeerPostId from '@/services/likes/BeerPostLike/getBeerPostLikeCount'; -import removeBeerPostLikeById from '@/services/likes/BeerPostLike/removeBeerPostLikeById'; +import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; +import createBeerPostLike from '@/services/likes/beer-post-like/createBeerPostLike'; +import findBeerPostLikeById from '@/services/likes/beer-post-like/findBeerPostLikeById'; +import getBeerPostLikeCountByBeerPostId from '@/services/likes/beer-post-like/getBeerPostLikeCount'; +import removeBeerPostLikeById from '@/services/likes/beer-post-like/removeBeerPostLikeById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/likes/beerStyleLikes/index.ts b/src/controllers/likes/beer-style-likes/index.ts similarity index 82% rename from src/controllers/likes/beerStyleLikes/index.ts rename to src/controllers/likes/beer-style-likes/index.ts index 3f18705..1b18ea3 100644 --- a/src/controllers/likes/beerStyleLikes/index.ts +++ b/src/controllers/likes/beer-style-likes/index.ts @@ -1,9 +1,9 @@ import ServerError from '@/config/util/ServerError'; -import createBeerStyleLike from '@/services/likes/BeerStyleLike/createBeerStyleLike'; -import findBeerStyleLikeById from '@/services/likes/BeerStyleLike/findBeerStyleLikeById'; -import getBeerStyleLikeCount from '@/services/likes/BeerStyleLike/getBeerStyleLikeCount'; -import removeBeerStyleLikeById from '@/services/likes/BeerStyleLike/removeBeerStyleLikeById'; -import getBeerStyleById from '@/services/posts/BeerStyles/getBeerStyleById'; +import createBeerStyleLike from '@/services/likes/beer-style-like/createBeerStyleLike'; +import findBeerStyleLikeById from '@/services/likes/beer-style-like/findBeerStyleLikeById'; +import getBeerStyleLikeCount from '@/services/likes/beer-style-like/getBeerStyleLikeCount'; +import removeBeerStyleLikeById from '@/services/likes/beer-style-like/removeBeerStyleLikeById'; +import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/likes/breweryPostLikes/index.ts b/src/controllers/likes/brewery-post-likes/index.ts similarity index 100% rename from src/controllers/likes/breweryPostLikes/index.ts rename to src/controllers/likes/brewery-post-likes/index.ts diff --git a/src/controllers/posts/beerPosts/index.ts b/src/controllers/posts/beer-posts/index.ts similarity index 88% rename from src/controllers/posts/beerPosts/index.ts rename to src/controllers/posts/beer-posts/index.ts index decce5c..b853c44 100644 --- a/src/controllers/posts/beerPosts/index.ts +++ b/src/controllers/posts/beer-posts/index.ts @@ -1,16 +1,16 @@ import ServerError from '@/config/util/ServerError'; -import deleteBeerPostById from '@/services/posts/BeerPost/deleteBeerPostById'; -import editBeerPostById from '@/services/posts/BeerPost/editBeerPostById'; -import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; +import deleteBeerPostById from '@/services/posts/beer-post/deleteBeerPostById'; +import editBeerPostById from '@/services/posts/beer-post/editBeerPostById'; +import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import getBeerRecommendations from '@/services/posts/BeerPost/getBeerRecommendations'; -import getAllBeerPosts from '@/services/posts/BeerPost/getAllBeerPosts'; +import getBeerRecommendations from '@/services/posts/beer-post/getBeerRecommendations'; +import getAllBeerPosts from '@/services/posts/beer-post/getAllBeerPosts'; import DBClient from '@/prisma/DBClient'; -import createNewBeerPost from '@/services/posts/BeerPost/createNewBeerPost'; -import getBeerPostsByPostedById from '@/services/posts/BeerPost/getBeerPostsByPostedById'; +import createNewBeerPost from '@/services/posts/beer-post/createNewBeerPost'; +import getBeerPostsByPostedById from '@/services/posts/beer-post/getBeerPostsByPostedById'; import { BeerPostRequest, CreateBeerPostRequest, diff --git a/src/controllers/posts/beerPosts/types/index.ts b/src/controllers/posts/beer-posts/types/index.ts similarity index 77% rename from src/controllers/posts/beerPosts/types/index.ts rename to src/controllers/posts/beer-posts/types/index.ts index 9bfca22..a1b5977 100644 --- a/src/controllers/posts/beerPosts/types/index.ts +++ b/src/controllers/posts/beer-posts/types/index.ts @@ -1,6 +1,6 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; -import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; +import CreateBeerPostValidationSchema from '@/services/posts/beer-post/schema/CreateBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/beer-post/schema/EditBeerPostValidationSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/posts/beerStyles/index.ts b/src/controllers/posts/beer-styles/index.ts similarity index 91% rename from src/controllers/posts/beerStyles/index.ts rename to src/controllers/posts/beer-styles/index.ts index 3cebe50..e59c21c 100644 --- a/src/controllers/posts/beerStyles/index.ts +++ b/src/controllers/posts/beer-styles/index.ts @@ -5,9 +5,9 @@ import DBClient from '@/prisma/DBClient'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import getBeerStyleById from '@/services/posts/BeerStyles/getBeerStyleById'; -import getBeerPostsByBeerStyleId from '@/services/posts/BeerPost/getBeerPostsByBeerStyleId'; -import getAllBeerStyles from '@/services/posts/BeerStyles/getAllBeerStyles'; +import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; +import getBeerPostsByBeerStyleId from '@/services/posts/beer-post/getBeerPostsByBeerStyleId'; +import getAllBeerStyles from '@/services/posts/beer-style-post/getAllBeerStyles'; import ServerError from '@/config/util/ServerError'; import { CreateBeerStyleRequest, GetBeerStyleByIdRequest } from './types'; diff --git a/src/controllers/posts/beerStyles/types/index.ts b/src/controllers/posts/beer-styles/types/index.ts similarity index 75% rename from src/controllers/posts/beerStyles/types/index.ts rename to src/controllers/posts/beer-styles/types/index.ts index d4deb87..1b848d6 100644 --- a/src/controllers/posts/beerStyles/types/index.ts +++ b/src/controllers/posts/beer-styles/types/index.ts @@ -2,7 +2,7 @@ import { NextApiRequest } from 'next'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { z } from 'zod'; -import CreateBeerStyleValidationSchema from '@/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema'; +import CreateBeerStyleValidationSchema from '@/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema'; export interface GetBeerStyleByIdRequest extends NextApiRequest { query: { id: string }; diff --git a/src/controllers/posts/breweries/index.ts b/src/controllers/posts/breweries/index.ts index 59fa617..67fbd97 100644 --- a/src/controllers/posts/breweries/index.ts +++ b/src/controllers/posts/breweries/index.ts @@ -1,14 +1,14 @@ import DBClient from '@/prisma/DBClient'; -import getAllBreweryPostsByPostedById from '@/services/posts/BreweryPost/getAllBreweryPostsByPostedById'; +import getAllBreweryPostsByPostedById from '@/services/posts/brewery-post/getAllBreweryPostsByPostedById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import getAllBreweryPosts from '@/services/posts/BreweryPost/getAllBreweryPosts'; -import createNewBreweryPost from '@/services/posts/BreweryPost/createNewBreweryPost'; +import getAllBreweryPosts from '@/services/posts/brewery-post/getAllBreweryPosts'; +import createNewBreweryPost from '@/services/posts/brewery-post/createNewBreweryPost'; import geocode from '@/config/mapbox/geocoder'; import ServerError from '@/config/util/ServerError'; -import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/brewery-post/schema/BreweryPostMapQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { CreateBreweryPostRequest, GetBreweryPostsRequest } from './types'; import { GetAllPostsByConnectedPostId } from '../types'; diff --git a/src/controllers/posts/breweries/types/index.ts b/src/controllers/posts/breweries/types/index.ts index c37b558..f20425f 100644 --- a/src/controllers/posts/breweries/types/index.ts +++ b/src/controllers/posts/breweries/types/index.ts @@ -1,5 +1,5 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; +import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/users/auth/index.ts b/src/controllers/users/auth/index.ts index a056c59..d012315 100644 --- a/src/controllers/users/auth/index.ts +++ b/src/controllers/users/auth/index.ts @@ -3,24 +3,24 @@ import localStrat from '@/config/auth/localStrat'; import { getLoginSession, setLoginSession } from '@/config/auth/session'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import createNewUser from '@/services/users/User/createNewUser'; -import findUserByEmail from '@/services/users/User/findUserByEmail'; +import createNewUser from '@/services/users/auth/createNewUser'; +import findUserByEmail from '@/services/users/auth/findUserByEmail'; import { NextApiRequest, NextApiResponse } from 'next'; import { expressWrapper } from 'next-connect'; import passport from 'passport'; import { z } from 'zod'; -import findUserByUsername from '@/services/users/User/findUserByUsername'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; -import sendConfirmationEmail from '@/services/users/User/sendConfirmationEmail'; +import findUserByUsername from '@/services/users/auth/findUserByUsername'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; +import sendConfirmationEmail from '@/services/users/auth/sendConfirmationEmail'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import type { NextFunction } from 'express'; import { verifyConfirmationToken } from '@/config/jwt'; -import updateUserToBeConfirmedById from '@/services/users/User/updateUserToBeConfirmedById'; +import updateUserToBeConfirmedById from '@/services/users/auth/updateUserToBeConfirmedById'; import DBClient from '@/prisma/DBClient'; -import sendResetPasswordEmail from '@/services/users/User/sendResetPasswordEmail'; +import sendResetPasswordEmail from '@/services/users/auth/sendResetPasswordEmail'; import { hashPassword } from '@/config/auth/passwordFns'; -import deleteUserById from '@/services/users/User/deleteUserById'; +import deleteUserById from '@/services/users/auth/deleteUserById'; import { CheckEmailRequest, CheckUsernameRequest, diff --git a/src/controllers/users/auth/types/index.ts b/src/controllers/users/auth/types/index.ts index 48d51fd..a8292e6 100644 --- a/src/controllers/users/auth/types/index.ts +++ b/src/controllers/users/auth/types/index.ts @@ -2,8 +2,8 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import { CreateUserValidationSchema, UpdatePasswordSchema, -} from '@/services/users/User/schema/CreateUserValidationSchemas'; -import TokenValidationSchema from '@/services/users/User/schema/TokenValidationSchema'; +} from '@/services/users/auth/schema/CreateUserValidationSchemas'; +import TokenValidationSchema from '@/services/users/auth/schema/TokenValidationSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; diff --git a/src/controllers/users/profile/index.ts b/src/controllers/users/profile/index.ts index c5db3b4..ffcf253 100644 --- a/src/controllers/users/profile/index.ts +++ b/src/controllers/users/profile/index.ts @@ -1,17 +1,16 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/users/User/findUserById'; +import findUserById from '@/services/users/auth/findUserById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import getUsersFollowingUser from '@/services/users/UserFollows/getUsersFollowingUser'; -import getUsersFollowedByUser from '@/services/users/UserFollows/getUsersFollowedByUser'; import { NextHandler } from 'next-connect'; import updateUserAvatarById, { UpdateUserAvatarByIdParams, -} from '@/services/users/UserAccount/UpdateUserAvatarByIdParams'; +} from '@/services/users/account/UpdateUserAvatarByIdParams'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import updateUserProfileById from '@/services/users/User/updateUserProfileById'; +import updateUserProfileById from '@/services/users/auth/updateUserProfileById'; + import { UserRouteRequest, GetUserFollowInfoRequest, @@ -19,6 +18,8 @@ import { UpdateAvatarRequest, UpdateProfileRequest, } from './types'; +import getUsersFollowingUser from '@/services/users/follows/getUsersFollowingUser'; +import getUsersFollowedByUser from '@/services/users/follows/getUsersFollowedByUser'; export const followUser = async ( req: UserRouteRequest, diff --git a/src/controllers/users/profile/types/index.ts b/src/controllers/users/profile/types/index.ts index 7daf5c3..5c4f600 100644 --- a/src/controllers/users/profile/types/index.ts +++ b/src/controllers/users/profile/types/index.ts @@ -1,5 +1,5 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import EditUserSchema from '@/services/users/User/schema/EditUserSchema'; +import EditUserSchema from '@/services/users/auth/schema/EditUserSchema'; import { z } from 'zod'; export interface UserRouteRequest extends UserExtendedNextApiRequest { diff --git a/src/hooks/auth/useUser.ts b/src/hooks/auth/useUser.ts index 0c82de9..66e4ef4 100644 --- a/src/hooks/auth/useUser.ts +++ b/src/hooks/auth/useUser.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWR from 'swr'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts b/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts index c81e4d3..89be302 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostSearch.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import useSWR from 'swr'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPosts.ts b/src/hooks/data-fetching/beer-posts/useBeerPosts.ts index f72764c..ab62440 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPosts.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPosts.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts index 9585bdf..7e1a3b0 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByBeerStyles.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts index 33875d6..c58616a 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByBrewery.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts b/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts index 7422ad5..b5d25f3 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerPostsByUser.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts b/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts index ec9aacb..2157058 100644 --- a/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts +++ b/src/hooks/data-fetching/beer-posts/useBeerRecommendations.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/beer-styles/useBeerStyles.ts b/src/hooks/data-fetching/beer-styles/useBeerStyles.ts index 21581b8..9d17cc8 100644 --- a/src/hooks/data-fetching/beer-styles/useBeerStyles.ts +++ b/src/hooks/data-fetching/beer-styles/useBeerStyles.ts @@ -1,4 +1,4 @@ -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts b/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts index 4a905d4..cc4d259 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts.ts @@ -1,4 +1,4 @@ -import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/brewery-post/schema/BreweryPostMapQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts b/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts index 4c3725e..a319afd 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryPosts.ts @@ -1,4 +1,4 @@ -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts b/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts index ecf34ab..f986d34 100644 --- a/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts +++ b/src/hooks/data-fetching/brewery-posts/useBreweryPostsByUser.ts @@ -1,4 +1,4 @@ -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts index 58365b8..85cbbc9 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts @@ -17,7 +17,7 @@ * - `mutate` A function to mutate the data. * - `error` The error object, if any. */ -import FollowInfoSchema from '@/services/users/UserFollows/schema/FollowInfoSchema'; +import FollowInfoSchema from '@/services/users/follows/schema/FollowInfoSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts index 85f57f2..b1e7fb9 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts @@ -1,4 +1,4 @@ -import FollowInfoSchema from '@/services/users/UserFollows/schema/FollowInfoSchema'; +import FollowInfoSchema from '@/services/users/follows/schema/FollowInfoSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/pages/api/beer-comments/[id].ts b/src/pages/api/beer-comments/[id].ts index 93ae8ab..8acf718 100644 --- a/src/pages/api/beer-comments/[id].ts +++ b/src/pages/api/beer-comments/[id].ts @@ -13,7 +13,7 @@ import { checkIfBeerCommentOwner, deleteBeerPostComment, editBeerPostComment, -} from '@/controllers/comments/beerComments'; +} from '@/controllers/comments/beer-comments'; const router = createRouter< CommentRequest, diff --git a/src/pages/api/beer-style-comments/[id].ts b/src/pages/api/beer-style-comments/[id].ts index 61d7680..ec6dc8f 100644 --- a/src/pages/api/beer-style-comments/[id].ts +++ b/src/pages/api/beer-style-comments/[id].ts @@ -5,7 +5,7 @@ import { checkIfBeerStyleCommentOwner, deleteBeerStyleComment, editBeerStyleComment, -} from '@/controllers/comments/beerStyleComments'; +} from '@/controllers/comments/beer-style-comments'; import { CommentRequest } from '@/controllers/comments/types'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; diff --git a/src/pages/api/beers/[id]/comments/index.ts b/src/pages/api/beers/[id]/comments/index.ts index a9a5c87..f9bc088 100644 --- a/src/pages/api/beers/[id]/comments/index.ts +++ b/src/pages/api/beers/[id]/comments/index.ts @@ -10,7 +10,7 @@ import CreateCommentValidationSchema from '@/services/schema/CommentSchema/Creat import { createBeerPostComment, getAllBeerPostComments, -} from '@/controllers/comments/beerComments'; +} from '@/controllers/comments/beer-comments'; const router = createRouter< // @TODO: Fix this any type diff --git a/src/pages/api/beers/[id]/images/index.ts b/src/pages/api/beers/[id]/images/index.ts index 10739f2..a7170ee 100644 --- a/src/pages/api/beers/[id]/images/index.ts +++ b/src/pages/api/beers/[id]/images/index.ts @@ -10,7 +10,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; import { uploadMiddlewareMultiple } from '@/config/multer/uploadMiddleware'; import { UploadImagesRequest } from '@/controllers/images/types'; -import { processBeerImageData } from '@/controllers/images/beerImages'; +import { processBeerImageData } from '@/controllers/images/beer-images'; const router = createRouter< UploadImagesRequest, diff --git a/src/pages/api/beers/[id]/index.ts b/src/pages/api/beers/[id]/index.ts index 1a82fc1..8a67ec7 100644 --- a/src/pages/api/beers/[id]/index.ts +++ b/src/pages/api/beers/[id]/index.ts @@ -6,14 +6,14 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; -import { EditBeerPostRequest } from '@/controllers/posts/beerPosts/types'; +import { EditBeerPostRequest } from '@/controllers/posts/beer-posts/types'; import { checkIfBeerPostOwner, editBeerPost, deleteBeerPost, -} from '@/controllers/posts/beerPosts'; +} from '@/controllers/posts/beer-posts'; -import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/beer-post/schema/EditBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/beers/[id]/like/index.ts b/src/pages/api/beers/[id]/like/index.ts index 22e600c..a6e7eb8 100644 --- a/src/pages/api/beers/[id]/like/index.ts +++ b/src/pages/api/beers/[id]/like/index.ts @@ -9,7 +9,7 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { sendBeerPostLikeRequest, getBeerPostLikeCount, -} from '@/controllers/likes/beerPostLikes'; +} from '@/controllers/likes/beer-posts-likes'; import { LikeRequest } from '@/controllers/likes/types'; const router = createRouter< diff --git a/src/pages/api/beers/[id]/like/is-liked.ts b/src/pages/api/beers/[id]/like/is-liked.ts index 7d44bc2..aa0f9a3 100644 --- a/src/pages/api/beers/[id]/like/is-liked.ts +++ b/src/pages/api/beers/[id]/like/is-liked.ts @@ -7,7 +7,7 @@ import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { checkIfBeerPostIsLiked } from '@/controllers/likes/beerPostLikes'; +import { checkIfBeerPostIsLiked } from '@/controllers/likes/beer-posts-likes'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/beers/[id]/recommendations.ts b/src/pages/api/beers/[id]/recommendations.ts index 0766a32..15b5d36 100644 --- a/src/pages/api/beers/[id]/recommendations.ts +++ b/src/pages/api/beers/[id]/recommendations.ts @@ -1,7 +1,7 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBeerPostRecommendations } from '@/controllers/posts/beerPosts'; -import { GetBeerRecommendationsRequest } from '@/controllers/posts/beerPosts/types'; +import { getBeerPostRecommendations } from '@/controllers/posts/beer-posts'; +import { GetBeerRecommendationsRequest } from '@/controllers/posts/beer-posts/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; diff --git a/src/pages/api/beers/create.ts b/src/pages/api/beers/create.ts index 29c0bb9..4c55237 100644 --- a/src/pages/api/beers/create.ts +++ b/src/pages/api/beers/create.ts @@ -1,14 +1,14 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { createRouter } from 'next-connect'; -import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; +import CreateBeerPostValidationSchema from '@/services/posts/beer-post/schema/CreateBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import { createBeerPost } from '@/controllers/posts/beerPosts'; -import { CreateBeerPostRequest } from '@/controllers/posts/beerPosts/types'; +import { createBeerPost } from '@/controllers/posts/beer-posts'; +import { CreateBeerPostRequest } from '@/controllers/posts/beer-posts/types'; const router = createRouter< CreateBeerPostRequest, diff --git a/src/pages/api/beers/index.ts b/src/pages/api/beers/index.ts index 2d3fe0f..6616805 100644 --- a/src/pages/api/beers/index.ts +++ b/src/pages/api/beers/index.ts @@ -1,6 +1,6 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBeerPosts } from '@/controllers/posts/beerPosts'; -import { GetAllBeerPostsRequest } from '@/controllers/posts/beerPosts/types'; +import { getBeerPosts } from '@/controllers/posts/beer-posts'; +import { GetAllBeerPostsRequest } from '@/controllers/posts/beer-posts/types'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/beers/search.ts b/src/pages/api/beers/search.ts index dd2cca1..780a583 100644 --- a/src/pages/api/beers/search.ts +++ b/src/pages/api/beers/search.ts @@ -5,7 +5,7 @@ import { NextApiRequest, NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; const SearchSchema = z.object({ search: z.string().min(1), diff --git a/src/pages/api/beers/styles/[id]/beers/index.ts b/src/pages/api/beers/styles/[id]/beers/index.ts index 73492de..5d89585 100644 --- a/src/pages/api/beers/styles/[id]/beers/index.ts +++ b/src/pages/api/beers/styles/[id]/beers/index.ts @@ -1,6 +1,6 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getAllBeersByBeerStyle } from '@/controllers/posts/beerStyles'; +import { getAllBeersByBeerStyle } from '@/controllers/posts/beer-styles'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiRequest, NextApiResponse } from 'next'; diff --git a/src/pages/api/beers/styles/[id]/comments/index.ts b/src/pages/api/beers/styles/[id]/comments/index.ts index 2a88610..174d413 100644 --- a/src/pages/api/beers/styles/[id]/comments/index.ts +++ b/src/pages/api/beers/styles/[id]/comments/index.ts @@ -7,7 +7,7 @@ import { z } from 'zod'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import { createComment, getAll } from '@/controllers/comments/beerStyleComments'; +import { createComment, getAll } from '@/controllers/comments/beer-style-comments'; const router = createRouter< // I don't want to use any, but I can't figure out how to get the types to work diff --git a/src/pages/api/beers/styles/[id]/index.ts b/src/pages/api/beers/styles/[id]/index.ts index 82cc746..c392ab7 100644 --- a/src/pages/api/beers/styles/[id]/index.ts +++ b/src/pages/api/beers/styles/[id]/index.ts @@ -1,6 +1,6 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBeerStyle } from '@/controllers/posts/beerStyles'; -import { GetBeerStyleByIdRequest } from '@/controllers/posts/beerStyles/types'; +import { getBeerStyle } from '@/controllers/posts/beer-styles'; +import { GetBeerStyleByIdRequest } from '@/controllers/posts/beer-styles/types'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; diff --git a/src/pages/api/beers/styles/[id]/like/index.ts b/src/pages/api/beers/styles/[id]/like/index.ts index aa078af..87ff024 100644 --- a/src/pages/api/beers/styles/[id]/like/index.ts +++ b/src/pages/api/beers/styles/[id]/like/index.ts @@ -10,7 +10,7 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { getBeerStyleLikeCountRequest, sendBeerStyleLikeRequest, -} from '@/controllers/likes/beerStyleLikes'; +} from '@/controllers/likes/beer-style-likes'; import { LikeRequest } from '@/controllers/likes/types'; const router = createRouter< diff --git a/src/pages/api/beers/styles/[id]/like/is-liked.ts b/src/pages/api/beers/styles/[id]/like/is-liked.ts index 74e5067..3289cb6 100644 --- a/src/pages/api/beers/styles/[id]/like/is-liked.ts +++ b/src/pages/api/beers/styles/[id]/like/is-liked.ts @@ -6,7 +6,7 @@ import APIResponseValidationSchema from '@/validation/APIResponseValidationSchem import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; import { z } from 'zod'; -import { checkIfBeerStyleIsLiked } from '@/controllers/likes/beerStyleLikes'; +import { checkIfBeerStyleIsLiked } from '@/controllers/likes/beer-style-likes'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/beers/styles/create.ts b/src/pages/api/beers/styles/create.ts index 5c51c89..5b956e3 100644 --- a/src/pages/api/beers/styles/create.ts +++ b/src/pages/api/beers/styles/create.ts @@ -1,8 +1,8 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { createBeerStyle } from '@/controllers/posts/beerStyles'; -import { CreateBeerStyleRequest } from '@/controllers/posts/beerStyles/types'; -import CreateBeerStyleValidationSchema from '@/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema'; +import { createBeerStyle } from '@/controllers/posts/beer-styles'; +import { CreateBeerStyleRequest } from '@/controllers/posts/beer-styles/types'; +import CreateBeerStyleValidationSchema from '@/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; diff --git a/src/pages/api/beers/styles/index.ts b/src/pages/api/beers/styles/index.ts index 9acc879..cc518a6 100644 --- a/src/pages/api/beers/styles/index.ts +++ b/src/pages/api/beers/styles/index.ts @@ -1,5 +1,5 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBeerStyles } from '@/controllers/posts/beerStyles'; +import { getBeerStyles } from '@/controllers/posts/beer-styles'; import { GetAllPostsRequest } from '@/controllers/posts/types'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; diff --git a/src/pages/api/breweries/[id]/comments/index.ts b/src/pages/api/breweries/[id]/comments/index.ts index a2ae7b9..2e0175d 100644 --- a/src/pages/api/breweries/[id]/comments/index.ts +++ b/src/pages/api/breweries/[id]/comments/index.ts @@ -8,7 +8,7 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import { NextApiResponse } from 'next'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; -import { createComment, getAll } from '@/controllers/comments/breweryComments'; +import { createComment, getAll } from '@/controllers/comments/brewery-comments'; const router = createRouter< // I don't want to use any, but I can't figure out how to get the types to work diff --git a/src/pages/api/breweries/[id]/images/index.ts b/src/pages/api/breweries/[id]/images/index.ts index 02f88f0..66c3317 100644 --- a/src/pages/api/breweries/[id]/images/index.ts +++ b/src/pages/api/breweries/[id]/images/index.ts @@ -10,7 +10,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; import { uploadMiddlewareMultiple } from '@/config/multer/uploadMiddleware'; import { UploadImagesRequest } from '@/controllers/images/types'; -import { processBreweryImageData } from '@/controllers/images/breweryImages'; +import { processBreweryImageData } from '@/controllers/images/brewery-images'; const router = createRouter< UploadImagesRequest, diff --git a/src/pages/api/breweries/[id]/index.ts b/src/pages/api/breweries/[id]/index.ts index b359552..8366698 100644 --- a/src/pages/api/breweries/[id]/index.ts +++ b/src/pages/api/breweries/[id]/index.ts @@ -7,8 +7,8 @@ import { createRouter, NextHandler } from 'next-connect'; import { z } from 'zod'; import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; -import EditBreweryPostValidationSchema from '@/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema'; +import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; +import EditBreweryPostValidationSchema from '@/services/posts/brewery-post/schema/EditBreweryPostValidationSchema'; interface BreweryPostRequest extends UserExtendedNextApiRequest { query: { id: string }; diff --git a/src/pages/api/breweries/[id]/like/index.ts b/src/pages/api/breweries/[id]/like/index.ts index 3ac2890..40b6c14 100644 --- a/src/pages/api/breweries/[id]/like/index.ts +++ b/src/pages/api/breweries/[id]/like/index.ts @@ -5,7 +5,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { sendBreweryPostLikeRequest, getBreweryPostLikeCount, -} from '@/controllers/likes/breweryPostLikes'; +} from '@/controllers/likes/brewery-post-likes'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; diff --git a/src/pages/api/breweries/[id]/like/is-liked.ts b/src/pages/api/breweries/[id]/like/is-liked.ts index aa59509..4a41897 100644 --- a/src/pages/api/breweries/[id]/like/is-liked.ts +++ b/src/pages/api/breweries/[id]/like/is-liked.ts @@ -2,7 +2,7 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import { getBreweryPostLikeStatus } from '@/controllers/likes/breweryPostLikes'; +import { getBreweryPostLikeStatus } from '@/controllers/likes/brewery-post-likes'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; diff --git a/src/pages/api/breweries/create.ts b/src/pages/api/breweries/create.ts index 0291b4e..275b467 100644 --- a/src/pages/api/breweries/create.ts +++ b/src/pages/api/breweries/create.ts @@ -5,8 +5,8 @@ import { NextApiResponse } from 'next'; import { z } from 'zod'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; -import createNewBreweryPost from '@/services/posts/BreweryPost/createNewBreweryPost'; +import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; +import createNewBreweryPost from '@/services/posts/brewery-post/createNewBreweryPost'; import geocode from '@/config/mapbox/geocoder'; import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; diff --git a/src/pages/api/breweries/map/index.ts b/src/pages/api/breweries/map/index.ts index 8781c54..a31579b 100644 --- a/src/pages/api/breweries/map/index.ts +++ b/src/pages/api/breweries/map/index.ts @@ -1,6 +1,6 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import DBClient from '@/prisma/DBClient'; -import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/brewery-post/schema/BreweryPostMapQueryResult'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; diff --git a/src/pages/api/brewery-comments/[id].ts b/src/pages/api/brewery-comments/[id].ts index ae26802..57e13c4 100644 --- a/src/pages/api/brewery-comments/[id].ts +++ b/src/pages/api/brewery-comments/[id].ts @@ -6,7 +6,7 @@ import { checkIfBreweryCommentOwner, deleteBreweryPostComment, editBreweryPostComment, -} from '@/controllers/comments/breweryComments'; +} from '@/controllers/comments/brewery-comments'; import { CommentRequest } from '@/controllers/comments/types'; import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; diff --git a/src/pages/api/users/[id]/index.ts b/src/pages/api/users/[id]/index.ts index 5572129..cc62439 100644 --- a/src/pages/api/users/[id]/index.ts +++ b/src/pages/api/users/[id]/index.ts @@ -4,7 +4,8 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { editUserInfo, deleteAccount } from '@/controllers/users/auth'; import { checkIfUserCanEditUser } from '@/controllers/users/profile'; import { EditUserRequest } from '@/controllers/users/profile/types'; -import EditUserSchema from '@/services/users/User/schema/EditUserSchema'; +import EditUserSchema from '@/services/users/auth/schema/EditUserSchema'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; diff --git a/src/pages/api/users/[id]/posts/beers.ts b/src/pages/api/users/[id]/posts/beers.ts index 7bdd47e..ced48d3 100644 --- a/src/pages/api/users/[id]/posts/beers.ts +++ b/src/pages/api/users/[id]/posts/beers.ts @@ -6,7 +6,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { GetAllPostsByConnectedPostId } from '@/controllers/posts/types'; -import { getBeerPostsByUserId } from '@/controllers/posts/beerPosts'; +import { getBeerPostsByUserId } from '@/controllers/posts/beer-posts'; const router = createRouter< GetAllPostsByConnectedPostId, diff --git a/src/pages/api/users/confirm.ts b/src/pages/api/users/confirm.ts index 8e7cff3..1c81926 100644 --- a/src/pages/api/users/confirm.ts +++ b/src/pages/api/users/confirm.ts @@ -9,7 +9,7 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { TokenValidationRequest } from '@/controllers/users/auth/types'; import { confirmUser } from '@/controllers/users/auth'; -import TokenValidationSchema from '@/services/users/User/schema/TokenValidationSchema'; +import TokenValidationSchema from '@/services/users/auth/schema/TokenValidationSchema'; const router = createRouter< TokenValidationRequest, diff --git a/src/pages/api/users/edit-password.ts b/src/pages/api/users/edit-password.ts index 7701184..8a651d8 100644 --- a/src/pages/api/users/edit-password.ts +++ b/src/pages/api/users/edit-password.ts @@ -3,7 +3,8 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { updatePassword } from '@/controllers/users/auth'; import { UpdatePasswordRequest } from '@/controllers/users/auth/types'; -import { UpdatePasswordSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import { UpdatePasswordSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { createRouter } from 'next-connect'; diff --git a/src/pages/api/users/login.ts b/src/pages/api/users/login.ts index 7fef08c..c001094 100644 --- a/src/pages/api/users/login.ts +++ b/src/pages/api/users/login.ts @@ -3,10 +3,11 @@ import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import { createRouter } from 'next-connect'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import LoginValidationSchema from '@/services/users/User/schema/LoginValidationSchema'; + import { UserExtendedNextApiRequest } from '@/config/auth/types'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import { authenticateUser, loginUser } from '@/controllers/users/auth'; +import LoginValidationSchema from '@/services/users/auth/schema/LoginValidationSchema'; const router = createRouter< UserExtendedNextApiRequest, diff --git a/src/pages/api/users/register.ts b/src/pages/api/users/register.ts index 5ee8ef1..78e1c79 100644 --- a/src/pages/api/users/register.ts +++ b/src/pages/api/users/register.ts @@ -1,12 +1,13 @@ import { NextApiResponse } from 'next'; import { z } from 'zod'; import { createRouter } from 'next-connect'; -import { CreateUserValidationSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; + import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import validateRequest from '@/config/nextConnect/middleware/validateRequest'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { registerUser } from '@/controllers/users/auth'; import { RegisterUserRequest } from '@/controllers/users/auth/types'; +import { CreateUserValidationSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; const router = createRouter< RegisterUserRequest, diff --git a/src/pages/beers/[id]/edit.tsx b/src/pages/beers/[id]/edit.tsx index 30c2fdf..0b69343 100644 --- a/src/pages/beers/[id]/edit.tsx +++ b/src/pages/beers/[id]/edit.tsx @@ -3,8 +3,8 @@ import Head from 'next/head'; import React from 'react'; import withPageAuthRequired from '@/util/withPageAuthRequired'; -import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import EditBeerPostForm from '@/components/EditBeerPostForm'; import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import { BiBeer } from 'react-icons/bi'; diff --git a/src/pages/beers/[id]/index.tsx b/src/pages/beers/[id]/index.tsx index dc79abc..467f109 100644 --- a/src/pages/beers/[id]/index.tsx +++ b/src/pages/beers/[id]/index.tsx @@ -1,8 +1,8 @@ import { NextPage, GetServerSideProps } from 'next'; import Head from 'next/head'; -import getBeerPostById from '@/services/posts/BeerPost/getBeerPostById'; +import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { z } from 'zod'; diff --git a/src/pages/beers/styles/[id]/index.tsx b/src/pages/beers/styles/[id]/index.tsx index 3d652e8..69b7e16 100644 --- a/src/pages/beers/styles/[id]/index.tsx +++ b/src/pages/beers/styles/[id]/index.tsx @@ -5,9 +5,9 @@ import { z } from 'zod'; import useMediaQuery from '@/hooks/utilities/useMediaQuery'; import { Tab } from '@headlessui/react'; -import getBeerStyleById from '@/services/posts/BeerStyles/getBeerStyleById'; +import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; import BeerStyleHeader from '@/components/BeerStyleById/BeerStyleHeader'; -import BeerStyleQueryResult from '@/services/posts/BeerStyles/schema/BeerStyleQueryResult'; +import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import BeerStyleCommentSection from '@/components/BeerStyleById/BeerStyleCommentSection'; import BeerStyleBeerSection from '@/components/BeerStyleById/BeerStyleBeerSection'; diff --git a/src/pages/breweries/[id]/beers/create.tsx b/src/pages/breweries/[id]/beers/create.tsx index a55190c..eb3f45c 100644 --- a/src/pages/breweries/[id]/beers/create.tsx +++ b/src/pages/breweries/[id]/beers/create.tsx @@ -3,12 +3,12 @@ import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { BeerStyle } from '@prisma/client'; import { NextPage } from 'next'; import { BiBeer } from 'react-icons/bi'; import { z } from 'zod'; -import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; +import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; interface CreateBeerPageProps { brewery: z.infer; diff --git a/src/pages/breweries/[id]/edit.tsx b/src/pages/breweries/[id]/edit.tsx index 11d5807..d1f6aae 100644 --- a/src/pages/breweries/[id]/edit.tsx +++ b/src/pages/breweries/[id]/edit.tsx @@ -5,9 +5,9 @@ import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import FormSegment from '@/components/ui/forms/FormSegment'; import FormTextArea from '@/components/ui/forms/FormTextArea'; import FormTextInput from '@/components/ui/forms/FormTextInput'; -import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; -import EditBreweryPostValidationSchema from '@/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema'; +import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; +import EditBreweryPostValidationSchema from '@/services/posts/brewery-post/schema/EditBreweryPostValidationSchema'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import { zodResolver } from '@hookform/resolvers/zod'; import { NextPage } from 'next'; diff --git a/src/pages/breweries/[id]/index.tsx b/src/pages/breweries/[id]/index.tsx index 7dc3998..ae2b281 100644 --- a/src/pages/breweries/[id]/index.tsx +++ b/src/pages/breweries/[id]/index.tsx @@ -1,5 +1,5 @@ -import getBreweryPostById from '@/services/posts/BreweryPost/getBreweryPostById'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { GetServerSideProps, NextPage } from 'next'; import { z } from 'zod'; diff --git a/src/pages/breweries/index.tsx b/src/pages/breweries/index.tsx index 65e720f..3accbaf 100644 --- a/src/pages/breweries/index.tsx +++ b/src/pages/breweries/index.tsx @@ -3,7 +3,7 @@ import LoadingCard from '@/components/ui/LoadingCard'; import Spinner from '@/components/ui/Spinner'; import UserContext from '@/contexts/UserContext'; import useBreweryPosts from '@/hooks/data-fetching/brewery-posts/useBreweryPosts'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { NextPage } from 'next'; import Head from 'next/head'; import { useContext, MutableRefObject, useRef } from 'react'; diff --git a/src/pages/breweries/map.tsx b/src/pages/breweries/map.tsx index 4033493..f82b90f 100644 --- a/src/pages/breweries/map.tsx +++ b/src/pages/breweries/map.tsx @@ -7,7 +7,7 @@ import LocationMarker from '@/components/ui/LocationMarker'; import Link from 'next/link'; import Head from 'next/head'; import useGeolocation from '@/hooks/utilities/useGeolocation'; -import BreweryPostMapQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostMapQueryResult'; +import BreweryPostMapQueryResult from '@/services/posts/brewery-post/schema/BreweryPostMapQueryResult'; import { z } from 'zod'; import useBreweryMapPagePosts from '@/hooks/data-fetching/brewery-posts/useBreweryMapPagePosts'; import ControlPanel from '@/components/ui/maps/ControlPanel'; diff --git a/src/pages/users/[id].tsx b/src/pages/users/[id].tsx index 7c2f05d..fa48c0f 100644 --- a/src/pages/users/[id].tsx +++ b/src/pages/users/[id].tsx @@ -1,6 +1,6 @@ import useMediaQuery from '@/hooks/utilities/useMediaQuery'; -import findUserById from '@/services/users/User/findUserById'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import findUserById from '@/services/users/auth/findUserById'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import Head from 'next/head'; import { FC } from 'react'; diff --git a/src/pages/users/account/edit-profile.tsx b/src/pages/users/account/edit-profile.tsx index 1d69c9c..70703c5 100644 --- a/src/pages/users/account/edit-profile.tsx +++ b/src/pages/users/account/edit-profile.tsx @@ -21,7 +21,7 @@ import UpdateProfileForm from '@/components/Account/UpdateProfileForm'; import useGetUsersFollowedByUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowedByUser'; import useGetUsersFollowingUser from '@/hooks/data-fetching/user-follows/useGetUsersFollowingUser'; -import UpdateProfileSchema from '@/services/users/User/schema/UpdateProfileSchema'; +import UpdateProfileSchema from '@/services/users/auth/schema/UpdateProfileSchema'; import sendUpdateUserAvatarRequest from '@/requests/Account/sendUpdateUserAvatarRequest'; import sendUpdateUserProfileRequest from '@/requests/Account/sendUpdateUserProfileRequest'; import Spinner from '@/components/ui/Spinner'; diff --git a/src/pages/users/forgot-password.tsx b/src/pages/users/forgot-password.tsx index 72023cd..a68adc3 100644 --- a/src/pages/users/forgot-password.tsx +++ b/src/pages/users/forgot-password.tsx @@ -4,7 +4,7 @@ import FormInfo from '@/components/ui/forms/FormInfo'; import FormLabel from '@/components/ui/forms/FormLabel'; import FormSegment from '@/components/ui/forms/FormSegment'; import FormTextInput from '@/components/ui/forms/FormTextInput'; -import { BaseCreateUserSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import { BaseCreateUserSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; import createErrorToast from '@/util/createErrorToast'; import { zodResolver } from '@hookform/resolvers/zod'; import { NextPage } from 'next'; diff --git a/src/pages/users/reset-password.tsx b/src/pages/users/reset-password.tsx index e464987..0c426ba 100644 --- a/src/pages/users/reset-password.tsx +++ b/src/pages/users/reset-password.tsx @@ -1,7 +1,7 @@ import { setLoginSession } from '@/config/auth/session'; import { verifyResetPasswordToken } from '@/config/jwt'; import ServerError from '@/config/util/ServerError'; -import findUserById from '@/services/users/User/findUserById'; +import findUserById from '@/services/users/auth/findUserById'; import { GetServerSideProps, NextApiResponse, NextPage } from 'next'; diff --git a/src/prisma/seed/create/createAdminUser.ts b/src/prisma/seed/create/createAdminUser.ts index d81db79..803f5f7 100644 --- a/src/prisma/seed/create/createAdminUser.ts +++ b/src/prisma/seed/create/createAdminUser.ts @@ -4,7 +4,7 @@ import { hashPassword } from '../../../config/auth/passwordFns'; import { ADMIN_PASSWORD } from '../../../config/env'; import DBClient from '../../DBClient'; -import GetUserSchema from '../../../services/users/User/schema/GetUserSchema'; +import GetUserSchema from '../../../services/users/auth/schema/GetUserSchema'; import imageUrls from '../util/imageUrls'; const createAdminUser = async () => { diff --git a/src/requests/Account/sendUpdateUserProfileRequest.ts b/src/requests/Account/sendUpdateUserProfileRequest.ts index 5846156..c38ed00 100644 --- a/src/requests/Account/sendUpdateUserProfileRequest.ts +++ b/src/requests/Account/sendUpdateUserProfileRequest.ts @@ -1,4 +1,4 @@ -import UpdateProfileSchema from '@/services/users/User/schema/UpdateProfileSchema'; +import UpdateProfileSchema from '@/services/users/auth/schema/UpdateProfileSchema'; import { z } from 'zod'; interface UpdateProfileRequestParams { diff --git a/src/requests/BeerImage/sendUploadBeerImageRequest.ts b/src/requests/BeerImage/sendUploadBeerImageRequest.ts index 67b2e8c..1cf8637 100644 --- a/src/requests/BeerImage/sendUploadBeerImageRequest.ts +++ b/src/requests/BeerImage/sendUploadBeerImageRequest.ts @@ -1,4 +1,4 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/BeerPost/sendCreateBeerPostRequest.ts b/src/requests/BeerPost/sendCreateBeerPostRequest.ts index 9e04ada..7e36b1f 100644 --- a/src/requests/BeerPost/sendCreateBeerPostRequest.ts +++ b/src/requests/BeerPost/sendCreateBeerPostRequest.ts @@ -1,5 +1,5 @@ -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; -import CreateBeerPostValidationSchema from '@/services/posts/BeerPost/schema/CreateBeerPostValidationSchema'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; +import CreateBeerPostValidationSchema from '@/services/posts/beer-post/schema/CreateBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/BeerPost/sendEditBeerPostRequest.ts b/src/requests/BeerPost/sendEditBeerPostRequest.ts index 37d0366..57fb68a 100644 --- a/src/requests/BeerPost/sendEditBeerPostRequest.ts +++ b/src/requests/BeerPost/sendEditBeerPostRequest.ts @@ -1,4 +1,4 @@ -import EditBeerPostValidationSchema from '@/services/posts/BeerPost/schema/EditBeerPostValidationSchema'; +import EditBeerPostValidationSchema from '@/services/posts/beer-post/schema/EditBeerPostValidationSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts b/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts index 0821c6d..be6ec7a 100644 --- a/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts +++ b/src/requests/BreweryImage/sendUploadBreweryImageRequest.ts @@ -1,4 +1,4 @@ -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { z } from 'zod'; interface SendUploadBeerImagesRequestArgs { diff --git a/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts b/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts index 9b14b74..5477035 100644 --- a/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts +++ b/src/requests/BreweryPost/sendCreateBreweryPostRequest.ts @@ -1,5 +1,5 @@ -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; -import CreateBreweryPostSchema from '@/services/posts/BreweryPost/schema/CreateBreweryPostSchema'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; +import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/User/sendEditUserRequest.ts b/src/requests/User/sendEditUserRequest.ts index 7a0ecbf..1ff9feb 100644 --- a/src/requests/User/sendEditUserRequest.ts +++ b/src/requests/User/sendEditUserRequest.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/User/sendRegisterUserRequest.ts b/src/requests/User/sendRegisterUserRequest.ts index 66cc069..3cb6c11 100644 --- a/src/requests/User/sendRegisterUserRequest.ts +++ b/src/requests/User/sendRegisterUserRequest.ts @@ -1,5 +1,5 @@ -import { CreateUserValidationSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import { CreateUserValidationSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/requests/User/sendUpdatePasswordRequest.ts b/src/requests/User/sendUpdatePasswordRequest.ts index 407e8e7..d565c30 100644 --- a/src/requests/User/sendUpdatePasswordRequest.ts +++ b/src/requests/User/sendUpdatePasswordRequest.ts @@ -1,4 +1,4 @@ -import { UpdatePasswordSchema } from '@/services/users/User/schema/CreateUserValidationSchemas'; +import { UpdatePasswordSchema } from '@/services/users/auth/schema/CreateUserValidationSchemas'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { z } from 'zod'; diff --git a/src/services/comments/BeerComment/createNewBeerComment.ts b/src/services/comments/beer-comment/createNewBeerComment.ts similarity index 100% rename from src/services/comments/BeerComment/createNewBeerComment.ts rename to src/services/comments/beer-comment/createNewBeerComment.ts diff --git a/src/services/comments/BeerComment/editBeerCommentById.ts b/src/services/comments/beer-comment/editBeerCommentById.ts similarity index 100% rename from src/services/comments/BeerComment/editBeerCommentById.ts rename to src/services/comments/beer-comment/editBeerCommentById.ts diff --git a/src/services/comments/BeerComment/findBeerCommentById.ts b/src/services/comments/beer-comment/findBeerCommentById.ts similarity index 100% rename from src/services/comments/BeerComment/findBeerCommentById.ts rename to src/services/comments/beer-comment/findBeerCommentById.ts diff --git a/src/services/comments/BeerComment/getAllBeerComments.ts b/src/services/comments/beer-comment/getAllBeerComments.ts similarity index 100% rename from src/services/comments/BeerComment/getAllBeerComments.ts rename to src/services/comments/beer-comment/getAllBeerComments.ts diff --git a/src/services/comments/BeerComment/getBeerCommentCount.ts b/src/services/comments/beer-comment/getBeerCommentCount.ts similarity index 100% rename from src/services/comments/BeerComment/getBeerCommentCount.ts rename to src/services/comments/beer-comment/getBeerCommentCount.ts diff --git a/src/services/comments/BeerStyleComment/createNewBeerStyleComment.ts b/src/services/comments/beer-style-comment/createNewBeerStyleComment.ts similarity index 100% rename from src/services/comments/BeerStyleComment/createNewBeerStyleComment.ts rename to src/services/comments/beer-style-comment/createNewBeerStyleComment.ts diff --git a/src/services/comments/BeerStyleComment/getAllBeerStyleComments.ts b/src/services/comments/beer-style-comment/getAllBeerStyleComments.ts similarity index 100% rename from src/services/comments/BeerStyleComment/getAllBeerStyleComments.ts rename to src/services/comments/beer-style-comment/getAllBeerStyleComments.ts diff --git a/src/services/comments/BeerStyleComment/getBeerStyleCommentCount.ts b/src/services/comments/beer-style-comment/getBeerStyleCommentCount.ts similarity index 100% rename from src/services/comments/BeerStyleComment/getBeerStyleCommentCount.ts rename to src/services/comments/beer-style-comment/getBeerStyleCommentCount.ts diff --git a/src/services/comments/BeerStyleComment/updateBeerStyleCommentById.ts b/src/services/comments/beer-style-comment/updateBeerStyleCommentById.ts similarity index 100% rename from src/services/comments/BeerStyleComment/updateBeerStyleCommentById.ts rename to src/services/comments/beer-style-comment/updateBeerStyleCommentById.ts diff --git a/src/services/comments/BreweryComment/createNewBreweryComment.ts b/src/services/comments/brewery-comment/createNewBreweryComment.ts similarity index 100% rename from src/services/comments/BreweryComment/createNewBreweryComment.ts rename to src/services/comments/brewery-comment/createNewBreweryComment.ts diff --git a/src/services/comments/BreweryComment/getAllBreweryComments.ts b/src/services/comments/brewery-comment/getAllBreweryComments.ts similarity index 100% rename from src/services/comments/BreweryComment/getAllBreweryComments.ts rename to src/services/comments/brewery-comment/getAllBreweryComments.ts diff --git a/src/services/comments/BreweryComment/getBreweryCommentById.ts b/src/services/comments/brewery-comment/getBreweryCommentById.ts similarity index 100% rename from src/services/comments/BreweryComment/getBreweryCommentById.ts rename to src/services/comments/brewery-comment/getBreweryCommentById.ts diff --git a/src/services/images/BeerImage/addBeerImageToDB.ts b/src/services/images/beer-image/addBeerImageToDB.ts similarity index 100% rename from src/services/images/BeerImage/addBeerImageToDB.ts rename to src/services/images/beer-image/addBeerImageToDB.ts diff --git a/src/services/images/BreweryImage/addBreweryImageToDB.ts b/src/services/images/brewery-image/addBreweryImageToDB.ts similarity index 100% rename from src/services/images/BreweryImage/addBreweryImageToDB.ts rename to src/services/images/brewery-image/addBreweryImageToDB.ts diff --git a/src/services/likes/BeerPostLike/createBeerPostLike.ts b/src/services/likes/beer-post-like/createBeerPostLike.ts similarity index 86% rename from src/services/likes/BeerPostLike/createBeerPostLike.ts rename to src/services/likes/beer-post-like/createBeerPostLike.ts index 6c2ebe8..14a18b7 100644 --- a/src/services/likes/BeerPostLike/createBeerPostLike.ts +++ b/src/services/likes/beer-post-like/createBeerPostLike.ts @@ -1,6 +1,6 @@ import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; -import GetUserSchema from '../../users/User/schema/GetUserSchema'; +import GetUserSchema from '../../users/auth/schema/GetUserSchema'; interface CreateBeerPostLikeArgs { id: string; diff --git a/src/services/likes/BeerPostLike/findBeerPostLikeById.ts b/src/services/likes/beer-post-like/findBeerPostLikeById.ts similarity index 100% rename from src/services/likes/BeerPostLike/findBeerPostLikeById.ts rename to src/services/likes/beer-post-like/findBeerPostLikeById.ts diff --git a/src/services/likes/BeerPostLike/getBeerPostLikeCount.ts b/src/services/likes/beer-post-like/getBeerPostLikeCount.ts similarity index 100% rename from src/services/likes/BeerPostLike/getBeerPostLikeCount.ts rename to src/services/likes/beer-post-like/getBeerPostLikeCount.ts diff --git a/src/services/likes/BeerPostLike/removeBeerPostLikeById.ts b/src/services/likes/beer-post-like/removeBeerPostLikeById.ts similarity index 100% rename from src/services/likes/BeerPostLike/removeBeerPostLikeById.ts rename to src/services/likes/beer-post-like/removeBeerPostLikeById.ts diff --git a/src/services/likes/BeerStyleLike/createBeerStyleLike.ts b/src/services/likes/beer-style-like/createBeerStyleLike.ts similarity index 86% rename from src/services/likes/BeerStyleLike/createBeerStyleLike.ts rename to src/services/likes/beer-style-like/createBeerStyleLike.ts index 6af1e71..e4c1813 100644 --- a/src/services/likes/BeerStyleLike/createBeerStyleLike.ts +++ b/src/services/likes/beer-style-like/createBeerStyleLike.ts @@ -1,6 +1,6 @@ import { z } from 'zod'; import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; interface CreateBeerStyleLikeArgs { beerStyleId: string; diff --git a/src/services/likes/BeerStyleLike/findBeerStyleLikeById.ts b/src/services/likes/beer-style-like/findBeerStyleLikeById.ts similarity index 100% rename from src/services/likes/BeerStyleLike/findBeerStyleLikeById.ts rename to src/services/likes/beer-style-like/findBeerStyleLikeById.ts diff --git a/src/services/likes/BeerStyleLike/getBeerStyleLikeCount.ts b/src/services/likes/beer-style-like/getBeerStyleLikeCount.ts similarity index 100% rename from src/services/likes/BeerStyleLike/getBeerStyleLikeCount.ts rename to src/services/likes/beer-style-like/getBeerStyleLikeCount.ts diff --git a/src/services/likes/BeerStyleLike/removeBeerStyleLikeById.ts b/src/services/likes/beer-style-like/removeBeerStyleLikeById.ts similarity index 100% rename from src/services/likes/BeerStyleLike/removeBeerStyleLikeById.ts rename to src/services/likes/beer-style-like/removeBeerStyleLikeById.ts diff --git a/src/services/posts/BeerPost/createNewBeerPost.ts b/src/services/posts/beer-post/createNewBeerPost.ts similarity index 100% rename from src/services/posts/BeerPost/createNewBeerPost.ts rename to src/services/posts/beer-post/createNewBeerPost.ts diff --git a/src/services/posts/BeerPost/deleteBeerPostById.ts b/src/services/posts/beer-post/deleteBeerPostById.ts similarity index 100% rename from src/services/posts/BeerPost/deleteBeerPostById.ts rename to src/services/posts/beer-post/deleteBeerPostById.ts diff --git a/src/services/posts/BeerPost/editBeerPostById.ts b/src/services/posts/beer-post/editBeerPostById.ts similarity index 100% rename from src/services/posts/BeerPost/editBeerPostById.ts rename to src/services/posts/beer-post/editBeerPostById.ts diff --git a/src/services/posts/BeerPost/getAllBeerPosts.ts b/src/services/posts/beer-post/getAllBeerPosts.ts similarity index 91% rename from src/services/posts/BeerPost/getAllBeerPosts.ts rename to src/services/posts/beer-post/getAllBeerPosts.ts index dd37b8d..a19f344 100644 --- a/src/services/posts/BeerPost/getAllBeerPosts.ts +++ b/src/services/posts/beer-post/getAllBeerPosts.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { z } from 'zod'; const prisma = DBClient.instance; diff --git a/src/services/posts/BeerPost/getBeerPostById.ts b/src/services/posts/beer-post/getBeerPostById.ts similarity index 90% rename from src/services/posts/BeerPost/getBeerPostById.ts rename to src/services/posts/beer-post/getBeerPostById.ts index 36fd1a2..f7e5c53 100644 --- a/src/services/posts/BeerPost/getBeerPostById.ts +++ b/src/services/posts/beer-post/getBeerPostById.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { z } from 'zod'; const prisma = DBClient.instance; diff --git a/src/services/posts/BeerPost/getBeerPostsByBeerStyleId.ts b/src/services/posts/beer-post/getBeerPostsByBeerStyleId.ts similarity index 100% rename from src/services/posts/BeerPost/getBeerPostsByBeerStyleId.ts rename to src/services/posts/beer-post/getBeerPostsByBeerStyleId.ts diff --git a/src/services/posts/BeerPost/getBeerPostsByBreweryId.ts b/src/services/posts/beer-post/getBeerPostsByBreweryId.ts similarity index 100% rename from src/services/posts/BeerPost/getBeerPostsByBreweryId.ts rename to src/services/posts/beer-post/getBeerPostsByBreweryId.ts diff --git a/src/services/posts/BeerPost/getBeerPostsByPostedById.ts b/src/services/posts/beer-post/getBeerPostsByPostedById.ts similarity index 100% rename from src/services/posts/BeerPost/getBeerPostsByPostedById.ts rename to src/services/posts/beer-post/getBeerPostsByPostedById.ts diff --git a/src/services/posts/BeerPost/getBeerRecommendations.ts b/src/services/posts/beer-post/getBeerRecommendations.ts similarity index 94% rename from src/services/posts/BeerPost/getBeerRecommendations.ts rename to src/services/posts/beer-post/getBeerRecommendations.ts index 6353e06..654af53 100644 --- a/src/services/posts/BeerPost/getBeerRecommendations.ts +++ b/src/services/posts/beer-post/getBeerRecommendations.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BeerPostQueryResult from '@/services/posts/BeerPost/schema/BeerPostQueryResult'; +import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import { z } from 'zod'; diff --git a/src/services/posts/BeerPost/schema/BeerPostQueryResult.ts b/src/services/posts/beer-post/schema/BeerPostQueryResult.ts similarity index 100% rename from src/services/posts/BeerPost/schema/BeerPostQueryResult.ts rename to src/services/posts/beer-post/schema/BeerPostQueryResult.ts diff --git a/src/services/posts/BeerPost/schema/CreateBeerPostValidationSchema.ts b/src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts similarity index 100% rename from src/services/posts/BeerPost/schema/CreateBeerPostValidationSchema.ts rename to src/services/posts/beer-post/schema/CreateBeerPostValidationSchema.ts diff --git a/src/services/posts/BeerPost/schema/EditBeerPostValidationSchema.ts b/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts similarity index 100% rename from src/services/posts/BeerPost/schema/EditBeerPostValidationSchema.ts rename to src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts diff --git a/src/services/posts/BeerStyles/deleteBeerStyleById.ts b/src/services/posts/beer-style-post/deleteBeerStyleById.ts similarity index 100% rename from src/services/posts/BeerStyles/deleteBeerStyleById.ts rename to src/services/posts/beer-style-post/deleteBeerStyleById.ts diff --git a/src/services/posts/BeerStyles/editBeerStyleById.ts b/src/services/posts/beer-style-post/editBeerStyleById.ts similarity index 100% rename from src/services/posts/BeerStyles/editBeerStyleById.ts rename to src/services/posts/beer-style-post/editBeerStyleById.ts diff --git a/src/services/posts/BeerStyles/getAllBeerStyles.ts b/src/services/posts/beer-style-post/getAllBeerStyles.ts similarity index 100% rename from src/services/posts/BeerStyles/getAllBeerStyles.ts rename to src/services/posts/beer-style-post/getAllBeerStyles.ts diff --git a/src/services/posts/BeerStyles/getBeerStyleById.ts b/src/services/posts/beer-style-post/getBeerStyleById.ts similarity index 100% rename from src/services/posts/BeerStyles/getBeerStyleById.ts rename to src/services/posts/beer-style-post/getBeerStyleById.ts diff --git a/src/services/posts/BeerStyles/schema/BeerStyleQueryResult.ts b/src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts similarity index 100% rename from src/services/posts/BeerStyles/schema/BeerStyleQueryResult.ts rename to src/services/posts/beer-style-post/schema/BeerStyleQueryResult.ts diff --git a/src/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema.ts b/src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts similarity index 100% rename from src/services/posts/BeerStyles/schema/CreateBeerStyleValidationSchema.ts rename to src/services/posts/beer-style-post/schema/CreateBeerStyleValidationSchema.ts diff --git a/src/services/posts/BreweryPost/createNewBreweryPost.ts b/src/services/posts/brewery-post/createNewBreweryPost.ts similarity index 100% rename from src/services/posts/BreweryPost/createNewBreweryPost.ts rename to src/services/posts/brewery-post/createNewBreweryPost.ts diff --git a/src/services/posts/BreweryPost/getAllBreweryPosts.ts b/src/services/posts/brewery-post/getAllBreweryPosts.ts similarity index 92% rename from src/services/posts/BreweryPost/getAllBreweryPosts.ts rename to src/services/posts/brewery-post/getAllBreweryPosts.ts index 39db838..b3540f5 100644 --- a/src/services/posts/BreweryPost/getAllBreweryPosts.ts +++ b/src/services/posts/brewery-post/getAllBreweryPosts.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { z } from 'zod'; diff --git a/src/services/posts/BreweryPost/getAllBreweryPostsByPostedById.ts b/src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts similarity index 93% rename from src/services/posts/BreweryPost/getAllBreweryPostsByPostedById.ts rename to src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts index d8a3dc7..b4820d1 100644 --- a/src/services/posts/BreweryPost/getAllBreweryPostsByPostedById.ts +++ b/src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { z } from 'zod'; diff --git a/src/services/posts/BreweryPost/getBreweryPostById.ts b/src/services/posts/brewery-post/getBreweryPostById.ts similarity index 91% rename from src/services/posts/BreweryPost/getBreweryPostById.ts rename to src/services/posts/brewery-post/getBreweryPostById.ts index 0c8399b..46886fe 100644 --- a/src/services/posts/BreweryPost/getBreweryPostById.ts +++ b/src/services/posts/brewery-post/getBreweryPostById.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/BreweryPost/schema/BreweryPostQueryResult'; +import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { z } from 'zod'; const prisma = DBClient.instance; diff --git a/src/services/posts/BreweryPost/schema/BreweryPostMapQueryResult.ts b/src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts similarity index 100% rename from src/services/posts/BreweryPost/schema/BreweryPostMapQueryResult.ts rename to src/services/posts/brewery-post/schema/BreweryPostMapQueryResult.ts diff --git a/src/services/posts/BreweryPost/schema/BreweryPostQueryResult.ts b/src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts similarity index 100% rename from src/services/posts/BreweryPost/schema/BreweryPostQueryResult.ts rename to src/services/posts/brewery-post/schema/BreweryPostQueryResult.ts diff --git a/src/services/posts/BreweryPost/schema/CreateBreweryPostSchema.ts b/src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts similarity index 100% rename from src/services/posts/BreweryPost/schema/CreateBreweryPostSchema.ts rename to src/services/posts/brewery-post/schema/CreateBreweryPostSchema.ts diff --git a/src/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema.ts b/src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts similarity index 100% rename from src/services/posts/BreweryPost/schema/EditBreweryPostValidationSchema.ts rename to src/services/posts/brewery-post/schema/EditBreweryPostValidationSchema.ts diff --git a/src/services/users/UserAccount/UpdateUserAvatarByIdParams.ts b/src/services/users/account/UpdateUserAvatarByIdParams.ts similarity index 95% rename from src/services/users/UserAccount/UpdateUserAvatarByIdParams.ts rename to src/services/users/account/UpdateUserAvatarByIdParams.ts index 9002c47..56ab286 100644 --- a/src/services/users/UserAccount/UpdateUserAvatarByIdParams.ts +++ b/src/services/users/account/UpdateUserAvatarByIdParams.ts @@ -1,5 +1,5 @@ import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import { z } from 'zod'; export interface UpdateUserAvatarByIdParams { diff --git a/src/services/users/User/createNewUser.ts b/src/services/users/auth/createNewUser.ts similarity index 100% rename from src/services/users/User/createNewUser.ts rename to src/services/users/auth/createNewUser.ts diff --git a/src/services/users/User/deleteUserById.ts b/src/services/users/auth/deleteUserById.ts similarity index 100% rename from src/services/users/User/deleteUserById.ts rename to src/services/users/auth/deleteUserById.ts diff --git a/src/services/users/User/findUserByEmail.ts b/src/services/users/auth/findUserByEmail.ts similarity index 100% rename from src/services/users/User/findUserByEmail.ts rename to src/services/users/auth/findUserByEmail.ts diff --git a/src/services/users/User/findUserById.ts b/src/services/users/auth/findUserById.ts similarity index 100% rename from src/services/users/User/findUserById.ts rename to src/services/users/auth/findUserById.ts diff --git a/src/services/users/User/findUserByIdPublic.ts b/src/services/users/auth/findUserByIdPublic.ts similarity index 100% rename from src/services/users/User/findUserByIdPublic.ts rename to src/services/users/auth/findUserByIdPublic.ts diff --git a/src/services/users/User/findUserByUsername.ts b/src/services/users/auth/findUserByUsername.ts similarity index 100% rename from src/services/users/User/findUserByUsername.ts rename to src/services/users/auth/findUserByUsername.ts diff --git a/src/services/users/User/schema/CreateUserValidationSchemas.ts b/src/services/users/auth/schema/CreateUserValidationSchemas.ts similarity index 100% rename from src/services/users/User/schema/CreateUserValidationSchemas.ts rename to src/services/users/auth/schema/CreateUserValidationSchemas.ts diff --git a/src/services/users/User/schema/EditUserSchema.ts b/src/services/users/auth/schema/EditUserSchema.ts similarity index 100% rename from src/services/users/User/schema/EditUserSchema.ts rename to src/services/users/auth/schema/EditUserSchema.ts diff --git a/src/services/users/User/schema/GetUserSchema.ts b/src/services/users/auth/schema/GetUserSchema.ts similarity index 100% rename from src/services/users/User/schema/GetUserSchema.ts rename to src/services/users/auth/schema/GetUserSchema.ts diff --git a/src/services/users/User/schema/LoginValidationSchema.ts b/src/services/users/auth/schema/LoginValidationSchema.ts similarity index 100% rename from src/services/users/User/schema/LoginValidationSchema.ts rename to src/services/users/auth/schema/LoginValidationSchema.ts diff --git a/src/services/users/User/schema/PublicUserSchema.ts b/src/services/users/auth/schema/PublicUserSchema.ts similarity index 72% rename from src/services/users/User/schema/PublicUserSchema.ts rename to src/services/users/auth/schema/PublicUserSchema.ts index 08895f3..ba51010 100644 --- a/src/services/users/User/schema/PublicUserSchema.ts +++ b/src/services/users/auth/schema/PublicUserSchema.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; const PublicUserSchema = GetUserSchema.pick({ id: true, diff --git a/src/services/users/User/schema/TokenValidationSchema.ts b/src/services/users/auth/schema/TokenValidationSchema.ts similarity index 100% rename from src/services/users/User/schema/TokenValidationSchema.ts rename to src/services/users/auth/schema/TokenValidationSchema.ts diff --git a/src/services/users/User/schema/UpdateProfileSchema.ts b/src/services/users/auth/schema/UpdateProfileSchema.ts similarity index 100% rename from src/services/users/User/schema/UpdateProfileSchema.ts rename to src/services/users/auth/schema/UpdateProfileSchema.ts diff --git a/src/services/users/User/sendConfirmationEmail.ts b/src/services/users/auth/sendConfirmationEmail.ts similarity index 100% rename from src/services/users/User/sendConfirmationEmail.ts rename to src/services/users/auth/sendConfirmationEmail.ts diff --git a/src/services/users/User/sendResetPasswordEmail.ts b/src/services/users/auth/sendResetPasswordEmail.ts similarity index 100% rename from src/services/users/User/sendResetPasswordEmail.ts rename to src/services/users/auth/sendResetPasswordEmail.ts diff --git a/src/services/users/User/updateUserProfileById.ts b/src/services/users/auth/updateUserProfileById.ts similarity index 100% rename from src/services/users/User/updateUserProfileById.ts rename to src/services/users/auth/updateUserProfileById.ts diff --git a/src/services/users/User/updateUserToBeConfirmedById.ts b/src/services/users/auth/updateUserToBeConfirmedById.ts similarity index 92% rename from src/services/users/User/updateUserToBeConfirmedById.ts rename to src/services/users/auth/updateUserToBeConfirmedById.ts index 650b42d..2db875f 100644 --- a/src/services/users/User/updateUserToBeConfirmedById.ts +++ b/src/services/users/auth/updateUserToBeConfirmedById.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import DBClient from '@/prisma/DBClient'; import { z } from 'zod'; diff --git a/src/services/users/UserFollows/getUsersFollowedByUser.ts b/src/services/users/follows/getUsersFollowedByUser.ts similarity index 100% rename from src/services/users/UserFollows/getUsersFollowedByUser.ts rename to src/services/users/follows/getUsersFollowedByUser.ts diff --git a/src/services/users/UserFollows/getUsersFollowingUser.ts b/src/services/users/follows/getUsersFollowingUser.ts similarity index 100% rename from src/services/users/UserFollows/getUsersFollowingUser.ts rename to src/services/users/follows/getUsersFollowingUser.ts diff --git a/src/services/users/UserFollows/schema/FollowInfoSchema.ts b/src/services/users/follows/schema/FollowInfoSchema.ts similarity index 69% rename from src/services/users/UserFollows/schema/FollowInfoSchema.ts rename to src/services/users/follows/schema/FollowInfoSchema.ts index 7151448..a073006 100644 --- a/src/services/users/UserFollows/schema/FollowInfoSchema.ts +++ b/src/services/users/follows/schema/FollowInfoSchema.ts @@ -1,4 +1,4 @@ -import GetUserSchema from '@/services/users/User/schema/GetUserSchema'; +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; const FollowInfoSchema = GetUserSchema.pick({ userAvatar: true, From 80404802dcfcd32c679b3aef3659b3b9095f8132 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Mon, 11 Dec 2023 18:17:41 -0500 Subject: [PATCH 14/21] refactor: update comments services --- .../comments/beer-comments/index.ts | 46 +++++----- .../comments/beer-style-comments/index.ts | 40 ++++----- .../comments/brewery-comments/index.ts | 49 +++++------ src/controllers/users/profile/index.ts | 5 +- .../beer-comment/createNewBeerComment.ts | 37 -------- .../beer-comment/editBeerCommentById.ts | 32 ------- .../beer-comment/findBeerCommentById.ts | 27 ------ .../beer-comment/getAllBeerComments.ts | 34 -------- .../beer-comment/getBeerCommentCount.ts | 13 --- src/services/comments/beer-comment/index.ts | 87 +++++++++++++++++++ .../comments/beer-comment/types/index.ts | 28 ++++++ .../createNewBeerStyleComment.ts | 39 --------- .../getAllBeerStyleComments.ts | 34 -------- .../getBeerStyleCommentCount.ts | 15 ---- .../comments/beer-style-comment/index.ts | 85 ++++++++++++++++++ .../beer-style-comment/types/index.ts | 28 ++++++ .../updateBeerStyleCommentById.ts | 23 ----- .../createNewBreweryComment.ts | 39 --------- .../brewery-comment/getAllBreweryComments.ts | 35 -------- .../brewery-comment/getBreweryCommentById.ts | 9 -- .../comments/brewery-comment/index.ts | 85 ++++++++++++++++++ .../comments/brewery-comment/types/index.ts | 29 +++++++ 22 files changed, 406 insertions(+), 413 deletions(-) delete mode 100644 src/services/comments/beer-comment/createNewBeerComment.ts delete mode 100644 src/services/comments/beer-comment/editBeerCommentById.ts delete mode 100644 src/services/comments/beer-comment/findBeerCommentById.ts delete mode 100644 src/services/comments/beer-comment/getAllBeerComments.ts delete mode 100644 src/services/comments/beer-comment/getBeerCommentCount.ts create mode 100644 src/services/comments/beer-comment/index.ts create mode 100644 src/services/comments/beer-comment/types/index.ts delete mode 100644 src/services/comments/beer-style-comment/createNewBeerStyleComment.ts delete mode 100644 src/services/comments/beer-style-comment/getAllBeerStyleComments.ts delete mode 100644 src/services/comments/beer-style-comment/getBeerStyleCommentCount.ts create mode 100644 src/services/comments/beer-style-comment/index.ts create mode 100644 src/services/comments/beer-style-comment/types/index.ts delete mode 100644 src/services/comments/beer-style-comment/updateBeerStyleCommentById.ts delete mode 100644 src/services/comments/brewery-comment/createNewBreweryComment.ts delete mode 100644 src/services/comments/brewery-comment/getAllBreweryComments.ts delete mode 100644 src/services/comments/brewery-comment/getBreweryCommentById.ts create mode 100644 src/services/comments/brewery-comment/index.ts create mode 100644 src/services/comments/brewery-comment/types/index.ts diff --git a/src/controllers/comments/beer-comments/index.ts b/src/controllers/comments/beer-comments/index.ts index d2fbf4c..2dc7327 100644 --- a/src/controllers/comments/beer-comments/index.ts +++ b/src/controllers/comments/beer-comments/index.ts @@ -1,13 +1,19 @@ -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import editBeerCommentById from '@/services/comments/beer-comment/editBeerCommentById'; -import findBeerCommentById from '@/services/comments/beer-comment/findBeerCommentById'; -import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import createNewBeerComment from '@/services/comments/beer-comment/createNewBeerComment'; -import getAllBeerComments from '@/services/comments/beer-comment/getAllBeerComments'; + +import ServerError from '@/config/util/ServerError'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; + +import { + getBeerPostCommentByIdService, + editBeerPostCommentByIdService, + createBeerPostCommentService, + getAllBeerCommentsService, + deleteBeerCommentByIdService, + getBeerPostCommentCountService, +} from '@/services/comments/beer-comment'; + import { CommentRequest, EditAndCreateCommentRequest, @@ -21,7 +27,7 @@ export const checkIfBeerCommentOwner = async ( ) => { const { id } = req.query; const user = req.user!; - const comment = await findBeerCommentById({ beerCommentId: id }); + const comment = await getBeerPostCommentByIdService({ beerPostCommentId: id }); if (!comment) { throw new ServerError('Comment not found', 404); @@ -40,17 +46,12 @@ export const editBeerPostComment = async ( ) => { const { id } = req.query; - const updated = await editBeerCommentById({ - content: req.body.content, - rating: req.body.rating, - id, - }); + await editBeerPostCommentByIdService({ body: req.body, beerPostCommentId: id }); res.status(200).json({ success: true, message: 'Comment updated successfully', statusCode: 200, - payload: updated, }); }; @@ -60,9 +61,7 @@ export const deleteBeerPostComment = async ( ) => { const { id } = req.query; - await DBClient.instance.beerComment.delete({ - where: { id }, - }); + await deleteBeerCommentByIdService({ beerPostCommentId: id }); res.status(200).json({ success: true, @@ -75,15 +74,12 @@ export const createBeerPostComment = async ( req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { - const { content, rating } = req.body; - const beerPostId = req.query.id; - const newBeerComment = await createNewBeerComment({ - content, - rating, - beerPostId, + const newBeerComment = await createBeerPostCommentService({ + body: req.body, userId: req.user!.id, + beerPostId, }); res.status(201).json({ @@ -102,13 +98,13 @@ export const getAllBeerPostComments = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num } = req.query; - const comments = await getAllBeerComments({ + const comments = await getAllBeerCommentsService({ beerPostId, pageNum: parseInt(page_num, 10), pageSize: parseInt(page_size, 10), }); - const count = await DBClient.instance.beerComment.count({ where: { beerPostId } }); + const count = await getBeerPostCommentCountService({ beerPostId }); res.setHeader('X-Total-Count', count); diff --git a/src/controllers/comments/beer-style-comments/index.ts b/src/controllers/comments/beer-style-comments/index.ts index f50dc59..2ca878b 100644 --- a/src/controllers/comments/beer-style-comments/index.ts +++ b/src/controllers/comments/beer-style-comments/index.ts @@ -1,14 +1,18 @@ import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; -import updateBeerStyleCommentById from '@/services/comments/beer-style-comment/updateBeerStyleCommentById'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import createNewBeerStyleComment from '@/services/comments/beer-style-comment/createNewBeerStyleComment'; -import getAllBeerStyleComments from '@/services/comments/beer-style-comment/getAllBeerStyleComments'; +import { + updateBeerStyleCommentById, + createNewBeerStyleComment, + getAllBeerStyleComments, + findBeerStyleCommentById, + deleteBeerStyleCommentById, +} from '@/services/comments/beer-style-comment'; import { CommentRequest, @@ -25,15 +29,14 @@ export const checkIfBeerStyleCommentOwner = async < ) => { const { id } = req.query; const user = req.user!; - const beerStyleComment = await DBClient.instance.beerStyleComment.findFirst({ - where: { id }, - }); + + const beerStyleComment = await findBeerStyleCommentById({ beerStyleCommentId: id }); if (!beerStyleComment) { throw new ServerError('Beer style comment not found.', 404); } - if (beerStyleComment.postedById !== user.id) { + if (beerStyleComment.postedBy.id !== user.id) { throw new ServerError( 'You are not authorized to modify this beer style comment.', 403, @@ -47,8 +50,8 @@ export const editBeerStyleComment = async ( req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { - const updated = await updateBeerStyleCommentById({ - id: req.query.id, + await updateBeerStyleCommentById({ + beerStyleCommentId: req.query.id, body: req.body, }); @@ -56,7 +59,6 @@ export const editBeerStyleComment = async ( success: true, message: 'Comment updated successfully', statusCode: 200, - payload: updated, }); }; @@ -66,7 +68,7 @@ export const deleteBeerStyleComment = async ( ) => { const { id } = req.query; - await DBClient.instance.beerStyleComment.delete({ where: { id } }); + await deleteBeerStyleCommentById({ beerStyleCommentId: id }); res.status(200).json({ success: true, @@ -79,15 +81,11 @@ export const createComment = async ( req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { - const { content, rating } = req.body; - - const newBeerStyleComment: z.infer = - await createNewBeerStyleComment({ - content, - rating, - beerStyleId: req.query.id, - userId: req.user!.id, - }); + const newBeerStyleComment = await createNewBeerStyleComment({ + body: req.body, + beerStyleId: req.query.id, + userId: req.user!.id, + }); res.status(201).json({ message: 'Beer comment created successfully', diff --git a/src/controllers/comments/brewery-comments/index.ts b/src/controllers/comments/brewery-comments/index.ts index 86484fc..81e6a3a 100644 --- a/src/controllers/comments/brewery-comments/index.ts +++ b/src/controllers/comments/brewery-comments/index.ts @@ -1,13 +1,18 @@ import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import getBreweryCommentById from '@/services/comments/brewery-comment/getBreweryCommentById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; -import createNewBreweryComment from '@/services/comments/brewery-comment/createNewBreweryComment'; -import getAllBreweryComments from '@/services/comments/brewery-comment/getAllBreweryComments'; + +import { + getBreweryCommentById, + createNewBreweryComment, + getAllBreweryComments, + deleteBreweryCommentByIdService, + updateBreweryCommentById, + getBreweryCommentCount, +} from '@/services/comments/brewery-comment'; + import { CommentRequest, EditAndCreateCommentRequest, @@ -23,13 +28,13 @@ export const checkIfBreweryCommentOwner = async < ) => { const { id } = req.query; const user = req.user!; - const comment = await getBreweryCommentById(id); + const comment = await getBreweryCommentById({ breweryCommentId: id }); if (!comment) { throw new ServerError('Comment not found', 404); } - if (comment.postedById !== user.id) { + if (comment.postedBy.id !== user.id) { throw new ServerError('You are not authorized to modify this comment', 403); } @@ -42,13 +47,9 @@ export const editBreweryPostComment = async ( ) => { const { id } = req.query; - const updated = await DBClient.instance.breweryComment.update({ - where: { id }, - data: { - content: req.body.content, - rating: req.body.rating, - updatedAt: new Date(), - }, + const updated = updateBreweryCommentById({ + breweryCommentId: id, + body: req.body, }); return res.status(200).json({ @@ -65,7 +66,7 @@ export const deleteBreweryPostComment = async ( ) => { const { id } = req.query; - await DBClient.instance.breweryComment.delete({ where: { id } }); + await deleteBreweryCommentByIdService({ breweryCommentId: id }); res.status(200).json({ success: true, @@ -78,19 +79,15 @@ export const createComment = async ( req: EditAndCreateCommentRequest, res: NextApiResponse>, ) => { - const { content, rating } = req.body; - const breweryPostId = req.query.id; const user = req.user!; - const newBreweryComment: z.infer = - await createNewBreweryComment({ - content, - rating, - breweryPostId, - userId: user.id, - }); + const newBreweryComment = await createNewBreweryComment({ + body: req.body, + breweryPostId, + userId: user.id, + }); res.status(201).json({ message: 'Beer comment created successfully', @@ -114,9 +111,7 @@ export const getAll = async ( pageSize: parseInt(page_size, 10), }); - const count = await DBClient.instance.breweryComment.count({ - where: { breweryPostId }, - }); + const count = await getBreweryCommentCount({ breweryPostId }); res.setHeader('X-Total-Count', count); diff --git a/src/controllers/users/profile/index.ts b/src/controllers/users/profile/index.ts index ffcf253..de93f05 100644 --- a/src/controllers/users/profile/index.ts +++ b/src/controllers/users/profile/index.ts @@ -10,7 +10,8 @@ import updateUserAvatarById, { } from '@/services/users/account/UpdateUserAvatarByIdParams'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import updateUserProfileById from '@/services/users/auth/updateUserProfileById'; - +import getUsersFollowingUser from '@/services/users/follows/getUsersFollowingUser'; +import getUsersFollowedByUser from '@/services/users/follows/getUsersFollowedByUser'; import { UserRouteRequest, GetUserFollowInfoRequest, @@ -18,8 +19,6 @@ import { UpdateAvatarRequest, UpdateProfileRequest, } from './types'; -import getUsersFollowingUser from '@/services/users/follows/getUsersFollowingUser'; -import getUsersFollowedByUser from '@/services/users/follows/getUsersFollowedByUser'; export const followUser = async ( req: UserRouteRequest, diff --git a/src/services/comments/beer-comment/createNewBeerComment.ts b/src/services/comments/beer-comment/createNewBeerComment.ts deleted file mode 100644 index 664e19e..0000000 --- a/src/services/comments/beer-comment/createNewBeerComment.ts +++ /dev/null @@ -1,37 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -const CreateNewBeerCommentServiceSchema = CreateCommentValidationSchema.extend({ - userId: z.string().cuid(), - beerPostId: z.string().cuid(), -}); - -type CreateNewBeerCommentArgs = z.infer; - -const createNewBeerComment = async ({ - content, - rating, - beerPostId, - userId, -}: CreateNewBeerCommentArgs): Promise> => { - return DBClient.instance.beerComment.create({ - data: { - content, - rating, - beerPost: { connect: { id: beerPostId } }, - postedBy: { connect: { id: userId } }, - }, - select: { - id: true, - content: true, - rating: true, - postedBy: { select: { id: true, username: true, userAvatar: true } }, - createdAt: true, - updatedAt: true, - }, - }); -}; - -export default createNewBeerComment; diff --git a/src/services/comments/beer-comment/editBeerCommentById.ts b/src/services/comments/beer-comment/editBeerCommentById.ts deleted file mode 100644 index 5449bf4..0000000 --- a/src/services/comments/beer-comment/editBeerCommentById.ts +++ /dev/null @@ -1,32 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -interface EditBeerCommentByIdArgs { - id: string; - content: string; - rating: number; -} - -const editBeerCommentById = async ({ - id, - content, - rating, -}: EditBeerCommentByIdArgs): Promise> => { - return DBClient.instance.beerComment.update({ - where: { id }, - data: { content, rating, updatedAt: new Date() }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - }); -}; - -export default editBeerCommentById; diff --git a/src/services/comments/beer-comment/findBeerCommentById.ts b/src/services/comments/beer-comment/findBeerCommentById.ts deleted file mode 100644 index e27acff..0000000 --- a/src/services/comments/beer-comment/findBeerCommentById.ts +++ /dev/null @@ -1,27 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -interface FindBeerCommentArgs { - beerCommentId: string; -} - -const findBeerCommentById = async ({ - beerCommentId, -}: FindBeerCommentArgs): Promise | null> => { - return DBClient.instance.beerComment.findUnique({ - where: { id: beerCommentId }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - }); -}; - -export default findBeerCommentById; diff --git a/src/services/comments/beer-comment/getAllBeerComments.ts b/src/services/comments/beer-comment/getAllBeerComments.ts deleted file mode 100644 index 26c5e1d..0000000 --- a/src/services/comments/beer-comment/getAllBeerComments.ts +++ /dev/null @@ -1,34 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -interface GetAllBeerCommentsArgs { - beerPostId: string; - pageNum: number; - pageSize: number; -} - -const getAllBeerComments = async ({ - beerPostId, - pageNum, - pageSize, -}: GetAllBeerCommentsArgs): Promise[]> => { - return DBClient.instance.beerComment.findMany({ - skip: (pageNum - 1) * pageSize, - take: pageSize, - where: { beerPostId }, - orderBy: { createdAt: 'desc' }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - }); -}; - -export default getAllBeerComments; diff --git a/src/services/comments/beer-comment/getBeerCommentCount.ts b/src/services/comments/beer-comment/getBeerCommentCount.ts deleted file mode 100644 index 989e7cd..0000000 --- a/src/services/comments/beer-comment/getBeerCommentCount.ts +++ /dev/null @@ -1,13 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface GetBeerCommentCountArgs { - beerPostId: string; -} - -const getBeerCommentCount = async ({ - beerPostId, -}: GetBeerCommentCountArgs): Promise => { - return DBClient.instance.beerComment.count({ where: { beerPostId } }); -}; - -export default getBeerCommentCount; diff --git a/src/services/comments/beer-comment/index.ts b/src/services/comments/beer-comment/index.ts new file mode 100644 index 0000000..6b82814 --- /dev/null +++ b/src/services/comments/beer-comment/index.ts @@ -0,0 +1,87 @@ +import DBClient from '@/prisma/DBClient'; + +import { + CreateBeerPostComment, + EditBeerPostCommentById, + FindOrDeleteBeerPostCommentById, + GetAllBeerPostComments, + GetBeerPostCommentCount, +} from './types'; + +const beerPostCommentSelect = { + id: true, + content: true, + rating: true, + createdAt: true, + updatedAt: true, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, +} as const; + +export const createBeerPostCommentService: CreateBeerPostComment = ({ + body, + beerPostId, + userId, +}) => { + const { content, rating } = body; + return DBClient.instance.beerComment.create({ + data: { + content, + rating, + beerPost: { connect: { id: beerPostId } }, + postedBy: { connect: { id: userId } }, + }, + select: beerPostCommentSelect, + }); +}; + +export const editBeerPostCommentByIdService: EditBeerPostCommentById = ({ + beerPostCommentId, + body, +}) => { + const { content, rating } = body; + return DBClient.instance.beerComment.update({ + where: { id: beerPostCommentId }, + data: { content, rating, updatedAt: new Date() }, + select: beerPostCommentSelect, + }); +}; + +export const getBeerPostCommentByIdService: FindOrDeleteBeerPostCommentById = ({ + beerPostCommentId, +}) => { + return DBClient.instance.beerComment.findUnique({ + where: { id: beerPostCommentId }, + select: beerPostCommentSelect, + }); +}; + +export const deleteBeerCommentByIdService: FindOrDeleteBeerPostCommentById = ({ + beerPostCommentId, +}) => { + return DBClient.instance.beerComment.delete({ + where: { id: beerPostCommentId }, + select: beerPostCommentSelect, + }); +}; + +export const getAllBeerCommentsService: GetAllBeerPostComments = ({ + beerPostId, + pageNum, + pageSize, +}) => { + return 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 } }); +}; diff --git a/src/services/comments/beer-comment/types/index.ts b/src/services/comments/beer-comment/types/index.ts new file mode 100644 index 0000000..63236e3 --- /dev/null +++ b/src/services/comments/beer-comment/types/index.ts @@ -0,0 +1,28 @@ +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; +import { z } from 'zod'; + +type BeerPostComment = z.infer; + +export type CreateBeerPostComment = (args: { + body: z.infer; + userId: string; + beerPostId: string; +}) => Promise; + +export type EditBeerPostCommentById = (args: { + body: z.infer; + beerPostCommentId: string; +}) => Promise; + +export type FindOrDeleteBeerPostCommentById = (args: { + beerPostCommentId: string; +}) => Promise; + +export type GetBeerPostCommentCount = (args: { beerPostId: string }) => Promise; + +export type GetAllBeerPostComments = (args: { + beerPostId: string; + pageNum: number; + pageSize: number; +}) => Promise; diff --git a/src/services/comments/beer-style-comment/createNewBeerStyleComment.ts b/src/services/comments/beer-style-comment/createNewBeerStyleComment.ts deleted file mode 100644 index 8197438..0000000 --- a/src/services/comments/beer-style-comment/createNewBeerStyleComment.ts +++ /dev/null @@ -1,39 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -const CreateNewBeerStyleCommentServiceSchema = CreateCommentValidationSchema.extend({ - userId: z.string().cuid(), - beerStyleId: z.string().cuid(), -}); - -type CreateNewBeerCommentArgs = z.infer; - -const createNewBeerStyleComment = async ({ - content, - rating, - userId, - beerStyleId, -}: CreateNewBeerCommentArgs): Promise> => { - return DBClient.instance.beerStyleComment.create({ - data: { - content, - rating, - beerStyle: { connect: { id: beerStyleId } }, - postedBy: { connect: { id: userId } }, - }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - }); -}; - -export default createNewBeerStyleComment; diff --git a/src/services/comments/beer-style-comment/getAllBeerStyleComments.ts b/src/services/comments/beer-style-comment/getAllBeerStyleComments.ts deleted file mode 100644 index 08219bf..0000000 --- a/src/services/comments/beer-style-comment/getAllBeerStyleComments.ts +++ /dev/null @@ -1,34 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -interface GetAllBeerStyleCommentArgs { - beerStyleId: string; - pageNum: number; - pageSize: number; -} - -const getAllBeerStyleComments = async ({ - beerStyleId, - pageNum, - pageSize, -}: GetAllBeerStyleCommentArgs): Promise[]> => { - return DBClient.instance.beerStyleComment.findMany({ - skip: (pageNum - 1) * pageSize, - take: pageSize, - where: { beerStyleId }, - orderBy: { createdAt: 'desc' }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - }); -}; - -export default getAllBeerStyleComments; diff --git a/src/services/comments/beer-style-comment/getBeerStyleCommentCount.ts b/src/services/comments/beer-style-comment/getBeerStyleCommentCount.ts deleted file mode 100644 index c52185c..0000000 --- a/src/services/comments/beer-style-comment/getBeerStyleCommentCount.ts +++ /dev/null @@ -1,15 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface GetBeerStyleCommentCountArgs { - beerStyleId: string; -} - -const getBeerCommentCount = async ({ - beerStyleId, -}: GetBeerStyleCommentCountArgs): Promise => { - return DBClient.instance.beerStyleComment.count({ - where: { beerStyleId }, - }); -}; - -export default getBeerCommentCount; diff --git a/src/services/comments/beer-style-comment/index.ts b/src/services/comments/beer-style-comment/index.ts new file mode 100644 index 0000000..172ea3a --- /dev/null +++ b/src/services/comments/beer-style-comment/index.ts @@ -0,0 +1,85 @@ +import DBClient from '@/prisma/DBClient'; +import { + CreateNewBeerStyleComment, + GetAllBeerStyleComments, + GetBeerStyleCommentCount, + UpdateBeerStyleCommentById, + FindOrDeleteBeerStyleCommentById, +} from './types'; + +const beerStyleCommentSelect = { + id: true, + content: true, + rating: true, + createdAt: true, + updatedAt: true, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, +} as const; + +export const createNewBeerStyleComment: CreateNewBeerStyleComment = ({ + body, + userId, + beerStyleId, +}) => { + const { content, rating } = body; + return DBClient.instance.beerStyleComment.create({ + data: { + content, + rating, + beerStyle: { connect: { id: beerStyleId } }, + postedBy: { connect: { id: userId } }, + }, + select: beerStyleCommentSelect, + }); +}; + +export const getAllBeerStyleComments: GetAllBeerStyleComments = ({ + beerStyleId, + pageNum, + pageSize, +}) => { + return 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 } }); +}; + +export const updateBeerStyleCommentById: UpdateBeerStyleCommentById = ({ + body, + beerStyleCommentId, +}) => { + const { content, rating } = body; + + return DBClient.instance.beerStyleComment.update({ + where: { id: beerStyleCommentId }, + data: { content, rating, updatedAt: new Date() }, + select: beerStyleCommentSelect, + }); +}; + +export const findBeerStyleCommentById: FindOrDeleteBeerStyleCommentById = ({ + beerStyleCommentId, +}) => { + return DBClient.instance.beerStyleComment.findUnique({ + where: { id: beerStyleCommentId }, + select: beerStyleCommentSelect, + }); +}; + +export const deleteBeerStyleCommentById: FindOrDeleteBeerStyleCommentById = ({ + beerStyleCommentId, +}) => { + return DBClient.instance.beerStyleComment.delete({ + where: { id: beerStyleCommentId }, + select: beerStyleCommentSelect, + }); +}; diff --git a/src/services/comments/beer-style-comment/types/index.ts b/src/services/comments/beer-style-comment/types/index.ts new file mode 100644 index 0000000..18c1366 --- /dev/null +++ b/src/services/comments/beer-style-comment/types/index.ts @@ -0,0 +1,28 @@ +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; +import { z } from 'zod'; + +type BeerStyleComment = z.infer; + +export type FindOrDeleteBeerStyleCommentById = (args: { + beerStyleCommentId: string; +}) => Promise; + +export type UpdateBeerStyleCommentById = (args: { + body: z.infer; + beerStyleCommentId: string; +}) => Promise; + +export type GetBeerStyleCommentCount = (args: { beerStyleId: string }) => Promise; + +export type GetAllBeerStyleComments = (args: { + beerStyleId: string; + pageNum: number; + pageSize: number; +}) => Promise; + +export type CreateNewBeerStyleComment = (args: { + body: z.infer; + userId: string; + beerStyleId: string; +}) => Promise; diff --git a/src/services/comments/beer-style-comment/updateBeerStyleCommentById.ts b/src/services/comments/beer-style-comment/updateBeerStyleCommentById.ts deleted file mode 100644 index a457043..0000000 --- a/src/services/comments/beer-style-comment/updateBeerStyleCommentById.ts +++ /dev/null @@ -1,23 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; - -interface UpdateBeerStyleCommentByIdParams { - body: z.infer; - id: string; -} - -const updateBeerStyleCommentById = ({ body, id }: UpdateBeerStyleCommentByIdParams) => { - const { content, rating } = body; - - return DBClient.instance.beerStyleComment.update({ - where: { id }, - data: { - content, - rating, - updatedAt: new Date(), - }, - }); -}; - -export default updateBeerStyleCommentById; diff --git a/src/services/comments/brewery-comment/createNewBreweryComment.ts b/src/services/comments/brewery-comment/createNewBreweryComment.ts deleted file mode 100644 index ea8de7b..0000000 --- a/src/services/comments/brewery-comment/createNewBreweryComment.ts +++ /dev/null @@ -1,39 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CreateCommentValidationSchema from '../../schema/CommentSchema/CreateCommentValidationSchema'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -const CreateNewBreweryCommentServiceSchema = CreateCommentValidationSchema.extend({ - userId: z.string().cuid(), - breweryPostId: z.string().cuid(), -}); - -const createNewBreweryComment = async ({ - content, - rating, - breweryPostId, - userId, -}: z.infer): Promise< - z.infer -> => { - return DBClient.instance.breweryComment.create({ - data: { - content, - rating, - breweryPost: { connect: { id: breweryPostId } }, - postedBy: { connect: { id: userId } }, - }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - }); -}; - -export default createNewBreweryComment; diff --git a/src/services/comments/brewery-comment/getAllBreweryComments.ts b/src/services/comments/brewery-comment/getAllBreweryComments.ts deleted file mode 100644 index 5c8a1a7..0000000 --- a/src/services/comments/brewery-comment/getAllBreweryComments.ts +++ /dev/null @@ -1,35 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CommentQueryResult from '../../schema/CommentSchema/CommentQueryResult'; - -const getAllBreweryComments = async ({ - id, - pageNum, - pageSize, -}: { - id: string; - pageNum: number; - pageSize: number; -}) => { - const skip = (pageNum - 1) * pageSize; - const breweryComments: z.infer[] = - await DBClient.instance.breweryComment.findMany({ - skip, - take: pageSize, - where: { breweryPostId: id }, - select: { - id: true, - content: true, - rating: true, - createdAt: true, - updatedAt: true, - postedBy: { - select: { id: true, username: true, createdAt: true, userAvatar: true }, - }, - }, - orderBy: { createdAt: 'desc' }, - }); - return breweryComments; -}; - -export default getAllBreweryComments; diff --git a/src/services/comments/brewery-comment/getBreweryCommentById.ts b/src/services/comments/brewery-comment/getBreweryCommentById.ts deleted file mode 100644 index c3420a0..0000000 --- a/src/services/comments/brewery-comment/getBreweryCommentById.ts +++ /dev/null @@ -1,9 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -const getBreweryCommentById = async (id: string) => { - return DBClient.instance.breweryComment.findUnique({ - where: { id }, - }); -}; - -export default getBreweryCommentById; diff --git a/src/services/comments/brewery-comment/index.ts b/src/services/comments/brewery-comment/index.ts new file mode 100644 index 0000000..aecd5e0 --- /dev/null +++ b/src/services/comments/brewery-comment/index.ts @@ -0,0 +1,85 @@ +import DBClient from '@/prisma/DBClient'; +import { + CreateNewBreweryComment, + FindDeleteBreweryCommentById, + GetAllBreweryComments, + GetBreweryCommentCount, + UpdateBreweryCommentById, +} from './types'; + +const breweryCommentSelect = { + id: true, + content: true, + rating: true, + createdAt: true, + updatedAt: true, + postedBy: { + select: { id: true, username: true, createdAt: true, userAvatar: true }, + }, +} as const; + +export const updateBreweryCommentById: UpdateBreweryCommentById = ({ + breweryCommentId, + body, +}) => { + const { content, rating } = body; + + return DBClient.instance.breweryComment.update({ + where: { id: breweryCommentId }, + data: { content, rating }, + select: breweryCommentSelect, + }); +}; + +export const createNewBreweryComment: CreateNewBreweryComment = ({ + body, + breweryPostId, + userId, +}) => { + const { content, rating } = body; + return DBClient.instance.breweryComment.create({ + data: { + content, + rating, + breweryPost: { connect: { id: breweryPostId } }, + postedBy: { connect: { id: userId } }, + }, + select: breweryCommentSelect, + }); +}; + +export const getAllBreweryComments: GetAllBreweryComments = ({ + id, + pageNum, + pageSize, +}) => { + return DBClient.instance.breweryComment.findMany({ + skip: (pageNum - 1) * pageSize, + take: pageSize, + where: { breweryPostId: id }, + select: breweryCommentSelect, + orderBy: { createdAt: 'desc' }, + }); +}; + +export const getBreweryCommentById: FindDeleteBreweryCommentById = ({ + breweryCommentId, +}) => { + return DBClient.instance.breweryComment.findUnique({ + where: { id: breweryCommentId }, + select: breweryCommentSelect, + }); +}; + +export const deleteBreweryCommentByIdService: FindDeleteBreweryCommentById = ({ + breweryCommentId, +}) => { + return DBClient.instance.breweryComment.delete({ + where: { id: breweryCommentId }, + select: breweryCommentSelect, + }); +}; + +export const getBreweryCommentCount: GetBreweryCommentCount = ({ breweryPostId }) => { + return DBClient.instance.breweryComment.count({ where: { breweryPostId } }); +}; diff --git a/src/services/comments/brewery-comment/types/index.ts b/src/services/comments/brewery-comment/types/index.ts new file mode 100644 index 0000000..4e7d7bb --- /dev/null +++ b/src/services/comments/brewery-comment/types/index.ts @@ -0,0 +1,29 @@ +import CommentQueryResult from '@/services/schema/CommentSchema/CommentQueryResult'; +import CreateCommentValidationSchema from '@/services/schema/CommentSchema/CreateCommentValidationSchema'; + +import { z } from 'zod'; + +type BreweryComment = z.infer; + +export type UpdateBreweryCommentById = (args: { + breweryCommentId: string; + body: z.infer; +}) => Promise; + +export type CreateNewBreweryComment = (args: { + body: z.infer; + breweryPostId: string; + userId: string; +}) => Promise; + +export type GetAllBreweryComments = (args: { + id: string; + pageNum: number; + pageSize: number; +}) => Promise; + +export type FindDeleteBreweryCommentById = (args: { + breweryCommentId: string; +}) => Promise; + +export type GetBreweryCommentCount = (args: { breweryPostId: string }) => Promise; From f7d09ce61e8d0026d21f71367c2abc6463fd1f5a Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Mon, 11 Dec 2023 21:16:33 -0500 Subject: [PATCH 15/21] Refactor: update beer post services, comment services --- .../comments/beer-comments/index.ts | 5 +- .../comments/beer-style-comments/index.ts | 8 +- .../comments/brewery-comments/index.ts | 11 +- .../likes/beer-posts-likes/index.ts | 13 +- src/controllers/posts/beer-posts/index.ts | 46 ++- src/controllers/posts/beer-styles/index.ts | 5 +- src/pages/beers/[id]/edit.tsx | 5 +- src/pages/beers/[id]/index.tsx | 6 +- .../BeerPost/sendEditBeerPostRequest.ts | 3 +- src/services/comments/beer-comment/index.ts | 13 +- .../comments/beer-comment/types/index.ts | 7 +- .../comments/beer-style-comment/index.ts | 13 +- .../beer-style-comment/types/index.ts | 7 +- .../comments/brewery-comment/index.ts | 15 +- .../comments/brewery-comment/types/index.ts | 4 +- .../posts/beer-post/createNewBeerPost.ts | 56 ---- .../posts/beer-post/deleteBeerPostById.ts | 39 --- .../posts/beer-post/editBeerPostById.ts | 45 --- .../posts/beer-post/getAllBeerPosts.ts | 45 --- .../posts/beer-post/getBeerPostById.ts | 37 --- .../beer-post/getBeerPostsByBeerStyleId.ts | 47 --- .../beer-post/getBeerPostsByBreweryId.ts | 47 --- .../beer-post/getBeerPostsByPostedById.ts | 47 --- .../posts/beer-post/getBeerRecommendations.ts | 65 ----- src/services/posts/beer-post/index.ts | 276 ++++++++++++++++++ .../schema/EditBeerPostValidationSchema.ts | 2 +- src/services/posts/beer-post/types/index.ts | 60 ++++ 27 files changed, 410 insertions(+), 517 deletions(-) delete mode 100644 src/services/posts/beer-post/createNewBeerPost.ts delete mode 100644 src/services/posts/beer-post/deleteBeerPostById.ts delete mode 100644 src/services/posts/beer-post/editBeerPostById.ts delete mode 100644 src/services/posts/beer-post/getAllBeerPosts.ts delete mode 100644 src/services/posts/beer-post/getBeerPostById.ts delete mode 100644 src/services/posts/beer-post/getBeerPostsByBeerStyleId.ts delete mode 100644 src/services/posts/beer-post/getBeerPostsByBreweryId.ts delete mode 100644 src/services/posts/beer-post/getBeerPostsByPostedById.ts delete mode 100644 src/services/posts/beer-post/getBeerRecommendations.ts create mode 100644 src/services/posts/beer-post/index.ts create mode 100644 src/services/posts/beer-post/types/index.ts diff --git a/src/controllers/comments/beer-comments/index.ts b/src/controllers/comments/beer-comments/index.ts index 2dc7327..7ca8dbc 100644 --- a/src/controllers/comments/beer-comments/index.ts +++ b/src/controllers/comments/beer-comments/index.ts @@ -11,7 +11,6 @@ import { createBeerPostCommentService, getAllBeerCommentsService, deleteBeerCommentByIdService, - getBeerPostCommentCountService, } from '@/services/comments/beer-comment'; import { @@ -98,14 +97,12 @@ export const getAllBeerPostComments = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num } = req.query; - const comments = await getAllBeerCommentsService({ + const { comments, count } = await getAllBeerCommentsService({ beerPostId, pageNum: parseInt(page_num, 10), pageSize: parseInt(page_size, 10), }); - const count = await getBeerPostCommentCountService({ beerPostId }); - res.setHeader('X-Total-Count', count); res.status(200).json({ diff --git a/src/controllers/comments/beer-style-comments/index.ts b/src/controllers/comments/beer-style-comments/index.ts index 2ca878b..9365c0c 100644 --- a/src/controllers/comments/beer-style-comments/index.ts +++ b/src/controllers/comments/beer-style-comments/index.ts @@ -1,6 +1,4 @@ import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; - import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; @@ -103,16 +101,12 @@ export const getAll = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num } = req.query; - const comments = await getAllBeerStyleComments({ + const { comments, count } = await getAllBeerStyleComments({ beerStyleId, pageNum: parseInt(page_num, 10), pageSize: parseInt(page_size, 10), }); - const count = await DBClient.instance.beerStyleComment.count({ - where: { beerStyleId }, - }); - res.setHeader('X-Total-Count', count); res.status(200).json({ diff --git a/src/controllers/comments/brewery-comments/index.ts b/src/controllers/comments/brewery-comments/index.ts index 81e6a3a..103dca9 100644 --- a/src/controllers/comments/brewery-comments/index.ts +++ b/src/controllers/comments/brewery-comments/index.ts @@ -10,7 +10,6 @@ import { getAllBreweryComments, deleteBreweryCommentByIdService, updateBreweryCommentById, - getBreweryCommentCount, } from '@/services/comments/brewery-comment'; import { @@ -70,7 +69,7 @@ export const deleteBreweryPostComment = async ( res.status(200).json({ success: true, - message: 'Comment deleted successfully', + message: 'Brewery comment deleted successfully', statusCode: 200, }); }; @@ -90,7 +89,7 @@ export const createComment = async ( }); res.status(201).json({ - message: 'Beer comment created successfully', + message: 'Brewery comment created successfully', statusCode: 201, payload: newBreweryComment, success: true, @@ -105,18 +104,16 @@ export const getAll = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num } = req.query; - const comments = await getAllBreweryComments({ + const { comments, count } = await getAllBreweryComments({ id: breweryPostId, pageNum: parseInt(page_num, 10), pageSize: parseInt(page_size, 10), }); - const count = await getBreweryCommentCount({ breweryPostId }); - res.setHeader('X-Total-Count', count); res.status(200).json({ - message: 'Beer comments fetched successfully', + message: 'Brewery comments fetched successfully', statusCode: 200, payload: comments, success: true, diff --git a/src/controllers/likes/beer-posts-likes/index.ts b/src/controllers/likes/beer-posts-likes/index.ts index 9b21e2d..f8eb405 100644 --- a/src/controllers/likes/beer-posts-likes/index.ts +++ b/src/controllers/likes/beer-posts-likes/index.ts @@ -1,14 +1,15 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; -import createBeerPostLike from '@/services/likes/beer-post-like/createBeerPostLike'; -import findBeerPostLikeById from '@/services/likes/beer-post-like/findBeerPostLikeById'; -import getBeerPostLikeCountByBeerPostId from '@/services/likes/beer-post-like/getBeerPostLikeCount'; -import removeBeerPostLikeById from '@/services/likes/beer-post-like/removeBeerPostLikeById'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; import { LikeRequest } from '../types'; +import createBeerPostLike from '@/services/likes/beer-post-like/createBeerPostLike'; +import findBeerPostLikeById from '@/services/likes/beer-post-like/findBeerPostLikeById'; +import getBeerPostLikeCountByBeerPostId from '@/services/likes/beer-post-like/getBeerPostLikeCount'; +import removeBeerPostLikeById from '@/services/likes/beer-post-like/removeBeerPostLikeById'; +import { getBeerPostById } from '@/services/posts/beer-post'; export const sendBeerPostLikeRequest = async ( req: LikeRequest, @@ -17,7 +18,7 @@ export const sendBeerPostLikeRequest = async ( const user = req.user!; const id = req.query.id as string; - const beer = await getBeerPostById(id); + const beer = await getBeerPostById({ beerPostId: id }); if (!beer) { throw new ServerError('Could not find a beer post with that id', 404); } diff --git a/src/controllers/posts/beer-posts/index.ts b/src/controllers/posts/beer-posts/index.ts index b853c44..44ff03b 100644 --- a/src/controllers/posts/beer-posts/index.ts +++ b/src/controllers/posts/beer-posts/index.ts @@ -1,16 +1,18 @@ import ServerError from '@/config/util/ServerError'; -import deleteBeerPostById from '@/services/posts/beer-post/deleteBeerPostById'; -import editBeerPostById from '@/services/posts/beer-post/editBeerPostById'; -import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; + +import { + getBeerPostById, + editBeerPostByIdService, + deleteBeerPostByIdService, + getBeerRecommendationsService, + getAllBeerPostsService, + createNewBeerPost, + getBeerPostsByPostedByIdService, +} from '@/services/posts/beer-post'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import { z } from 'zod'; -import getBeerRecommendations from '@/services/posts/beer-post/getBeerRecommendations'; -import getAllBeerPosts from '@/services/posts/beer-post/getAllBeerPosts'; -import DBClient from '@/prisma/DBClient'; -import createNewBeerPost from '@/services/posts/beer-post/createNewBeerPost'; -import getBeerPostsByPostedById from '@/services/posts/beer-post/getBeerPostsByPostedById'; import { BeerPostRequest, CreateBeerPostRequest, @@ -28,7 +30,7 @@ export const checkIfBeerPostOwner = async >, ) => { - await editBeerPostById({ id: req.query.id, data: req.body }); + await editBeerPostByIdService({ beerPostId: req.query.id, body: req.body }); res.status(200).json({ message: 'Beer post updated successfully', @@ -57,7 +59,7 @@ export const editBeerPost = async ( export const deleteBeerPost = async (req: BeerPostRequest, res: NextApiResponse) => { const { id } = req.query; - const deleted = await deleteBeerPostById({ beerPostId: id }); + const deleted = await deleteBeerPostByIdService({ beerPostId: id }); if (!deleted) { throw new ServerError('Beer post not found', 404); } @@ -75,7 +77,7 @@ export const getBeerPostRecommendations = async ( ) => { const { id } = req.query; - const beerPost = await getBeerPostById(id); + const beerPost = await getBeerPostById({ beerPostId: id }); if (!beerPost) { throw new ServerError('Beer post not found', 404); @@ -84,7 +86,7 @@ export const getBeerPostRecommendations = async ( const pageNum = parseInt(req.query.page_num as string, 10); const pageSize = parseInt(req.query.page_size as string, 10); - const { count, beerRecommendations } = await getBeerRecommendations({ + const { beerRecommendations, count } = await getBeerRecommendationsService({ beerPost, pageNum, pageSize, @@ -106,11 +108,9 @@ export const getBeerPosts = async ( const pageNum = parseInt(req.query.page_num, 10); const pageSize = parseInt(req.query.page_size, 10); - const beerPosts = await getAllBeerPosts({ pageNum, pageSize }); + const { beerPosts, count } = await getAllBeerPostsService({ pageNum, pageSize }); - const beerPostCount = await DBClient.instance.beerPost.count(); - - res.setHeader('X-Total-Count', beerPostCount); + res.setHeader('X-Total-Count', count); res.status(200).json({ message: 'Beer posts retrieved successfully', @@ -124,14 +124,14 @@ export const createBeerPost = async ( req: CreateBeerPostRequest, res: NextApiResponse>, ) => { - const { name, description, styleId: typeId, abv, ibu, breweryId } = req.body; + const { name, description, styleId, abv, ibu, breweryId } = req.body; const newBeerPost = await createNewBeerPost({ name, description, abv, ibu, - styleId: typeId, + styleId, breweryId, userId: req.user!.id, }); @@ -153,17 +153,13 @@ export const getBeerPostsByUserId = async ( const { id } = req.query; - const beerPosts = await getBeerPostsByPostedById({ + const { beerPosts, count } = await getBeerPostsByPostedByIdService({ pageNum, pageSize, postedById: id, }); - const beerPostCount = await DBClient.instance.beerPost.count({ - where: { postedBy: { id } }, - }); - - res.setHeader('X-Total-Count', beerPostCount); + res.setHeader('X-Total-Count', count); res.status(200).json({ message: `Beer posts by user ${id} fetched successfully`, diff --git a/src/controllers/posts/beer-styles/index.ts b/src/controllers/posts/beer-styles/index.ts index e59c21c..75007e7 100644 --- a/src/controllers/posts/beer-styles/index.ts +++ b/src/controllers/posts/beer-styles/index.ts @@ -6,12 +6,13 @@ import DBClient from '@/prisma/DBClient'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; -import getBeerPostsByBeerStyleId from '@/services/posts/beer-post/getBeerPostsByBeerStyleId'; import getAllBeerStyles from '@/services/posts/beer-style-post/getAllBeerStyles'; import ServerError from '@/config/util/ServerError'; + import { CreateBeerStyleRequest, GetBeerStyleByIdRequest } from './types'; import { GetAllPostsByConnectedPostId, GetAllPostsRequest } from '../types'; +import { getBeerPostsByBeerStyleIdService } from '@/services/posts/beer-post'; export const getBeerStyle = async ( req: GetBeerStyleByIdRequest, @@ -36,7 +37,7 @@ export const getAllBeersByBeerStyle = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num, id } = req.query; - const beers = await getBeerPostsByBeerStyleId({ + const beers = await getBeerPostsByBeerStyleIdService({ pageNum: parseInt(page_num, 10), pageSize: parseInt(page_size, 10), styleId: id, diff --git a/src/pages/beers/[id]/edit.tsx b/src/pages/beers/[id]/edit.tsx index 0b69343..58b73d6 100644 --- a/src/pages/beers/[id]/edit.tsx +++ b/src/pages/beers/[id]/edit.tsx @@ -3,12 +3,12 @@ import Head from 'next/head'; import React from 'react'; import withPageAuthRequired from '@/util/withPageAuthRequired'; -import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; import EditBeerPostForm from '@/components/EditBeerPostForm'; import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import { BiBeer } from 'react-icons/bi'; import { z } from 'zod'; +import { getBeerPostById } from '@/services/posts/beer-post'; interface EditPageProps { beerPost: z.infer; @@ -37,7 +37,6 @@ const EditBeerPostPage: NextPage = ({ beerPost }) => { ibu: beerPost.ibu, description: beerPost.description, id: beerPost.id, - styleId: beerPost.style.id, }} /> @@ -50,7 +49,7 @@ export default EditBeerPostPage; export const getServerSideProps = withPageAuthRequired( async (context, session) => { const beerPostId = context.params?.id as string; - const beerPost = await getBeerPostById(beerPostId); + const beerPost = await getBeerPostById({ beerPostId }); const { id: userId } = session; if (!beerPost) { diff --git a/src/pages/beers/[id]/index.tsx b/src/pages/beers/[id]/index.tsx index 467f109..51b03b0 100644 --- a/src/pages/beers/[id]/index.tsx +++ b/src/pages/beers/[id]/index.tsx @@ -1,6 +1,5 @@ import { NextPage, GetServerSideProps } from 'next'; import Head from 'next/head'; -import getBeerPostById from '@/services/posts/beer-post/getBeerPostById'; import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; @@ -12,6 +11,7 @@ import useMediaQuery from '@/hooks/utilities/useMediaQuery'; import { Tab } from '@headlessui/react'; import dynamic from 'next/dynamic'; import { CldImage } from 'next-cloudinary'; +import { getBeerPostById } from '@/services/posts/beer-post'; const [BeerInfoHeader, BeerPostCommentsSection, BeerRecommendations] = [ dynamic(() => import('@/components/BeerById/BeerInfoHeader')), @@ -100,7 +100,9 @@ const BeerByIdPage: NextPage = ({ beerPost }) => { }; export const getServerSideProps: GetServerSideProps = async (context) => { - const beerPost = await getBeerPostById(context.params!.id! as string); + const beerPost = await getBeerPostById({ + beerPostId: context.params?.id as string, + }); if (!beerPost) { return { notFound: true }; diff --git a/src/requests/BeerPost/sendEditBeerPostRequest.ts b/src/requests/BeerPost/sendEditBeerPostRequest.ts index 57fb68a..de58f1d 100644 --- a/src/requests/BeerPost/sendEditBeerPostRequest.ts +++ b/src/requests/BeerPost/sendEditBeerPostRequest.ts @@ -20,12 +20,11 @@ const sendEditBeerPostRequest = async ({ ibu, id, name, - styleId, }: z.infer) => { const response = await fetch(`/api/beers/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ abv, description, ibu, name, styleId, id }), + body: JSON.stringify({ abv, description, ibu, name, id }), }); if (!response.ok) { diff --git a/src/services/comments/beer-comment/index.ts b/src/services/comments/beer-comment/index.ts index 6b82814..d4fd6f1 100644 --- a/src/services/comments/beer-comment/index.ts +++ b/src/services/comments/beer-comment/index.ts @@ -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 }; }; diff --git a/src/services/comments/beer-comment/types/index.ts b/src/services/comments/beer-comment/types/index.ts index 63236e3..f9d37b9 100644 --- a/src/services/comments/beer-comment/types/index.ts +++ b/src/services/comments/beer-comment/types/index.ts @@ -19,10 +19,11 @@ export type FindOrDeleteBeerPostCommentById = (args: { beerPostCommentId: string; }) => Promise; -export type GetBeerPostCommentCount = (args: { beerPostId: string }) => Promise; - export type GetAllBeerPostComments = (args: { beerPostId: string; pageNum: number; pageSize: number; -}) => Promise; +}) => Promise<{ + comments: BeerPostComment[]; + count: number; +}>; diff --git a/src/services/comments/beer-style-comment/index.ts b/src/services/comments/beer-style-comment/index.ts index 172ea3a..2bf8c10 100644 --- a/src/services/comments/beer-style-comment/index.ts +++ b/src/services/comments/beer-style-comment/index.ts @@ -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 = ({ diff --git a/src/services/comments/beer-style-comment/types/index.ts b/src/services/comments/beer-style-comment/types/index.ts index 18c1366..e3c3029 100644 --- a/src/services/comments/beer-style-comment/types/index.ts +++ b/src/services/comments/beer-style-comment/types/index.ts @@ -13,13 +13,14 @@ export type UpdateBeerStyleCommentById = (args: { beerStyleCommentId: string; }) => Promise; -export type GetBeerStyleCommentCount = (args: { beerStyleId: string }) => Promise; - export type GetAllBeerStyleComments = (args: { beerStyleId: string; pageNum: number; pageSize: number; -}) => Promise; +}) => Promise<{ + comments: BeerStyleComment[]; + count: number; +}>; export type CreateNewBeerStyleComment = (args: { body: z.infer; diff --git a/src/services/comments/brewery-comment/index.ts b/src/services/comments/brewery-comment/index.ts index aecd5e0..0d0283f 100644 --- a/src/services/comments/brewery-comment/index.ts +++ b/src/services/comments/brewery-comment/index.ts @@ -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 } }); -}; diff --git a/src/services/comments/brewery-comment/types/index.ts b/src/services/comments/brewery-comment/types/index.ts index 4e7d7bb..8d1dda0 100644 --- a/src/services/comments/brewery-comment/types/index.ts +++ b/src/services/comments/brewery-comment/types/index.ts @@ -20,10 +20,8 @@ export type GetAllBreweryComments = (args: { id: string; pageNum: number; pageSize: number; -}) => Promise; +}) => Promise<{ comments: BreweryComment[]; count: number }>; export type FindDeleteBreweryCommentById = (args: { breweryCommentId: string; }) => Promise; - -export type GetBreweryCommentCount = (args: { breweryPostId: string }) => Promise; diff --git a/src/services/posts/beer-post/createNewBeerPost.ts b/src/services/posts/beer-post/createNewBeerPost.ts deleted file mode 100644 index 87d19ba..0000000 --- a/src/services/posts/beer-post/createNewBeerPost.ts +++ /dev/null @@ -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): Promise< - z.infer -> => { - 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; diff --git a/src/services/posts/beer-post/deleteBeerPostById.ts b/src/services/posts/beer-post/deleteBeerPostById.ts deleted file mode 100644 index 634712a..0000000 --- a/src/services/posts/beer-post/deleteBeerPostById.ts +++ /dev/null @@ -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 | 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; diff --git a/src/services/posts/beer-post/editBeerPostById.ts b/src/services/posts/beer-post/editBeerPostById.ts deleted file mode 100644 index 7f4ae0a..0000000 --- a/src/services/posts/beer-post/editBeerPostById.ts +++ /dev/null @@ -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; -} - -const editBeerPostById = ({ - id, - data: { abv, ibu, name, description }, -}: EditBeerPostByIdArgs): Promise> => { - 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; diff --git a/src/services/posts/beer-post/getAllBeerPosts.ts b/src/services/posts/beer-post/getAllBeerPosts.ts deleted file mode 100644 index a19f344..0000000 --- a/src/services/posts/beer-post/getAllBeerPosts.ts +++ /dev/null @@ -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[]> => { - 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; diff --git a/src/services/posts/beer-post/getBeerPostById.ts b/src/services/posts/beer-post/getBeerPostById.ts deleted file mode 100644 index f7e5c53..0000000 --- a/src/services/posts/beer-post/getBeerPostById.ts +++ /dev/null @@ -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 | 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; diff --git a/src/services/posts/beer-post/getBeerPostsByBeerStyleId.ts b/src/services/posts/beer-post/getBeerPostsByBeerStyleId.ts deleted file mode 100644 index ccc089f..0000000 --- a/src/services/posts/beer-post/getBeerPostsByBeerStyleId.ts +++ /dev/null @@ -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[]> => { - 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; diff --git a/src/services/posts/beer-post/getBeerPostsByBreweryId.ts b/src/services/posts/beer-post/getBeerPostsByBreweryId.ts deleted file mode 100644 index 4c7946a..0000000 --- a/src/services/posts/beer-post/getBeerPostsByBreweryId.ts +++ /dev/null @@ -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[]> => { - 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; diff --git a/src/services/posts/beer-post/getBeerPostsByPostedById.ts b/src/services/posts/beer-post/getBeerPostsByPostedById.ts deleted file mode 100644 index 1d6589d..0000000 --- a/src/services/posts/beer-post/getBeerPostsByPostedById.ts +++ /dev/null @@ -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[]> => { - 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; diff --git a/src/services/posts/beer-post/getBeerRecommendations.ts b/src/services/posts/beer-post/getBeerRecommendations.ts deleted file mode 100644 index 654af53..0000000 --- a/src/services/posts/beer-post/getBeerRecommendations.ts +++ /dev/null @@ -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; - pageNum: number; - pageSize: number; -} - -const getBeerRecommendations = async ({ - beerPost, - pageNum, - pageSize, -}: GetBeerRecommendationsArgs): Promise<{ - beerRecommendations: z.infer[]; - count: number; -}> => { - const skip = (pageNum - 1) * pageSize; - const take = pageSize; - - const beerRecommendations: z.infer[] = - 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; diff --git a/src/services/posts/beer-post/index.ts b/src/services/posts/beer-post/index.ts new file mode 100644 index 0000000..679b9f3 --- /dev/null +++ b/src/services/posts/beer-post/index.ts @@ -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, + }); +}; diff --git a/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts b/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts index f9f7233..98adce8 100644 --- a/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts +++ b/src/services/posts/beer-post/schema/EditBeerPostValidationSchema.ts @@ -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; diff --git a/src/services/posts/beer-post/types/index.ts b/src/services/posts/beer-post/types/index.ts new file mode 100644 index 0000000..2e8fd0b --- /dev/null +++ b/src/services/posts/beer-post/types/index.ts @@ -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; + +export type CreateNewBeerPost = (args: z.infer) => Promise; + +export type EditBeerPostById = (args: { + beerPostId: string; + body: z.infer; +}) => Promise; + +export type FindOrDeleteBeerPostById = (args: { + beerPostId: string; +}) => Promise; + +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 }>; From 685c86e0c1518423a5ab6837d197d058ddd39345 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Mon, 11 Dec 2023 22:39:31 -0500 Subject: [PATCH 16/21] update docs --- src/services/comments/beer-comment/index.ts | 52 +++++++++++++++++++ .../comments/beer-style-comment/index.ts | 52 +++++++++++++++++++ .../comments/brewery-comment/index.ts | 52 +++++++++++++++++++ 3 files changed, 156 insertions(+) diff --git a/src/services/comments/beer-comment/index.ts b/src/services/comments/beer-comment/index.ts index d4fd6f1..b884f5a 100644 --- a/src/services/comments/beer-comment/index.ts +++ b/src/services/comments/beer-comment/index.ts @@ -7,6 +7,14 @@ import { GetAllBeerPostComments, } from './types'; +/** + * The select object for retrieving beer post comments. + * + * @example + * const beerPostComments = await DBClient.instance.beerComment.findMany({ + * select: beerPostCommentSelect, + * }); + */ const beerPostCommentSelect = { id: true, content: true, @@ -18,6 +26,17 @@ const beerPostCommentSelect = { }, } as const; +/** + * Creates a new comment for a beer post. + * + * @param params - The options for creating the comment. + * @param params.body - The body of the comment. + * @param params.body.content - The content of the comment. + * @param params.body.rating - The rating of the beer. + * @param params.beerPostId - The ID of the beer post. + * @param params.userId - The ID of the user creating the comment. + * @returns A promise that resolves to the created beer comment. + */ export const createBeerPostCommentService: CreateBeerPostComment = ({ body, beerPostId, @@ -35,6 +54,16 @@ export const createBeerPostCommentService: CreateBeerPostComment = ({ }); }; +/** + * Edits a comment for a beer post. + * + * @param params - The options for editing the comment. + * @param params.body - The body of the comment. + * @param params.body.content - The content of the comment. + * @param params.body.rating - The rating of the beer. + * @param params.beerPostCommentId - The ID of the beer post comment. + * @returns A promise that resolves to the updated beer comment. + */ export const editBeerPostCommentByIdService: EditBeerPostCommentById = ({ beerPostCommentId, body, @@ -47,6 +76,13 @@ export const editBeerPostCommentByIdService: EditBeerPostCommentById = ({ }); }; +/** + * Finds a comment for a beer post by ID. + * + * @param params - The options for finding the comment. + * @param params.beerPostCommentId - The ID of the beer post comment. + * @returns A promise that resolves to the found beer comment. + */ export const getBeerPostCommentByIdService: FindOrDeleteBeerPostCommentById = ({ beerPostCommentId, }) => { @@ -56,6 +92,13 @@ export const getBeerPostCommentByIdService: FindOrDeleteBeerPostCommentById = ({ }); }; +/** + * Deletes a comment for a beer post by ID. + * + * @param params - The options for deleting the comment. + * @param params.beerPostCommentId - The ID of the beer post comment. + * @returns A promise that resolves to the deleted beer comment. + */ export const deleteBeerCommentByIdService: FindOrDeleteBeerPostCommentById = ({ beerPostCommentId, }) => { @@ -65,6 +108,15 @@ export const deleteBeerCommentByIdService: FindOrDeleteBeerPostCommentById = ({ }); }; +/** + * Gets all comments for a beer post. + * + * @param params - The options for getting the comments. + * @param params.beerPostId - The ID of the beer post. + * @param params.pageNum - The page number of the comments. + * @param params.pageSize - The number of comments per page. + * @returns A promise that resolves to the found beer comments. + */ export const getAllBeerCommentsService: GetAllBeerPostComments = async ({ beerPostId, pageNum, diff --git a/src/services/comments/beer-style-comment/index.ts b/src/services/comments/beer-style-comment/index.ts index 2bf8c10..2e700c3 100644 --- a/src/services/comments/beer-style-comment/index.ts +++ b/src/services/comments/beer-style-comment/index.ts @@ -6,6 +6,14 @@ import { FindOrDeleteBeerStyleCommentById, } from './types'; +/** + * The select object for retrieving beer style comments. + * + * @example + * const beerStyleComments = await DBClient.instance.beerStyleComment.findMany({ + * select: beerStyleCommentSelect, + * }); + */ const beerStyleCommentSelect = { id: true, content: true, @@ -17,6 +25,17 @@ const beerStyleCommentSelect = { }, } as const; +/** + * Creates a new comment for a beer style. + * + * @param params - The options for creating the comment. + * @param params.body - The body of the comment. + * @param params.body.content - The content of the comment. + * @param params.body.rating - The rating of the beer style. + * @param params.beerStyleId - The ID of the beer style. + * @param params.userId - The ID of the user creating the comment. + * @returns A promise that resolves to the created beer comment. + */ export const createNewBeerStyleComment: CreateNewBeerStyleComment = ({ body, userId, @@ -34,6 +53,15 @@ export const createNewBeerStyleComment: CreateNewBeerStyleComment = ({ }); }; +/** + * Gets all comments for a beer style. + * + * @param params - The options for getting the comments. + * @param params.beerStyleId - The ID of the beer style. + * @param params.pageNum - The page number of the comments. + * @param params.pageSize - The page size of the comments. + * @returns A promise that resolves to the beer style comments. + */ export const getAllBeerStyleComments: GetAllBeerStyleComments = async ({ beerStyleId, pageNum, @@ -54,6 +82,16 @@ export const getAllBeerStyleComments: GetAllBeerStyleComments = async ({ return { comments, count }; }; +/** + * Updates a beer style comment by ID. + * + * @param params - The options for updating the comment. + * @param params.body - The body of the comment. + * @param params.body.content - The content of the comment. + * @param params.body.rating - The rating of the beer style. + * @param params.beerStyleCommentId - The ID of the beer style comment. + * @returns A promise that resolves to the updated beer comment. + */ export const updateBeerStyleCommentById: UpdateBeerStyleCommentById = ({ body, beerStyleCommentId, @@ -67,6 +105,13 @@ export const updateBeerStyleCommentById: UpdateBeerStyleCommentById = ({ }); }; +/** + * Finds a comment for a beer style by ID. + * + * @param params - The options for finding the comment. + * @param params.beerStyleCommentId - The ID of the beer style comment. + * @returns A promise that resolves to the found beer comment. + */ export const findBeerStyleCommentById: FindOrDeleteBeerStyleCommentById = ({ beerStyleCommentId, }) => { @@ -76,6 +121,13 @@ export const findBeerStyleCommentById: FindOrDeleteBeerStyleCommentById = ({ }); }; +/** + * Deletes a comment for a beer style by ID. + * + * @param params - The options for deleting the comment. + * @param params.beerStyleCommentId - The ID of the beer style comment. + * @returns A promise that resolves to the deleted beer comment. + */ export const deleteBeerStyleCommentById: FindOrDeleteBeerStyleCommentById = ({ beerStyleCommentId, }) => { diff --git a/src/services/comments/brewery-comment/index.ts b/src/services/comments/brewery-comment/index.ts index 0d0283f..19f994c 100644 --- a/src/services/comments/brewery-comment/index.ts +++ b/src/services/comments/brewery-comment/index.ts @@ -6,6 +6,14 @@ import { UpdateBreweryCommentById, } from './types'; +/** + * The select object for retrieving brewery comments. + * + * @example + * const breweryComments = await DBClient.instance.breweryComment.findMany({ + * select: breweryCommentSelect, + * }); + */ const breweryCommentSelect = { id: true, content: true, @@ -17,6 +25,16 @@ const breweryCommentSelect = { }, } as const; +/** + * Updates a brewery comment by ID. + * + * @param params - The options for updating the brewery comment. + * @param params.breweryCommentId - The ID of the brewery comment. + * @param params.body - The body of the comment. + * @param params.body.content - The content of the comment. + * @param params.body.rating - The rating of the brewery. + * @returns A promise that resolves to the updated brewery comment. + */ export const updateBreweryCommentById: UpdateBreweryCommentById = ({ breweryCommentId, body, @@ -30,6 +48,17 @@ export const updateBreweryCommentById: UpdateBreweryCommentById = ({ }); }; +/** + * Creates a new comment for a brewery. + * + * @param params - The options for creating the comment. + * @param params.body - The body of the comment. + * @param params.body.content - The content of the comment. + * @param params.body.rating - The rating of the brewery. + * @param params.breweryPostId - The ID of the brewery post. + * @param params.userId - The ID of the user creating the comment. + * @returns A promise that resolves to the created brewery comment. + */ export const createNewBreweryComment: CreateNewBreweryComment = ({ body, breweryPostId, @@ -47,6 +76,15 @@ export const createNewBreweryComment: CreateNewBreweryComment = ({ }); }; +/** + * Gets all comments for a brewery. + * + * @param params - The options for getting the comments. + * @param params.breweryPostId - The ID of the brewery post. + * @param params.pageNum - The page number of the comments. + * @param params.pageSize - The number of comments per page. + * @returns A promise that resolves to the retrieved brewery comments. + */ export const getAllBreweryComments: GetAllBreweryComments = async ({ id, pageNum, @@ -67,6 +105,13 @@ export const getAllBreweryComments: GetAllBreweryComments = async ({ return { comments, count }; }; +/** + * Finds a comment for a brewery post by ID. + * + * @param params - The options for finding the comment. + * @param params.breweryCommentId - The ID of the brewery post comment. + * @returns A promise that resolves to the found brewery comment. + */ export const getBreweryCommentById: FindDeleteBreweryCommentById = ({ breweryCommentId, }) => { @@ -76,6 +121,13 @@ export const getBreweryCommentById: FindDeleteBreweryCommentById = ({ }); }; +/** + * Deletes a comment for a brewery post by ID. + * + * @param params - The options for deleting the comment. + * @param params.breweryCommentId - The ID of the brewery post comment. + * @returns A promise that resolves to the deleted brewery comment. + */ export const deleteBreweryCommentByIdService: FindDeleteBreweryCommentById = ({ breweryCommentId, }) => { From fdbadb63dc4374d261d482068110b258b067f0e6 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Wed, 13 Dec 2023 09:49:31 -0500 Subject: [PATCH 17/21] refactor image services --- package.json | 6 +- src/config/cloudinary/helpers/deleteImage.ts | 11 +++ src/config/cloudinary/index.ts | 6 +- src/controllers/images/beer-images/index.ts | 27 ++++-- .../images/brewery-images/index.ts | 8 +- src/controllers/images/types/index.ts | 4 + .../likes/beer-posts-likes/index.ts | 4 +- src/controllers/posts/beer-styles/index.ts | 2 +- .../seed/clear/clearCloudinaryStorage.ts | 7 ++ src/prisma/seed/clear/index.ts | 17 +++- src/prisma/seed/index.ts | 2 + .../images/beer-image/addBeerImageToDB.ts | 40 --------- src/services/images/beer-image/index.ts | 87 +++++++++++++++++++ src/services/images/beer-image/types/index.ts | 19 ++++ .../brewery-image/addBreweryImageToDB.ts | 39 --------- src/services/images/brewery-image/index.ts | 86 ++++++++++++++++++ .../images/brewery-image/types/index.ts | 19 ++++ 17 files changed, 285 insertions(+), 99 deletions(-) create mode 100644 src/config/cloudinary/helpers/deleteImage.ts create mode 100644 src/prisma/seed/clear/clearCloudinaryStorage.ts delete mode 100644 src/services/images/beer-image/addBeerImageToDB.ts create mode 100644 src/services/images/beer-image/index.ts create mode 100644 src/services/images/beer-image/types/index.ts delete mode 100644 src/services/images/brewery-image/addBreweryImageToDB.ts create mode 100644 src/services/images/brewery-image/index.ts create mode 100644 src/services/images/brewery-image/types/index.ts diff --git a/package.json b/package.json index b4c8e9c..15272cc 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "start": "next start", "lint": "next lint", "clear-db": "npx ts-node ./src/prisma/seed/clear/index.ts", - "format": "npx prettier . --write", + "format": "npx prettier . --write; npx prisma format;", "format-watch": "npx onchange \"**/*\" -- prettier --write --ignore-unknown {{changed}}", "seed": "npx --max-old-space-size=4096 ts-node ./src/prisma/seed/index.ts" }, @@ -22,7 +22,7 @@ "@mapbox/search-js-core": "^1.0.0-beta.17", "@mapbox/search-js-react": "^1.0.0-beta.17", "@next/bundle-analyzer": "^14.0.3", - "@prisma/client": "^5.6.0", + "@prisma/client": "^5.7.0", "@react-email/components": "^0.0.11", "@react-email/render": "^0.0.9", "@react-email/tailwind": "^0.0.12", @@ -85,7 +85,7 @@ "prettier-plugin-jsdoc": "^1.0.2", "prettier-plugin-tailwindcss": "^0.5.7", "prettier": "^3.0.0", - "prisma": "^5.6.0", + "prisma": "^5.7.0", "tailwindcss-animate": "^1.0.6", "tailwindcss": "^3.3.3", "ts-node": "^10.9.1", diff --git a/src/config/cloudinary/helpers/deleteImage.ts b/src/config/cloudinary/helpers/deleteImage.ts new file mode 100644 index 0000000..ba54f22 --- /dev/null +++ b/src/config/cloudinary/helpers/deleteImage.ts @@ -0,0 +1,11 @@ +import { cloudinary } from '..'; + +/** + * Deletes an image from Cloudinary. + * + * @param path - The cloudinary path of the image to be deleted. + * @returns A promise that resolves when the image is successfully deleted. + */ +const deleteImage = (path: string) => cloudinary.uploader.destroy(path); + +export default deleteImage; diff --git a/src/config/cloudinary/index.ts b/src/config/cloudinary/index.ts index 625b176..e624940 100644 --- a/src/config/cloudinary/index.ts +++ b/src/config/cloudinary/index.ts @@ -4,6 +4,7 @@ import { NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME, CLOUDINARY_KEY, CLOUDINARY_SECRET, + NODE_ENV, } from '../env'; import CloudinaryStorage from './CloudinaryStorage'; @@ -14,6 +15,9 @@ cloudinary.config({ }); /** Cloudinary storage instance. */ -const storage = new CloudinaryStorage({ cloudinary, params: { folder: 'biergarten' } }); +const storage = new CloudinaryStorage({ + cloudinary, + params: { folder: NODE_ENV === 'production' ? 'biergarten' : 'biergarten-dev' }, +}); export { cloudinary, storage }; diff --git a/src/controllers/images/beer-images/index.ts b/src/controllers/images/beer-images/index.ts index 92ce733..208d249 100644 --- a/src/controllers/images/beer-images/index.ts +++ b/src/controllers/images/beer-images/index.ts @@ -1,9 +1,12 @@ import ServerError from '@/config/util/ServerError'; -import addBeerImageToDB from '@/services/images/beer-image/addBeerImageToDB'; +import { + addBeerImagesToDB, + deleteBeerImageFromDBAndStorage, +} from '@/services/images/beer-image'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import { UploadImagesRequest } from '../types'; +import { DeleteImageRequest, UploadImagesRequest } from '../types'; // eslint-disable-next-line import/prefer-default-export export const processBeerImageData = async ( @@ -16,11 +19,10 @@ export const processBeerImageData = async ( throw new ServerError('No images uploaded', 400); } - const beerImages = await addBeerImageToDB({ - alt: body.alt, - caption: body.caption, + const beerImages = await addBeerImagesToDB({ beerPostId: req.query.id, userId: user!.id, + body, files, }); @@ -32,3 +34,18 @@ export const processBeerImageData = async ( statusCode: 200, }); }; + +export const deleteBeerImageData = async ( + req: DeleteImageRequest, + res: NextApiResponse>, +) => { + const { id } = req.query; + + await deleteBeerImageFromDBAndStorage({ beerImageId: id }); + + res.status(200).json({ + success: true, + message: `Successfully deleted image with id ${id}`, + statusCode: 200, + }); +}; diff --git a/src/controllers/images/brewery-images/index.ts b/src/controllers/images/brewery-images/index.ts index 3c7c910..c7b5bee 100644 --- a/src/controllers/images/brewery-images/index.ts +++ b/src/controllers/images/brewery-images/index.ts @@ -1,8 +1,9 @@ import ServerError from '@/config/util/ServerError'; -import addBreweryImageToDB from '@/services/images/brewery-image/addBreweryImageToDB'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; +import { addBreweryImagesToDB } from '@/services/images/brewery-image'; import { UploadImagesRequest } from '../types'; // eslint-disable-next-line import/prefer-default-export @@ -16,11 +17,10 @@ export const processBreweryImageData = async ( throw new ServerError('No images uploaded', 400); } - const breweryImages = await addBreweryImageToDB({ - alt: body.alt, - caption: body.caption, + const breweryImages = await addBreweryImagesToDB({ breweryPostId: req.query.id, userId: user!.id, + body, files, }); diff --git a/src/controllers/images/types/index.ts b/src/controllers/images/types/index.ts index f91a095..8d4b308 100644 --- a/src/controllers/images/types/index.ts +++ b/src/controllers/images/types/index.ts @@ -7,3 +7,7 @@ export interface UploadImagesRequest extends UserExtendedNextApiRequest { query: { id: string }; body: z.infer; } + +export interface DeleteImageRequest extends UserExtendedNextApiRequest { + query: { id: string }; +} diff --git a/src/controllers/likes/beer-posts-likes/index.ts b/src/controllers/likes/beer-posts-likes/index.ts index f8eb405..c37e953 100644 --- a/src/controllers/likes/beer-posts-likes/index.ts +++ b/src/controllers/likes/beer-posts-likes/index.ts @@ -4,12 +4,12 @@ import ServerError from '@/config/util/ServerError'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; -import { LikeRequest } from '../types'; import createBeerPostLike from '@/services/likes/beer-post-like/createBeerPostLike'; import findBeerPostLikeById from '@/services/likes/beer-post-like/findBeerPostLikeById'; import getBeerPostLikeCountByBeerPostId from '@/services/likes/beer-post-like/getBeerPostLikeCount'; import removeBeerPostLikeById from '@/services/likes/beer-post-like/removeBeerPostLikeById'; import { getBeerPostById } from '@/services/posts/beer-post'; +import { LikeRequest } from '../types'; export const sendBeerPostLikeRequest = async ( req: LikeRequest, @@ -20,7 +20,7 @@ export const sendBeerPostLikeRequest = async ( const beer = await getBeerPostById({ beerPostId: id }); if (!beer) { - throw new ServerError('Could not find a beer post with that id', 404); + throw new ServerError('Could not find a beer post with that id.', 404); } const alreadyLiked = await findBeerPostLikeById({ diff --git a/src/controllers/posts/beer-styles/index.ts b/src/controllers/posts/beer-styles/index.ts index 75007e7..657b3dc 100644 --- a/src/controllers/posts/beer-styles/index.ts +++ b/src/controllers/posts/beer-styles/index.ts @@ -10,9 +10,9 @@ import getAllBeerStyles from '@/services/posts/beer-style-post/getAllBeerStyles' import ServerError from '@/config/util/ServerError'; +import { getBeerPostsByBeerStyleIdService } from '@/services/posts/beer-post'; import { CreateBeerStyleRequest, GetBeerStyleByIdRequest } from './types'; import { GetAllPostsByConnectedPostId, GetAllPostsRequest } from '../types'; -import { getBeerPostsByBeerStyleIdService } from '@/services/posts/beer-post'; export const getBeerStyle = async ( req: GetBeerStyleByIdRequest, diff --git a/src/prisma/seed/clear/clearCloudinaryStorage.ts b/src/prisma/seed/clear/clearCloudinaryStorage.ts new file mode 100644 index 0000000..e280644 --- /dev/null +++ b/src/prisma/seed/clear/clearCloudinaryStorage.ts @@ -0,0 +1,7 @@ +import { cloudinary } from '../../../config/cloudinary'; + +const clearCloudinaryStorage = async () => { + await cloudinary.api.delete_resources_by_prefix('biergarten-dev/'); +}; + +export default clearCloudinaryStorage; diff --git a/src/prisma/seed/clear/index.ts b/src/prisma/seed/clear/index.ts index 5410ec0..e9b0d50 100644 --- a/src/prisma/seed/clear/index.ts +++ b/src/prisma/seed/clear/index.ts @@ -1,7 +1,16 @@ import logger from '../../../config/pino/logger'; +import clearCloudinaryStorage from './clearCloudinaryStorage'; import clearDatabase from './clearDatabase'; -clearDatabase().then(() => { - logger.info('Database cleared'); - process.exit(0); -}); +(async () => { + await clearDatabase(); + await clearCloudinaryStorage(); +})() + .then(() => { + logger.info('Successfully cleared database and cloudinary storage.'); + process.exit(0); + }) + .catch((err) => { + logger.error(err); + process.exit(1); + }); diff --git a/src/prisma/seed/index.ts b/src/prisma/seed/index.ts index 059d2c6..3eeccfd 100644 --- a/src/prisma/seed/index.ts +++ b/src/prisma/seed/index.ts @@ -20,6 +20,7 @@ import createNewBeerStyleComments from './create/createNewBeerStyleComments'; import createNewBeerStyleLikes from './create/createNewBeerStyleLikes'; import createNewUserAvatars from './create/createNewUserAvatars'; import createNewUserFollows from './create/createNewUserFollows'; +import clearCloudinaryStorage from './clear/clearCloudinaryStorage'; (async () => { try { @@ -27,6 +28,7 @@ import createNewUserFollows from './create/createNewUserFollows'; logger.info('Clearing database.'); await clearDatabase(); + await clearCloudinaryStorage(); logger.info('Database cleared successfully, preparing to seed.'); await createAdminUser(); diff --git a/src/services/images/beer-image/addBeerImageToDB.ts b/src/services/images/beer-image/addBeerImageToDB.ts deleted file mode 100644 index e4e472a..0000000 --- a/src/services/images/beer-image/addBeerImageToDB.ts +++ /dev/null @@ -1,40 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { BeerImage } from '@prisma/client'; -import { z } from 'zod'; -import ImageMetadataValidationSchema from '../../schema/ImageSchema/ImageMetadataValidationSchema'; - -interface ProcessImageDataArgs { - files: Express.Multer.File[]; - alt: z.infer['alt']; - caption: z.infer['caption']; - beerPostId: string; - userId: string; -} - -const addBeerImageToDB = ({ - alt, - caption, - files, - beerPostId, - userId, -}: ProcessImageDataArgs) => { - const beerImagePromises: Promise[] = []; - - files.forEach((file) => { - beerImagePromises.push( - DBClient.instance.beerImage.create({ - data: { - alt, - caption, - postedBy: { connect: { id: userId } }, - beerPost: { connect: { id: beerPostId } }, - path: file.path, - }, - }), - ); - }); - - return Promise.all(beerImagePromises); -}; - -export default addBeerImageToDB; diff --git a/src/services/images/beer-image/index.ts b/src/services/images/beer-image/index.ts new file mode 100644 index 0000000..16e5a63 --- /dev/null +++ b/src/services/images/beer-image/index.ts @@ -0,0 +1,87 @@ +import DBClient from '@/prisma/DBClient'; +import { BeerImage } from '@prisma/client'; +import { cloudinary } from '@/config/cloudinary'; +import { + AddBeerImagesToDB, + DeleteBeerImageFromDBAndStorage, + UpdateBeerImageMetadata, +} from './types'; + +/** + * Adds beer images to the database. + * + * @param options - The options for adding beer images. + * @param options.body - The body of the request. + * @param options.body.alt - The alt text for the beer image. + * @param options.body.caption - The caption for the beer image. + * @param options.files - The array of files to be uploaded as beer images. + * @param options.beerPostId - The ID of the beer post. + * @param options.userId - The ID of the user. + * @returns A promise that resolves to an array of created beer images. + */ +export const addBeerImagesToDB: AddBeerImagesToDB = ({ + body, + files, + beerPostId, + userId, +}) => { + const beerImagePromises: Promise[] = []; + + const { alt, caption } = body; + files.forEach((file) => { + beerImagePromises.push( + DBClient.instance.beerImage.create({ + data: { + alt, + caption, + postedBy: { connect: { id: userId } }, + beerPost: { connect: { id: beerPostId } }, + path: file.path, + }, + }), + ); + }); + + return Promise.all(beerImagePromises); +}; + +/** + * Deletes a beer image from the database and storage. + * + * @param options - The options for deleting a beer image. + * @param options.beerImageId - The ID of the beer image. + */ +export const deleteBeerImageFromDBAndStorage: DeleteBeerImageFromDBAndStorage = async ({ + beerImageId, +}) => { + const deleted = await DBClient.instance.beerImage.delete({ + where: { id: beerImageId }, + select: { path: true, id: true }, + }); + const { path } = deleted; + await cloudinary.uploader.destroy(path); +}; + +/** + * Updates the beer image metadata in the database. + * + * @param options - The options for updating the beer image metadata. + * @param options.beerImageId - The ID of the beer image. + * @param options.body - The body of the request containing the alt and caption. + * @param options.body.alt - The alt text for the beer image. + * @param options.body.caption - The caption for the beer image. + * @returns A promise that resolves to the updated beer image. + */ + +export const updateBeerImageMetadata: UpdateBeerImageMetadata = async ({ + beerImageId, + body, +}) => { + const { alt, caption } = body; + const updated = await DBClient.instance.beerImage.update({ + where: { id: beerImageId }, + data: { alt, caption }, + }); + + return updated; +}; diff --git a/src/services/images/beer-image/types/index.ts b/src/services/images/beer-image/types/index.ts new file mode 100644 index 0000000..e392c47 --- /dev/null +++ b/src/services/images/beer-image/types/index.ts @@ -0,0 +1,19 @@ +import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; +import { BeerImage } from '@prisma/client'; +import { z } from 'zod'; + +export type AddBeerImagesToDB = (args: { + files: Express.Multer.File[]; + body: z.infer; + beerPostId: string; + userId: string; +}) => Promise; + +export type DeleteBeerImageFromDBAndStorage = (args: { + beerImageId: string; +}) => Promise; + +export type UpdateBeerImageMetadata = (args: { + beerImageId: string; + body: z.infer; +}) => Promise; diff --git a/src/services/images/brewery-image/addBreweryImageToDB.ts b/src/services/images/brewery-image/addBreweryImageToDB.ts deleted file mode 100644 index 99992f8..0000000 --- a/src/services/images/brewery-image/addBreweryImageToDB.ts +++ /dev/null @@ -1,39 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { BreweryImage } from '@prisma/client'; -import { z } from 'zod'; -import ImageMetadataValidationSchema from '../../schema/ImageSchema/ImageMetadataValidationSchema'; - -interface ProcessImageDataArgs { - files: Express.Multer.File[]; - alt: z.infer['alt']; - caption: z.infer['caption']; - breweryPostId: string; - userId: string; -} - -const addBreweryImageToDB = ({ - alt, - caption, - files, - breweryPostId, - userId, -}: ProcessImageDataArgs) => { - const breweryImagePromises: Promise[] = []; - files.forEach((file) => { - breweryImagePromises.push( - DBClient.instance.breweryImage.create({ - data: { - alt, - caption, - postedBy: { connect: { id: userId } }, - breweryPost: { connect: { id: breweryPostId } }, - path: file.path, - }, - }), - ); - }); - - return Promise.all(breweryImagePromises); -}; - -export default addBreweryImageToDB; diff --git a/src/services/images/brewery-image/index.ts b/src/services/images/brewery-image/index.ts new file mode 100644 index 0000000..22d8d28 --- /dev/null +++ b/src/services/images/brewery-image/index.ts @@ -0,0 +1,86 @@ +import DBClient from '@/prisma/DBClient'; +import { BreweryImage } from '@prisma/client'; +import { cloudinary } from '@/config/cloudinary'; +import { + AddBreweryImagesToDB, + DeleteBreweryImageFromDBAndStorage, + UpdateBreweryImageMetadata, +} from './types'; + +/** + * Adds brewery images to the database. + * + * @param options - The options for adding brewery images. + * @param options.body - The body of the request containing the alt and caption. + * @param options.body.alt - The alt text for the brewery image. + * @param options.body.caption - The caption for the brewery image. + * @param options.files - The array of files to be uploaded as brewery images. + * @param options.breweryPostId - The ID of the brewery post. + * @param options.userId - The ID of the user adding the images. + * @returns A promise that resolves to an array of created brewery images. + */ + +export const addBreweryImagesToDB: AddBreweryImagesToDB = ({ + body, + files, + breweryPostId, + userId, +}) => { + const breweryImagePromises: Promise[] = []; + + const { alt, caption } = body; + files.forEach((file) => { + breweryImagePromises.push( + DBClient.instance.breweryImage.create({ + data: { + alt, + caption, + postedBy: { connect: { id: userId } }, + breweryPost: { connect: { id: breweryPostId } }, + path: file.path, + }, + }), + ); + }); + + return Promise.all(breweryImagePromises); +}; + +/** + * Deletes a brewery image from the database and storage. + * + * @param options - The options for deleting a brewery image. + * @param options.breweryImageId - The ID of the brewery image. + */ +export const deleteBreweryImageFromDBAndStorage: DeleteBreweryImageFromDBAndStorage = + async ({ breweryImageId }) => { + const deleted = await DBClient.instance.breweryImage.delete({ + where: { id: breweryImageId }, + select: { path: true, id: true }, + }); + const { path } = deleted; + await cloudinary.uploader.destroy(path); + }; + +/** + * Updates the brewery image metadata in the database. + * + * @param options - The options for updating the brewery image metadata. + * @param options.breweryImageId - The ID of the brewery image. + * @param options.body - The body of the request containing the alt and caption. + * @param options.body.alt - The alt text for the brewery image. + * @param options.body.caption - The caption for the brewery image. + * @returns A promise that resolves to the updated brewery image. + */ +export const updateBreweryImageMetadata: UpdateBreweryImageMetadata = async ({ + breweryImageId, + body, +}) => { + const { alt, caption } = body; + const updated = await DBClient.instance.breweryImage.update({ + where: { id: breweryImageId }, + data: { alt, caption }, + }); + + return updated; +}; diff --git a/src/services/images/brewery-image/types/index.ts b/src/services/images/brewery-image/types/index.ts new file mode 100644 index 0000000..6da8221 --- /dev/null +++ b/src/services/images/brewery-image/types/index.ts @@ -0,0 +1,19 @@ +import ImageMetadataValidationSchema from '@/services/schema/ImageSchema/ImageMetadataValidationSchema'; +import { BreweryImage } from '@prisma/client'; +import { z } from 'zod'; + +export type AddBreweryImagesToDB = (args: { + files: Express.Multer.File[]; + body: z.infer; + breweryPostId: string; + userId: string; +}) => Promise; + +export type DeleteBreweryImageFromDBAndStorage = (args: { + breweryImageId: string; +}) => Promise; + +export type UpdateBreweryImageMetadata = (args: { + breweryImageId: string; + body: z.infer; +}) => Promise; From 0de4697e775160f4396acde2a1df74d37b50eb87 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Wed, 13 Dec 2023 12:38:00 -0500 Subject: [PATCH 18/21] Refactor: update like services --- package-lock.json | 133 +++++++++++++----- src/controllers/images/beer-images/index.ts | 8 +- .../images/brewery-images/index.ts | 4 +- .../likes/beer-posts-likes/index.ts | 48 ++++--- .../likes/beer-style-likes/index.ts | 24 ++-- .../likes/brewery-post-likes/index.ts | 60 ++++---- src/services/images/beer-image/index.ts | 6 +- src/services/images/brewery-image/index.ts | 23 +-- .../beer-post-like/createBeerPostLike.ts | 15 -- .../beer-post-like/findBeerPostLikeById.ts | 14 -- .../beer-post-like/getBeerPostLikeCount.ts | 6 - src/services/likes/beer-post-like/index.ts | 60 ++++++++ .../beer-post-like/removeBeerPostLikeById.ts | 10 -- .../schema/BeerPostLikeSchema.ts | 11 ++ .../likes/beer-post-like/types/index.ts | 23 +++ .../beer-style-like/createBeerStyleLike.ts | 18 --- .../beer-style-like/findBeerStyleLikeById.ts | 16 --- .../beer-style-like/getBeerStyleLikeCount.ts | 10 -- src/services/likes/beer-style-like/index.ts | 63 +++++++++ .../removeBeerStyleLikeById.ts | 12 -- .../schema/BeerStyleLikeSchema.ts | 11 ++ .../likes/beer-style-like/types/index.ts | 23 +++ src/services/likes/brewery-post-like/index.ts | 63 +++++++++ .../schema/BreweryPostLikeSchema.ts | 11 ++ .../likes/brewery-post-like/types/index.ts | 24 ++++ 25 files changed, 484 insertions(+), 212 deletions(-) delete mode 100644 src/services/likes/beer-post-like/createBeerPostLike.ts delete mode 100644 src/services/likes/beer-post-like/findBeerPostLikeById.ts delete mode 100644 src/services/likes/beer-post-like/getBeerPostLikeCount.ts create mode 100644 src/services/likes/beer-post-like/index.ts delete mode 100644 src/services/likes/beer-post-like/removeBeerPostLikeById.ts create mode 100644 src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts create mode 100644 src/services/likes/beer-post-like/types/index.ts delete mode 100644 src/services/likes/beer-style-like/createBeerStyleLike.ts delete mode 100644 src/services/likes/beer-style-like/findBeerStyleLikeById.ts delete mode 100644 src/services/likes/beer-style-like/getBeerStyleLikeCount.ts create mode 100644 src/services/likes/beer-style-like/index.ts delete mode 100644 src/services/likes/beer-style-like/removeBeerStyleLikeById.ts create mode 100644 src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts create mode 100644 src/services/likes/beer-style-like/types/index.ts create mode 100644 src/services/likes/brewery-post-like/index.ts create mode 100644 src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts create mode 100644 src/services/likes/brewery-post-like/types/index.ts diff --git a/package-lock.json b/package-lock.json index d0db80d..754092f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@mapbox/search-js-core": "^1.0.0-beta.17", "@mapbox/search-js-react": "^1.0.0-beta.17", "@next/bundle-analyzer": "^14.0.3", - "@prisma/client": "^5.6.0", + "@prisma/client": "^5.7.0", "@react-email/components": "^0.0.11", "@react-email/render": "^0.0.9", "@react-email/tailwind": "^0.0.12", @@ -79,7 +79,7 @@ "prettier": "^3.0.0", "prettier-plugin-jsdoc": "^1.0.2", "prettier-plugin-tailwindcss": "^0.5.7", - "prisma": "^5.6.0", + "prisma": "^5.7.0", "tailwindcss": "^3.3.3", "tailwindcss-animate": "^1.0.6", "ts-node": "^10.9.1", @@ -1633,13 +1633,10 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==" }, "node_modules/@prisma/client": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.6.0.tgz", - "integrity": "sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.7.0.tgz", + "integrity": "sha512-cZmglCrfNbYpzUtz7HscVHl38e9CrUs31nrVoGUK1nIPXGgt8hT4jj2s657UXcNdQ/jBUxDgGmHyu2Nyrq1txg==", "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" - }, "engines": { "node": ">=16.13" }, @@ -1652,17 +1649,50 @@ } } }, + "node_modules/@prisma/debug": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.7.0.tgz", + "integrity": "sha512-tZ+MOjWlVvz1kOEhNYMa4QUGURY+kgOUBqLHYIV8jmCsMuvA1tWcn7qtIMLzYWCbDcQT4ZS8xDgK0R2gl6/0wA==", + "devOptional": true + }, "node_modules/@prisma/engines": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.6.0.tgz", - "integrity": "sha512-Mt2q+GNJpU2vFn6kif24oRSBQv1KOkYaterQsi0k2/lA+dLvhRX6Lm26gon6PYHwUM8/h8KRgXIUMU0PCLB6bw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.7.0.tgz", + "integrity": "sha512-TkOMgMm60n5YgEKPn9erIvFX2/QuWnl3GBo6yTRyZKk5O5KQertXiNnrYgSLy0SpsKmhovEPQb+D4l0SzyE7XA==", "devOptional": true, - "hasInstallScript": true + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.7.0", + "@prisma/engines-version": "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9", + "@prisma/fetch-engine": "5.7.0", + "@prisma/get-platform": "5.7.0" + } }, "node_modules/@prisma/engines-version": { - "version": "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee.tgz", - "integrity": "sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw==" + "version": "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9.tgz", + "integrity": "sha512-V6tgRVi62jRwTm0Hglky3Scwjr/AKFBFtS+MdbsBr7UOuiu1TKLPc6xfPiyEN1+bYqjEtjxwGsHgahcJsd1rNg==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.7.0.tgz", + "integrity": "sha512-zIn/qmO+N/3FYe7/L9o+yZseIU8ivh4NdPKSkQRIHfg2QVTVMnbhGoTcecbxfVubeTp+DjcbjS0H9fCuM4W04w==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.7.0", + "@prisma/engines-version": "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9", + "@prisma/get-platform": "5.7.0" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.7.0.tgz", + "integrity": "sha512-ZeV/Op4bZsWXuw5Tg05WwRI8BlKiRFhsixPcAM+5BKYSiUZiMKIi713tfT3drBq8+T0E1arNZgYSA9QYcglWNA==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.7.0" + } }, "node_modules/@radix-ui/react-compose-refs": { "version": "1.0.1", @@ -8532,13 +8562,13 @@ } }, "node_modules/prisma": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.6.0.tgz", - "integrity": "sha512-EEaccku4ZGshdr2cthYHhf7iyvCcXqwJDvnoQRAJg5ge2Tzpv0e2BaMCp+CbbDUwoVTzwgOap9Zp+d4jFa2O9A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.7.0.tgz", + "integrity": "sha512-0rcfXO2ErmGAtxnuTNHQT9ztL0zZheQjOI/VNJzdq87C3TlGPQtMqtM+KCwU6XtmkoEr7vbCQqA7HF9IY0ST+Q==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "5.6.0" + "@prisma/engines": "5.7.0" }, "bin": { "prisma": "build/index.js" @@ -11853,23 +11883,54 @@ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==" }, "@prisma/client": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.6.0.tgz", - "integrity": "sha512-mUDefQFa1wWqk4+JhKPYq8BdVoFk9NFMBXUI8jAkBfQTtgx8WPx02U2HB/XbAz3GSUJpeJOKJQtNvaAIDs6sug==", - "requires": { - "@prisma/engines-version": "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee" - } + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.7.0.tgz", + "integrity": "sha512-cZmglCrfNbYpzUtz7HscVHl38e9CrUs31nrVoGUK1nIPXGgt8hT4jj2s657UXcNdQ/jBUxDgGmHyu2Nyrq1txg==", + "requires": {} }, - "@prisma/engines": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.6.0.tgz", - "integrity": "sha512-Mt2q+GNJpU2vFn6kif24oRSBQv1KOkYaterQsi0k2/lA+dLvhRX6Lm26gon6PYHwUM8/h8KRgXIUMU0PCLB6bw==", + "@prisma/debug": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.7.0.tgz", + "integrity": "sha512-tZ+MOjWlVvz1kOEhNYMa4QUGURY+kgOUBqLHYIV8jmCsMuvA1tWcn7qtIMLzYWCbDcQT4ZS8xDgK0R2gl6/0wA==", "devOptional": true }, + "@prisma/engines": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.7.0.tgz", + "integrity": "sha512-TkOMgMm60n5YgEKPn9erIvFX2/QuWnl3GBo6yTRyZKk5O5KQertXiNnrYgSLy0SpsKmhovEPQb+D4l0SzyE7XA==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.7.0", + "@prisma/engines-version": "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9", + "@prisma/fetch-engine": "5.7.0", + "@prisma/get-platform": "5.7.0" + } + }, "@prisma/engines-version": { - "version": "5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.6.0-32.e95e739751f42d8ca026f6b910f5a2dc5adeaeee.tgz", - "integrity": "sha512-UoFgbV1awGL/3wXuUK3GDaX2SolqczeeJ5b4FVec9tzeGbSWJboPSbT0psSrmgYAKiKnkOPFSLlH6+b+IyOwAw==" + "version": "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9.tgz", + "integrity": "sha512-V6tgRVi62jRwTm0Hglky3Scwjr/AKFBFtS+MdbsBr7UOuiu1TKLPc6xfPiyEN1+bYqjEtjxwGsHgahcJsd1rNg==", + "devOptional": true + }, + "@prisma/fetch-engine": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.7.0.tgz", + "integrity": "sha512-zIn/qmO+N/3FYe7/L9o+yZseIU8ivh4NdPKSkQRIHfg2QVTVMnbhGoTcecbxfVubeTp+DjcbjS0H9fCuM4W04w==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.7.0", + "@prisma/engines-version": "5.7.0-41.79fb5193cf0a8fdbef536e4b4a159cad677ab1b9", + "@prisma/get-platform": "5.7.0" + } + }, + "@prisma/get-platform": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.7.0.tgz", + "integrity": "sha512-ZeV/Op4bZsWXuw5Tg05WwRI8BlKiRFhsixPcAM+5BKYSiUZiMKIi713tfT3drBq8+T0E1arNZgYSA9QYcglWNA==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.7.0" + } }, "@radix-ui/react-compose-refs": { "version": "1.0.1", @@ -16765,12 +16826,12 @@ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" }, "prisma": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.6.0.tgz", - "integrity": "sha512-EEaccku4ZGshdr2cthYHhf7iyvCcXqwJDvnoQRAJg5ge2Tzpv0e2BaMCp+CbbDUwoVTzwgOap9Zp+d4jFa2O9A==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.7.0.tgz", + "integrity": "sha512-0rcfXO2ErmGAtxnuTNHQT9ztL0zZheQjOI/VNJzdq87C3TlGPQtMqtM+KCwU6XtmkoEr7vbCQqA7HF9IY0ST+Q==", "devOptional": true, "requires": { - "@prisma/engines": "5.6.0" + "@prisma/engines": "5.7.0" } }, "process": { diff --git a/src/controllers/images/beer-images/index.ts b/src/controllers/images/beer-images/index.ts index 208d249..0a1d5c1 100644 --- a/src/controllers/images/beer-images/index.ts +++ b/src/controllers/images/beer-images/index.ts @@ -1,7 +1,7 @@ import ServerError from '@/config/util/ServerError'; import { - addBeerImagesToDB, - deleteBeerImageFromDBAndStorage, + addBeerImagesService, + deleteBeerImageService, } from '@/services/images/beer-image'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; @@ -19,7 +19,7 @@ export const processBeerImageData = async ( throw new ServerError('No images uploaded', 400); } - const beerImages = await addBeerImagesToDB({ + const beerImages = await addBeerImagesService({ beerPostId: req.query.id, userId: user!.id, body, @@ -41,7 +41,7 @@ export const deleteBeerImageData = async ( ) => { const { id } = req.query; - await deleteBeerImageFromDBAndStorage({ beerImageId: id }); + await deleteBeerImageService({ beerImageId: id }); res.status(200).json({ success: true, diff --git a/src/controllers/images/brewery-images/index.ts b/src/controllers/images/brewery-images/index.ts index c7b5bee..a7a4a3c 100644 --- a/src/controllers/images/brewery-images/index.ts +++ b/src/controllers/images/brewery-images/index.ts @@ -3,7 +3,7 @@ import ServerError from '@/config/util/ServerError'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import { addBreweryImagesToDB } from '@/services/images/brewery-image'; +import { addBreweryImagesService } from '@/services/images/brewery-image'; import { UploadImagesRequest } from '../types'; // eslint-disable-next-line import/prefer-default-export @@ -17,7 +17,7 @@ export const processBreweryImageData = async ( throw new ServerError('No images uploaded', 400); } - const breweryImages = await addBreweryImagesToDB({ + const breweryImages = await addBreweryImagesService({ breweryPostId: req.query.id, userId: user!.id, body, diff --git a/src/controllers/likes/beer-posts-likes/index.ts b/src/controllers/likes/beer-posts-likes/index.ts index c37e953..0211164 100644 --- a/src/controllers/likes/beer-posts-likes/index.ts +++ b/src/controllers/likes/beer-posts-likes/index.ts @@ -4,11 +4,14 @@ import ServerError from '@/config/util/ServerError'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; -import createBeerPostLike from '@/services/likes/beer-post-like/createBeerPostLike'; -import findBeerPostLikeById from '@/services/likes/beer-post-like/findBeerPostLikeById'; -import getBeerPostLikeCountByBeerPostId from '@/services/likes/beer-post-like/getBeerPostLikeCount'; -import removeBeerPostLikeById from '@/services/likes/beer-post-like/removeBeerPostLikeById'; + import { getBeerPostById } from '@/services/posts/beer-post'; +import { + findBeerPostLikeByIdService, + createBeerPostLikeService, + removeBeerPostLikeService, + getBeerPostLikeCountService, +} from '@/services/likes/beer-post-like'; import { LikeRequest } from '../types'; export const sendBeerPostLikeRequest = async ( @@ -23,26 +26,30 @@ export const sendBeerPostLikeRequest = async ( throw new ServerError('Could not find a beer post with that id.', 404); } - const alreadyLiked = await findBeerPostLikeById({ + const liked = await findBeerPostLikeByIdService({ beerPostId: beer.id, likedById: user.id, }); - const jsonResponse = { - success: true as const, - message: '', - statusCode: 200 as const, - }; + if (liked) { + await removeBeerPostLikeService({ beerPostLikeId: liked.id }); + res.status(200).json({ + success: true, + message: 'Successfully unliked beer post.', + statusCode: 200, + payload: { liked: false }, + }); - if (alreadyLiked) { - await removeBeerPostLikeById({ beerLikeId: alreadyLiked.id }); - jsonResponse.message = 'Successfully unliked beer post'; - } else { - await createBeerPostLike({ id, user }); - jsonResponse.message = 'Successfully liked beer post'; + return; } - res.status(200).json(jsonResponse); + await createBeerPostLikeService({ beerPostId: beer.id, likedById: user.id }); + res.status(200).json({ + success: true, + message: 'Successfully liked beer post.', + statusCode: 200, + payload: { liked: true }, + }); }; export const getBeerPostLikeCount = async ( @@ -51,7 +58,7 @@ export const getBeerPostLikeCount = async ( ) => { const id = req.query.id as string; - const likeCount = await getBeerPostLikeCountByBeerPostId({ beerPostId: id }); + const likeCount = await getBeerPostLikeCountService({ beerPostId: id }); res.status(200).json({ success: true, @@ -68,7 +75,10 @@ export const checkIfBeerPostIsLiked = async ( const user = req.user!; const beerPostId = req.query.id as string; - const alreadyLiked = await findBeerPostLikeById({ beerPostId, likedById: user.id }); + const alreadyLiked = await findBeerPostLikeByIdService({ + beerPostId, + likedById: user.id, + }); res.status(200).json({ success: true, diff --git a/src/controllers/likes/beer-style-likes/index.ts b/src/controllers/likes/beer-style-likes/index.ts index 1b18ea3..f8f75dc 100644 --- a/src/controllers/likes/beer-style-likes/index.ts +++ b/src/controllers/likes/beer-style-likes/index.ts @@ -1,13 +1,16 @@ import ServerError from '@/config/util/ServerError'; -import createBeerStyleLike from '@/services/likes/beer-style-like/createBeerStyleLike'; -import findBeerStyleLikeById from '@/services/likes/beer-style-like/findBeerStyleLikeById'; -import getBeerStyleLikeCount from '@/services/likes/beer-style-like/getBeerStyleLikeCount'; -import removeBeerStyleLikeById from '@/services/likes/beer-style-like/removeBeerStyleLikeById'; + import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; +import { + createBeerStyleLikeService, + findBeerStyleLikeService, + getBeerStyleLikeCountService, + removeBeerStyleLikeService, +} from '@/services/likes/beer-style-like'; import { LikeRequest } from '../types'; export const sendBeerStyleLikeRequest = async ( @@ -22,20 +25,20 @@ export const sendBeerStyleLikeRequest = async ( throw new ServerError('Could not find a beer style with that id.', 404); } - const beerStyleLike = await findBeerStyleLikeById({ + const beerStyleLike = await findBeerStyleLikeService({ beerStyleId: beerStyle.id, likedById: user.id, }); if (beerStyleLike) { - await removeBeerStyleLikeById({ beerStyleLikeId: beerStyleLike.id }); + await removeBeerStyleLikeService({ beerStyleLikeId: beerStyleLike.id }); res.status(200).json({ message: 'Successfully unliked beer style.', success: true, statusCode: 200, }); } else { - await createBeerStyleLike({ beerStyleId: beerStyle.id, user }); + await createBeerStyleLikeService({ beerStyleId: beerStyle.id, likedById: user.id }); res.status(200).json({ message: 'Successfully liked beer style.', success: true, @@ -49,7 +52,7 @@ export const getBeerStyleLikeCountRequest = async ( res: NextApiResponse>, ) => { const id = req.query.id as string; - const likeCount = await getBeerStyleLikeCount({ beerStyleId: id }); + const likeCount = await getBeerStyleLikeCountService({ beerStyleId: id }); res.status(200).json({ success: true, @@ -66,7 +69,10 @@ export const checkIfBeerStyleIsLiked = async ( const user = req.user!; const beerStyleId = req.query.id as string; - const alreadyLiked = await findBeerStyleLikeById({ beerStyleId, likedById: user.id }); + const alreadyLiked = await findBeerStyleLikeService({ + beerStyleId, + likedById: user.id, + }); res.status(200).json({ success: true, message: alreadyLiked ? 'Beer style is liked.' : 'Beer style is not liked.', diff --git a/src/controllers/likes/brewery-post-likes/index.ts b/src/controllers/likes/brewery-post-likes/index.ts index d09ac56..9839030 100644 --- a/src/controllers/likes/brewery-post-likes/index.ts +++ b/src/controllers/likes/brewery-post-likes/index.ts @@ -1,6 +1,12 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; import DBClient from '@/prisma/DBClient'; +import { + createBreweryPostLikeService, + findBreweryPostLikeService, + getBreweryPostLikeCountService, + removeBreweryPostLikeService, +} from '@/services/likes/brewery-post-like'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; @@ -20,29 +26,31 @@ export const sendBreweryPostLikeRequest = async ( throw new ServerError('Could not find a brewery post with that id', 404); } - const alreadyLiked = await DBClient.instance.breweryPostLike.findFirst({ - where: { breweryPostId: breweryPost.id, likedById: user.id }, + const like = await findBreweryPostLikeService({ + breweryPostId: breweryPost.id, + likedById: user.id, }); - const jsonResponse = { - success: true as const, - message: '', - statusCode: 200 as const, - }; + if (like) { + await removeBreweryPostLikeService({ breweryPostLikeId: like.id }); + res.status(200).json({ + success: true, + message: 'Successfully removed like from brewery post.', + statusCode: 200, + }); - if (alreadyLiked) { - await DBClient.instance.breweryPostLike.delete({ - where: { id: alreadyLiked.id }, - }); - jsonResponse.message = 'Successfully unliked brewery post'; - } else { - await DBClient.instance.breweryPostLike.create({ - data: { breweryPostId: breweryPost.id, likedById: user.id }, - }); - jsonResponse.message = 'Successfully liked brewery post'; + return; } - res.status(200).json(jsonResponse); + await createBreweryPostLikeService({ + breweryPostId: breweryPost.id, + likedById: user.id, + }); + res.status(200).json({ + success: true, + message: 'Successfully liked brewery post.', + statusCode: 200, + }); }; export const getBreweryPostLikeCount = async ( @@ -59,8 +67,8 @@ export const getBreweryPostLikeCount = async ( throw new ServerError('Could not find a brewery post with that id', 404); } - const likeCount = await DBClient.instance.breweryPostLike.count({ - where: { breweryPostId: breweryPost.id }, + const likeCount = await getBreweryPostLikeCountService({ + breweryPostId: breweryPost.id, }); res.status(200).json({ @@ -78,17 +86,15 @@ export const getBreweryPostLikeStatus = async ( const user = req.user!; const id = req.query.id as string; - const alreadyLiked = await DBClient.instance.breweryPostLike.findFirst({ - where: { - breweryPostId: id, - likedById: user.id, - }, + const liked = await findBreweryPostLikeService({ + breweryPostId: id, + likedById: user.id, }); res.status(200).json({ success: true, - message: alreadyLiked ? 'Brewery post is liked.' : 'Brewery post is not liked.', + message: liked ? 'Brewery post is liked.' : 'Brewery post is not liked.', statusCode: 200, - payload: { isLiked: !!alreadyLiked }, + payload: { isLiked: !!liked }, }); }; diff --git a/src/services/images/beer-image/index.ts b/src/services/images/beer-image/index.ts index 16e5a63..faf8956 100644 --- a/src/services/images/beer-image/index.ts +++ b/src/services/images/beer-image/index.ts @@ -19,7 +19,7 @@ import { * @param options.userId - The ID of the user. * @returns A promise that resolves to an array of created beer images. */ -export const addBeerImagesToDB: AddBeerImagesToDB = ({ +export const addBeerImagesService: AddBeerImagesToDB = ({ body, files, beerPostId, @@ -51,7 +51,7 @@ export const addBeerImagesToDB: AddBeerImagesToDB = ({ * @param options - The options for deleting a beer image. * @param options.beerImageId - The ID of the beer image. */ -export const deleteBeerImageFromDBAndStorage: DeleteBeerImageFromDBAndStorage = async ({ +export const deleteBeerImageService: DeleteBeerImageFromDBAndStorage = async ({ beerImageId, }) => { const deleted = await DBClient.instance.beerImage.delete({ @@ -73,7 +73,7 @@ export const deleteBeerImageFromDBAndStorage: DeleteBeerImageFromDBAndStorage = * @returns A promise that resolves to the updated beer image. */ -export const updateBeerImageMetadata: UpdateBeerImageMetadata = async ({ +export const updateBeerImageService: UpdateBeerImageMetadata = async ({ beerImageId, body, }) => { diff --git a/src/services/images/brewery-image/index.ts b/src/services/images/brewery-image/index.ts index 22d8d28..ac91450 100644 --- a/src/services/images/brewery-image/index.ts +++ b/src/services/images/brewery-image/index.ts @@ -20,7 +20,7 @@ import { * @returns A promise that resolves to an array of created brewery images. */ -export const addBreweryImagesToDB: AddBreweryImagesToDB = ({ +export const addBreweryImagesService: AddBreweryImagesToDB = ({ body, files, breweryPostId, @@ -52,15 +52,16 @@ export const addBreweryImagesToDB: AddBreweryImagesToDB = ({ * @param options - The options for deleting a brewery image. * @param options.breweryImageId - The ID of the brewery image. */ -export const deleteBreweryImageFromDBAndStorage: DeleteBreweryImageFromDBAndStorage = - async ({ breweryImageId }) => { - const deleted = await DBClient.instance.breweryImage.delete({ - where: { id: breweryImageId }, - select: { path: true, id: true }, - }); - const { path } = deleted; - await cloudinary.uploader.destroy(path); - }; +export const deleteBreweryImageService: DeleteBreweryImageFromDBAndStorage = async ({ + breweryImageId, +}) => { + const deleted = await DBClient.instance.breweryImage.delete({ + where: { id: breweryImageId }, + select: { path: true, id: true }, + }); + const { path } = deleted; + await cloudinary.uploader.destroy(path); +}; /** * Updates the brewery image metadata in the database. @@ -72,7 +73,7 @@ export const deleteBreweryImageFromDBAndStorage: DeleteBreweryImageFromDBAndStor * @param options.body.caption - The caption for the brewery image. * @returns A promise that resolves to the updated brewery image. */ -export const updateBreweryImageMetadata: UpdateBreweryImageMetadata = async ({ +export const updateBreweryImageService: UpdateBreweryImageMetadata = async ({ breweryImageId, body, }) => { diff --git a/src/services/likes/beer-post-like/createBeerPostLike.ts b/src/services/likes/beer-post-like/createBeerPostLike.ts deleted file mode 100644 index 14a18b7..0000000 --- a/src/services/likes/beer-post-like/createBeerPostLike.ts +++ /dev/null @@ -1,15 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import GetUserSchema from '../../users/auth/schema/GetUserSchema'; - -interface CreateBeerPostLikeArgs { - id: string; - user: z.infer; -} - -const createBeerPostLike = async ({ id, user }: CreateBeerPostLikeArgs) => - DBClient.instance.beerPostLike.create({ - data: { beerPost: { connect: { id } }, likedBy: { connect: { id: user.id } } }, - }); - -export default createBeerPostLike; diff --git a/src/services/likes/beer-post-like/findBeerPostLikeById.ts b/src/services/likes/beer-post-like/findBeerPostLikeById.ts deleted file mode 100644 index 11e2789..0000000 --- a/src/services/likes/beer-post-like/findBeerPostLikeById.ts +++ /dev/null @@ -1,14 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface FindBeerPostLikeByIdArgs { - beerPostId: string; - likedById: string; -} - -const findBeerPostLikeById = async ({ - beerPostId, - likedById, -}: FindBeerPostLikeByIdArgs) => - DBClient.instance.beerPostLike.findFirst({ where: { beerPostId, likedById } }); - -export default findBeerPostLikeById; diff --git a/src/services/likes/beer-post-like/getBeerPostLikeCount.ts b/src/services/likes/beer-post-like/getBeerPostLikeCount.ts deleted file mode 100644 index 57886cc..0000000 --- a/src/services/likes/beer-post-like/getBeerPostLikeCount.ts +++ /dev/null @@ -1,6 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -const getBeerPostLikeCountByBeerPostId = async ({ beerPostId }: { beerPostId: string }) => - DBClient.instance.beerPostLike.count({ where: { beerPostId } }); - -export default getBeerPostLikeCountByBeerPostId; diff --git a/src/services/likes/beer-post-like/index.ts b/src/services/likes/beer-post-like/index.ts new file mode 100644 index 0000000..bb0908c --- /dev/null +++ b/src/services/likes/beer-post-like/index.ts @@ -0,0 +1,60 @@ +import DBClient from '@/prisma/DBClient'; +import { + CreateBeerPostLike, + FindBeerPostLikeById, + GetBeerPostLikeCount, + RemoveBeerPostLike, +} from './types'; + +/** + * Creates a new beer post like. + * + * @param params - The parameters object for creating the beer post like. + * @param params.beerPostId - The ID of the beer post. + * @param params.likedById - The ID of the user who will like the beer post. + * @returns A promise that resolves to the newly created beer post like. + */ +export const createBeerPostLikeService: CreateBeerPostLike = async ({ + beerPostId, + likedById, +}) => + DBClient.instance.beerPostLike.create({ + data: { + beerPost: { connect: { id: beerPostId } }, + likedBy: { connect: { id: likedById } }, + }, + }); + +/** + * Retrieves a beer post like by ID. + * + * @param params - The parameters object for retrieving the beer post like. + * @param params.beerPostId - The ID of the beer post. + * @param params.likedById - The ID of the user who liked the beer post. + * @returns A promise that resolves to the beer post like. + */ +export const findBeerPostLikeByIdService: FindBeerPostLikeById = async ({ + beerPostId, + likedById, +}) => DBClient.instance.beerPostLike.findFirst({ where: { beerPostId, likedById } }); + +/** + * Removes a beer post like. + * + * @param params - The parameters object for removing the beer post like. + * @param params.beerPostLikeId - The ID of the beer post like to remove. + * @returns A promise that resolves to the removed beer post like. + */ +export const removeBeerPostLikeService: RemoveBeerPostLike = async ({ beerPostLikeId }) => + DBClient.instance.beerPostLike.delete({ where: { id: beerPostLikeId } }); + +/** + * Retrieves the number of likes for a beer post. + * + * @param params - The parameters object for retrieving the number of likes for a beer + * post. + * @param params.beerPostId - The ID of the beer post. + * @returns A promise that resolves to the number of likes for a beer post. + */ +export const getBeerPostLikeCountService: GetBeerPostLikeCount = async ({ beerPostId }) => + DBClient.instance.beerPostLike.count({ where: { beerPostId } }); diff --git a/src/services/likes/beer-post-like/removeBeerPostLikeById.ts b/src/services/likes/beer-post-like/removeBeerPostLikeById.ts deleted file mode 100644 index 2a6e3e7..0000000 --- a/src/services/likes/beer-post-like/removeBeerPostLikeById.ts +++ /dev/null @@ -1,10 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface RemoveBeerPostLikeArgs { - beerLikeId: string; -} - -const removeBeerPostLikeById = async ({ beerLikeId }: RemoveBeerPostLikeArgs) => - DBClient.instance.beerPostLike.delete({ where: { id: beerLikeId } }); - -export default removeBeerPostLikeById; diff --git a/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts b/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts new file mode 100644 index 0000000..e849f1c --- /dev/null +++ b/src/services/likes/beer-post-like/schema/BeerPostLikeSchema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +const BeerPostLikeSchema = z.object({ + id: z.string().cuid(), + beerPostId: z.string().cuid(), + likedById: z.string().cuid(), + createdAt: z.coerce.date(), + updatedAt: z.coerce.date().nullable(), +}); + +export default BeerPostLikeSchema; diff --git a/src/services/likes/beer-post-like/types/index.ts b/src/services/likes/beer-post-like/types/index.ts new file mode 100644 index 0000000..200fba5 --- /dev/null +++ b/src/services/likes/beer-post-like/types/index.ts @@ -0,0 +1,23 @@ +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; + +import { z } from 'zod'; +import BeerPostLikeSchema from '../schema/BeerPostLikeSchema'; + +type User = z.infer; +type ReturnSchema = z.infer; + +export type CreateBeerPostLike = (args: { + beerPostId: string; + likedById: User['id']; +}) => Promise; + +export type FindBeerPostLikeById = (args: { + beerPostId: string; + likedById: User['id']; +}) => Promise; + +export type RemoveBeerPostLike = (args: { + beerPostLikeId: string; +}) => Promise; + +export type GetBeerPostLikeCount = (args: { beerPostId: string }) => Promise; diff --git a/src/services/likes/beer-style-like/createBeerStyleLike.ts b/src/services/likes/beer-style-like/createBeerStyleLike.ts deleted file mode 100644 index e4c1813..0000000 --- a/src/services/likes/beer-style-like/createBeerStyleLike.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { z } from 'zod'; -import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; - -interface CreateBeerStyleLikeArgs { - beerStyleId: string; - user: z.infer; -} -const createBeerStyleLike = async ({ beerStyleId, user }: CreateBeerStyleLikeArgs) => { - return DBClient.instance.beerStyleLike.create({ - data: { - beerStyleId, - likedById: user.id, - }, - }); -}; - -export default createBeerStyleLike; diff --git a/src/services/likes/beer-style-like/findBeerStyleLikeById.ts b/src/services/likes/beer-style-like/findBeerStyleLikeById.ts deleted file mode 100644 index b9ec621..0000000 --- a/src/services/likes/beer-style-like/findBeerStyleLikeById.ts +++ /dev/null @@ -1,16 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface FindBeerStyleLikeByIdArgs { - beerStyleId: string; - likedById: string; -} -const findBeerStyleLikeById = async ({ - beerStyleId, - likedById, -}: FindBeerStyleLikeByIdArgs) => { - return DBClient.instance.beerStyleLike.findFirst({ - where: { beerStyleId, likedById }, - }); -}; - -export default findBeerStyleLikeById; diff --git a/src/services/likes/beer-style-like/getBeerStyleLikeCount.ts b/src/services/likes/beer-style-like/getBeerStyleLikeCount.ts deleted file mode 100644 index 7ba4061..0000000 --- a/src/services/likes/beer-style-like/getBeerStyleLikeCount.ts +++ /dev/null @@ -1,10 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface GetBeerStyleLikeCountArgs { - beerStyleId: string; -} -const getBeerStyleLikeCount = async ({ beerStyleId }: GetBeerStyleLikeCountArgs) => { - return DBClient.instance.beerStyleLike.count({ where: { beerStyleId } }); -}; - -export default getBeerStyleLikeCount; diff --git a/src/services/likes/beer-style-like/index.ts b/src/services/likes/beer-style-like/index.ts new file mode 100644 index 0000000..003953f --- /dev/null +++ b/src/services/likes/beer-style-like/index.ts @@ -0,0 +1,63 @@ +import DBClient from '@/prisma/DBClient'; + +import { + CreateBeerStyleLike, + FindBeerStyleLike, + GetBeerStyleLikeCount, + RemoveBeerStyleLike, +} from './types'; + +/** + * Creates a new beer style like. + * + * @param params - The parameters object for creating the beer style like. + * @param params.beerStyleId - The ID of the beer style. + * @param params.likedById - The ID of the user who will like the beer style. + * @returns A promise that resolves to the newly created beer style like. + */ +export const createBeerStyleLikeService: CreateBeerStyleLike = async ({ + beerStyleId, + likedById, +}) => + DBClient.instance.beerStyleLike.create({ + data: { + beerStyle: { connect: { id: beerStyleId } }, + likedBy: { connect: { id: likedById } }, + }, + }); + +/** + * Retrieves a beer style like by ID. + * + * @param params - The parameters object for retrieving the beer style like. + * @param params.beerStyleId - The ID of the beer style. + * @param params.likedById - The ID of the user who liked the beer style. + * @returns A promise that resolves to the beer style like. + */ +export const findBeerStyleLikeService: FindBeerStyleLike = async ({ + beerStyleId, + likedById, +}) => DBClient.instance.beerStyleLike.findFirst({ where: { beerStyleId, likedById } }); + +/** + * Removes a beer style like. + * + * @param params - The parameters object for removing the beer style like. + * @param params.beerStyleLikeId - The ID of the beer style like to remove. + * @returns A promise that resolves to the removed beer style like. + */ +export const removeBeerStyleLikeService: RemoveBeerStyleLike = async ({ + beerStyleLikeId, +}) => DBClient.instance.beerStyleLike.delete({ where: { id: beerStyleLikeId } }); + +/** + * Retrieves the number of likes for a beer style. + * + * @param params - The parameters object for retrieving the number of likes for a beer + * style. + * @param params.beerStyleId - The ID of the beer style. + * @returns A promise that resolves to the number of likes for a beer style. + */ +export const getBeerStyleLikeCountService: GetBeerStyleLikeCount = async ({ + beerStyleId, +}) => DBClient.instance.beerStyleLike.count({ where: { beerStyleId } }); diff --git a/src/services/likes/beer-style-like/removeBeerStyleLikeById.ts b/src/services/likes/beer-style-like/removeBeerStyleLikeById.ts deleted file mode 100644 index 164eee4..0000000 --- a/src/services/likes/beer-style-like/removeBeerStyleLikeById.ts +++ /dev/null @@ -1,12 +0,0 @@ -import DBClient from '@/prisma/DBClient'; - -interface RemoveBeerStyleLikeByIdArgs { - beerStyleLikeId: string; -} -const removeBeerStyleLikeById = async ({ - beerStyleLikeId, -}: RemoveBeerStyleLikeByIdArgs) => { - return DBClient.instance.beerStyleLike.delete({ where: { id: beerStyleLikeId } }); -}; - -export default removeBeerStyleLikeById; diff --git a/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts b/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts new file mode 100644 index 0000000..93ce932 --- /dev/null +++ b/src/services/likes/beer-style-like/schema/BeerStyleLikeSchema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +const BeerStyleLikeSchema = z.object({ + id: z.string().cuid(), + beerStyleId: z.string().cuid(), + likedById: z.string().cuid(), + createdAt: z.coerce.date(), + updatedAt: z.coerce.date().nullable(), +}); + +export default BeerStyleLikeSchema; diff --git a/src/services/likes/beer-style-like/types/index.ts b/src/services/likes/beer-style-like/types/index.ts new file mode 100644 index 0000000..877a742 --- /dev/null +++ b/src/services/likes/beer-style-like/types/index.ts @@ -0,0 +1,23 @@ +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; +import { z } from 'zod'; + +import BeerStyleLikeSchema from '../schema/BeerStyleLikeSchema'; + +type User = z.infer; +type ReturnSchema = z.infer; + +export type CreateBeerStyleLike = (args: { + beerStyleId: string; + likedById: User['id']; +}) => Promise; + +export type FindBeerStyleLike = (args: { + beerStyleId: string; + likedById: User['id']; +}) => Promise; + +export type RemoveBeerStyleLike = (args: { + beerStyleLikeId: string; +}) => Promise; + +export type GetBeerStyleLikeCount = (args: { beerStyleId: string }) => Promise; diff --git a/src/services/likes/brewery-post-like/index.ts b/src/services/likes/brewery-post-like/index.ts new file mode 100644 index 0000000..123d61a --- /dev/null +++ b/src/services/likes/brewery-post-like/index.ts @@ -0,0 +1,63 @@ +import DBClient from '@/prisma/DBClient'; + +import { + CreateBreweryPostLike, + FindBreweryPostLike, + GetBreweryPostLikeCount, + RemoveBreweryPostLike, +} from './types'; + +/** + * Creates a new brewery post like. + * + * @param params - The parameters object for creating the brewery post like. + * @param params.breweryPostId - The ID of the brewery post. + * @param params.likedById - The ID of the user who will like the brewery post. + * @returns A promise that resolves to the newly created brewery post like. + */ +export const createBreweryPostLikeService: CreateBreweryPostLike = async ({ + breweryPostId, + likedById, +}) => + DBClient.instance.breweryPostLike.create({ + data: { + breweryPost: { connect: { id: breweryPostId } }, + likedBy: { connect: { id: likedById } }, + }, + }); + +/** + * Retrieves a brewery post like by ID. + * + * @param params - The parameters object for retrieving the brewery post like. + * @param params.breweryPostId - The ID of the brewery post. + * @param params.likedById - The ID of the user who liked the brewery post. + * @returns A promise that resolves to the brewery post like. + */ +export const findBreweryPostLikeService: FindBreweryPostLike = async ({ + breweryPostId, + likedById, +}) => + DBClient.instance.breweryPostLike.findFirst({ where: { breweryPostId, likedById } }); + +/** + * Removes a brewery post like. + * + * @param params - The parameters object for removing the brewery post like. + * @param params.breweryPostLikeId - The ID of the brewery post like to remove. + * @returns A promise that resolves to the removed brewery post like. + */ +export const removeBreweryPostLikeService: RemoveBreweryPostLike = async ({ + breweryPostLikeId, +}) => DBClient.instance.breweryPostLike.delete({ where: { id: breweryPostLikeId } }); + +/** + * Retrieves the number of likes for a brewery post. + * + * @param params - The parameters object for retrieving the number of likes for a brewery + * @param params.breweryPostId - The ID of the brewery post. + * @returns A promise that resolves to the number of likes for a brewery post. + */ +export const getBreweryPostLikeCountService: GetBreweryPostLikeCount = async ({ + breweryPostId, +}) => DBClient.instance.breweryPostLike.count({ where: { breweryPostId } }); diff --git a/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts b/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts new file mode 100644 index 0000000..754ff31 --- /dev/null +++ b/src/services/likes/brewery-post-like/schema/BreweryPostLikeSchema.ts @@ -0,0 +1,11 @@ +import { z } from 'zod'; + +const BreweryPostLikeSchema = z.object({ + id: z.string().cuid(), + breweryPostId: z.string().cuid(), + likedById: z.string().cuid(), + createdAt: z.coerce.date(), + updatedAt: z.coerce.date().nullable(), +}); + +export default BreweryPostLikeSchema; diff --git a/src/services/likes/brewery-post-like/types/index.ts b/src/services/likes/brewery-post-like/types/index.ts new file mode 100644 index 0000000..f3d0581 --- /dev/null +++ b/src/services/likes/brewery-post-like/types/index.ts @@ -0,0 +1,24 @@ +import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; +import { z } from 'zod'; +import BreweryPostLikeSchema from '../schema/BreweryPostLikeSchema'; + +type User = z.infer; +type ReturnSchema = z.infer; + +export type CreateBreweryPostLike = (args: { + breweryPostId: string; + likedById: User['id']; +}) => Promise; + +export type FindBreweryPostLike = (args: { + breweryPostId: string; + likedById: User['id']; +}) => Promise; + +export type RemoveBreweryPostLike = (args: { + breweryPostLikeId: string; +}) => Promise; + +export type GetBreweryPostLikeCount = (args: { + breweryPostId: string; +}) => Promise; From 70a168df92b864fb79781aa550aa0eb4ba12b408 Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Thu, 14 Dec 2023 22:18:59 -0500 Subject: [PATCH 19/21] Refactor: update beer style, brewery post services --- .../likes/beer-style-likes/index.ts | 4 +- src/controllers/posts/beer-posts/index.ts | 24 +- src/controllers/posts/beer-styles/index.ts | 45 ++-- src/controllers/posts/breweries/index.ts | 169 ++++++++------ .../posts/breweries/types/index.ts | 9 + src/pages/api/breweries/[id]/index.ts | 78 +------ src/pages/api/breweries/create.ts | 51 +---- src/pages/api/breweries/map/index.ts | 46 +--- src/pages/beers/styles/[id]/index.tsx | 5 +- src/pages/breweries/[id]/beers/create.tsx | 4 +- src/pages/breweries/[id]/edit.tsx | 5 +- src/pages/breweries/[id]/index.tsx | 6 +- .../beer-style-post/deleteBeerStyleById.ts | 34 --- .../beer-style-post/editBeerStyleById.ts | 30 --- .../posts/beer-style-post/getAllBeerStyles.ts | 37 ---- .../posts/beer-style-post/getBeerStyleById.ts | 30 --- src/services/posts/beer-style-post/index.ts | 182 +++++++++++++++ .../posts/beer-style-post/types/index.ts | 39 ++++ .../brewery-post/createNewBreweryPost.ts | 64 ------ .../posts/brewery-post/getAllBreweryPosts.ts | 55 ----- .../getAllBreweryPostsByPostedById.ts | 58 ----- .../posts/brewery-post/getBreweryPostById.ts | 46 ---- src/services/posts/brewery-post/index.ts | 207 ++++++++++++++++++ ...eateNewBreweryPostWithoutLocationSchema.ts | 14 ++ .../schema/GetMapBreweryPostsSchema.ts | 14 ++ .../posts/brewery-post/types/index.ts | 48 ++++ 26 files changed, 671 insertions(+), 633 deletions(-) delete mode 100644 src/services/posts/beer-style-post/deleteBeerStyleById.ts delete mode 100644 src/services/posts/beer-style-post/editBeerStyleById.ts delete mode 100644 src/services/posts/beer-style-post/getAllBeerStyles.ts delete mode 100644 src/services/posts/beer-style-post/getBeerStyleById.ts create mode 100644 src/services/posts/beer-style-post/index.ts create mode 100644 src/services/posts/beer-style-post/types/index.ts delete mode 100644 src/services/posts/brewery-post/createNewBreweryPost.ts delete mode 100644 src/services/posts/brewery-post/getAllBreweryPosts.ts delete mode 100644 src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts delete mode 100644 src/services/posts/brewery-post/getBreweryPostById.ts create mode 100644 src/services/posts/brewery-post/index.ts create mode 100644 src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts create mode 100644 src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts create mode 100644 src/services/posts/brewery-post/types/index.ts diff --git a/src/controllers/likes/beer-style-likes/index.ts b/src/controllers/likes/beer-style-likes/index.ts index f8f75dc..fd2499d 100644 --- a/src/controllers/likes/beer-style-likes/index.ts +++ b/src/controllers/likes/beer-style-likes/index.ts @@ -1,6 +1,5 @@ import ServerError from '@/config/util/ServerError'; -import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; @@ -11,6 +10,7 @@ import { getBeerStyleLikeCountService, removeBeerStyleLikeService, } from '@/services/likes/beer-style-like'; +import { getBeerStyleByIdService } from '@/services/posts/beer-style-post'; import { LikeRequest } from '../types'; export const sendBeerStyleLikeRequest = async ( @@ -20,7 +20,7 @@ export const sendBeerStyleLikeRequest = async ( const user = req.user!; const { id } = req.query; - const beerStyle = await getBeerStyleById(id); + const beerStyle = await getBeerStyleByIdService({ beerStyleId: id }); if (!beerStyle) { throw new ServerError('Could not find a beer style with that id.', 404); } diff --git a/src/controllers/posts/beer-posts/index.ts b/src/controllers/posts/beer-posts/index.ts index 44ff03b..76cacf7 100644 --- a/src/controllers/posts/beer-posts/index.ts +++ b/src/controllers/posts/beer-posts/index.ts @@ -1,5 +1,17 @@ import ServerError from '@/config/util/ServerError'; +import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; +import { NextApiResponse } from 'next'; +import { NextHandler } from 'next-connect'; +import { z } from 'zod'; +import { GetAllPostsByConnectedPostId } from '@/controllers/posts/types'; +import { + BeerPostRequest, + CreateBeerPostRequest, + EditBeerPostRequest, + GetAllBeerPostsRequest, + GetBeerRecommendationsRequest, +} from '@/controllers/posts/beer-posts/types'; import { getBeerPostById, editBeerPostByIdService, @@ -9,18 +21,6 @@ import { createNewBeerPost, getBeerPostsByPostedByIdService, } from '@/services/posts/beer-post'; -import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiResponse } from 'next'; -import { NextHandler } from 'next-connect'; -import { z } from 'zod'; -import { - BeerPostRequest, - CreateBeerPostRequest, - EditBeerPostRequest, - GetAllBeerPostsRequest, - GetBeerRecommendationsRequest, -} from './types'; -import { GetAllPostsByConnectedPostId } from '../types'; export const checkIfBeerPostOwner = async ( req: BeerPostRequestType, diff --git a/src/controllers/posts/beer-styles/index.ts b/src/controllers/posts/beer-styles/index.ts index 657b3dc..e5676a1 100644 --- a/src/controllers/posts/beer-styles/index.ts +++ b/src/controllers/posts/beer-styles/index.ts @@ -1,16 +1,16 @@ import { NextApiResponse } from 'next'; import { z } from 'zod'; -import DBClient from '@/prisma/DBClient'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; -import getAllBeerStyles from '@/services/posts/beer-style-post/getAllBeerStyles'; - -import ServerError from '@/config/util/ServerError'; - import { getBeerPostsByBeerStyleIdService } from '@/services/posts/beer-post'; +import { + createBeerStyleService, + getAllBeerStylesService, + getBeerStyleByIdService, +} from '@/services/posts/beer-style-post'; + import { CreateBeerStyleRequest, GetBeerStyleByIdRequest } from './types'; import { GetAllPostsByConnectedPostId, GetAllPostsRequest } from '../types'; @@ -20,7 +20,9 @@ export const getBeerStyle = async ( ) => { const { id } = req.query; - const beerStyle = await getBeerStyleById(id); + const beerStyle = await getBeerStyleByIdService({ + beerStyleId: id, + }); res.status(200).json({ message: 'Beer style retrieved successfully.', @@ -37,20 +39,18 @@ export const getAllBeersByBeerStyle = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { page_size, page_num, id } = req.query; - const beers = await getBeerPostsByBeerStyleIdService({ + const { beerPosts, count } = await getBeerPostsByBeerStyleIdService({ pageNum: parseInt(page_num, 10), pageSize: parseInt(page_size, 10), styleId: id, }); - const count = await DBClient.instance.beerPost.count({ where: { styleId: id } }); - res.setHeader('X-Total-Count', count); res.status(200).json({ message: `Beers with style id ${id} retrieved successfully.`, statusCode: 200, - payload: beers, + payload: beerPosts, success: true, }); }; @@ -62,8 +62,10 @@ export const getBeerStyles = async ( const pageNum = parseInt(req.query.page_num, 10); const pageSize = parseInt(req.query.page_size, 10); - const beerStyles = await getAllBeerStyles({ pageNum, pageSize }); - const beerStyleCount = await DBClient.instance.beerStyle.count(); + const { beerStyles, beerStyleCount } = await getAllBeerStylesService({ + pageNum, + pageSize, + }); res.setHeader('X-Total-Count', beerStyleCount); @@ -83,23 +85,14 @@ export const createBeerStyle = async ( const user = req.user!; - const glassware = await DBClient.instance.glassware.findUnique({ - where: { id: glasswareId }, - select: { id: true }, - }); - - if (!glassware) { - throw new ServerError('Glassware not found.', 404); - } - - const beerStyle = await DBClient.instance.beerStyle.create({ - data: { + const beerStyle = await createBeerStyleService({ + glasswareId, + postedById: user.id, + body: { abvRange, description, - glassware: { connect: { id: glasswareId } }, ibuRange, name, - postedBy: { connect: { id: user.id } }, }, }); diff --git a/src/controllers/posts/breweries/index.ts b/src/controllers/posts/breweries/index.ts index 67fbd97..658cb50 100644 --- a/src/controllers/posts/breweries/index.ts +++ b/src/controllers/posts/breweries/index.ts @@ -1,15 +1,27 @@ -import DBClient from '@/prisma/DBClient'; -import getAllBreweryPostsByPostedById from '@/services/posts/brewery-post/getAllBreweryPostsByPostedById'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; -import getAllBreweryPosts from '@/services/posts/brewery-post/getAllBreweryPosts'; -import createNewBreweryPost from '@/services/posts/brewery-post/createNewBreweryPost'; + import geocode from '@/config/mapbox/geocoder'; import ServerError from '@/config/util/ServerError'; -import BreweryPostMapQueryResult from '@/services/posts/brewery-post/schema/BreweryPostMapQueryResult'; -import BeerPostQueryResult from '@/services/posts/beer-post/schema/BeerPostQueryResult'; -import { CreateBreweryPostRequest, GetBreweryPostsRequest } from './types'; + +import { + getAllBreweryPostsByPostedByIdService, + getAllBreweryPostsService, + createNewBreweryPostService, + createBreweryPostLocationService, + getMapBreweryPostsService, + getBreweryPostByIdService, +} from '@/services/posts/brewery-post'; +import { getBeerPostsByBreweryIdService } from '@/services/posts/beer-post'; +import { NextHandler } from 'next-connect'; +import DBClient from '@/prisma/DBClient'; +import { + BreweryPostRequest, + CreateBreweryPostRequest, + EditBreweryPostRequest, + GetBreweryPostsRequest, +} from './types'; import { GetAllPostsByConnectedPostId } from '../types'; export const getBreweryPostsByUserId = async ( @@ -21,17 +33,13 @@ export const getBreweryPostsByUserId = async ( const { id } = req.query; - const breweryPosts = await getAllBreweryPostsByPostedById({ + const { breweryPosts, count } = await getAllBreweryPostsByPostedByIdService({ pageNum, pageSize, postedById: id, }); - const breweryPostCount = await DBClient.instance.breweryPost.count({ - where: { postedBy: { id } }, - }); - - res.setHeader('X-Total-Count', breweryPostCount); + res.setHeader('X-Total-Count', count); res.status(200).json({ message: `Brewery posts by user ${id} fetched successfully`, @@ -48,10 +56,9 @@ export const getBreweryPosts = async ( const pageNum = parseInt(req.query.page_num, 10); const pageSize = parseInt(req.query.page_size, 10); - const breweryPosts = await getAllBreweryPosts({ pageNum, pageSize }); - const breweryPostCount = await DBClient.instance.breweryPost.count(); + const { breweryPosts, count } = await getAllBreweryPostsService({ pageNum, pageSize }); - res.setHeader('X-Total-Count', breweryPostCount); + res.setHeader('X-Total-Count', count); res.status(200).json({ message: 'Brewery posts retrieved successfully', statusCode: 200, @@ -77,19 +84,18 @@ export const createBreweryPost = async ( const [latitude, longitude] = geocoded.center; - const location = await DBClient.instance.breweryLocation.create({ - data: { + const location = await createBreweryPostLocationService({ + body: { address, city, country, stateOrProvince: region, coordinates: [latitude, longitude], - postedBy: { connect: { id: userId } }, }, - select: { id: true }, + postedById: userId, }); - const newBreweryPost = await createNewBreweryPost({ + const newBreweryPost = await createNewBreweryPostService({ name, description, locationId: location.id, @@ -112,24 +118,12 @@ export const getMapBreweryPosts = async ( const pageNum = parseInt(req.query.page_num, 10); const pageSize = parseInt(req.query.page_size, 10); - const skip = (pageNum - 1) * pageSize; - const take = pageSize; + const { breweryPosts, count } = await getMapBreweryPostsService({ + pageNum, + pageSize, + }); - const breweryPosts: z.infer[] = - await DBClient.instance.breweryPost.findMany({ - select: { - location: { - select: { coordinates: true, city: true, country: true, stateOrProvince: true }, - }, - id: true, - name: true, - }, - skip, - take, - }); - const breweryPostCount = await DBClient.instance.breweryPost.count(); - - res.setHeader('X-Total-Count', breweryPostCount); + res.setHeader('X-Total-Count', count); res.status(200).json({ message: 'Brewery posts retrieved successfully', @@ -149,37 +143,10 @@ export const getAllBeersByBrewery = async ( const pageNum = parseInt(page_num, 10); const pageSize = parseInt(page_size, 10); - const beers: z.infer[] = - await DBClient.instance.beerPost.findMany({ - where: { breweryId: id }, - skip: (pageNum - 1) * pageSize, - take: 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, - }, - }, - }, - }); - - const count = await DBClient.instance.beerPost.count({ - where: { breweryId: id }, + const { beerPosts, count } = await getBeerPostsByBreweryIdService({ + pageNum, + pageSize, + breweryId: id, }); res.setHeader('X-Total-Count', count); @@ -187,7 +154,69 @@ export const getAllBeersByBrewery = async ( res.status(200).json({ message: 'Beers fetched successfully', statusCode: 200, - payload: beers, + payload: beerPosts, success: true, }); }; + +export const checkIfBreweryPostOwner = async ( + req: BreweryPostRequest, + res: NextApiResponse, + next: NextHandler, +) => { + const user = req.user!; + const { id } = req.query; + + const breweryPost = await getBreweryPostByIdService({ breweryPostId: id }); + if (!breweryPost) { + throw new ServerError('Brewery post not found', 404); + } + + if (breweryPost.postedBy.id !== user.id) { + throw new ServerError('You are not the owner of this brewery post', 403); + } + + return next(); +}; + +export const editBreweryPost = async ( + req: EditBreweryPostRequest, + res: NextApiResponse>, +) => { + const { + body, + query: { id }, + } = req; + + await DBClient.instance.breweryPost.update({ + where: { id }, + data: body, + }); + + res.status(200).json({ + message: 'Brewery post updated successfully', + success: true, + statusCode: 200, + }); +}; + +export const deleteBreweryPost = async ( + req: BreweryPostRequest, + res: NextApiResponse, +) => { + const { + query: { id }, + } = req; + + const deleted = await DBClient.instance.breweryPost.delete({ where: { id } }); + + if (!deleted) { + throw new ServerError('Brewery post not found', 404); + } + + res.status(200).json({ + message: 'Brewery post deleted successfully', + success: true, + statusCode: 200, + }); +}; diff --git a/src/controllers/posts/breweries/types/index.ts b/src/controllers/posts/breweries/types/index.ts index f20425f..85dd30a 100644 --- a/src/controllers/posts/breweries/types/index.ts +++ b/src/controllers/posts/breweries/types/index.ts @@ -1,5 +1,6 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; +import EditBreweryPostValidationSchema from '@/services/posts/brewery-post/schema/EditBreweryPostValidationSchema'; import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import { NextApiRequest } from 'next'; import { z } from 'zod'; @@ -11,3 +12,11 @@ export interface GetBreweryPostsRequest extends NextApiRequest { export interface CreateBreweryPostRequest extends UserExtendedNextApiRequest { body: z.infer; } + +export interface BreweryPostRequest extends UserExtendedNextApiRequest { + query: { id: string }; +} + +export interface EditBreweryPostRequest extends BreweryPostRequest { + body: z.infer; +} diff --git a/src/pages/api/breweries/[id]/index.ts b/src/pages/api/breweries/[id]/index.ts index 8366698..f71a7a5 100644 --- a/src/pages/api/breweries/[id]/index.ts +++ b/src/pages/api/breweries/[id]/index.ts @@ -1,81 +1,17 @@ import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; -import { UserExtendedNextApiRequest } from '@/config/auth/types'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; -import { createRouter, NextHandler } from 'next-connect'; +import { createRouter } from 'next-connect'; import { z } from 'zod'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; -import EditBreweryPostValidationSchema from '@/services/posts/brewery-post/schema/EditBreweryPostValidationSchema'; -interface BreweryPostRequest extends UserExtendedNextApiRequest { - query: { id: string }; -} +import { + checkIfBreweryPostOwner, + editBreweryPost, + deleteBreweryPost, +} from '@/controllers/posts/breweries'; +import { EditBreweryPostRequest } from '@/controllers/posts/breweries/types'; -interface EditBreweryPostRequest extends BreweryPostRequest { - body: z.infer; -} - -const checkIfBreweryPostOwner = async ( - req: BreweryPostRequest, - res: NextApiResponse, - next: NextHandler, -) => { - const user = req.user!; - const { id } = req.query; - - const breweryPost = await getBreweryPostById(id); - if (!breweryPost) { - throw new ServerError('Brewery post not found', 404); - } - - if (breweryPost.postedBy.id !== user.id) { - throw new ServerError('You are not the owner of this brewery post', 403); - } - - return next(); -}; - -const editBreweryPost = async ( - req: EditBreweryPostRequest, - res: NextApiResponse>, -) => { - const { - body, - query: { id }, - } = req; - - await DBClient.instance.breweryPost.update({ - where: { id }, - data: body, - }); - - res.status(200).json({ - message: 'Brewery post updated successfully', - success: true, - statusCode: 200, - }); -}; - -const deleteBreweryPost = async (req: BreweryPostRequest, res: NextApiResponse) => { - const { - query: { id }, - } = req; - - const deleted = await DBClient.instance.breweryPost.delete({ where: { id } }); - - if (!deleted) { - throw new ServerError('Brewery post not found', 404); - } - - res.status(200).json({ - message: 'Brewery post deleted successfully', - success: true, - statusCode: 200, - }); -}; const router = createRouter< EditBreweryPostRequest, NextApiResponse> diff --git a/src/pages/api/breweries/create.ts b/src/pages/api/breweries/create.ts index 275b467..6c935ef 100644 --- a/src/pages/api/breweries/create.ts +++ b/src/pages/api/breweries/create.ts @@ -6,56 +6,9 @@ import { z } from 'zod'; import NextConnectOptions from '@/config/nextConnect/NextConnectOptions'; import getCurrentUser from '@/config/nextConnect/middleware/getCurrentUser'; import CreateBreweryPostSchema from '@/services/posts/brewery-post/schema/CreateBreweryPostSchema'; -import createNewBreweryPost from '@/services/posts/brewery-post/createNewBreweryPost'; -import geocode from '@/config/mapbox/geocoder'; -import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; + import { CreateBreweryPostRequest } from '@/controllers/posts/breweries/types'; - -const createBreweryPost = async ( - req: CreateBreweryPostRequest, - res: NextApiResponse>, -) => { - const { name, description, dateEstablished, address, city, country, region } = req.body; - const userId = req.user!.id; - - const fullAddress = `${address}, ${city}, ${region}, ${country}`; - - const geocoded = await geocode(fullAddress); - - if (!geocoded) { - throw new ServerError('Address is not valid', 400); - } - - const [latitude, longitude] = geocoded.center; - - const location = await DBClient.instance.breweryLocation.create({ - data: { - address, - city, - country, - stateOrProvince: region, - coordinates: [latitude, longitude], - postedBy: { connect: { id: userId } }, - }, - select: { id: true }, - }); - - const newBreweryPost = await createNewBreweryPost({ - name, - description, - locationId: location.id, - dateEstablished, - userId, - }); - - res.status(201).json({ - message: 'Brewery post created successfully', - statusCode: 201, - payload: newBreweryPost, - success: true, - }); -}; +import { createBreweryPost } from '@/controllers/posts/breweries'; const router = createRouter< CreateBreweryPostRequest, diff --git a/src/pages/api/breweries/map/index.ts b/src/pages/api/breweries/map/index.ts index a31579b..185cd3f 100644 --- a/src/pages/api/breweries/map/index.ts +++ b/src/pages/api/breweries/map/index.ts @@ -1,51 +1,15 @@ import validateRequest from '@/config/nextConnect/middleware/validateRequest'; -import DBClient from '@/prisma/DBClient'; -import BreweryPostMapQueryResult from '@/services/posts/brewery-post/schema/BreweryPostMapQueryResult'; +import { getMapBreweryPosts } from '@/controllers/posts/breweries'; +import { GetBreweryPostsRequest } from '@/controllers/posts/breweries/types'; + import PaginatedQueryResponseSchema from '@/services/schema/PaginatedQueryResponseSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; -import { NextApiRequest, NextApiResponse } from 'next'; +import { NextApiResponse } from 'next'; + import { createRouter } from 'next-connect'; import { z } from 'zod'; -interface GetBreweryPostsRequest extends NextApiRequest { - query: z.infer; -} - -const getMapBreweryPosts = async ( - req: GetBreweryPostsRequest, - res: NextApiResponse>, -) => { - const pageNum = parseInt(req.query.page_num, 10); - const pageSize = parseInt(req.query.page_size, 10); - - const skip = (pageNum - 1) * pageSize; - const take = pageSize; - - const breweryPosts: z.infer[] = - await DBClient.instance.breweryPost.findMany({ - select: { - location: { - select: { coordinates: true, city: true, country: true, stateOrProvince: true }, - }, - id: true, - name: true, - }, - skip, - take, - }); - const breweryPostCount = await DBClient.instance.breweryPost.count(); - - res.setHeader('X-Total-Count', breweryPostCount); - - res.status(200).json({ - message: 'Brewery posts retrieved successfully', - statusCode: 200, - payload: breweryPosts, - success: true, - }); -}; - const router = createRouter< GetBreweryPostsRequest, NextApiResponse> diff --git a/src/pages/beers/styles/[id]/index.tsx b/src/pages/beers/styles/[id]/index.tsx index 69b7e16..58d96b4 100644 --- a/src/pages/beers/styles/[id]/index.tsx +++ b/src/pages/beers/styles/[id]/index.tsx @@ -5,11 +5,12 @@ import { z } from 'zod'; import useMediaQuery from '@/hooks/utilities/useMediaQuery'; import { Tab } from '@headlessui/react'; -import getBeerStyleById from '@/services/posts/beer-style-post/getBeerStyleById'; + import BeerStyleHeader from '@/components/BeerStyleById/BeerStyleHeader'; import BeerStyleQueryResult from '@/services/posts/beer-style-post/schema/BeerStyleQueryResult'; import BeerStyleCommentSection from '@/components/BeerStyleById/BeerStyleCommentSection'; import BeerStyleBeerSection from '@/components/BeerStyleById/BeerStyleBeerSection'; +import { getBeerStyleByIdService } from '@/services/posts/beer-style-post'; interface BeerStylePageProps { beerStyle: z.infer; @@ -69,7 +70,7 @@ export default BeerStyleByIdPage; export const getServerSideProps: GetServerSideProps = async ({ params }) => { const id = params!.id as string; - const beerStyle = await getBeerStyleById(id); + const beerStyle = await getBeerStyleByIdService({ beerStyleId: id }); if (!beerStyle) { return { notFound: true }; } diff --git a/src/pages/breweries/[id]/beers/create.tsx b/src/pages/breweries/[id]/beers/create.tsx index eb3f45c..e1f7d73 100644 --- a/src/pages/breweries/[id]/beers/create.tsx +++ b/src/pages/breweries/[id]/beers/create.tsx @@ -8,7 +8,7 @@ import { BeerStyle } from '@prisma/client'; import { NextPage } from 'next'; import { BiBeer } from 'react-icons/bi'; import { z } from 'zod'; -import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; +import { getBreweryPostByIdService } from '@/services/posts/brewery-post'; interface CreateBeerPageProps { brewery: z.infer; @@ -32,7 +32,7 @@ export const getServerSideProps = withPageAuthRequired( async (context) => { const id = context.params?.id as string; - const breweryPost = await getBreweryPostById(id); + const breweryPost = await getBreweryPostByIdService({ breweryPostId: id }); const beerStyles = await DBClient.instance.beerStyle.findMany(); return { diff --git a/src/pages/breweries/[id]/edit.tsx b/src/pages/breweries/[id]/edit.tsx index d1f6aae..5f2c493 100644 --- a/src/pages/breweries/[id]/edit.tsx +++ b/src/pages/breweries/[id]/edit.tsx @@ -5,7 +5,8 @@ import FormPageLayout from '@/components/ui/forms/FormPageLayout'; import FormSegment from '@/components/ui/forms/FormSegment'; import FormTextArea from '@/components/ui/forms/FormTextArea'; import FormTextInput from '@/components/ui/forms/FormTextInput'; -import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; +import { getBreweryPostByIdService } from '@/services/posts/brewery-post'; + import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import EditBreweryPostValidationSchema from '@/services/posts/brewery-post/schema/EditBreweryPostValidationSchema'; import withPageAuthRequired from '@/util/withPageAuthRequired'; @@ -143,7 +144,7 @@ export default EditBreweryPostPage; export const getServerSideProps = withPageAuthRequired( async (context, session) => { const breweryPostId = context.params?.id as string; - const breweryPost = await getBreweryPostById(breweryPostId); + const breweryPost = await getBreweryPostByIdService({ breweryPostId }); const { id: userId } = session; diff --git a/src/pages/breweries/[id]/index.tsx b/src/pages/breweries/[id]/index.tsx index ae2b281..a081fe4 100644 --- a/src/pages/breweries/[id]/index.tsx +++ b/src/pages/breweries/[id]/index.tsx @@ -1,4 +1,3 @@ -import getBreweryPostById from '@/services/posts/brewery-post/getBreweryPostById'; import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; import { GetServerSideProps, NextPage } from 'next'; @@ -13,6 +12,7 @@ import { Tab } from '@headlessui/react'; import dynamic from 'next/dynamic'; import { MAPBOX_ACCESS_TOKEN } from '@/config/env'; import { CldImage } from 'next-cloudinary'; +import { getBreweryPostByIdService } from '@/services/posts/brewery-post'; const [BreweryInfoHeader, BreweryBeersSection, BreweryCommentsSection, BreweryPostMap] = [ dynamic(() => import('@/components/BreweryById/BreweryInfoHeader')), @@ -114,7 +114,9 @@ const BreweryByIdPage: NextPage = ({ breweryPost, mapboxToken export const getServerSideProps: GetServerSideProps = async ( context, ) => { - const breweryPost = await getBreweryPostById(context.params!.id! as string); + const breweryPost = await getBreweryPostByIdService({ + breweryPostId: context.params?.id as string, + }); const mapboxToken = MAPBOX_ACCESS_TOKEN; return !breweryPost diff --git a/src/services/posts/beer-style-post/deleteBeerStyleById.ts b/src/services/posts/beer-style-post/deleteBeerStyleById.ts deleted file mode 100644 index 5d169ae..0000000 --- a/src/services/posts/beer-style-post/deleteBeerStyleById.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { z } from 'zod'; -import DBClient from '@/prisma/DBClient'; -import BeerStyleQueryResult from './schema/BeerStyleQueryResult'; - -interface DeleteBeerStyleByIdArgs { - beerStyleId: string; -} - -const deleteBeerStyleById = async ({ - beerStyleId, -}: DeleteBeerStyleByIdArgs): Promise | null> => { - const deleted = await DBClient.instance.beerStyle.delete({ - where: { id: beerStyleId }, - select: { - id: true, - name: true, - createdAt: true, - updatedAt: true, - abvRange: true, - ibuRange: true, - description: true, - postedBy: { select: { id: true, username: true } }, - glassware: { select: { id: true, name: true } }, - }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the ibuRange and abvRange - * fields to [number, number] in order to satisfy the zod schema. - */ - return deleted as Awaited>; -}; - -export default deleteBeerStyleById; diff --git a/src/services/posts/beer-style-post/editBeerStyleById.ts b/src/services/posts/beer-style-post/editBeerStyleById.ts deleted file mode 100644 index 07adb3f..0000000 --- a/src/services/posts/beer-style-post/editBeerStyleById.ts +++ /dev/null @@ -1,30 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import BeerStyleQueryResult from './schema/BeerStyleQueryResult'; - -const editBeerStyleById = async ( - id: string, -): Promise | null> => { - const beerStyle = await DBClient.instance.beerStyle.findUnique({ - where: { id }, - select: { - id: true, - name: true, - postedBy: { select: { id: true, username: true } }, - createdAt: true, - updatedAt: true, - abvRange: true, - ibuRange: true, - description: true, - glassware: { select: { id: true, name: true } }, - }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the ibuRange and abvRange - * fields to [number, number] in order to satisfy the zod schema. - */ - return beerStyle as Awaited>; -}; - -export default editBeerStyleById; diff --git a/src/services/posts/beer-style-post/getAllBeerStyles.ts b/src/services/posts/beer-style-post/getAllBeerStyles.ts deleted file mode 100644 index 65df57b..0000000 --- a/src/services/posts/beer-style-post/getAllBeerStyles.ts +++ /dev/null @@ -1,37 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import BeerStyleQueryResult from './schema/BeerStyleQueryResult'; - -interface GetAllBeerStylesArgs { - pageNum: number; - pageSize: number; -} - -const getAllBeerStyles = async ({ - pageNum, - pageSize, -}: GetAllBeerStylesArgs): Promise[]> => { - const beerStyles = await DBClient.instance.beerStyle.findMany({ - take: pageSize, - skip: (pageNum - 1) * pageSize, - select: { - id: true, - name: true, - postedBy: { select: { id: true, username: true } }, - createdAt: true, - updatedAt: true, - abvRange: true, - ibuRange: true, - description: true, - glassware: { select: { id: true, name: true } }, - }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the ibuRange and abvRange - * fields to [number, number] in order to satisfy the zod schema. - */ - return beerStyles as Awaited>; -}; - -export default getAllBeerStyles; diff --git a/src/services/posts/beer-style-post/getBeerStyleById.ts b/src/services/posts/beer-style-post/getBeerStyleById.ts deleted file mode 100644 index 688fcda..0000000 --- a/src/services/posts/beer-style-post/getBeerStyleById.ts +++ /dev/null @@ -1,30 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import BeerStyleQueryResult from './schema/BeerStyleQueryResult'; - -const getBeerStyleById = async ( - id: string, -): Promise | null> => { - const beerStyle = await DBClient.instance.beerStyle.findUnique({ - where: { id }, - select: { - id: true, - name: true, - postedBy: { select: { id: true, username: true } }, - createdAt: true, - updatedAt: true, - abvRange: true, - ibuRange: true, - description: true, - glassware: { select: { id: true, name: true } }, - }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the ibuRange and abvRange - * fields to [number, number] in order to satisfy the zod schema. - */ - return beerStyle as Awaited>; -}; - -export default getBeerStyleById; diff --git a/src/services/posts/beer-style-post/index.ts b/src/services/posts/beer-style-post/index.ts new file mode 100644 index 0000000..0a18b28 --- /dev/null +++ b/src/services/posts/beer-style-post/index.ts @@ -0,0 +1,182 @@ +import DBClient from '@/prisma/DBClient'; +import ServerError from '@/config/util/ServerError'; +import type { + CreateBeerStyle, + DeleteBeerStyleById, + EditBeerStyleById, + GetAllBeerStyles, + GetBeerStyleById, +} from '@/services/posts/beer-style-post/types'; + +/** + * The select object for retrieving beer styles. + * + * Satisfies the BeerStyleQueryResult zod schema. + * + * @remarks + * Prisma does not support tuples, so we have to typecast the ibuRange and abvRange fields + * to satisfy the zod schema. + * @example + * const beerStyles = await DBClient.instance.beerStyle.findMany({ + * select: beerStyleSelect, + * }); + */ +const beerStyleSelect = { + id: true, + name: true, + createdAt: true, + updatedAt: true, + abvRange: true, + ibuRange: true, + description: true, + postedBy: { select: { id: true, username: true } }, + glassware: { select: { id: true, name: true } }, +} as const; + +/** + * Deletes a beer style by id. + * + * @param args - The arguments for the service. + * @param args.beerStyleId - The id of the beer style to delete. + * @returns The deleted beer style. + */ +export const deleteBeerStyleService: DeleteBeerStyleById = async ({ beerStyleId }) => { + const deleted = await DBClient.instance.beerStyle.delete({ + where: { id: beerStyleId }, + select: beerStyleSelect, + }); + + return deleted as Awaited>; +}; + +/** + * Edits a beer style by id. + * + * @param args - The arguments for the service. + * @param args.beerStyleId - The id of the beer style to edit. + * @param args.body - The data to update the beer style with. + * @param args.body.abvRange - The abv range of the beer style. + * @param args.body.description - The description of the beer style. + * @param args.body.glasswareId - The id of the glassware to connect to the beer style. + * @param args.body.ibuRange - The ibu range of the beer style. + * @param args.body.name - The name of the beer style. + * @returns The updated beer style. + */ +export const editBeerStyleService: EditBeerStyleById = async ({ beerStyleId, body }) => { + const { abvRange, description, glasswareId, ibuRange, name } = body; + + const glassware = await DBClient.instance.glassware.findUnique({ + where: { id: glasswareId }, + select: { id: true }, + }); + + if (!glassware) { + throw new ServerError( + 'A glassware with that id does not exist and cannot be connected.', + 404, + ); + } + + const updated = await DBClient.instance.beerStyle.update({ + where: { id: beerStyleId }, + data: { + abvRange, + description, + ibuRange, + name, + glassware: { connect: { id: glasswareId } }, + }, + select: beerStyleSelect, + }); + + return updated as Awaited>; +}; + +/** + * Gets all beer styles with pagination. + * + * @param args - The arguments for the service. + * @param args.pageNum - The page number of the results. + * @param args.pageSize - The page size of the results. + * @returns The beer styles and the total count of beer styles. + */ +export const getAllBeerStylesService: GetAllBeerStyles = async ({ + pageNum, + pageSize, +}) => { + const beerStyles = await DBClient.instance.beerStyle.findMany({ + take: pageSize, + skip: (pageNum - 1) * pageSize, + select: beerStyleSelect, + }); + + const beerStyleCount = await DBClient.instance.beerStyle.count(); + + return { + beerStyles: beerStyles as Awaited< + ReturnType + >['beerStyles'], + beerStyleCount, + }; +}; + +/** + * Gets a beer style by id. + * + * @param args - The arguments for the service. + * @param args.beerStyleId - The id of the beer style to get. + * @returns The beer style. + */ +export const getBeerStyleByIdService: GetBeerStyleById = async ({ beerStyleId }) => { + const beerStyle = await DBClient.instance.beerStyle.findUnique({ + where: { id: beerStyleId }, + select: beerStyleSelect, + }); + + return beerStyle as Awaited>; +}; + +/** + * Creates a beer style. + * + * @param args - The arguments for the service. + * @param args.body - The data to create the beer style with. + * @param args.body.abvRange - The abv range of the beer style. + * @param args.body.description - The description of the beer style. + * @param args.body.glasswareId - The id of the glassware to connect to the beer style. + * @param args.body.ibuRange - The ibu range of the beer style. + * @param args.body.name - The name of the beer style. + * @param args.glasswareId - The id of the glassware to connect to the beer style. + * @param args.postedById - The id of the user who posted the beer style. + */ +export const createBeerStyleService: CreateBeerStyle = async ({ + body: { abvRange, description, ibuRange, name }, + glasswareId, + postedById, +}) => { + const glassware = await DBClient.instance.glassware.findUnique({ + where: { id: glasswareId }, + select: { id: true }, + }); + + if (!glassware) { + throw new ServerError( + 'A glassware with that id does not exist and cannot be connected.', + 404, + ); + } + + const beerStyle = await DBClient.instance.beerStyle.create({ + data: { + name, + description, + abvRange, + ibuRange, + glassware: { connect: { id: glasswareId } }, + postedBy: { connect: { id: postedById } }, + }, + select: beerStyleSelect, + }); + + return beerStyle as Awaited>; +}; diff --git a/src/services/posts/beer-style-post/types/index.ts b/src/services/posts/beer-style-post/types/index.ts new file mode 100644 index 0000000..9790bf7 --- /dev/null +++ b/src/services/posts/beer-style-post/types/index.ts @@ -0,0 +1,39 @@ +import { z } from 'zod'; +import BeerStyleQueryResult from '../schema/BeerStyleQueryResult'; + +type BeerStyle = z.infer; + +export type GetBeerStyleById = (args: { + beerStyleId: string; +}) => Promise; + +export type DeleteBeerStyleById = (args: { + beerStyleId: string; +}) => Promise; + +export type EditBeerStyleById = (args: { + beerStyleId: string; + body: { + name: string; + description: string; + abvRange: [number, number]; + ibuRange: [number, number]; + glasswareId: string; + }; +}) => Promise; + +export type GetAllBeerStyles = (args: { pageNum: number; pageSize: number }) => Promise<{ + beerStyles: BeerStyle[]; + beerStyleCount: number; +}>; + +export type CreateBeerStyle = (args: { + body: { + name: string; + description: string; + abvRange: [number, number]; + ibuRange: [number, number]; + }; + glasswareId: string; + postedById: string; +}) => Promise; diff --git a/src/services/posts/brewery-post/createNewBreweryPost.ts b/src/services/posts/brewery-post/createNewBreweryPost.ts deleted file mode 100644 index cdcc66a..0000000 --- a/src/services/posts/brewery-post/createNewBreweryPost.ts +++ /dev/null @@ -1,64 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import CreateBreweryPostSchema from './schema/CreateBreweryPostSchema'; -import BreweryPostQueryResult from './schema/BreweryPostQueryResult'; - -const CreateNewBreweryPostWithUserAndLocationSchema = CreateBreweryPostSchema.omit({ - address: true, - city: true, - country: true, - stateOrProvince: true, -}).extend({ - userId: z.string().cuid(), - locationId: z.string().cuid(), -}); - -const createNewBreweryPost = async ({ - dateEstablished, - description, - locationId, - name, - userId, -}: z.infer): Promise< - z.infer -> => { - const post = (await DBClient.instance.breweryPost.create({ - data: { - name, - description, - dateEstablished, - location: { connect: { id: locationId } }, - postedBy: { connect: { id: userId } }, - }, - select: { - id: true, - name: true, - description: true, - createdAt: true, - dateEstablished: true, - postedBy: { select: { id: true, username: true } }, - breweryImages: { - select: { - path: true, - caption: true, - id: true, - alt: true, - createdAt: true, - updatedAt: true, - }, - }, - location: { - select: { - city: true, - address: true, - coordinates: true, - country: true, - stateOrProvince: true, - }, - }, - }, - })) as Awaited>; - - return post; -}; -export default createNewBreweryPost; diff --git a/src/services/posts/brewery-post/getAllBreweryPosts.ts b/src/services/posts/brewery-post/getAllBreweryPosts.ts deleted file mode 100644 index b3540f5..0000000 --- a/src/services/posts/brewery-post/getAllBreweryPosts.ts +++ /dev/null @@ -1,55 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; - -import { z } from 'zod'; - -const prisma = DBClient.instance; - -const getAllBreweryPosts = async ({ - pageNum, - pageSize, -}: { - pageNum: number; - pageSize: number; -}): Promise[]> => { - const breweryPosts = await prisma.breweryPost.findMany({ - take: pageSize, - skip: (pageNum - 1) * pageSize, - select: { - id: true, - location: { - select: { - city: true, - address: true, - coordinates: true, - country: true, - stateOrProvince: true, - }, - }, - description: true, - name: true, - postedBy: { select: { username: true, id: true } }, - breweryImages: { - select: { - path: true, - caption: true, - id: true, - alt: true, - createdAt: true, - updatedAt: true, - }, - }, - createdAt: true, - dateEstablished: true, - }, - orderBy: { createdAt: 'desc' }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the coordinates field to - * [number, number] in order to satisfy the zod schema. - */ - return breweryPosts as Awaited>; -}; - -export default getAllBreweryPosts; diff --git a/src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts b/src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts deleted file mode 100644 index b4820d1..0000000 --- a/src/services/posts/brewery-post/getAllBreweryPostsByPostedById.ts +++ /dev/null @@ -1,58 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; - -import { z } from 'zod'; - -const prisma = DBClient.instance; - -const getAllBreweryPostsByPostedById = async ({ - pageNum, - pageSize, - postedById, -}: { - pageNum: number; - pageSize: number; - postedById: string; -}): Promise[]> => { - const breweryPosts = await prisma.breweryPost.findMany({ - where: { postedBy: { id: postedById } }, - take: pageSize, - skip: (pageNum - 1) * pageSize, - select: { - id: true, - location: { - select: { - city: true, - address: true, - coordinates: true, - country: true, - stateOrProvince: true, - }, - }, - description: true, - name: true, - postedBy: { select: { username: true, id: true } }, - breweryImages: { - select: { - path: true, - caption: true, - id: true, - alt: true, - createdAt: true, - updatedAt: true, - }, - }, - createdAt: true, - dateEstablished: true, - }, - orderBy: { createdAt: 'desc' }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the coordinates field to - * [number, number] in order to satisfy the zod schema. - */ - return breweryPosts as Awaited>; -}; - -export default getAllBreweryPostsByPostedById; diff --git a/src/services/posts/brewery-post/getBreweryPostById.ts b/src/services/posts/brewery-post/getBreweryPostById.ts deleted file mode 100644 index 46886fe..0000000 --- a/src/services/posts/brewery-post/getBreweryPostById.ts +++ /dev/null @@ -1,46 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import BreweryPostQueryResult from '@/services/posts/brewery-post/schema/BreweryPostQueryResult'; -import { z } from 'zod'; - -const prisma = DBClient.instance; - -const getBreweryPostById = async (id: string) => { - const breweryPost = await prisma.breweryPost.findFirst({ - select: { - id: true, - location: { - select: { - city: true, - address: true, - coordinates: true, - country: true, - stateOrProvince: true, - }, - }, - description: true, - name: true, - breweryImages: { - select: { - path: true, - caption: true, - id: true, - alt: true, - createdAt: true, - updatedAt: true, - }, - }, - postedBy: { select: { username: true, id: true } }, - createdAt: true, - dateEstablished: true, - }, - where: { id }, - }); - - /** - * Prisma does not support tuples, so we have to typecast the coordinates field to - * [number, number] in order to satisfy the zod schema. - */ - return breweryPost as z.infer | null; -}; - -export default getBreweryPostById; diff --git a/src/services/posts/brewery-post/index.ts b/src/services/posts/brewery-post/index.ts new file mode 100644 index 0000000..a055c68 --- /dev/null +++ b/src/services/posts/brewery-post/index.ts @@ -0,0 +1,207 @@ +import DBClient from '@/prisma/DBClient'; + +import { + CreateBreweryPostLocation, + CreateNewBreweryPost, + GetAllBreweryPosts, + GetAllBreweryPostsByPostedById, + GetBreweryPostById, + GetMapBreweryPosts, +} from './types'; + +/** + * The select object to use when querying for brewery posts. + * + * @remarks + * Prisma does not support tuples, so we have to typecast the coordinates field to + * [number, number] in order to satisfy the zod schema. + */ +const breweryPostSelect = { + id: true, + name: true, + description: true, + createdAt: true, + dateEstablished: true, + postedBy: { select: { id: true, username: true } }, + breweryImages: { + select: { + path: true, + caption: true, + id: true, + alt: true, + createdAt: true, + updatedAt: true, + }, + }, + location: { + select: { + city: true, + address: true, + coordinates: true, + country: true, + stateOrProvince: true, + }, + }, +} as const; + +/** + * Creates a new brewery post. + * + * @param args - The arguments to create a new brewery post. + * @param args.name - The name of the brewery. + * @param args.description - The description of the brewery. + * @param args.dateEstablished - The date the brewery was established. + * @param args.userId - The id of the user who created the brewery post. + * @param args.locationId - The id of the location of the brewery. + * @returns The newly created brewery post. + */ +export const createNewBreweryPostService: CreateNewBreweryPost = async ({ + dateEstablished, + description, + locationId, + name, + userId, +}) => { + const post = (await DBClient.instance.breweryPost.create({ + data: { + name, + description, + dateEstablished, + location: { connect: { id: locationId } }, + postedBy: { connect: { id: userId } }, + }, + select: breweryPostSelect, + })) as Awaited>; + + return post; +}; + +/** + * Retrieves all brewery posts paginated. + * + * @param args - The arguments to get all brewery posts. + * @param args.pageNum - The page number of the brewery posts to get. + * @param args.pageSize - The number of brewery posts to get per page. + * @returns All brewery posts. + */ +export const getAllBreweryPostsService: GetAllBreweryPosts = async ({ + pageNum, + pageSize, +}) => { + const breweryPosts = (await DBClient.instance.breweryPost.findMany({ + take: pageSize, + skip: (pageNum - 1) * pageSize, + select: breweryPostSelect, + orderBy: { createdAt: 'desc' }, + })) as Awaited>['breweryPosts']; + + const count = await DBClient.instance.breweryPost.count(); + return { breweryPosts, count }; +}; + +/** + * Retrieves a brewery post by ID. + * + * @param args - The arguments to get a brewery post by ID. + * @param args.breweryPostId - The ID of the brewery post to get. + * @returns The brewery post. + */ +export const getBreweryPostByIdService: GetBreweryPostById = async ({ + breweryPostId, +}) => { + const breweryPost = await DBClient.instance.breweryPost.findFirst({ + select: breweryPostSelect, + where: { id: breweryPostId }, + }); + + return breweryPost as Awaited>; +}; + +/** + * Retrieves all brewery posts by posted by ID. + * + * @param args - The arguments to get all brewery posts by posted by ID. + * @param args.pageNum - The page number of the brewery posts to get. + * @param args.pageSize - The number of brewery posts to get per page. + * @param args.postedById - The ID of the user who posted the brewery posts. + */ +export const getAllBreweryPostsByPostedByIdService: GetAllBreweryPostsByPostedById = + async ({ pageNum, pageSize, postedById }) => { + const breweryPosts = (await DBClient.instance.breweryPost.findMany({ + where: { postedBy: { id: postedById } }, + take: pageSize, + skip: (pageNum - 1) * pageSize, + select: breweryPostSelect, + orderBy: { createdAt: 'desc' }, + })) as Awaited< + ReturnType + >['breweryPosts']; + + const count = await DBClient.instance.breweryPost.count({ + where: { postedBy: { id: postedById } }, + }); + + return { breweryPosts, count }; + }; + +/** + * Creates a brewery post location. + * + * @param args - The arguments to create a brewery post location. + * @param args.body - The body of the request. + * @param args.body.address - The address of the brewery. + * @param args.body.city - The city of the brewery. + * @param args.body.country - The country of the brewery. + * @param args.body.stateOrProvince - The state or province of the brewery. + * @param args.body.coordinates - The coordinates of the brewery in an array of [latitude, + * longitude]. + * @param args.postedById - The ID of the user who posted the brewery post. + * @returns The newly created brewery post location. + */ +export const createBreweryPostLocationService: CreateBreweryPostLocation = async ({ + body: { address, city, country, stateOrProvince, coordinates }, + postedById, +}) => { + const [latitude, longitude] = coordinates; + + return DBClient.instance.breweryLocation.create({ + data: { + address, + city, + country, + stateOrProvince, + coordinates: [latitude, longitude], + postedBy: { connect: { id: postedById } }, + }, + select: { id: true }, + }); +}; + +/** + * Gets all brewery posts for the post map. + * + * @param args - The arguments to get all brewery posts for the post map. + * @param args.pageNum - The page number of the brewery posts to get. + * @param args.pageSize - The number of brewery posts to get per page. + * @returns All brewery posts for the post map. + */ +export const getMapBreweryPostsService: GetMapBreweryPosts = async ({ + pageNum, + pageSize, +}) => { + const breweryPosts = await DBClient.instance.breweryPost.findMany({ + take: pageSize, + skip: (pageNum - 1) * pageSize, + select: { + id: true, + name: true, + location: { + select: { coordinates: true, city: true, country: true, stateOrProvince: true }, + }, + }, + orderBy: { createdAt: 'desc' }, + }); + + const count = await DBClient.instance.breweryPost.count(); + return { breweryPosts, count }; +}; diff --git a/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts b/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts new file mode 100644 index 0000000..7eca3c7 --- /dev/null +++ b/src/services/posts/brewery-post/schema/CreateNewBreweryPostWithoutLocationSchema.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; +import CreateBreweryPostSchema from './CreateBreweryPostSchema'; + +const CreateNewBreweryPostWithoutLocationSchema = CreateBreweryPostSchema.omit({ + address: true, + city: true, + country: true, + stateOrProvince: true, +}).extend({ + userId: z.string().cuid(), + locationId: z.string().cuid(), +}); + +export default CreateNewBreweryPostWithoutLocationSchema; diff --git a/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts b/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts new file mode 100644 index 0000000..93ced18 --- /dev/null +++ b/src/services/posts/brewery-post/schema/GetMapBreweryPostsSchema.ts @@ -0,0 +1,14 @@ +import { z } from 'zod'; + +const GetMapBreweryPostsSchema = z.object({ + name: z.string(), + id: z.string().cuid(), + location: z.object({ + city: z.string(), + country: z.string().nullable(), + stateOrProvince: z.string().nullable(), + coordinates: z.array(z.number(), z.number()), + }), +}); + +export default GetMapBreweryPostsSchema; diff --git a/src/services/posts/brewery-post/types/index.ts b/src/services/posts/brewery-post/types/index.ts new file mode 100644 index 0000000..92f5221 --- /dev/null +++ b/src/services/posts/brewery-post/types/index.ts @@ -0,0 +1,48 @@ +import { z } from 'zod'; +import BreweryPostQueryResult from '../schema/BreweryPostQueryResult'; +import CreateNewBreweryPostWithoutLocationSchema from '../schema/CreateNewBreweryPostWithoutLocationSchema'; +import BreweryPostMapQueryResult from '../schema/BreweryPostMapQueryResult'; + +export type CreateNewBreweryPost = ( + args: z.infer, +) => Promise>; + +export type GetAllBreweryPosts = (args: { + pageNum: number; + pageSize: number; +}) => Promise<{ + breweryPosts: z.infer[]; + count: number; +}>; + +export type GetBreweryPostById = (args: { + breweryPostId: string; +}) => Promise | null>; + +export type GetAllBreweryPostsByPostedById = (args: { + pageNum: number; + pageSize: number; + postedById: string; +}) => Promise<{ + breweryPosts: z.infer[]; + count: number; +}>; + +export type CreateBreweryPostLocation = (args: { + body: { + address: string; + city: string; + country?: string; + stateOrProvince?: string; + coordinates: [number, number]; + }; + postedById: string; +}) => Promise<{ id: string }>; + +export type GetMapBreweryPosts = (args: { + pageNum: number; + pageSize: number; +}) => Promise<{ + breweryPosts: z.infer[]; + count: number; +}>; From bffa28b93dc8b8c1c2787b4e112853ccc8a4ebbc Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 17 Dec 2023 13:39:50 -0500 Subject: [PATCH 20/21] Update user auth services --- public/robots.txt | 1 - src/config/auth/localStrat.ts | 4 +- .../nextConnect/middleware/getCurrentUser.ts | 5 +- .../likes/brewery-post-likes/index.ts | 12 +- src/controllers/users/auth/index.ts | 104 +++--- src/controllers/users/profile/index.ts | 107 +++--- src/emails/ForgotEmail.tsx | 6 +- src/emails/{Welcome.tsx => WelcomeEmail.tsx} | 6 +- .../user-follows/useGetUsersFollowedByUser.ts | 2 +- .../user-follows/useGetUsersFollowingUser.ts | 2 +- src/pages/users/[id].tsx | 5 +- src/pages/users/reset-password.tsx | 6 +- .../account/UpdateUserAvatarByIdParams.ts | 55 ---- src/services/users/auth/createNewUser.ts | 44 --- src/services/users/auth/deleteUserById.ts | 28 -- src/services/users/auth/findUserByEmail.ts | 13 - src/services/users/auth/findUserById.ts | 37 --- src/services/users/auth/findUserByIdPublic.ts | 23 -- src/services/users/auth/findUserByUsername.ts | 13 - src/services/users/auth/index.ts | 307 ++++++++++++++++++ .../users/auth/schema/PublicUserSchema.ts | 11 - .../users/auth/sendConfirmationEmail.ts | 29 -- .../users/auth/sendResetPasswordEmail.ts | 30 -- src/services/users/auth/types/index.ts | 47 +++ .../users/auth/updateUserProfileById.ts | 33 -- .../users/auth/updateUserToBeConfirmedById.ts | 37 --- .../users/follows/getUsersFollowedByUser.ts | 27 -- .../users/follows/getUsersFollowingUser.ts | 27 -- src/services/users/profile/index.ts | 193 +++++++++++ .../schema/FollowInfoSchema.ts | 0 src/services/users/profile/types/index.ts | 38 +++ 31 files changed, 700 insertions(+), 552 deletions(-) rename src/emails/{Welcome.tsx => WelcomeEmail.tsx} (91%) delete mode 100644 src/services/users/account/UpdateUserAvatarByIdParams.ts delete mode 100644 src/services/users/auth/createNewUser.ts delete mode 100644 src/services/users/auth/deleteUserById.ts delete mode 100644 src/services/users/auth/findUserByEmail.ts delete mode 100644 src/services/users/auth/findUserById.ts delete mode 100644 src/services/users/auth/findUserByIdPublic.ts delete mode 100644 src/services/users/auth/findUserByUsername.ts create mode 100644 src/services/users/auth/index.ts delete mode 100644 src/services/users/auth/schema/PublicUserSchema.ts delete mode 100644 src/services/users/auth/sendConfirmationEmail.ts delete mode 100644 src/services/users/auth/sendResetPasswordEmail.ts create mode 100644 src/services/users/auth/types/index.ts delete mode 100644 src/services/users/auth/updateUserProfileById.ts delete mode 100644 src/services/users/auth/updateUserToBeConfirmedById.ts delete mode 100644 src/services/users/follows/getUsersFollowedByUser.ts delete mode 100644 src/services/users/follows/getUsersFollowingUser.ts create mode 100644 src/services/users/profile/index.ts rename src/services/users/{follows => profile}/schema/FollowInfoSchema.ts (100%) create mode 100644 src/services/users/profile/types/index.ts diff --git a/public/robots.txt b/public/robots.txt index e80fa28..064ec2f 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -3,4 +3,3 @@ Disallow: /api/ Disallow: /login/ Disallow: /register/ Disallow: /users/ -Disallow: /account/ diff --git a/src/config/auth/localStrat.ts b/src/config/auth/localStrat.ts index 614bd45..84df138 100644 --- a/src/config/auth/localStrat.ts +++ b/src/config/auth/localStrat.ts @@ -1,11 +1,11 @@ -import findUserByUsername from '@/services/users/auth/findUserByUsername'; import Local from 'passport-local'; +import { findUserByUsername } from '@/services/users/auth'; import ServerError from '../util/ServerError'; import { validatePassword } from './passwordFns'; const localStrat = new Local.Strategy(async (username, password, done) => { try { - const user = await findUserByUsername(username); + const user = await findUserByUsername({ username }); if (!user) { throw new ServerError('Username or password is incorrect.', 401); } diff --git a/src/config/nextConnect/middleware/getCurrentUser.ts b/src/config/nextConnect/middleware/getCurrentUser.ts index 24f5f43..e907a27 100644 --- a/src/config/nextConnect/middleware/getCurrentUser.ts +++ b/src/config/nextConnect/middleware/getCurrentUser.ts @@ -1,9 +1,10 @@ import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; -import findUserById from '@/services/users/auth/findUserById'; + import ServerError from '@/config/util/ServerError'; import { getLoginSession } from '../../auth/session'; import { UserExtendedNextApiRequest } from '../../auth/types'; +import { findUserById } from '@/services/users/auth'; /** Get the current user from the session. Adds the user to the request object. */ const getCurrentUser = async ( @@ -12,7 +13,7 @@ const getCurrentUser = async ( next: NextHandler, ) => { const session = await getLoginSession(req); - const user = await findUserById(session?.id); + const user = await findUserById({ userId: session?.id }); if (!user) { throw new ServerError('User is not logged in.', 401); diff --git a/src/controllers/likes/brewery-post-likes/index.ts b/src/controllers/likes/brewery-post-likes/index.ts index 9839030..6eeb790 100644 --- a/src/controllers/likes/brewery-post-likes/index.ts +++ b/src/controllers/likes/brewery-post-likes/index.ts @@ -1,12 +1,13 @@ import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; + import { createBreweryPostLikeService, findBreweryPostLikeService, getBreweryPostLikeCountService, removeBreweryPostLikeService, } from '@/services/likes/brewery-post-like'; +import { getBreweryPostByIdService } from '@/services/posts/brewery-post'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse, NextApiRequest } from 'next'; import { z } from 'zod'; @@ -18,9 +19,7 @@ export const sendBreweryPostLikeRequest = async ( const id = req.query.id! as string; const user = req.user!; - const breweryPost = await DBClient.instance.breweryPost.findUnique({ - where: { id }, - }); + const breweryPost = await getBreweryPostByIdService({ breweryPostId: id }); if (!breweryPost) { throw new ServerError('Could not find a brewery post with that id', 404); @@ -59,10 +58,7 @@ export const getBreweryPostLikeCount = async ( ) => { const id = req.query.id! as string; - const breweryPost = await DBClient.instance.breweryPost.findUnique({ - where: { id }, - }); - + const breweryPost = await getBreweryPostByIdService({ breweryPostId: id }); if (!breweryPost) { throw new ServerError('Could not find a brewery post with that id', 404); } diff --git a/src/controllers/users/auth/index.ts b/src/controllers/users/auth/index.ts index d012315..4477f9e 100644 --- a/src/controllers/users/auth/index.ts +++ b/src/controllers/users/auth/index.ts @@ -3,24 +3,33 @@ import localStrat from '@/config/auth/localStrat'; import { getLoginSession, setLoginSession } from '@/config/auth/session'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; import ServerError from '@/config/util/ServerError'; -import createNewUser from '@/services/users/auth/createNewUser'; -import findUserByEmail from '@/services/users/auth/findUserByEmail'; + import { NextApiRequest, NextApiResponse } from 'next'; import { expressWrapper } from 'next-connect'; import passport from 'passport'; import { z } from 'zod'; -import findUserByUsername from '@/services/users/auth/findUserByUsername'; import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; -import sendConfirmationEmail from '@/services/users/auth/sendConfirmationEmail'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import type { NextFunction } from 'express'; import { verifyConfirmationToken } from '@/config/jwt'; -import updateUserToBeConfirmedById from '@/services/users/auth/updateUserToBeConfirmedById'; -import DBClient from '@/prisma/DBClient'; -import sendResetPasswordEmail from '@/services/users/auth/sendResetPasswordEmail'; + import { hashPassword } from '@/config/auth/passwordFns'; -import deleteUserById from '@/services/users/auth/deleteUserById'; + +import { + createNewUser, + deleteUserById, + findUserByEmail, + findUserByUsername, + sendConfirmationEmail, + sendResetPasswordEmail, + updateUserById, + updateUserPassword, + updateUserToBeConfirmedById, +} from '@/services/users/auth'; + +import { EditUserRequest, UserRouteRequest } from '@/controllers/users/profile/types'; import { CheckEmailRequest, CheckUsernameRequest, @@ -29,7 +38,6 @@ import { TokenValidationRequest, UpdatePasswordRequest, } from './types'; -import { EditUserRequest, UserRouteRequest } from '../profile/types'; export const authenticateUser = expressWrapper( async ( @@ -88,10 +96,12 @@ export const registerUser = async ( req: RegisterUserRequest, res: NextApiResponse>, ) => { - const [usernameTaken, emailTaken] = await Promise.all([ - findUserByUsername(req.body.username), - findUserByEmail(req.body.email), - ]); + const [usernameTaken, emailTaken] = ( + await Promise.all([ + findUserByUsername({ username: req.body.username }), + findUserByEmail({ email: req.body.email }), + ]) + ).map((user) => !!user); if (usernameTaken) { throw new ServerError( @@ -114,7 +124,11 @@ export const registerUser = async ( username: user.username, }); - await sendConfirmationEmail(user); + await sendConfirmationEmail({ + email: user.email, + username: user.username, + userId: user.id, + }); res.status(201).json({ success: true, @@ -141,7 +155,7 @@ export const confirmUser = async ( throw new ServerError('Could not confirm user.', 401); } - await updateUserToBeConfirmedById(id); + await updateUserToBeConfirmedById({ userId: id }); res.status(200).json({ message: 'User confirmed successfully.', @@ -156,12 +170,14 @@ export const resetPassword = async ( ) => { const { email } = req.body; - const user = await DBClient.instance.user.findUnique({ - where: { email }, - }); + const user = await findUserByEmail({ email }); if (user) { - await sendResetPasswordEmail(user); + await sendResetPasswordEmail({ + email: user.email, + username: user.username, + userId: user.id, + }); } res.status(200).json({ @@ -188,7 +204,7 @@ export const sendCurrentUser = async ( export const checkEmail = async (req: CheckEmailRequest, res: NextApiResponse) => { const { email: emailToCheck } = req.query; - const email = await findUserByEmail(emailToCheck); + const email = await findUserByEmail({ email: emailToCheck }); res.json({ success: true, @@ -201,7 +217,7 @@ export const checkEmail = async (req: CheckEmailRequest, res: NextApiResponse) = export const checkUsername = async (req: CheckUsernameRequest, res: NextApiResponse) => { const { username: usernameToCheck } = req.query; - const username = await findUserByUsername(usernameToCheck); + const username = await findUserByUsername({ username: usernameToCheck }); res.json({ success: true, @@ -215,14 +231,10 @@ export const updatePassword = async ( req: UpdatePasswordRequest, res: NextApiResponse>, ) => { - const { password } = req.body; - const hash = await hashPassword(password); - const user = req.user!; - await DBClient.instance.user.update({ - data: { hash }, - where: { id: user.id }, - }); + const { password } = req.body; + + await updateUserPassword({ userId: user.id, password: await hashPassword(password) }); res.json({ message: 'Updated user password.', @@ -237,7 +249,11 @@ export const resendConfirmation = async ( ) => { const user = req.user!; - await sendConfirmationEmail(user); + await sendConfirmationEmail({ + userId: user.id, + username: user.username, + email: user.email, + }); res.status(200).json({ message: `Resent the confirmation email for ${user.username}.`, statusCode: 200, @@ -251,31 +267,9 @@ export const editUserInfo = async ( ) => { const { email, firstName, lastName, username } = req.body; - const [usernameIsTaken, emailIsTaken] = await Promise.all([ - findUserByUsername(username), - findUserByEmail(email), - ]); - - const emailChanged = req.user!.email !== email; - const usernameChanged = req.user!.username !== username; - - if (emailIsTaken && emailChanged) { - throw new ServerError('Email is already taken', 400); - } - - if (usernameIsTaken && usernameChanged) { - throw new ServerError('Username is already taken', 400); - } - - const updatedUser = await DBClient.instance.user.update({ - where: { id: req.user!.id }, - data: { - email, - firstName, - lastName, - username, - accountIsVerified: emailChanged ? false : undefined, - }, + const updatedUser = await updateUserById({ + userId: req.user!.id, + data: { email, firstName, lastName, username }, }); res.json({ @@ -291,7 +285,7 @@ export const deleteAccount = async ( res: NextApiResponse>, ) => { const { id } = req.query; - const deletedUser = await deleteUserById(id); + const deletedUser = await deleteUserById({ userId: id }); if (!deletedUser) { throw new ServerError('Could not find a user with that id.', 400); diff --git a/src/controllers/users/profile/index.ts b/src/controllers/users/profile/index.ts index de93f05..357a26e 100644 --- a/src/controllers/users/profile/index.ts +++ b/src/controllers/users/profile/index.ts @@ -1,17 +1,23 @@ import ServerError from '@/config/util/ServerError'; -import DBClient from '@/prisma/DBClient'; -import findUserById from '@/services/users/auth/findUserById'; + import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import { NextApiResponse } from 'next'; import { z } from 'zod'; import { NextHandler } from 'next-connect'; -import updateUserAvatarById, { - UpdateUserAvatarByIdParams, -} from '@/services/users/account/UpdateUserAvatarByIdParams'; + import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import updateUserProfileById from '@/services/users/auth/updateUserProfileById'; -import getUsersFollowingUser from '@/services/users/follows/getUsersFollowingUser'; -import getUsersFollowedByUser from '@/services/users/follows/getUsersFollowedByUser'; + +import { findUserById } from '@/services/users/auth'; + +import { + createUserFollow, + deleteUserFollow, + findUserFollow, + getUsersFollowedByUser, + getUsersFollowingUser, + updateUserAvatar, + updateUserProfileById, +} from '@/services/users/profile'; import { UserRouteRequest, GetUserFollowInfoRequest, @@ -26,24 +32,19 @@ export const followUser = async ( ) => { const { id } = req.query; - const user = await findUserById(id); + const user = await findUserById({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } const currentUser = req.user!; - const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ - where: { - followerId: currentUser.id, - followingId: id, - }, + const userIsFollowedBySessionUser = await findUserFollow({ + followerId: currentUser.id, + followingId: id, }); if (!userIsFollowedBySessionUser) { - await DBClient.instance.userFollow.create({ - data: { followerId: currentUser.id, followingId: id }, - }); - + await createUserFollow({ followerId: currentUser.id, followingId: id }); res.status(200).json({ message: 'Now following user.', success: true, @@ -53,14 +54,7 @@ export const followUser = async ( return; } - await DBClient.instance.userFollow.delete({ - where: { - followerId_followingId: { - followerId: currentUser.id, - followingId: id, - }, - }, - }); + await deleteUserFollow({ followerId: currentUser.id, followingId: id }); res.status(200).json({ message: 'No longer following user.', @@ -76,7 +70,7 @@ export const getUserFollowers = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { id, page_num, page_size } = req.query; - const user = await findUserById(id); + const user = await findUserById({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } @@ -84,20 +78,17 @@ export const getUserFollowers = async ( const pageNum = parseInt(page_num, 10); const pageSize = parseInt(page_size, 10); - const following = await getUsersFollowingUser({ + const { follows, count } = await getUsersFollowingUser({ userId: id, pageNum, pageSize, }); - const followingCount = await DBClient.instance.userFollow.count({ - where: { following: { id } }, - }); - res.setHeader('X-Total-Count', followingCount); + res.setHeader('X-Total-Count', count); res.json({ message: 'Retrieved users that are followed by queried user', - payload: following, + payload: follows, success: true, statusCode: 200, }); @@ -110,7 +101,7 @@ export const getUsersFollowed = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { id, page_num, page_size } = req.query; - const user = await findUserById(id); + const user = await findUserById({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } @@ -118,20 +109,17 @@ export const getUsersFollowed = async ( const pageNum = parseInt(page_num, 10); const pageSize = parseInt(page_size, 10); - const following = await getUsersFollowedByUser({ + const { follows, count } = await getUsersFollowedByUser({ userId: id, pageNum, pageSize, }); - const followingCount = await DBClient.instance.userFollow.count({ - where: { follower: { id } }, - }); - res.setHeader('X-Total-Count', followingCount); + res.setHeader('X-Total-Count', count); res.json({ message: 'Retrieved users that are followed by queried user', - payload: following, + payload: follows, success: true, statusCode: 200, }); @@ -143,33 +131,27 @@ export const checkIfUserIsFollowedBySessionUser = async ( ) => { const { id } = req.query; - const user = await findUserById(id); + const user = await findUserById({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } const currentUser = req.user!; - const userIsFollowedBySessionUser = await DBClient.instance.userFollow.findFirst({ - where: { followerId: currentUser.id, followingId: id }, + const userFollow = await findUserFollow({ + followerId: currentUser.id, + followingId: id, }); - if (!userIsFollowedBySessionUser) { - res.status(200).json({ - message: 'User is not followed by the current user.', - success: true, - statusCode: 200, - payload: { isFollowed: false }, - }); - - return; - } + const isFollowed = !!userFollow; res.status(200).json({ - message: 'User is followed by the current user.', + message: isFollowed + ? 'User is followed by the session user.' + : 'User is not followed by the session user.', success: true, statusCode: 200, - payload: { isFollowed: true }, + payload: { isFollowed }, }); }; @@ -180,7 +162,7 @@ export const checkIfUserCanEditUser = async ( ) => { const authenticatedUser = req.user!; - const userToUpdate = await findUserById(req.query.id); + const userToUpdate = await findUserById({ userId: req.query.id }); if (!userToUpdate) { throw new ServerError('User not found', 404); } @@ -209,13 +191,10 @@ export const checkIfUserCanUpdateProfile = async { const { file, user } = req; - const avatar: UpdateUserAvatarByIdParams['data']['avatar'] = { - alt: file.originalname, - path: file.path, - caption: '', - }; - - await updateUserAvatarById({ id: user!.id, data: { avatar } }); + await updateUserAvatar({ + userId: user!.id, + data: { alt: file.originalname, path: file.path, caption: '' }, + }); res.status(200).json({ message: 'User avatar updated successfully.', statusCode: 200, @@ -227,7 +206,7 @@ export const updateProfile = async (req: UpdateProfileRequest, res: NextApiRespo const user = req.user!; const { body } = req; - await updateUserProfileById({ id: user!.id, data: { bio: body.bio } }); + await updateUserProfileById({ userId: user!.id, data: { bio: body.bio } }); res.status(200).json({ message: 'Profile updated successfully.', diff --git a/src/emails/ForgotEmail.tsx b/src/emails/ForgotEmail.tsx index 5819674..8a2bad7 100644 --- a/src/emails/ForgotEmail.tsx +++ b/src/emails/ForgotEmail.tsx @@ -3,12 +3,12 @@ import { Tailwind } from '@react-email/tailwind'; import { FC } from 'react'; -interface ForgotEmailProps { +interface ResetPasswordEmailProps { name?: string; url?: string; } -const ForgotEmail: FC = ({ name, url }) => { +const ResetPasswordEmail: FC = ({ name, url }) => { return ( @@ -36,4 +36,4 @@ const ForgotEmail: FC = ({ name, url }) => { ); }; -export default ForgotEmail; +export default ResetPasswordEmail; diff --git a/src/emails/Welcome.tsx b/src/emails/WelcomeEmail.tsx similarity index 91% rename from src/emails/Welcome.tsx rename to src/emails/WelcomeEmail.tsx index 9380079..92e9513 100644 --- a/src/emails/Welcome.tsx +++ b/src/emails/WelcomeEmail.tsx @@ -3,13 +3,13 @@ import { Tailwind } from '@react-email/tailwind'; import { FC } from 'react'; -interface WelcomeEmail { +interface WelcomeEmailProps { subject?: string; name?: string; url?: string; } -const Welcome: FC = ({ name, url }) => ( +const WelcomeEmail: FC = ({ name, url }) => (
@@ -43,4 +43,4 @@ const Welcome: FC = ({ name, url }) => ( ); -export default Welcome; +export default WelcomeEmail; diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts index 85cbbc9..be56aae 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowedByUser.ts @@ -17,7 +17,7 @@ * - `mutate` A function to mutate the data. * - `error` The error object, if any. */ -import FollowInfoSchema from '@/services/users/follows/schema/FollowInfoSchema'; +import FollowInfoSchema from '@/services/users/profile/schema/FollowInfoSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts index b1e7fb9..7555995 100644 --- a/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts +++ b/src/hooks/data-fetching/user-follows/useGetUsersFollowingUser.ts @@ -1,4 +1,4 @@ -import FollowInfoSchema from '@/services/users/follows/schema/FollowInfoSchema'; +import FollowInfoSchema from '@/services/users/profile/schema/FollowInfoSchema'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import useSWRInfinite from 'swr/infinite'; import { z } from 'zod'; diff --git a/src/pages/users/[id].tsx b/src/pages/users/[id].tsx index fa48c0f..dfa99aa 100644 --- a/src/pages/users/[id].tsx +++ b/src/pages/users/[id].tsx @@ -1,5 +1,5 @@ import useMediaQuery from '@/hooks/utilities/useMediaQuery'; -import findUserById from '@/services/users/auth/findUserById'; + import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; import Head from 'next/head'; @@ -7,6 +7,7 @@ import { FC } from 'react'; import { z } from 'zod'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import UserHeader from '@/components/UserPage/UserHeader'; +import { findUserById } from '@/services/users/auth'; interface UserInfoPageProps { user: z.infer; @@ -39,7 +40,7 @@ export default UserInfoPage; export const getServerSideProps = withPageAuthRequired( async (context) => { const { id } = context.params!; - const user = await findUserById(id as string); + const user = await findUserById({ userId: id as string }); return user ? { props: { user: JSON.parse(JSON.stringify(user)) } } : { notFound: true }; diff --git a/src/pages/users/reset-password.tsx b/src/pages/users/reset-password.tsx index 0c426ba..78dea22 100644 --- a/src/pages/users/reset-password.tsx +++ b/src/pages/users/reset-password.tsx @@ -1,7 +1,7 @@ import { setLoginSession } from '@/config/auth/session'; import { verifyResetPasswordToken } from '@/config/jwt'; import ServerError from '@/config/util/ServerError'; -import findUserById from '@/services/users/auth/findUserById'; +import { findUserById } from '@/services/users/auth'; import { GetServerSideProps, NextApiResponse, NextPage } from 'next'; @@ -29,14 +29,14 @@ export const getServerSideProps: GetServerSideProps = async (context) => { const { id } = await verifyResetPasswordToken(token as string); - const user = await findUserById(id); + const user = await findUserById({ userId: id as string }); if (!user) { throw new ServerError('User not found', 404); } await setLoginSession(context.res as NextApiResponse, user); - return { redirect: { destination: '/account', permanent: false } }; + return { redirect: { destination: '/users/account', permanent: false } }; } catch (error) { return { props: {} }; } diff --git a/src/services/users/account/UpdateUserAvatarByIdParams.ts b/src/services/users/account/UpdateUserAvatarByIdParams.ts deleted file mode 100644 index 56ab286..0000000 --- a/src/services/users/account/UpdateUserAvatarByIdParams.ts +++ /dev/null @@ -1,55 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; -import { z } from 'zod'; - -export interface UpdateUserAvatarByIdParams { - id: string; - data: { - avatar: { - alt: string; - path: string; - caption: string; - }; - }; -} -const updateUserAvatarById = async ({ id, data }: UpdateUserAvatarByIdParams) => { - const user: z.infer = await DBClient.instance.user.update({ - where: { id }, - data: { - userAvatar: data.avatar - ? { - upsert: { - create: { - alt: data.avatar.alt, - path: data.avatar.path, - caption: data.avatar.caption, - }, - update: { - alt: data.avatar.alt, - path: data.avatar.path, - caption: data.avatar.caption, - }, - }, - } - : undefined, - }, - select: { - id: true, - username: true, - email: true, - bio: true, - userAvatar: true, - accountIsVerified: true, - createdAt: true, - firstName: true, - lastName: true, - updatedAt: true, - dateOfBirth: true, - role: true, - }, - }); - - return user; -}; - -export default updateUserAvatarById; diff --git a/src/services/users/auth/createNewUser.ts b/src/services/users/auth/createNewUser.ts deleted file mode 100644 index b34c61a..0000000 --- a/src/services/users/auth/createNewUser.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { hashPassword } from '@/config/auth/passwordFns'; -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import { CreateUserValidationSchema } from './schema/CreateUserValidationSchemas'; -import GetUserSchema from './schema/GetUserSchema'; - -const createNewUser = async ({ - email, - password, - firstName, - lastName, - dateOfBirth, - username, -}: z.infer) => { - const hash = await hashPassword(password); - const user: z.infer = await DBClient.instance.user.create({ - data: { - username, - email, - hash, - firstName, - lastName, - dateOfBirth: new Date(dateOfBirth), - }, - select: { - id: true, - username: true, - email: true, - firstName: true, - lastName: true, - dateOfBirth: true, - createdAt: true, - accountIsVerified: true, - updatedAt: true, - role: true, - userAvatar: true, - bio: true, - }, - }); - - return user; -}; - -export default createNewUser; diff --git a/src/services/users/auth/deleteUserById.ts b/src/services/users/auth/deleteUserById.ts deleted file mode 100644 index dd62693..0000000 --- a/src/services/users/auth/deleteUserById.ts +++ /dev/null @@ -1,28 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import GetUserSchema from './schema/GetUserSchema'; - -const deleteUserById = async (id: string) => { - const deletedUser: z.infer | null = - await DBClient.instance.user.delete({ - where: { id }, - select: { - id: true, - username: true, - email: true, - firstName: true, - lastName: true, - dateOfBirth: true, - createdAt: true, - accountIsVerified: true, - updatedAt: true, - role: true, - userAvatar: true, - bio: true, - }, - }); - - return deletedUser; -}; - -export default deleteUserById; diff --git a/src/services/users/auth/findUserByEmail.ts b/src/services/users/auth/findUserByEmail.ts deleted file mode 100644 index 6e505e1..0000000 --- a/src/services/users/auth/findUserByEmail.ts +++ /dev/null @@ -1,13 +0,0 @@ -import DBClient from '../../../prisma/DBClient'; - -const findUserByEmail = async (email: string) => - DBClient.instance.user.findFirst({ - where: { email }, - select: { - id: true, - username: true, - hash: true, - }, - }); - -export default findUserByEmail; diff --git a/src/services/users/auth/findUserById.ts b/src/services/users/auth/findUserById.ts deleted file mode 100644 index 05b1182..0000000 --- a/src/services/users/auth/findUserById.ts +++ /dev/null @@ -1,37 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import GetUserSchema from './schema/GetUserSchema'; - -const findUserById = async (id: string) => { - const user: z.infer | null = - await DBClient.instance.user.findUnique({ - where: { id }, - select: { - id: true, - username: true, - email: true, - firstName: true, - lastName: true, - dateOfBirth: true, - createdAt: true, - accountIsVerified: true, - updatedAt: true, - role: true, - userAvatar: { - select: { - path: true, - alt: true, - caption: true, - createdAt: true, - id: true, - updatedAt: true, - }, - }, - bio: true, - }, - }); - - return user; -}; - -export default findUserById; diff --git a/src/services/users/auth/findUserByIdPublic.ts b/src/services/users/auth/findUserByIdPublic.ts deleted file mode 100644 index f7509d5..0000000 --- a/src/services/users/auth/findUserByIdPublic.ts +++ /dev/null @@ -1,23 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; - -import PublicUserSchema from './schema/PublicUserSchema'; - -const findUserByIdPublic = async (id: string) => { - const user: z.infer | null = - await DBClient.instance.user.findUnique({ - where: { id }, - select: { - id: true, - username: true, - firstName: true, - lastName: true, - createdAt: true, - role: true, - }, - }); - - return user; -}; - -export default findUserByIdPublic; diff --git a/src/services/users/auth/findUserByUsername.ts b/src/services/users/auth/findUserByUsername.ts deleted file mode 100644 index b4a57ca..0000000 --- a/src/services/users/auth/findUserByUsername.ts +++ /dev/null @@ -1,13 +0,0 @@ -import DBClient from '../../../prisma/DBClient'; - -const findUserByUsername = async (username: string) => - DBClient.instance.user.findFirst({ - where: { username }, - select: { - id: true, - username: true, - hash: true, - }, - }); - -export default findUserByUsername; diff --git a/src/services/users/auth/index.ts b/src/services/users/auth/index.ts new file mode 100644 index 0000000..050f2a6 --- /dev/null +++ b/src/services/users/auth/index.ts @@ -0,0 +1,307 @@ +/* eslint-disable import/prefer-default-export */ +import { hashPassword } from '@/config/auth/passwordFns'; +import DBClient from '@/prisma/DBClient'; +import { BASE_URL } from '@/config/env'; +import { generateConfirmationToken, generateResetPasswordToken } from '@/config/jwt'; +import sendEmail from '@/config/sparkpost/sendEmail'; + +import { ReactElement } from 'react'; +import ServerError from '@/config/util/ServerError'; +import { render } from '@react-email/render'; +import WelcomeEmail from '@/emails/WelcomeEmail'; +import ResetPasswordEmail from '@/emails/ForgotEmail'; + +import { + CreateNewUser, + DeleteUserById, + FindUserByEmail, + FindUserByUsername, + FindUserById, + SendConfirmationEmail, + SendResetPasswordEmail, + UpdateUserToBeConfirmedById, + UpdateUserPassword, + UpdateUserById, +} from './types'; + +/** + * The select object for retrieving users. + * + * Satisfies the GetUserSchema zod schema. + * + * @example + * const users = await DBClient.instance.user.findMany({ + * select: userSelect, + * }); + */ +const userSelect = { + id: true, + username: true, + email: true, + firstName: true, + lastName: true, + dateOfBirth: true, + createdAt: true, + accountIsVerified: true, + updatedAt: true, + role: true, + userAvatar: true, + bio: true, +} as const; + +/** + * The select object for retrieving users without sensitive information. + * + * @example + * const user = await DBClient.instance.user.findUnique({ + * where: { id: userId }, + * select: AuthUserSelect, + * }); + */ +const authUserSelect = { + id: true, + username: true, + hash: true, +} as const; + +/** + * Creates a new user. + * + * @param args The arguments for service. + * @param args.email The email of the user to create. + * @param args.password The password of the user to create. + * @param args.firstName The first name of the user to create. + * @param args.lastName The last name of the user to create. + * @param args.dateOfBirth The date of birth of the user to create. + * @param args.username The username of the user to create. + * @returns The user. + */ +export const createNewUser: CreateNewUser = async ({ + email, + password, + firstName, + lastName, + dateOfBirth, + username, +}) => { + const hash = await hashPassword(password); + + const user = await DBClient.instance.user.create({ + data: { + username, + email, + hash, + firstName, + lastName, + dateOfBirth: new Date(dateOfBirth), + }, + select: userSelect, + }); + + return user; +}; + +/** + * Deletes a user by id. + * + * @param args The arguments for service. + * @param args.userId The id of the user to delete. + * @returns The user that was deleted if found, otherwise null. + */ +export const deleteUserById: DeleteUserById = ({ userId }) => { + return DBClient.instance.user.delete({ where: { id: userId }, select: authUserSelect }); +}; + +/** + * Finds a user by username. + * + * @param args The arguments for service. + * @param args.username The username of the user to find. + * @returns The user if found, otherwise null. + */ + +export const findUserByUsername: FindUserByUsername = async ({ username }) => { + return DBClient.instance.user.findUnique({ + where: { username }, + select: authUserSelect, + }); +}; + +/** + * Finds a user by email. + * + * @param args The arguments for service. + * @param args.email The email of the user to find. + */ +export const findUserByEmail: FindUserByEmail = async ({ email }) => { + return DBClient.instance.user.findUnique({ where: { email }, select: userSelect }); +}; + +/** + * Finds a user by id. + * + * @param args The arguments for service. + * @param args.userId The id of the user to find. + * @returns The user if found, otherwise null. + */ +export const findUserById: FindUserById = ({ userId }) => { + return DBClient.instance.user.findUnique({ where: { id: userId }, select: userSelect }); +}; + +/** + * Sends a confirmation email to the user using React Email and SparkPost. + * + * @param args The arguments for service. + * @param args.userId The id of the user to send the confirmation email to. + * @param args.username The username of the user to send the confirmation email to. + * @param args.email The email of the user to send the confirmation email to. + * @returns The user if found, otherwise null. + */ +export const sendConfirmationEmail: SendConfirmationEmail = async ({ + userId, + username, + email, +}) => { + const confirmationToken = generateConfirmationToken({ id: userId, username }); + const url = `${BASE_URL}/users/confirm?token=${confirmationToken}`; + + const name = username; + const address = email; + const subject = 'Confirm your email'; + + const component = WelcomeEmail({ name, url, subject })! as ReactElement< + unknown, + string + >; + + const html = render(component); + const text = render(component, { plainText: true }); + + await sendEmail({ address, subject, text, html }); +}; + +/** + * Sends a reset password email to the specified user. + * + * @param args The arguments for service. + * @param args.userId The id of the user to send the reset password email to. + * @param args.username The username of the user to send the reset password email to. + * @param args.email The email of the user to send the reset password email to. + * @returns A promise that resolves to void. + */ +export const sendResetPasswordEmail: SendResetPasswordEmail = async ({ + userId, + username, + email, +}) => { + const token = generateResetPasswordToken({ id: userId, username }); + + const url = `${BASE_URL}/users/reset-password?token=${token}`; + + const component = ResetPasswordEmail({ name: username, url })! as ReactElement< + unknown, + string + >; + + const html = render(component); + const text = render(component, { plainText: true }); + + await sendEmail({ + address: email, + subject: 'Reset Password', + html, + text, + }); +}; + +/** + * Updates a user to be confirmed by id. + * + * @param args The arguments for service. + * @param args.userId The id of the user to update. + * @returns The user. + */ +export const updateUserToBeConfirmedById: UpdateUserToBeConfirmedById = async ({ + userId, +}) => { + return DBClient.instance.user.update({ + where: { id: userId }, + data: { accountIsVerified: true, updatedAt: new Date() }, + select: userSelect, + }); +}; + +export const updateUserPassword: UpdateUserPassword = async ({ password, userId }) => { + const hash = await hashPassword(password); + + const user = await DBClient.instance.user.update({ + where: { id: userId }, + data: { hash, updatedAt: new Date() }, + select: authUserSelect, + }); + + return user; +}; + +/** + * Updates a user by id. + * + * @param args The arguments for service. + * @param args.userId The id of the user to update. + * @param args.data The data to update the user with. + * @param args.data.email The email of the user to update. + * @param args.data.firstName The first name of the user to update. + * @param args.data.lastName The last name of the user to update. + * @param args.data.username The username of the user to update. + */ +export const updateUserById: UpdateUserById = async ({ userId, data }) => { + const user = await DBClient.instance.user.findUnique({ + where: { id: userId }, + select: userSelect, + }); + + if (!user) { + throw new ServerError('User not found', 404); + } + + const updatedFields = { + email: data.email !== user.email, + username: data.username !== user.username, + firstName: data.firstName !== user.firstName, + lastName: data.lastName !== user.lastName, + } as const; + + if (updatedFields.email) { + const emailIsTaken = await findUserByEmail({ email: data.email }); + if (emailIsTaken) { + throw new ServerError('Email is already taken', 400); + } + + await sendConfirmationEmail({ + userId, + username: data.username, + email: data.email, + }); + } + + if (updatedFields.username) { + const usernameIsTaken = await findUserByUsername({ username: data.username }); + if (usernameIsTaken) { + throw new ServerError('Username is already taken', 400); + } + } + + const updatedUser = await DBClient.instance.user.update({ + where: { id: userId }, + data: { + email: updatedFields.email ? data.email : undefined, + username: updatedFields.username ? data.username : undefined, + firstName: updatedFields.firstName ? data.firstName : undefined, + lastName: updatedFields.lastName ? data.lastName : undefined, + accountIsVerified: updatedFields.email ? false : undefined, + }, + select: userSelect, + }); + + return updatedUser; +}; diff --git a/src/services/users/auth/schema/PublicUserSchema.ts b/src/services/users/auth/schema/PublicUserSchema.ts deleted file mode 100644 index ba51010..0000000 --- a/src/services/users/auth/schema/PublicUserSchema.ts +++ /dev/null @@ -1,11 +0,0 @@ -import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; - -const PublicUserSchema = GetUserSchema.pick({ - id: true, - name: true, - createdAt: true, - username: true, - role: true, -}); - -export default PublicUserSchema; diff --git a/src/services/users/auth/sendConfirmationEmail.ts b/src/services/users/auth/sendConfirmationEmail.ts deleted file mode 100644 index 4cf6e19..0000000 --- a/src/services/users/auth/sendConfirmationEmail.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { generateConfirmationToken } from '@/config/jwt'; -import sendEmail from '@/config/sparkpost/sendEmail'; - -import Welcome from '@/emails/Welcome'; -import { render } from '@react-email/render'; -import { z } from 'zod'; -import { BASE_URL } from '@/config/env'; -import { ReactElement } from 'react'; -import GetUserSchema from './schema/GetUserSchema'; - -type UserSchema = z.infer; - -const sendConfirmationEmail = async ({ id, username, email }: UserSchema) => { - const confirmationToken = generateConfirmationToken({ id, username }); - - const subject = 'Confirm your email'; - const name = username; - const url = `${BASE_URL}/users/confirm?token=${confirmationToken}`; - const address = email; - - const component = Welcome({ name, url, subject })! as ReactElement; - - const html = render(component); - const text = render(component, { plainText: true }); - - await sendEmail({ address, subject, text, html }); -}; - -export default sendConfirmationEmail; diff --git a/src/services/users/auth/sendResetPasswordEmail.ts b/src/services/users/auth/sendResetPasswordEmail.ts deleted file mode 100644 index a6410db..0000000 --- a/src/services/users/auth/sendResetPasswordEmail.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { BASE_URL } from '@/config/env'; -import { generateResetPasswordToken } from '@/config/jwt'; -import sendEmail from '@/config/sparkpost/sendEmail'; -import ForgotEmail from '@/emails/ForgotEmail'; -import { User } from '@prisma/client'; -import type { ReactElement } from 'react'; -import { render } from '@react-email/render'; - -const sendResetPasswordEmail = async (user: User) => { - const token = generateResetPasswordToken({ id: user.id, username: user.username }); - - const url = `${BASE_URL}/users/reset-password?token=${token}`; - - const component = ForgotEmail({ name: user.username, url })! as ReactElement< - unknown, - string - >; - - const html = render(component); - const text = render(component, { plainText: true }); - - await sendEmail({ - address: user.email, - subject: 'Reset Password', - html, - text, - }); -}; - -export default sendResetPasswordEmail; diff --git a/src/services/users/auth/types/index.ts b/src/services/users/auth/types/index.ts new file mode 100644 index 0000000..6389667 --- /dev/null +++ b/src/services/users/auth/types/index.ts @@ -0,0 +1,47 @@ +import { z } from 'zod'; +import GetUserSchema from '../schema/GetUserSchema'; +import { CreateUserValidationSchema } from '../schema/CreateUserValidationSchemas'; + +type User = z.infer; +type AuthUser = { username: string; hash: string; id: string }; + +export type CreateNewUser = ( + args: z.infer, +) => Promise; + +export type DeleteUserById = (args: { userId: string }) => Promise; + +export type FindUserById = (args: { userId: string }) => Promise; + +export type FindUserByUsername = (args: { username: string }) => Promise; + +export type FindUserByEmail = (args: { email: string }) => Promise; + +export type UpdateUserPassword = (args: { + userId: string; + password: string; +}) => Promise; + +export type SendConfirmationEmail = (args: { + userId: string; + username: string; + email: string; +}) => Promise; + +export type SendResetPasswordEmail = (args: { + userId: string; + username: string; + email: string; +}) => Promise; + +export type UpdateUserToBeConfirmedById = (args: { userId: string }) => Promise; + +export type UpdateUserById = (args: { + userId: string; + data: { + email: string; + firstName: string; + lastName: string; + username: string; + }; +}) => Promise; diff --git a/src/services/users/auth/updateUserProfileById.ts b/src/services/users/auth/updateUserProfileById.ts deleted file mode 100644 index 204aba9..0000000 --- a/src/services/users/auth/updateUserProfileById.ts +++ /dev/null @@ -1,33 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import GetUserSchema from './schema/GetUserSchema'; - -interface UpdateUserProfileByIdParams { - id: string; - data: { bio: string }; -} - -const updateUserProfileById = async ({ id, data }: UpdateUserProfileByIdParams) => { - const user: z.infer = await DBClient.instance.user.update({ - where: { id }, - data: { bio: data.bio }, - select: { - id: true, - username: true, - email: true, - bio: true, - userAvatar: true, - accountIsVerified: true, - createdAt: true, - firstName: true, - lastName: true, - updatedAt: true, - dateOfBirth: true, - role: true, - }, - }); - - return user; -}; - -export default updateUserProfileById; diff --git a/src/services/users/auth/updateUserToBeConfirmedById.ts b/src/services/users/auth/updateUserToBeConfirmedById.ts deleted file mode 100644 index 2db875f..0000000 --- a/src/services/users/auth/updateUserToBeConfirmedById.ts +++ /dev/null @@ -1,37 +0,0 @@ -import GetUserSchema from '@/services/users/auth/schema/GetUserSchema'; -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; - -const updateUserToBeConfirmedById = async (id: string) => { - const user: z.infer = await DBClient.instance.user.update({ - where: { id }, - data: { accountIsVerified: true, updatedAt: new Date() }, - select: { - id: true, - username: true, - email: true, - accountIsVerified: true, - createdAt: true, - firstName: true, - lastName: true, - updatedAt: true, - dateOfBirth: true, - role: true, - bio: true, - userAvatar: { - select: { - id: true, - path: true, - alt: true, - caption: true, - createdAt: true, - updatedAt: true, - }, - }, - }, - }); - - return user; -}; - -export default updateUserToBeConfirmedById; diff --git a/src/services/users/follows/getUsersFollowedByUser.ts b/src/services/users/follows/getUsersFollowedByUser.ts deleted file mode 100644 index 3f58d19..0000000 --- a/src/services/users/follows/getUsersFollowedByUser.ts +++ /dev/null @@ -1,27 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import FollowInfoSchema from './schema/FollowInfoSchema'; - -interface GetFollowingInfoByUserIdArgs { - userId: string; - pageNum: number; - pageSize: number; -} -const getUsersFollowedByUser = async ({ - userId, - pageNum, - pageSize, -}: GetFollowingInfoByUserIdArgs): Promise[]> => { - const usersFollowedByQueriedUser = await DBClient.instance.userFollow.findMany({ - take: pageSize, - skip: (pageNum - 1) * pageSize, - where: { following: { id: userId } }, - select: { - follower: { select: { username: true, userAvatar: true, id: true } }, - }, - }); - - return usersFollowedByQueriedUser.map((u) => u.follower); -}; - -export default getUsersFollowedByUser; diff --git a/src/services/users/follows/getUsersFollowingUser.ts b/src/services/users/follows/getUsersFollowingUser.ts deleted file mode 100644 index 5379b7f..0000000 --- a/src/services/users/follows/getUsersFollowingUser.ts +++ /dev/null @@ -1,27 +0,0 @@ -import DBClient from '@/prisma/DBClient'; -import { z } from 'zod'; -import FollowInfoSchema from './schema/FollowInfoSchema'; - -interface GetFollowingInfoByUserIdArgs { - userId: string; - pageNum: number; - pageSize: number; -} -const getUsersFollowingUser = async ({ - userId, - pageNum, - pageSize, -}: GetFollowingInfoByUserIdArgs): Promise[]> => { - const usersFollowingQueriedUser = await DBClient.instance.userFollow.findMany({ - take: pageSize, - skip: (pageNum - 1) * pageSize, - where: { follower: { id: userId } }, - select: { - following: { select: { username: true, userAvatar: true, id: true } }, - }, - }); - - return usersFollowingQueriedUser.map((u) => u.following); -}; - -export default getUsersFollowingUser; diff --git a/src/services/users/profile/index.ts b/src/services/users/profile/index.ts new file mode 100644 index 0000000..b7734c9 --- /dev/null +++ b/src/services/users/profile/index.ts @@ -0,0 +1,193 @@ +import DBClient from '@/prisma/DBClient'; +import ServerError from '@/config/util/ServerError'; +import { + GetUsersFollowedByOrFollowingUser, + UpdateUserAvatar, + UpdateUserProfileById, + UserFollowService, +} from './types'; + +/** + * The select object for retrieving users. + * + * Satisfies the GetUserSchema zod schema. + * + * @example + * const users = await DBClient.instance.user.findMany({ + * select: userSelect, + * }); + */ +const userSelect = { + id: true, + username: true, + email: true, + firstName: true, + lastName: true, + dateOfBirth: true, + createdAt: true, + accountIsVerified: true, + updatedAt: true, + role: true, + userAvatar: true, + bio: true, +} as const; + +/** + * Finds a user follow by the followerId and followingId. + * + * @returns The user follow if found, otherwise null. + */ +export const findUserFollow: UserFollowService = ({ followerId, followingId }) => { + return DBClient.instance.userFollow.findFirst({ where: { followerId, followingId } }); +}; + +/** + * Creates a new user follow. + * + * @param args The arguments for service. + * @param args.followerId The follower id of the user follow to create. + * @param args.followingId The following id of the user follow to create. + * @returns The user follow. + */ +export const createUserFollow: UserFollowService = ({ followerId, followingId }) => { + return DBClient.instance.userFollow.create({ data: { followerId, followingId } }); +}; + +/** + * Deletes a user follow. + * + * @param args The arguments for service. + * @param args.followerId The follower id of the user follow to delete. + * @param args.followingId The following id of the user follow to delete. + * @returns The user follow. + */ +export const deleteUserFollow: UserFollowService = ({ followerId, followingId }) => { + return DBClient.instance.userFollow.delete({ + where: { followerId_followingId: { followerId, followingId } }, + }); +}; + +/** + * Gets the users followed by the session user. + * + * @param args The arguments for service. + * @param args.userId The id of the user to check if followed by the session user. + * @param args.pageNum The page number of the users to retrieve. + * @param args.pageSize The page size of the users to retrieve. + * @returns The users followed by the queried user and the count of users followed by the + * queried user. + */ +export const getUsersFollowedByUser: GetUsersFollowedByOrFollowingUser = async ({ + userId, + pageNum, + pageSize, +}) => { + const usersFollowedByQueriedUser = await DBClient.instance.userFollow.findMany({ + take: pageSize, + skip: (pageNum - 1) * pageSize, + where: { follower: { id: userId } }, + select: { + follower: { select: { username: true, userAvatar: true, id: true } }, + }, + }); + const count = await DBClient.instance.userFollow.count({ + where: { follower: { id: userId } }, + }); + const follows = usersFollowedByQueriedUser.map((u) => u.follower); + + return { follows, count }; +}; + +/** + * Gets the users following the session user. + * + * @param args The arguments for service. + * @param args.userId The id of the user to check if followed by the session user. + * @param args.pageNum The page number of the users to retrieve. + * @param args.pageSize The page size of the users to retrieve. + */ +export const getUsersFollowingUser: GetUsersFollowedByOrFollowingUser = async ({ + userId, + pageNum, + pageSize, +}) => { + const usersFollowingQueriedUser = await DBClient.instance.userFollow.findMany({ + take: pageSize, + skip: (pageNum - 1) * pageSize, + where: { following: { id: userId } }, + select: { + following: { select: { username: true, userAvatar: true, id: true } }, + }, + }); + + const count = await DBClient.instance.userFollow.count({ + where: { following: { id: userId } }, + }); + + const follows = usersFollowingQueriedUser.map((u) => u.following); + return { follows, count }; +}; + +/** + * Updates the user avatar of the user. + * + * @param args The arguments for service. + * @param args.userId The id of the user to update the avatar of. + * @param args.data The data to update the user avatar with. + * @param args.data.alt The alt text of the user avatar. + * @param args.data.path The path of the user avatar. + * @param args.data.caption The caption of the user avatar. + * @returns The updated user. + */ +export const updateUserAvatar: UpdateUserAvatar = async ({ userId, data }) => { + const user = await DBClient.instance.user.findUnique({ + where: { id: userId }, + select: userSelect, + }); + + if (!user) { + throw new ServerError('User not found', 404); + } + + const updatedUser = await DBClient.instance.user.update({ + where: { id: userId }, + data: { + userAvatar: { + upsert: { + create: { + alt: data.alt, + path: data.path, + caption: data.caption, + }, + update: { + alt: data.alt, + path: data.path, + caption: data.caption, + }, + }, + }, + }, + select: userSelect, + }); + + return updatedUser; +}; + +/** + * Updates a user's profile by id. + * + * @param args The arguments for service. + * @param args.userId The id of the user to update. + * @param args.data The data to update the user with. + * @param args.data.bio The bio of the user. + * @returns The user. + */ +export const updateUserProfileById: UpdateUserProfileById = async ({ userId, data }) => { + const user = await DBClient.instance.user.update({ + where: { id: userId }, + data: { bio: data.bio }, + select: userSelect, + }); + + return user; +}; diff --git a/src/services/users/follows/schema/FollowInfoSchema.ts b/src/services/users/profile/schema/FollowInfoSchema.ts similarity index 100% rename from src/services/users/follows/schema/FollowInfoSchema.ts rename to src/services/users/profile/schema/FollowInfoSchema.ts diff --git a/src/services/users/profile/types/index.ts b/src/services/users/profile/types/index.ts new file mode 100644 index 0000000..7a3663e --- /dev/null +++ b/src/services/users/profile/types/index.ts @@ -0,0 +1,38 @@ +import { UserFollow } from '@prisma/client'; +import { z } from 'zod'; + +import FollowInfoSchema from '../schema/FollowInfoSchema'; +import GetUserSchema from '../../auth/schema/GetUserSchema'; + +type FollowInfo = z.infer; +type User = z.infer; + +export type UserFollowService = (args: { + followerId: string; + followingId: string; +}) => Promise; + +export type UpdateUserProfileById = (args: { + userId: string; + data: { bio: string }; +}) => Promise; + +export type CheckIfUserIsFollowedBySessionUser = (args: { + followerId: string; + followingId: string; +}) => Promise; + +export type GetUsersFollowedByOrFollowingUser = (args: { + userId: string; + pageNum: number; + pageSize: number; +}) => Promise<{ follows: FollowInfo[]; count: number }>; + +export type UpdateUserAvatar = (args: { + userId: string; + data: { + alt: string; + path: string; + caption: string; + }; +}) => Promise; From db17a61f24a32ab04c4ebcecda41bcb0dd796c5d Mon Sep 17 00:00:00 2001 From: Aaron William Po Date: Sun, 17 Dec 2023 23:44:57 -0500 Subject: [PATCH 21/21] Update brewery post services, transactional emails --- src/config/auth/localStrat.ts | 4 +- .../nextConnect/middleware/getCurrentUser.ts | 8 ++-- src/controllers/posts/breweries/index.ts | 16 +++---- src/controllers/users/auth/index.ts | 47 ++++++++++--------- src/controllers/users/profile/index.ts | 12 ++--- src/pages/users/[id].tsx | 4 +- src/pages/users/reset-password.tsx | 4 +- src/services/posts/brewery-post/index.ts | 34 ++++++++++++++ .../posts/brewery-post/types/index.ts | 9 ++++ src/services/users/auth/index.ts | 31 ++++++------ 10 files changed, 106 insertions(+), 63 deletions(-) diff --git a/src/config/auth/localStrat.ts b/src/config/auth/localStrat.ts index 84df138..9d8681d 100644 --- a/src/config/auth/localStrat.ts +++ b/src/config/auth/localStrat.ts @@ -1,11 +1,11 @@ import Local from 'passport-local'; -import { findUserByUsername } from '@/services/users/auth'; +import { findUserByUsernameService } from '@/services/users/auth'; import ServerError from '../util/ServerError'; import { validatePassword } from './passwordFns'; const localStrat = new Local.Strategy(async (username, password, done) => { try { - const user = await findUserByUsername({ username }); + const user = await findUserByUsernameService({ username }); if (!user) { throw new ServerError('Username or password is incorrect.', 401); } diff --git a/src/config/nextConnect/middleware/getCurrentUser.ts b/src/config/nextConnect/middleware/getCurrentUser.ts index e907a27..4f2c3ba 100644 --- a/src/config/nextConnect/middleware/getCurrentUser.ts +++ b/src/config/nextConnect/middleware/getCurrentUser.ts @@ -2,9 +2,9 @@ import { NextApiResponse } from 'next'; import { NextHandler } from 'next-connect'; import ServerError from '@/config/util/ServerError'; -import { getLoginSession } from '../../auth/session'; -import { UserExtendedNextApiRequest } from '../../auth/types'; -import { findUserById } from '@/services/users/auth'; +import { findUserByIdService } from '@/services/users/auth'; +import { getLoginSession } from '@/config/auth/session'; +import { UserExtendedNextApiRequest } from '@/config/auth/types'; /** Get the current user from the session. Adds the user to the request object. */ const getCurrentUser = async ( @@ -13,7 +13,7 @@ const getCurrentUser = async ( next: NextHandler, ) => { const session = await getLoginSession(req); - const user = await findUserById({ userId: session?.id }); + const user = await findUserByIdService({ userId: session?.id }); if (!user) { throw new ServerError('User is not logged in.', 401); diff --git a/src/controllers/posts/breweries/index.ts b/src/controllers/posts/breweries/index.ts index 658cb50..4e5cdfd 100644 --- a/src/controllers/posts/breweries/index.ts +++ b/src/controllers/posts/breweries/index.ts @@ -12,10 +12,12 @@ import { createBreweryPostLocationService, getMapBreweryPostsService, getBreweryPostByIdService, + updateBreweryPostService, + deleteBreweryPostService, } from '@/services/posts/brewery-post'; import { getBeerPostsByBreweryIdService } from '@/services/posts/beer-post'; import { NextHandler } from 'next-connect'; -import DBClient from '@/prisma/DBClient'; + import { BreweryPostRequest, CreateBreweryPostRequest, @@ -188,10 +190,7 @@ export const editBreweryPost = async ( query: { id }, } = req; - await DBClient.instance.breweryPost.update({ - where: { id }, - data: body, - }); + await updateBreweryPostService({ breweryPostId: id, body }); res.status(200).json({ message: 'Brewery post updated successfully', @@ -204,11 +203,8 @@ export const deleteBreweryPost = async ( req: BreweryPostRequest, res: NextApiResponse, ) => { - const { - query: { id }, - } = req; - - const deleted = await DBClient.instance.breweryPost.delete({ where: { id } }); + const { id } = req.query; + const deleted = await deleteBreweryPostService({ breweryPostId: id }); if (!deleted) { throw new ServerError('Brewery post not found', 404); diff --git a/src/controllers/users/auth/index.ts b/src/controllers/users/auth/index.ts index 4477f9e..e2109d1 100644 --- a/src/controllers/users/auth/index.ts +++ b/src/controllers/users/auth/index.ts @@ -18,15 +18,15 @@ import { verifyConfirmationToken } from '@/config/jwt'; import { hashPassword } from '@/config/auth/passwordFns'; import { - createNewUser, - deleteUserById, - findUserByEmail, - findUserByUsername, - sendConfirmationEmail, - sendResetPasswordEmail, - updateUserById, - updateUserPassword, - updateUserToBeConfirmedById, + createNewUserService, + deleteUserService, + findUserByEmailService, + findUserByUsernameService, + sendConfirmationEmailService, + sendResetPasswordEmailService, + updateUserService, + updateUserPasswordService, + confirmUserService, } from '@/services/users/auth'; import { EditUserRequest, UserRouteRequest } from '@/controllers/users/profile/types'; @@ -98,8 +98,8 @@ export const registerUser = async ( ) => { const [usernameTaken, emailTaken] = ( await Promise.all([ - findUserByUsername({ username: req.body.username }), - findUserByEmail({ email: req.body.email }), + findUserByUsernameService({ username: req.body.username }), + findUserByEmailService({ email: req.body.email }), ]) ).map((user) => !!user); @@ -117,14 +117,14 @@ export const registerUser = async ( ); } - const user = await createNewUser(req.body); + const user = await createNewUserService(req.body); await setLoginSession(res, { id: user.id, username: user.username, }); - await sendConfirmationEmail({ + await sendConfirmationEmailService({ email: user.email, username: user.username, userId: user.id, @@ -155,7 +155,7 @@ export const confirmUser = async ( throw new ServerError('Could not confirm user.', 401); } - await updateUserToBeConfirmedById({ userId: id }); + await confirmUserService({ userId: id }); res.status(200).json({ message: 'User confirmed successfully.', @@ -170,10 +170,10 @@ export const resetPassword = async ( ) => { const { email } = req.body; - const user = await findUserByEmail({ email }); + const user = await findUserByEmailService({ email }); if (user) { - await sendResetPasswordEmail({ + await sendResetPasswordEmailService({ email: user.email, username: user.username, userId: user.id, @@ -204,7 +204,7 @@ export const sendCurrentUser = async ( export const checkEmail = async (req: CheckEmailRequest, res: NextApiResponse) => { const { email: emailToCheck } = req.query; - const email = await findUserByEmail({ email: emailToCheck }); + const email = await findUserByEmailService({ email: emailToCheck }); res.json({ success: true, @@ -217,7 +217,7 @@ export const checkEmail = async (req: CheckEmailRequest, res: NextApiResponse) = export const checkUsername = async (req: CheckUsernameRequest, res: NextApiResponse) => { const { username: usernameToCheck } = req.query; - const username = await findUserByUsername({ username: usernameToCheck }); + const username = await findUserByUsernameService({ username: usernameToCheck }); res.json({ success: true, @@ -234,7 +234,10 @@ export const updatePassword = async ( const user = req.user!; const { password } = req.body; - await updateUserPassword({ userId: user.id, password: await hashPassword(password) }); + await updateUserPasswordService({ + userId: user.id, + password: await hashPassword(password), + }); res.json({ message: 'Updated user password.', @@ -249,7 +252,7 @@ export const resendConfirmation = async ( ) => { const user = req.user!; - await sendConfirmationEmail({ + await sendConfirmationEmailService({ userId: user.id, username: user.username, email: user.email, @@ -267,7 +270,7 @@ export const editUserInfo = async ( ) => { const { email, firstName, lastName, username } = req.body; - const updatedUser = await updateUserById({ + const updatedUser = await updateUserService({ userId: req.user!.id, data: { email, firstName, lastName, username }, }); @@ -285,7 +288,7 @@ export const deleteAccount = async ( res: NextApiResponse>, ) => { const { id } = req.query; - const deletedUser = await deleteUserById({ userId: id }); + const deletedUser = await deleteUserService({ userId: id }); if (!deletedUser) { throw new ServerError('Could not find a user with that id.', 400); diff --git a/src/controllers/users/profile/index.ts b/src/controllers/users/profile/index.ts index 357a26e..e84fabd 100644 --- a/src/controllers/users/profile/index.ts +++ b/src/controllers/users/profile/index.ts @@ -7,7 +7,7 @@ import { NextHandler } from 'next-connect'; import { UserExtendedNextApiRequest } from '@/config/auth/types'; -import { findUserById } from '@/services/users/auth'; +import { findUserByIdService } from '@/services/users/auth'; import { createUserFollow, @@ -32,7 +32,7 @@ export const followUser = async ( ) => { const { id } = req.query; - const user = await findUserById({ userId: id }); + const user = await findUserByIdService({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } @@ -70,7 +70,7 @@ export const getUserFollowers = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { id, page_num, page_size } = req.query; - const user = await findUserById({ userId: id }); + const user = await findUserByIdService({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } @@ -101,7 +101,7 @@ export const getUsersFollowed = async ( // eslint-disable-next-line @typescript-eslint/naming-convention const { id, page_num, page_size } = req.query; - const user = await findUserById({ userId: id }); + const user = await findUserByIdService({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } @@ -131,7 +131,7 @@ export const checkIfUserIsFollowedBySessionUser = async ( ) => { const { id } = req.query; - const user = await findUserById({ userId: id }); + const user = await findUserByIdService({ userId: id }); if (!user) { throw new ServerError('User not found', 404); } @@ -162,7 +162,7 @@ export const checkIfUserCanEditUser = async ( ) => { const authenticatedUser = req.user!; - const userToUpdate = await findUserById({ userId: req.query.id }); + const userToUpdate = await findUserByIdService({ userId: req.query.id }); if (!userToUpdate) { throw new ServerError('User not found', 404); } diff --git a/src/pages/users/[id].tsx b/src/pages/users/[id].tsx index dfa99aa..170a8ff 100644 --- a/src/pages/users/[id].tsx +++ b/src/pages/users/[id].tsx @@ -7,7 +7,7 @@ import { FC } from 'react'; import { z } from 'zod'; import withPageAuthRequired from '@/util/withPageAuthRequired'; import UserHeader from '@/components/UserPage/UserHeader'; -import { findUserById } from '@/services/users/auth'; +import { findUserByIdService } from '@/services/users/auth'; interface UserInfoPageProps { user: z.infer; @@ -40,7 +40,7 @@ export default UserInfoPage; export const getServerSideProps = withPageAuthRequired( async (context) => { const { id } = context.params!; - const user = await findUserById({ userId: id as string }); + const user = await findUserByIdService({ userId: id as string }); return user ? { props: { user: JSON.parse(JSON.stringify(user)) } } : { notFound: true }; diff --git a/src/pages/users/reset-password.tsx b/src/pages/users/reset-password.tsx index 78dea22..ec33445 100644 --- a/src/pages/users/reset-password.tsx +++ b/src/pages/users/reset-password.tsx @@ -1,7 +1,7 @@ import { setLoginSession } from '@/config/auth/session'; import { verifyResetPasswordToken } from '@/config/jwt'; import ServerError from '@/config/util/ServerError'; -import { findUserById } from '@/services/users/auth'; +import { findUserByIdService } from '@/services/users/auth'; import { GetServerSideProps, NextApiResponse, NextPage } from 'next'; @@ -29,7 +29,7 @@ export const getServerSideProps: GetServerSideProps = async (context) => { const { id } = await verifyResetPasswordToken(token as string); - const user = await findUserById({ userId: id as string }); + const user = await findUserByIdService({ userId: id as string }); if (!user) { throw new ServerError('User not found', 404); } diff --git a/src/services/posts/brewery-post/index.ts b/src/services/posts/brewery-post/index.ts index a055c68..0c3875f 100644 --- a/src/services/posts/brewery-post/index.ts +++ b/src/services/posts/brewery-post/index.ts @@ -7,6 +7,7 @@ import { GetAllBreweryPostsByPostedById, GetBreweryPostById, GetMapBreweryPosts, + UpdateBreweryPost, } from './types'; /** @@ -205,3 +206,36 @@ export const getMapBreweryPostsService: GetMapBreweryPosts = async ({ const count = await DBClient.instance.breweryPost.count(); return { breweryPosts, count }; }; + +/** + * Updates a brewery post. + * + * @param args - The arguments to update a brewery post. + * @param args.breweryPostId - The ID of the brewery post to update. + * @param args.body - The body of the request. + * @param args.body.name - The name of the brewery. + * @param args.body.description - The description of the brewery. + * @param args.body.dateEstablished - The date the brewery was established. + * @returns The updated brewery post. + */ +export const updateBreweryPostService: UpdateBreweryPost = async ({ + breweryPostId, + body, +}) => { + const breweryPost = await DBClient.instance.breweryPost.update({ + where: { id: breweryPostId }, + data: body, + select: breweryPostSelect, + }); + + return breweryPost as Awaited>; +}; + +export const deleteBreweryPostService: GetBreweryPostById = async ({ breweryPostId }) => { + const breweryPost = await DBClient.instance.breweryPost.delete({ + where: { id: breweryPostId }, + select: breweryPostSelect, + }); + + return breweryPost as Awaited>; +}; diff --git a/src/services/posts/brewery-post/types/index.ts b/src/services/posts/brewery-post/types/index.ts index 92f5221..4fd2bd0 100644 --- a/src/services/posts/brewery-post/types/index.ts +++ b/src/services/posts/brewery-post/types/index.ts @@ -46,3 +46,12 @@ export type GetMapBreweryPosts = (args: { breweryPosts: z.infer[]; count: number; }>; + +export type UpdateBreweryPost = (args: { + breweryPostId: string; + body: { + name: string; + description: string; + dateEstablished: Date; + }; +}) => Promise>; diff --git a/src/services/users/auth/index.ts b/src/services/users/auth/index.ts index 050f2a6..69e8081 100644 --- a/src/services/users/auth/index.ts +++ b/src/services/users/auth/index.ts @@ -76,7 +76,7 @@ const authUserSelect = { * @param args.username The username of the user to create. * @returns The user. */ -export const createNewUser: CreateNewUser = async ({ +export const createNewUserService: CreateNewUser = async ({ email, password, firstName, @@ -108,7 +108,7 @@ export const createNewUser: CreateNewUser = async ({ * @param args.userId The id of the user to delete. * @returns The user that was deleted if found, otherwise null. */ -export const deleteUserById: DeleteUserById = ({ userId }) => { +export const deleteUserService: DeleteUserById = ({ userId }) => { return DBClient.instance.user.delete({ where: { id: userId }, select: authUserSelect }); }; @@ -120,7 +120,7 @@ export const deleteUserById: DeleteUserById = ({ userId }) => { * @returns The user if found, otherwise null. */ -export const findUserByUsername: FindUserByUsername = async ({ username }) => { +export const findUserByUsernameService: FindUserByUsername = async ({ username }) => { return DBClient.instance.user.findUnique({ where: { username }, select: authUserSelect, @@ -133,7 +133,7 @@ export const findUserByUsername: FindUserByUsername = async ({ username }) => { * @param args The arguments for service. * @param args.email The email of the user to find. */ -export const findUserByEmail: FindUserByEmail = async ({ email }) => { +export const findUserByEmailService: FindUserByEmail = async ({ email }) => { return DBClient.instance.user.findUnique({ where: { email }, select: userSelect }); }; @@ -144,7 +144,7 @@ export const findUserByEmail: FindUserByEmail = async ({ email }) => { * @param args.userId The id of the user to find. * @returns The user if found, otherwise null. */ -export const findUserById: FindUserById = ({ userId }) => { +export const findUserByIdService: FindUserById = ({ userId }) => { return DBClient.instance.user.findUnique({ where: { id: userId }, select: userSelect }); }; @@ -157,7 +157,7 @@ export const findUserById: FindUserById = ({ userId }) => { * @param args.email The email of the user to send the confirmation email to. * @returns The user if found, otherwise null. */ -export const sendConfirmationEmail: SendConfirmationEmail = async ({ +export const sendConfirmationEmailService: SendConfirmationEmail = async ({ userId, username, email, @@ -189,7 +189,7 @@ export const sendConfirmationEmail: SendConfirmationEmail = async ({ * @param args.email The email of the user to send the reset password email to. * @returns A promise that resolves to void. */ -export const sendResetPasswordEmail: SendResetPasswordEmail = async ({ +export const sendResetPasswordEmailService: SendResetPasswordEmail = async ({ userId, username, email, @@ -221,9 +221,7 @@ export const sendResetPasswordEmail: SendResetPasswordEmail = async ({ * @param args.userId The id of the user to update. * @returns The user. */ -export const updateUserToBeConfirmedById: UpdateUserToBeConfirmedById = async ({ - userId, -}) => { +export const confirmUserService: UpdateUserToBeConfirmedById = async ({ userId }) => { return DBClient.instance.user.update({ where: { id: userId }, data: { accountIsVerified: true, updatedAt: new Date() }, @@ -231,7 +229,10 @@ export const updateUserToBeConfirmedById: UpdateUserToBeConfirmedById = async ({ }); }; -export const updateUserPassword: UpdateUserPassword = async ({ password, userId }) => { +export const updateUserPasswordService: UpdateUserPassword = async ({ + password, + userId, +}) => { const hash = await hashPassword(password); const user = await DBClient.instance.user.update({ @@ -254,7 +255,7 @@ export const updateUserPassword: UpdateUserPassword = async ({ password, userId * @param args.data.lastName The last name of the user to update. * @param args.data.username The username of the user to update. */ -export const updateUserById: UpdateUserById = async ({ userId, data }) => { +export const updateUserService: UpdateUserById = async ({ userId, data }) => { const user = await DBClient.instance.user.findUnique({ where: { id: userId }, select: userSelect, @@ -272,12 +273,12 @@ export const updateUserById: UpdateUserById = async ({ userId, data }) => { } as const; if (updatedFields.email) { - const emailIsTaken = await findUserByEmail({ email: data.email }); + const emailIsTaken = await findUserByEmailService({ email: data.email }); if (emailIsTaken) { throw new ServerError('Email is already taken', 400); } - await sendConfirmationEmail({ + await sendConfirmationEmailService({ userId, username: data.username, email: data.email, @@ -285,7 +286,7 @@ export const updateUserById: UpdateUserById = async ({ userId, data }) => { } if (updatedFields.username) { - const usernameIsTaken = await findUserByUsername({ username: data.username }); + const usernameIsTaken = await findUserByUsernameService({ username: data.username }); if (usernameIsTaken) { throw new ServerError('Username is already taken', 400); }