---
# System prepended metadata

title: Backend Infra Introduction

---

# Backend Infra Introduction

## CI/CD flow

```mermaid
flowchart TD;
  GitLab(GitLab)-->|1. Webhook Trigger|Build(Cloud Build)
  GitLab-->|2. Clone|Build
  subgraph Build [Cloud Build]
    Build-Clone(1. Clone the target branch)-->Build-Checkout(2. Checkout to the target commit)
    Build-Checkout-->Build-Build(3. Build docker image)
    Build-Build-->Build-Push(4. Push to Artifact Registry)
    Build-Push-->|Is develop branch|Build-DeployDevDB
    Build-Push-->|Is master branch|Build-DeployProdDB
    Build-DeployDevDB(5. Migrate dev DB with Prisma)-->Build-DeployDevServ(6. Deploy dev service)
    Build-DeployProdDB(5. Migrate prod DB with Prisma)-->Build-DeployProdServ(6. Deploy prod service)
  end
  Build-->|3. Push docker image|Artifact(Artifact Registry)
  Build-->|4. Deploy|Run
  Artifact-->|5. Pull latest image|Run(Cloud Run)
```


> GitLab Webhook Setting
> https://gitlab.com/elkroom/backend/oxo_game_service/-/hooks

> Cloud Build Setting Page
> https://console.cloud.google.com/cloud-build/triggers?project=oxo-backend

## Project
## Tech Stack
- TypeScript
- Fastify
- Prisma
- PostgreSQL

### Project Structure
```mermaid
flowchart LR;
  Router(Router)-->Controller(Controller)-->Service(Service)
```

- src
  - api
    - ***.schema.ts:** API schemas. It will be used by Swagger to generate API docs, and [Ajv](https://ajv.js.org/) to validate all request and response
    - ***.type.ts**: [TypeBox](https://github.com/sinclairzx81/typebox) declaration, for declaring schema's type
    - ***.request.ts:** interface which extend `FastifyRequest`
  - **firebase:** code that related to Firebase
  - plugin
    - **auth.ts:** fastify plugin that declare the auth functions
    - **jwt.ts:** plugin for JWT verifying
    - **env.ts:** plugin for setting environment variables
    - **helmet.ts:** plugin for auto-add important security headers
    - **swagger.ts:** plugin for setup Swagger by the schemas
  - util
    - **error:** place to declare HTTP exception, such as 404 not found.

### Tools
- pnpm
  - Fast, disk space efficient package manager
- ESLint
  - A linter for JS/TS, and it could be fully customized with its configuration file(`.eslintrc`).