From f518f205b92115f0ad909ab82b0984bda3c93853 Mon Sep 17 00:00:00 2001 From: chloe <44501120+chloezxyy@users.noreply.github.com> Date: Mon, 1 Apr 2024 15:47:13 +0800 Subject: [PATCH 01/10] chore(server): /health check endpoint --- apps/server/src/AppModule.ts | 2 ++ apps/server/src/PrismaModule.ts | 8 +++++++ apps/server/src/health/PrismaHealth.ts | 23 +++++++++++++++++++ .../src/health/PrismaHealthController.ts | 19 +++++++++++++++ apps/server/src/health/PrismaHealthModule.ts | 12 ++++++++++ 5 files changed, 64 insertions(+) create mode 100644 apps/server/src/PrismaModule.ts create mode 100644 apps/server/src/health/PrismaHealth.ts create mode 100644 apps/server/src/health/PrismaHealthController.ts create mode 100644 apps/server/src/health/PrismaHealthModule.ts diff --git a/apps/server/src/AppModule.ts b/apps/server/src/AppModule.ts index 9e59ce8d..6d24d8ef 100644 --- a/apps/server/src/AppModule.ts +++ b/apps/server/src/AppModule.ts @@ -2,6 +2,7 @@ import { Module } from "@nestjs/common"; import { appConfig, ENV_VALIDATION_SCHEMA } from "./AppConfig"; import { UserModule } from "./user/UserModule"; import { ConfigModule } from "@nestjs/config"; +import { HealthModule } from "./health/PrismaHealthModule"; @Module({ imports: [ @@ -11,6 +12,7 @@ import { ConfigModule } from "@nestjs/config"; validationSchema: ENV_VALIDATION_SCHEMA, }), UserModule, + HealthModule, ], }) export class AppModule {} diff --git a/apps/server/src/PrismaModule.ts b/apps/server/src/PrismaModule.ts new file mode 100644 index 00000000..8339692e --- /dev/null +++ b/apps/server/src/PrismaModule.ts @@ -0,0 +1,8 @@ +import { Module } from "@nestjs/common"; +import { PrismaService } from "./PrismaService"; + +@Module({ + exports: [PrismaService], + providers: [PrismaService], +}) +export class PrismaModule {} diff --git a/apps/server/src/health/PrismaHealth.ts b/apps/server/src/health/PrismaHealth.ts new file mode 100644 index 00000000..1bbd8fe0 --- /dev/null +++ b/apps/server/src/health/PrismaHealth.ts @@ -0,0 +1,23 @@ +import { Injectable } from "@nestjs/common"; +import { + HealthCheckError, + HealthIndicator, + HealthIndicatorResult, +} from "@nestjs/terminus"; + +import { PrismaService } from "../PrismaService"; + +@Injectable() +export class PrismaHealthIndicator extends HealthIndicator { + constructor(private readonly prismaService: PrismaService) { + super(); + } + + async isHealthy(key: string): Promise { + return this.prismaService.$queryRaw`SELECT 1` + .then(() => this.getStatus(key, true)) + .catch((e) => { + throw new HealthCheckError(e.message, this.getStatus(key, false, e)); + }); + } +} diff --git a/apps/server/src/health/PrismaHealthController.ts b/apps/server/src/health/PrismaHealthController.ts new file mode 100644 index 00000000..58842ca3 --- /dev/null +++ b/apps/server/src/health/PrismaHealthController.ts @@ -0,0 +1,19 @@ +import { Controller, Get } from "@nestjs/common"; +import { HealthCheck, HealthCheckService } from "@nestjs/terminus"; +import { SkipThrottle } from "@nestjs/throttler"; +import { PrismaHealthIndicator } from "./PrismaHealth"; + +@Controller("health") +export class HealthController { + constructor( + private health: HealthCheckService, + private prisma: PrismaHealthIndicator, + ) {} + + @SkipThrottle() + @Get() + @HealthCheck() + check() { + return this.health.check([() => this.prisma.isHealthy("database")]); + } +} diff --git a/apps/server/src/health/PrismaHealthModule.ts b/apps/server/src/health/PrismaHealthModule.ts new file mode 100644 index 00000000..30bc3f7e --- /dev/null +++ b/apps/server/src/health/PrismaHealthModule.ts @@ -0,0 +1,12 @@ +import { Module } from "@nestjs/common"; +import { TerminusModule } from "@nestjs/terminus"; +import { PrismaModule } from "../PrismaModule"; +import { HealthController } from "./PrismaHealthController"; +import { PrismaHealthIndicator } from "./PrismaHealth"; + +@Module({ + imports: [TerminusModule, PrismaModule], + controllers: [HealthController], + providers: [PrismaHealthIndicator], +}) +export class HealthModule {} From c604e73755101d1157aecb6b726a9800f54f1ce9 Mon Sep 17 00:00:00 2001 From: chloe <44501120+chloezxyy@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:05:58 +0800 Subject: [PATCH 02/10] feature(ui-ux): footer ui for /app routes --- apps/web/src/app/app/components/AppFooter.tsx | 100 ++++++++++++++++++ apps/web/src/app/app/components/AppLayout.tsx | 2 + .../app/components/AppNavigationBarMobile.tsx | 2 +- apps/web/src/components/Footer.tsx | 4 +- .../navigation/NavigationBarMobile.tsx | 2 +- 5 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 apps/web/src/app/app/components/AppFooter.tsx diff --git a/apps/web/src/app/app/components/AppFooter.tsx b/apps/web/src/app/app/components/AppFooter.tsx new file mode 100644 index 00000000..fff54ff9 --- /dev/null +++ b/apps/web/src/app/app/components/AppFooter.tsx @@ -0,0 +1,100 @@ +import MarbleFiLogo from "@/components/MarbleFiLogo"; +import { Tag } from "@/components/Tag"; +import clsx from "clsx"; +import { FaReddit } from "react-icons/fa"; +import { FaXTwitter } from "react-icons/fa6"; +import Link from "next/link"; + +const footerLinks = [ + { + title: "FAQs", + link: "/faqs", + }, + { + title: "Documentation", + link: "/documentation", + }, + { + title: "Terms of Use", + link: "/terms-of-use", + }, + + { + title: "Privacy Notice", + link: "/privacy-notice", + }, +]; + +export default function AppFooter() { + return ( + + ); +} + +function FooterNaviationLinkWeb() { + return ( +
+ {footerLinks.map((link, index) => ( +
+ + {link.title} + +
+ ))} +
+ ); +} +function FooterNaviationLinkMobile() { + return ( +
+ {footerLinks.map((link, index) => ( + + {link.title} + + ))} +
+ ); +} diff --git a/apps/web/src/app/app/components/AppLayout.tsx b/apps/web/src/app/app/components/AppLayout.tsx index 2eb072f8..68d0acde 100644 --- a/apps/web/src/app/app/components/AppLayout.tsx +++ b/apps/web/src/app/app/components/AppLayout.tsx @@ -18,6 +18,7 @@ import { import { ContractProvider } from "@/context/ContractContext"; import { NetworkEnvironmentProvider } from "@/context/NetworkEnvironmentContext"; import AppHeader from "@/app/app/components/AppHeader"; +import AppFooter from "@/app/app/components/AppFooter"; const metamask = new MetaMaskConnector({ chains: [mainnet, sepolia], @@ -73,6 +74,7 @@ export default function AppLayout({ children }: { children: React.ReactNode }) { >
{children}
+ diff --git a/apps/web/src/app/app/components/AppNavigationBarMobile.tsx b/apps/web/src/app/app/components/AppNavigationBarMobile.tsx index f1ff28e4..ded2ad8e 100644 --- a/apps/web/src/app/app/components/AppNavigationBarMobile.tsx +++ b/apps/web/src/app/app/components/AppNavigationBarMobile.tsx @@ -10,7 +10,7 @@ export default function AppNavigationBarMobile({ onClose }: { onClose: any }) {
Reddit Icon X Icon Date: Tue, 9 Apr 2024 15:10:31 +0800 Subject: [PATCH 03/10] fix(ui-ux): footer ui web --- apps/web/src/app/app/components/AppFooter.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/web/src/app/app/components/AppFooter.tsx b/apps/web/src/app/app/components/AppFooter.tsx index fff54ff9..8fd128e8 100644 --- a/apps/web/src/app/app/components/AppFooter.tsx +++ b/apps/web/src/app/app/components/AppFooter.tsx @@ -29,7 +29,7 @@ export default function AppFooter() { return (