Skip to content

Commit

Permalink
Initial Changes
Browse files Browse the repository at this point in the history
  • Loading branch information
AlpacaFur committed Nov 24, 2023
1 parent a769198 commit e3cbb2f
Show file tree
Hide file tree
Showing 15 changed files with 321 additions and 3 deletions.
8 changes: 8 additions & 0 deletions infrastructure/prod/Dockerfile.app
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ COPY packages/frontend-v2 packages/frontend-v2
COPY packages/api-client packages/api-client
COPY packages/common packages/common

ARG COMMIT
ARG BUILD_TIMESTAMP
ARG COMMIT_MESSAGE

ENV NEXT_PUBLIC_COMMIT_HASH $COMMIT
ENV NEXT_PUBLIC_COMMIT_MESSAGE $COMMIT_MESSAGE
ENV NEXT_PUBLIC_BUILD_TIMESTAMP $BUILD_TIMESTAMP

RUN yarn packages/api-client build
RUN yarn packages/common build
RUN yarn packages/frontend-v2 build
Expand Down
6 changes: 6 additions & 0 deletions infrastructure/prod/Dockerfile.server
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,13 @@ RUN yarn packages/api-v2 build
FROM node:16-alpine AS runner
WORKDIR /server

ARG COMMIT
ARG COMMIT_MESSAGE
ARG BUILD_TIMESTAMP

ENV NODE_ENV production
ENV COMMIT_HASH $COMMIT
ENV COMMIT_MESSAGE $COMMIT_MESSAGE

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nestjs
Expand Down
23 changes: 23 additions & 0 deletions infrastructure/prod/get-ecr-image-name.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
if [[ ! " backend frontend " =~ " $1 " ]]; then
echo "Please provide ECR repo to use: backend or frontend"
exit 1
fi

CURRENT_HASH=$( git rev-parse HEAD )

if [[ $1 = "backend" ]]; then
REPO="graduatenu-rails"
fi

if [[ $1 = "frontend" ]]; then
REPO="graduatenu-node"
fi

AWS_DEFAULT_REGION="us-east-1"
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com"

ECR_IMAGE_NAME="${ECR_REGISTRY}/${REPO}:${CURRENT_HASH}"

echo $ECR_IMAGE_NAME
19 changes: 17 additions & 2 deletions infrastructure/prod/redeploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,26 @@ fi
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
AWS_DEFAULT_REGION="us-east-1"
REPOS=( "graduatenu-rails" "graduatenu-node" )
LATEST_HASH=$(git ls-remote https://github.com/sandboxnu/graduatenu.git main | awk '{ print $1 }')
CURRENT_HASH=$(git ls-remote https://github.com/sandboxnu/graduatenu.git main | awk '{ print $1 }')
ECS_CLUSTER="$1-graduatenu"
TASK_FAMILIES=( "${ECS_CLUSTER}-api" "${ECS_CLUSTER}-web" )
SERVICES=( "${ECS_CLUSTER}-api" "${ECS_CLUSTER}-web" )

if [[ "frontend" = $2 ]]; then
echo "INFO: Deploying frontend only."
REPOS=("graduatenu-node")
fi

if [[ "backend" = $2 ]]; then
echo "INFO: Deploying backend only."
REPOS=("graduatenu-rails")
fi

if [[ "current" = $3 ]]; then
echo "INFO: Using current hash!"
CURRENT_HASH=$(git rev-parse HEAD)
fi

# Disable aws from sending stdout to less
export AWS_PAGER=""

Expand All @@ -21,7 +36,7 @@ echo "Redeploying services for cluster: ${ECS_CLUSTER} with last pushed image"

for i in "${!REPOS[@]}"; do
# Last pushed image should always be tagged with the latest commit hash on main
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${REPOS[$i]}:${LATEST_HASH}"
ECR_IMAGE="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${REPOS[$i]}:${CURRENT_HASH}"
TASK_FAMILY="${TASK_FAMILIES[$i]}"
SERVICE="${SERVICES[$i]}"
# fetch template for task definition
Expand Down
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@
"backend:docker:build": "docker compose -f infrastructure/develop/docker-compose.api.yml build",
"backend:docker:run": "docker compose -f infrastructure/develop/docker-compose.api.yml up -d",
"backend:docker:down": "docker compose -f infrastructure/develop/docker-compose.api.yml down",
"frontend:build": "docker build --build-arg=\"COMMIT=$(git rev-parse HEAD)\" --build-arg=\"BUILD_TIMESTAMP=$(date +%s)\" --build-arg=\"COMMIT_MESSAGE=$(git --no-pager show -s --format=%s)\" -t $(sh ./infrastructure/prod/get-ecr-image-name.sh frontend) -f ./infrastructure/prod/Dockerfile.app .",
"frontend:run": "docker run -p 4000:3000 $(sh ./infrastructure/prod/get-ecr-image-name.sh frontend)",
"backend:build": "docker build --build-arg=\"COMMIT=$(git rev-parse HEAD)\" -t $(sh ./infrastructure/prod/get-ecr-image-name.sh backend) -f ./infrastructure/prod/Dockerfile.server .",
"backend:run": "docker run -p 4001:3001 $(sh ./infrastructure/prod/get-ecr-image-name.sh backend)",
"backend:push": "docker push $(sh ./infrastructure/prod/get-ecr-image-name.sh backend)",
"ecr:docker:auth": "aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $(aws sts get-caller-identity --query Account --output text).dkr.ecr.us-east-1.amazonaws.com",
"lint": "eslint packages/ --ext .ts,.tsx .",
"tsc": "yarn workspaces foreach -v --exclude . run tsc",
"g:babel": "cd $INIT_CWD && babel",
Expand Down
6 changes: 6 additions & 0 deletions packages/api-client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import {
ResetPasswordDto,
courseToString,
NUPathEnum,
GetMetaInfoResponse,
} from "@graduate/common";
import { ClassConstructor, plainToInstance } from "class-transformer";

Expand Down Expand Up @@ -103,6 +104,11 @@ class APIClient {
getSupportedMajors: (): Promise<GetSupportedMajorsResponse> =>
this.req("GET", `/majors/supportedMajors`, GetSupportedMajorsResponse),
};

meta = {
getInfo: (): Promise<GetMetaInfoResponse> =>
this.req("GET", "/meta/info", GetMetaInfoResponse),
};
}

/**
Expand Down
2 changes: 2 additions & 0 deletions packages/api-v2/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { LoggingInterceptor } from "./interceptors/logging.interceptor";
import { MajorModule } from "./major/major.module";
import { EmailModule } from "./email/email.module";
import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
import { MetaModule } from "./meta/meta.module";

@Module({
imports: [
Expand All @@ -29,6 +30,7 @@ import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler";
PlanModule,
MajorModule,
EmailModule,
MetaModule,
],
providers: [
{
Expand Down
2 changes: 2 additions & 0 deletions packages/api-v2/src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ async function bootstrap() {
cors: {
origin:
"https://graduatenu-frontend-v2-git-christina-move-fro-b625a5-sandboxneu.vercel.app",
credentials: true,
allowedHeaders: ["GET", "HEAD", "POST", "PUT", "DELETE", "PATCH"],
},
});

Expand Down
13 changes: 13 additions & 0 deletions packages/api-v2/src/meta/meta.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { Controller, Get } from "@nestjs/common";
import { MetaService } from "./meta.service";
import { type MetaInfo } from "@graduate/common";

@Controller("meta")
export class MetaController {
constructor(private readonly metaService: MetaService) {}

@Get("/info")
getMetaInfo(): MetaInfo {
return this.metaService.getMetaInfo();
}
}
10 changes: 10 additions & 0 deletions packages/api-v2/src/meta/meta.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Module } from "@nestjs/common";
import { MetaService } from "./meta.service";
import { MetaController } from "./meta.controller";

@Module({
controllers: [MetaController],
providers: [MetaService],
exports: [MetaService],
})
export class MetaModule {}
17 changes: 17 additions & 0 deletions packages/api-v2/src/meta/meta.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { type MetaInfo } from "@graduate/common";
import { Injectable } from "@nestjs/common";

@Injectable()
export class MetaService {
getMetaInfo(): MetaInfo {
return {
commit: process.env.COMMIT_SHA ?? false,
commitMessage: process.env.COMMIT_MESSAGE ?? false,
build_timestamp:
process.env.BUILD_TIMESTAMP !== undefined
? Number(process.env.BUILD_TIMESTAMP)
: false,
environment: process.env.NODE_ENV ?? false,
};
}
}
9 changes: 9 additions & 0 deletions packages/common/src/api-response-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import {
Schedule2,
SupportedMajors,
ScheduleCourse2,
MetaInfo,
Maybe,
} from "./types";

/** Types our API responds with. */
Expand Down Expand Up @@ -52,3 +54,10 @@ export class GetSupportedMajorsResponse {
// { year => { majorName => {concentrations, minRequiredConcentrations} }}
supportedMajors: SupportedMajors;
}

export class GetMetaInfoResponse implements MetaInfo {
commit: Maybe<string>;
commitMessage: Maybe<string>;
build_timestamp: Maybe<number>;
environment: Maybe<string>;
}
9 changes: 9 additions & 0 deletions packages/common/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -483,3 +483,12 @@ export const Err = <T, E>(err: E): Result<T, E> => ({
err,
type: ResultType.Err,
});

export type Maybe<T> = T | false;

export interface MetaInfo {
commit: Maybe<string>;
commitMessage: Maybe<string>;
build_timestamp: Maybe<number>;
environment: Maybe<string>;
}
62 changes: 61 additions & 1 deletion packages/frontend-v2/components/Header/GraduateHeaders.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,16 @@ import { HeaderContainer } from "./HeaderContainer";
import { Logo } from "./Logo";
import { GraduateButtonLink } from "../Link";
import { UserDropdown } from "./UserDropdown";
import { Flex, Icon, IconProps, Link as ChakraLink } from "@chakra-ui/react";
import {
Flex,
Icon,
IconProps,
Link as ChakraLink,
Box,
Text,
} from "@chakra-ui/react";
import { useState } from "react";
import { MetaInfo } from "../MetaInfo/MetaInfo";

export const GraduatePreAuthHeader: React.FC = () => {
return (
Expand All @@ -27,10 +36,61 @@ interface GraduateHeaderProps {
}

const GraduateHeader: React.FC<GraduateHeaderProps> = ({ rightContent }) => {
const [showDevInfo, setShowDevInfo] = useState(false);

return (
<HeaderContainer>
<Logo />
<Flex columnGap="md" alignItems="center">
<Flex position="relative">
<Flex
border={
process.env.NODE_ENV === "development" ? "1px solid" : "0px solid"
}
_hover={{
background: "neutral.100",
}}
borderColor="neutral.300"
padding="5px"
alignItems="center"
gap="xs"
borderRadius="md"
onClick={() => setShowDevInfo((state) => !state)}
transition="background 0.15s ease"
userSelect="none"
>
<Icon
xmlns="http://www.w3.org/2000/svg"
fill="black"
viewBox="0 0 24 24"
>
<path d="M14.6,16.6L19.2,12L14.6,7.4L16,6L22,12L16,18L14.6,16.6M9.4,16.6L4.8,12L9.4,7.4L8,6L2,12L8,18L9.4,16.6Z"></path>
</Icon>
{process.env.NODE_ENV === "development" && <Text>Dev</Text>}
</Flex>
{
<Box
position="absolute"
border="1px solid"
borderColor="neutral.400"
top="80%"
left="0px"
transition="opacity 0.15s ease, transform 0.15s ease"
opacity={showDevInfo ? 1 : 0}
transform={
showDevInfo ? "scale(1)" : "scale(0.9) translateY(-5px)"
}
pointerEvents={showDevInfo ? "unset" : "none"}
transformOrigin="20% top"
padding="md"
background="white"
borderRadius="md"
width="300px"
>
<MetaInfo />
</Box>
}
</Flex>
<ChakraLink href="https://forms.gle/Tg9yuhR8inkrqHdN6" isExternal>
<FeedbackIcon mx="2px" />
Feedback
Expand Down
Loading

0 comments on commit e3cbb2f

Please sign in to comment.