-
-
+
+ {user ? (
+
+ ) : (
+
+
+ Log in to leave a comment.
+
+
+ )}
diff --git a/pages/user/current.tsx b/pages/user/current.tsx
index 3d07503..0e6159e 100644
--- a/pages/user/current.tsx
+++ b/pages/user/current.tsx
@@ -1,11 +1,13 @@
import Layout from '@/components/ui/Layout';
import Spinner from '@/components/ui/Spinner';
import withPageAuthRequired from '@/config/auth/withPageAuthRequired';
-import useUser from '@/hooks/useUser';
+import UserContext from '@/contexts/userContext';
+
import { GetServerSideProps, NextPage } from 'next';
+import { useContext } from 'react';
const ProtectedPage: NextPage = () => {
- const { user, isLoading, error } = useUser();
+ const { user, error, isLoading } = useContext(UserContext);
return (
diff --git a/prisma/migrations/20230209085224_/migration.sql b/prisma/migrations/20230209085224_/migration.sql
new file mode 100644
index 0000000..35d2edd
--- /dev/null
+++ b/prisma/migrations/20230209085224_/migration.sql
@@ -0,0 +1,16 @@
+-- CreateTable
+CREATE TABLE "BeerPostLike" (
+ "id" TEXT NOT NULL,
+ "beerPostId" TEXT NOT NULL,
+ "userId" TEXT NOT NULL,
+ "createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ "updatedAt" TIMESTAMPTZ(3),
+
+ CONSTRAINT "BeerPostLike_pkey" PRIMARY KEY ("id")
+);
+
+-- AddForeignKey
+ALTER TABLE "BeerPostLike" ADD CONSTRAINT "BeerPostLike_beerPostId_fkey" FOREIGN KEY ("beerPostId") REFERENCES "BeerPost"("id") ON DELETE CASCADE ON UPDATE CASCADE;
+
+-- AddForeignKey
+ALTER TABLE "BeerPostLike" ADD CONSTRAINT "BeerPostLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index d9bf9ee..4b9fb46 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -25,24 +25,36 @@ model User {
breweryPosts BreweryPost[]
beerComments BeerComment[]
breweryComments BreweryComment[]
+ BeerPostLikes BeerPostLike[]
}
model BeerPost {
- id String @id @default(uuid())
- name String
- ibu Float
- abv Float
- description String
- postedBy User @relation(fields: [postedById], references: [id], onDelete: Cascade)
- postedById String
- brewery BreweryPost @relation(fields: [breweryId], references: [id], onDelete: Cascade)
- breweryId String
- type BeerType @relation(fields: [typeId], references: [id], onDelete: Cascade)
- typeId String
- createdAt DateTime @default(now()) @db.Timestamptz(3)
- updatedAt DateTime? @updatedAt @db.Timestamptz(3)
- beerComments BeerComment[]
- beerImages BeerImage[]
+ id String @id @default(uuid())
+ name String
+ ibu Float
+ abv Float
+ description String
+ postedBy User @relation(fields: [postedById], references: [id], onDelete: Cascade)
+ postedById String
+ brewery BreweryPost @relation(fields: [breweryId], references: [id], onDelete: Cascade)
+ breweryId String
+ type BeerType @relation(fields: [typeId], references: [id], onDelete: Cascade)
+ typeId String
+ createdAt DateTime @default(now()) @db.Timestamptz(3)
+ updatedAt DateTime? @updatedAt @db.Timestamptz(3)
+ beerComments BeerComment[]
+ beerImages BeerImage[]
+ BeerPostLikes BeerPostLike[]
+}
+
+model BeerPostLike {
+ id String @id @default(uuid())
+ beerPost BeerPost @relation(fields: [beerPostId], references: [id], onDelete: Cascade)
+ beerPostId String
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
+ userId String
+ createdAt DateTime @default(now()) @db.Timestamptz(3)
+ updatedAt DateTime? @updatedAt @db.Timestamptz(3)
}
model BeerComment {
diff --git a/prisma/seed/create/createNewBeerPostLikes.ts b/prisma/seed/create/createNewBeerPostLikes.ts
new file mode 100644
index 0000000..f5617be
--- /dev/null
+++ b/prisma/seed/create/createNewBeerPostLikes.ts
@@ -0,0 +1,34 @@
+import type { BeerPost, BeerPostLike, User } from '@prisma/client';
+import DBClient from '../../DBClient';
+
+const createNewBeerPostLikes = async ({
+ joinData: { beerPosts, users },
+ numberOfLikes,
+}: {
+ joinData: {
+ beerPosts: BeerPost[];
+ users: User[];
+ };
+ numberOfLikes: number;
+}) => {
+ const beerPostLikePromises: Promise[] = [];
+
+ // eslint-disable-next-line no-plusplus
+ for (let i = 0; i < numberOfLikes; i++) {
+ const beerPost = beerPosts[Math.floor(Math.random() * beerPosts.length)];
+ const user = users[Math.floor(Math.random() * users.length)];
+
+ beerPostLikePromises.push(
+ DBClient.instance.beerPostLike.create({
+ data: {
+ beerPost: { connect: { id: beerPost.id } },
+ user: { connect: { id: user.id } },
+ },
+ }),
+ );
+ }
+
+ return Promise.all(beerPostLikePromises);
+};
+
+export default createNewBeerPostLikes;
diff --git a/prisma/seed/index.ts b/prisma/seed/index.ts
index 04b6b4a..1012ffd 100644
--- a/prisma/seed/index.ts
+++ b/prisma/seed/index.ts
@@ -6,6 +6,7 @@ import cleanDatabase from './clean/cleanDatabase';
import createNewBeerImages from './create/createNewBeerImages';
import createNewBeerPostComments from './create/createNewBeerPostComments';
+import createNewBeerPostLikes from './create/createNewBeerPostLikes';
import createNewBeerPosts from './create/createNewBeerPosts';
import createNewBeerTypes from './create/createNewBeerTypes';
import createNewBreweryImages from './create/createNewBreweryImages';
@@ -31,7 +32,14 @@ import createNewUsers from './create/createNewUsers';
numberOfPosts: 48,
joinData: { breweryPosts, beerTypes, users },
});
- const [beerPostComments, breweryPostComments] = await Promise.all([
+
+ const [
+ beerPostComments,
+ breweryPostComments,
+ beerPostLikes,
+ beerImages,
+ breweryImages,
+ ] = await Promise.all([
createNewBeerPostComments({
numberOfComments: 1000,
joinData: { beerPosts, users },
@@ -40,11 +48,18 @@ import createNewUsers from './create/createNewUsers';
numberOfComments: 1000,
joinData: { breweryPosts, users },
}),
- ]);
-
- const [beerImages, breweryImages] = await Promise.all([
- createNewBeerImages({ numberOfImages: 1000, beerPosts }),
- createNewBreweryImages({ numberOfImages: 1000, breweryPosts }),
+ createNewBeerPostLikes({
+ numberOfLikes: 10000,
+ joinData: { beerPosts, users },
+ }),
+ createNewBeerImages({
+ numberOfImages: 1000,
+ beerPosts,
+ }),
+ createNewBreweryImages({
+ numberOfImages: 1000,
+ breweryPosts,
+ }),
]);
const end = performance.now();
@@ -57,6 +72,7 @@ import createNewUsers from './create/createNewUsers';
numberOfBreweryPosts: breweryPosts.length,
numberOfBeerPosts: beerPosts.length,
numberOfBeerTypes: beerTypes.length,
+ numberOfBeerPostLikes: beerPostLikes.length,
numberOfBeerPostComments: beerPostComments.length,
numberOfBreweryPostComments: breweryPostComments.length,
numberOfBeerImages: beerImages.length,
diff --git a/requests/sendCheckIfUserLikesBeerPostRequest.ts b/requests/sendCheckIfUserLikesBeerPostRequest.ts
new file mode 100644
index 0000000..b815004
--- /dev/null
+++ b/requests/sendCheckIfUserLikesBeerPostRequest.ts
@@ -0,0 +1,31 @@
+import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
+import { z } from 'zod';
+
+const sendCheckIfUserLikesBeerPostRequest = async (beerPostId: string) => {
+ const response = await fetch(`/api/beers/${beerPostId}/like/is-liked`);
+ const data = await response.json();
+
+ const parsed = APIResponseValidationSchema.safeParse(data);
+
+ if (!parsed.success) {
+ throw new Error('Invalid API response.');
+ }
+
+ const { payload } = parsed.data;
+
+ const parsedPayload = z
+ .object({
+ isLiked: z.boolean(),
+ })
+ .safeParse(payload);
+
+ if (!parsedPayload.success) {
+ throw new Error('Invalid API response.');
+ }
+
+ const { isLiked } = parsedPayload.data;
+
+ return isLiked;
+};
+
+export default sendCheckIfUserLikesBeerPostRequest;
diff --git a/requests/sendLikeRequest.ts b/requests/sendLikeRequest.ts
new file mode 100644
index 0000000..e9d235b
--- /dev/null
+++ b/requests/sendLikeRequest.ts
@@ -0,0 +1,30 @@
+import BeerPostQueryResult from '@/services/BeerPost/schema/BeerPostQueryResult';
+import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema';
+
+const sendLikeRequest = async (beerPost: BeerPostQueryResult) => {
+ const response = await fetch(`/api/beers/${beerPost.id}/like`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: '',
+ });
+
+ if (!response.ok) {
+ throw new Error('Something went wrong.');
+ }
+
+ const data = await response.json();
+
+ const parsed = APIResponseValidationSchema.safeParse(data);
+
+ if (!parsed.success) {
+ throw new Error('Invalid API response.');
+ }
+
+ const { success, message } = parsed.data;
+
+ return { success, message };
+};
+
+export default sendLikeRequest;
diff --git a/requests/sendLoginUserRequest.tsx b/requests/sendLoginUserRequest.ts
similarity index 100%
rename from requests/sendLoginUserRequest.tsx
rename to requests/sendLoginUserRequest.ts
diff --git a/services/BeerComment/createNewBeerComment.ts b/services/BeerComment/createNewBeerComment.ts
index 169daa5..eaca82f 100644
--- a/services/BeerComment/createNewBeerComment.ts
+++ b/services/BeerComment/createNewBeerComment.ts
@@ -5,6 +5,7 @@ import BeerCommentValidationSchema from './schema/CreateBeerCommentValidationSch
const CreateBeerCommentWithUserSchema = BeerCommentValidationSchema.extend({
userId: z.string().uuid(),
});
+
const createNewBeerComment = async ({
content,
rating,
diff --git a/services/BeerPost/schema/BeerReccomendationQueryResult.ts b/services/BeerPost/schema/BeerRecommendationQueryResult.ts
similarity index 100%
rename from services/BeerPost/schema/BeerReccomendationQueryResult.ts
rename to services/BeerPost/schema/BeerRecommendationQueryResult.ts
diff --git a/services/BeerPostLike/createBeerPostLike.ts b/services/BeerPostLike/createBeerPostLike.ts
new file mode 100644
index 0000000..e01ca9f
--- /dev/null
+++ b/services/BeerPostLike/createBeerPostLike.ts
@@ -0,0 +1,20 @@
+import DBClient from '@/prisma/DBClient';
+import { z } from 'zod';
+import GetUserSchema from '../User/schema/GetUserSchema';
+
+const createBeerPostLike = async ({
+ id,
+ user,
+}: {
+ id: string;
+ user: z.infer;
+}) => {
+ return DBClient.instance.beerPostLike.create({
+ data: {
+ beerPost: { connect: { id } },
+ user: { connect: { id: user.id } },
+ },
+ });
+};
+
+export default createBeerPostLike;
diff --git a/services/BeerPostLike/findBeerPostLikeById.ts b/services/BeerPostLike/findBeerPostLikeById.ts
new file mode 100644
index 0000000..92bcd45
--- /dev/null
+++ b/services/BeerPostLike/findBeerPostLikeById.ts
@@ -0,0 +1,6 @@
+import DBClient from '@/prisma/DBClient';
+
+const findBeerPostLikeById = async (id: string) =>
+ DBClient.instance.beerPostLike.findUnique({ where: { id } });
+
+export default findBeerPostLikeById;
diff --git a/services/BeerPostLike/removeBeerPostLikeById.ts b/services/BeerPostLike/removeBeerPostLikeById.ts
new file mode 100644
index 0000000..5e711d7
--- /dev/null
+++ b/services/BeerPostLike/removeBeerPostLikeById.ts
@@ -0,0 +1,11 @@
+import DBClient from '@/prisma/DBClient';
+
+const removeBeerPostLikeById = async (id: string) => {
+ return DBClient.instance.beerPostLike.delete({
+ where: {
+ id,
+ },
+ });
+};
+
+export default removeBeerPostLikeById;
diff --git a/services/user/createNewUser.ts b/services/User/createNewUser.ts
similarity index 100%
rename from services/user/createNewUser.ts
rename to services/User/createNewUser.ts
diff --git a/services/user/findUserByEmail.ts b/services/User/findUserByEmail.ts
similarity index 100%
rename from services/user/findUserByEmail.ts
rename to services/User/findUserByEmail.ts
diff --git a/services/user/findUserById.ts b/services/User/findUserById.ts
similarity index 100%
rename from services/user/findUserById.ts
rename to services/User/findUserById.ts
diff --git a/services/user/findUserByUsername.ts b/services/User/findUserByUsername.ts
similarity index 100%
rename from services/user/findUserByUsername.ts
rename to services/User/findUserByUsername.ts
diff --git a/services/user/schema/CreateUserValidationSchema.ts b/services/User/schema/CreateUserValidationSchema.ts
similarity index 100%
rename from services/user/schema/CreateUserValidationSchema.ts
rename to services/User/schema/CreateUserValidationSchema.ts
diff --git a/services/user/schema/GetUserSchema.ts b/services/User/schema/GetUserSchema.ts
similarity index 100%
rename from services/user/schema/GetUserSchema.ts
rename to services/User/schema/GetUserSchema.ts
diff --git a/services/user/schema/LoginValidationSchema.ts b/services/User/schema/LoginValidationSchema.ts
similarity index 100%
rename from services/user/schema/LoginValidationSchema.ts
rename to services/User/schema/LoginValidationSchema.ts