Skip to content

Commit

Permalink
Merge branch 'master' into gabau/create-testcase-ui
Browse files Browse the repository at this point in the history
  • Loading branch information
Gabau committed Nov 13, 2023
2 parents 5739ec7 + e4dde3a commit 35c94b1
Show file tree
Hide file tree
Showing 26 changed files with 804 additions and 595 deletions.
15 changes: 12 additions & 3 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
/node_modules
/.next
/npm-debug.log
Dockerfile
.dockerignore
node_modules
npm-debug.log
README.md
.next
.server
data
docs
judge0-*
.git
/.env
6 changes: 5 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,16 @@ NEXTAUTH_SECRET=NEXTAUTH_SECRET
NEXT_AUTH_SECRET=EXAMPLE_JWT_SECRET
NEXTAUTH_URL="http://localhost:${PORT}"

# Judge0
J0_URL="http://localhost:2358"

# S3
S3_ENDPOINT="http://localhost:9000"
S3_BUCKET_NAME=s3

# Github OAuth Provider
GITHUB_ID=EXAMPLE_GITHUB_ID
GITHUB_SECRET=EXAMPLE_GITHUB_SECRET

# OpenAI
OPENAI_API_KEY=EXAMPLE_OPENAI_API_KEY
OPENAI_API_KEY=EXAMPLE_OPENAI_ID
38 changes: 38 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Dockerfile

FROM node:18-alpine
WORKDIR /app

COPY . .
COPY /production/.env .env

RUN \
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
elif [ -f package-lock.json ]; then npm ci; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \
else echo "Lockfile not found." && exit 1; \
fi

# ARG DATABASE_URL
# ARG NEXT_PUBLIC_WS_PORT

ENV NEXT_TELEMETRY_DISABLED 1

RUN \
if [ -f yarn.lock ]; then SKIP_ENV_VALIDATION=1 yarn build; \
elif [ -f package-lock.json ]; then SKIP_ENV_VALIDATION=1 npm run build; \
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && SKIP_ENV_VALIDATION=1 pnpm run build; \
else echo "Lockfile not found." && exit 1; \
fi

ENV NODE_ENV production
ENV NEXT_TELEMETRY_DISABLED 1

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

USER nextjs
EXPOSE 3000
ENV PORT 3000

CMD ["yarn", "start"]
28 changes: 7 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,27 +35,13 @@ Notes:
- If postgres is running on 5432, kill the process `sudo pkill -u postgres`
- If you have trouble starting the `judge0` container, or encounter `Incorrect type. Expected "include".` in `compose.yml`, try updating `docker-compose` to `v2.20` (Docker Desktop `4.42.1`) or later.

## What's next? How do I make an app with this?
## Building and Running Image

We try to keep this project as simple as possible, so you can start with just the scaffolding we set up for you, and add additional things later when they become necessary.

If you are not familiar with the different technologies used in this project, please refer to the respective docs. If you still are in the wind, please join our [Discord](https://t3.gg/discord) and ask for help.

- [Next.js](https://nextjs.org)
- [NextAuth.js](https://next-auth.js.org)
- [Prisma](https://prisma.io)
- [Tailwind CSS](https://tailwindcss.com)
- [tRPC](https://trpc.io)

## Learn More

To learn more about the [T3 Stack](https://create.t3.gg/), take a look at the following resources:

- [Documentation](https://create.t3.gg/)
- [Learn the T3 Stack](https://create.t3.gg/en/faq#what-learning-resources-are-currently-available) — Check out these awesome tutorials

You can check out the [create-t3-app GitHub repository](https://github.com/t3-oss/create-t3-app) — your feedback and contributions are welcome!
```bash
docker build -t peer-prep .
docker compose --profile prod up -d
```

## How do I deploy this?
## Production Environment

Follow our deployment guides for [Vercel](https://create.t3.gg/en/deployment/vercel), [Netlify](https://create.t3.gg/en/deployment/netlify) and [Docker](https://create.t3.gg/en/deployment/docker) for more information.
For Assignment 4 and beyond, do note there is an additional `.env` file that needs to be initialized in the folder `production`. If you are a grader, please refer to the secret submission `Assignment4-production.env.txt`.
14 changes: 13 additions & 1 deletion compose.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
include:
- judge0-v1.13.0/docker-compose.yml
services:
app:
platform: "linux/amd64"
build:
context: .
dockerfile: Dockerfile
working_dir: /app
ports:
- "3000:3000"
- ${NEXT_PUBLIC_WS_PORT}:${NEXT_PUBLIC_WS_PORT}
image: t3-app
profiles:
- prod
postgres_db:
image: postgres:12.16
container_name: postgresdb-dev
Expand Down Expand Up @@ -36,6 +48,7 @@ services:
S3_BUCKET_NAME: ${S3_BUCKET_NAME}
volumes:
- "./data/s3:/home/app/public/peer-prep"
container_name: s3-bucket
rabbitmq:
image: rabbitmq:3.11.23-management-alpine
restart: always
Expand All @@ -48,7 +61,6 @@ services:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
command: sh -c "rabbitmq-plugins enable rabbitmq_web_stomp && rabbitmq-server"

networks:
- rabbitmq_go_net
networks:
Expand Down
Binary file modified docs/cs3219archi.pptx
Binary file not shown.
3 changes: 2 additions & 1 deletion judge0-v1.13.0/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ x-logging:
max-size: 100m

services:
server:
j0-server:
image: judge0/judge0:1.13.0
volumes:
- ./judge0.conf:/judge0.conf:ro
Expand All @@ -17,6 +17,7 @@ services:
privileged: true
<<: *default-logging
restart: always
container_name: j0-server

workers:
image: judge0/judge0:1.13.0
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
"prisma:generate": "prisma generate --schema prisma/mongodb/schema.prisma && prisma generate --schema prisma/postgres/schema.prisma",
"prisma:push": "prisma db push --schema prisma/mongodb/schema.prisma && prisma db push --schema prisma/postgres/schema.prisma",
"prisma:studio": "prisma studio --schema prisma/mongodb/schema.prisma | prisma studio --schema prisma/postgres/schema.prisma -p 5556",
"docker:up": "docker-compose up -d",
"docker:down": "docker-compose down",
"docker:up": "docker compose up -d",
"docker:down": "docker compose down",
"start-dev": "./start-dev-script.sh"
},
"dependencies": {
Expand Down Expand Up @@ -52,7 +52,7 @@
"next": "^13.4.13",
"next-auth": "^4.22.4",
"npm-run-all": "^4.1.5",
"openai": "^4.14.1",
"openai": "^4.16.1",
"react": "18.2.0",
"react-codemirror-merge": "^4.21.15",
"react-dom": "18.2.0",
Expand Down
10 changes: 5 additions & 5 deletions prisma/postgres/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ model User {
matchRequest MatchRequest?
joinRequest JoinRequest[]
sessionUserAndUserMessages SessionUserAndUserMessage[]
sessionUserAndAIMessages SessionUserAndAIMessage[]
sessionAIThreads SessionAIThread[]
Submission Submission[]
}

Expand Down Expand Up @@ -195,15 +195,15 @@ model SessionUserAndUserMessage {
@@index([sessionId])
}

model SessionUserAndAIMessage {
id String @id @default(cuid())
model SessionAIThread {
id String @id @default(cuid())
sessionId String
userId String
message String
role String
threadId String
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
@@unique([sessionId, userId, threadId])
@@index([sessionId])
}

Expand Down
38 changes: 38 additions & 0 deletions production/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@

## Node
NODE_ENV=production
PORT=3000
# Websocket port
NEXT_PUBLIC_WS_PORT=3002

# PostgreSQL
POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_URL=

## MongoDB
MONGO_USER=
MONGO_PASSWORD=
MONGO_URL=

# Next Auth
# You can generate a new secret on the command line with:
# openssl rand -base64 32
# https://next-auth.js.org/configuration/options#secret
NEXTAUTH_SECRET=EXAMPLE_NEXTAUTH_SEC
NEXTAUTH_URL="http://localhost:${PORT}"

S3_ENDPOINT="http://localhost:9000"


# JUDGE0
J0_URL="http://j0-server:2358"

S3_BUCKET_NAME=some
# Next auth secret
NEXT_AUTH_SECRET=EXAMPLE_JWT_SECRET

# Github OAuth Provider
GITHUB_ID=
GITHUB_SECRET=
OPENAI_API_KEY=
4 changes: 2 additions & 2 deletions src/components/AIBox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const AIBox = ({
} text-white p-2 my-2`}
>
<div className="flex justify-between">
<span>{message.role === "user" ? userName : "GPT-3.5"}</span>
<span>{message.role === "user" ? userName : "Code Assistant"}</span>
</div>
<p>{message.message}</p>
</div>
Expand All @@ -54,7 +54,7 @@ const AIBox = ({
{isAIResponding && (
<input
className="w-full rounded-md p-2"
value="GPT-3.5 is responding..."
value="Code Assistant is responding..."
disabled
/>
)}
Expand Down
77 changes: 77 additions & 0 deletions src/components/ConfirmModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
type ConfirmModalProps = {
isOpen: boolean;
title?: string;
message: string;
onConfirm: () => void;
onCancel: () => void;
cancelButtonText?: string;
confirmButtonText?: string;
type?: "warning" | "neutral";
};
const ConfirmModal = ({
isOpen,
title,
message,
onConfirm,
onCancel,
cancelButtonText = "Cancel",
confirmButtonText = "Confirm",
type = "neutral",
}: ConfirmModalProps) => {
if (!isOpen) return null;

return (
<div className="fixed z-10 inset-0 overflow-y-auto">
<div className="flex items-end justify-center min-h-screen pt-4 px-4 pb-20 text-center sm:block sm:p-0">
<div className="fixed inset-0 transition-opacity" aria-hidden="true">
<div className="absolute inset-0 bg-gray-500 opacity-70"></div>
</div>
<span
className="hidden sm:inline-block sm:align-middle sm:h-screen"
aria-hidden="true"
>
&#8203;
</span>
<div className="inline-block align-bottom bg-white rounded-lg text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:max-w-lg sm:w-full">
<div className="bg-white px-4 pt-5 pb-4 sm:p-6 sm:pb-4">
<div className="sm:flex sm:items-start">
<div className="mt-3 text-center sm:mt-0 sm:ml-4 sm:text-left">
<h3
className="text-lg leading-6 font-medium text-gray-900"
id="modal-title"
>
{title}
</h3>
<div className="mt-2">
<p className="text-sm text-gray-500">{message}</p>
</div>
</div>
</div>
</div>
<div className="bg-gray-50 px-4 py-3 sm:px-6 sm:flex sm:flex-row-reverse">
<button
type="button"
className={`w-full inline-flex justify-center rounded-md border border-transparent shadow-sm px-4 py-2 text-base font-medium text-white ${
type == "warning"
? "bg-red-600 hover:bg-red-700 focus:ring-red-500"
: "bg-blue-600 hover:bg-blue-700 focus:ring-blue-500"
}focus:outline-none focus:ring-2 focus:ring-offset-2 sm:ml-3 sm:w-auto sm:text-sm`}
onClick={onConfirm}
>
{confirmButtonText}
</button>
<button
type="button"
className="mt-3 w-full inline-flex justify-center rounded-md border border-gray-300 shadow-sm px-4 py-2 bg-white text-base font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 sm:mt-0 sm:w-auto sm:text-sm"
onClick={onCancel}
>
{cancelButtonText}
</button>
</div>
</div>
</div>
</div>
);
};

export default ConfirmModal;
10 changes: 10 additions & 0 deletions src/components/NavBar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,16 @@ const NavBar = () => {
Test cases
</Link>
}
{
session?.user.role === "MAINTAINER" &&
<Link
href="/maintainer/environments"
onClick={closeDropdown}
className="flex items-center justify-center font-bold text-white no-underline transition hover:bg-white/20 rounded-md whitespace-nowrap bg-white/10 flex-[1_0_0%] px-4"
>
Environments
</Link>
}
{session && <div
onClick={() => {
void signOut();
Expand Down
Loading

0 comments on commit 35c94b1

Please sign in to comment.