# georgiuslab/notebase architecture

> Architecture diagram of the GitHub repository georgiuslab/notebase, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/georgiuslab/notebase
- Repository: https://github.com/georgiuslab/notebase

## Overview

Notebase is a backend for sharing and discovering study materials, with an API gateway in front of a Spring backend. The visible upload workflow requests a presigned URL, uploads to S3 outside the application, then confirms and saves the material. Users can search and retrieve materials and like them; separate services handle user profiles and faculty data. The tree also shows tag, subject, reporting, and audit domains, but their detailed behavior is unsampled. Relationships below are limited to calls visible in excerpts or references in the source index.

Main entry points: [`notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java`](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java) (S3 service), [`notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java) (Material API), [`notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java`](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java) (Material service), [`notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java`](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java) (Like service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_edge["API gateway"]
  node_gateway["API gateway"]
end

subgraph group_content["Materials and likes"]
  node_material_controller["Material API"]
  node_material_service["Material service"]
  node_like_service["Like service<br/>[LikeService.java]"]
  node_material_repo["Material repository"]
  node_like_repo["Like repository"]
end

subgraph group_identity["Users and storage"]
  node_s3_service["S3 service<br/>[S3Service.java]"]
  node_user_controller["User API"]
  node_user_service["User service<br/>[UserService.java]"]
  node_user_repo["User repository"]
end

subgraph group_catalog["Academic catalog"]
  node_faculty_controller["Faculty API"]
  node_faculty_service["Faculty service"]
  node_faculty_repo["Faculty repository"]
  node_subject_service["Subject service"]
  node_tag_service["Tag service<br/>[TagService.java]"]
end

subgraph group_records["Domain records"]
  node_material_record[("Material record<br/>[Material.java]")]
  node_material_dto["Material response"]
  node_url_dto["Presigned URL"]
  node_user_record[("User record<br/>[User.java]")]
  node_user_summary["User summary"]
  node_faculty_record[("Faculty record<br/>[Faculty.java]")]
  node_subject_record[("Subject record<br/>[Subject.java]")]
  node_subject_dto["Subject response"]
  node_moderation[("Reports and audit<br/>[Report.java]")]
end

node_client(("API client"))
node_s3[("AWS S3")]

node_client -.->|"sends requests"| node_gateway
node_client -->|"calls API"| node_material_controller
node_material_controller -->|"requests upload URL"| node_s3_service
node_material_controller -->|"verifies upload"| node_s3_service
node_material_controller -->|"confirms and queries"| node_material_service
node_material_controller -->|"toggles like"| node_like_service
node_material_service -->|"reads and saves"| node_material_repo
node_material_service -->|"checks likes"| node_like_repo
node_material_service -->|"creates download URL"| node_s3_service
node_material_service -->|"maps results"| node_material_dto
node_like_service -->|"updates counts"| node_material_repo
node_like_service -->|"checks and saves"| node_like_repo
node_like_service -->|"looks up user"| node_user_repo
node_material_repo -->|"persists"| node_material_record
node_s3_service -->|"signs and verifies"| node_s3
node_s3_service -->|"returns URL data"| node_url_dto
node_client -->|"calls API"| node_user_controller
node_user_controller -->|"delegates profile work"| node_user_service
node_user_service -->|"reads and saves"| node_user_repo
node_user_service -->|"creates avatar URL"| node_s3_service
node_user_repo -.->|"persists"| node_user_record
node_faculty_controller -->|"delegates queries"| node_faculty_service
node_faculty_service -->|"queries faculty"| node_faculty_repo
node_faculty_service -->|"maps subjects"| node_subject_dto
node_faculty_repo -.->|"persists"| node_faculty_record

click node_gateway "https://github.com/georgiuslab/notebase/blob/main/api-gateway/src/main/java/chemilabi/trade/api_gateway/ApiGatewayApplication.java"
click node_material_controller "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java"
click node_material_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java"
click node_like_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java"
click node_material_repo "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/MaterialRepository.java"
click node_like_repo "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/LikeRepository.java"
click node_material_record "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Material.java"
click node_material_dto "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/MaterialResponseDto.java"
click node_s3_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java"
click node_url_dto "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/PresignedUrlResponseDto.java"
click node_user_controller "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/UserController.java"
click node_user_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/UserService.java"
click node_user_repo "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/UserRepository.java"
click node_user_record "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/User.java"
click node_user_summary "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/UserSummaryDto.java"
click node_faculty_controller "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/FacultyController.java"
click node_faculty_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/FacultyService.java"
click node_faculty_repo "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/FacultyRepository.java"
click node_faculty_record "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Faculty.java"
click node_subject_record "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Subject.java"
click node_subject_dto "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/SubjectResponseDto.java"
click node_subject_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/SubjectService.java"
click node_tag_service "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/TagService.java"
click node_moderation "https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Report.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_gateway,node_client toneBlue
class node_material_controller,node_material_service,node_like_service,node_material_repo,node_like_repo,node_s3 toneAmber
class node_s3_service,node_user_controller,node_user_service,node_user_repo toneMint
class node_faculty_controller,node_faculty_service,node_faculty_repo,node_subject_service,node_tag_service toneRose
class node_material_record,node_material_dto,node_url_dto,node_user_record,node_user_summary,node_faculty_record,node_subject_record,node_subject_dto,node_moderation toneIndigo
```

## Components

### API gateway

- [API gateway](https://github.com/georgiuslab/notebase/blob/main/api-gateway/src/main/java/chemilabi/trade/api_gateway/ApiGatewayApplication.java): `api-gateway/src/main/java/chemilabi/trade/api_gateway/ApiGatewayApplication.java`

### Materials and likes

- [Material API](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`
- [Material service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java`
- [Like service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java`
- [Material repository](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/MaterialRepository.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/MaterialRepository.java`
- [Like repository](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/LikeRepository.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/LikeRepository.java`

### Users and storage

- [S3 service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java`
- [User API](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/UserController.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/UserController.java`
- [User service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/UserService.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/UserService.java`
- [User repository](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/UserRepository.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/UserRepository.java`

### Academic catalog

- [Faculty API](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/FacultyController.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/FacultyController.java`
- [Faculty service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/FacultyService.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/FacultyService.java`
- [Faculty repository](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/FacultyRepository.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/FacultyRepository.java`
- [Subject service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/SubjectService.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/SubjectService.java`
- [Tag service](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/TagService.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/TagService.java`

### Domain records

- [Material record](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Material.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Material.java`
- [Material response](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/MaterialResponseDto.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/MaterialResponseDto.java`
- [Presigned URL](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/PresignedUrlResponseDto.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/PresignedUrlResponseDto.java`
- [User record](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/User.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/User.java`
- [User summary](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/UserSummaryDto.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/UserSummaryDto.java`
- [Faculty record](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Faculty.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Faculty.java`
- [Subject record](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Subject.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Subject.java`
- [Subject response](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/SubjectResponseDto.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/dto/SubjectResponseDto.java`
- [Reports and audit](https://github.com/georgiuslab/notebase/blob/main/notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Report.java): `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/model/Report.java`

### Other components

- **API client**
- **AWS S3**

## Connections

- API client → API gateway: sends requests
- API client → Material API: calls API (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`)
- Material API → S3 service: requests upload URL (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`)
- Material API → S3 service: verifies upload (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`)
- Material API → Material service: confirms and queries (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`)
- Material API → Like service: toggles like (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/MaterialController.java`)
- Material service → Material repository: reads and saves (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java`)
- Material service → Like repository: checks likes (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java`)
- Material service → S3 service: creates download URL (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java`)
- Material service → Material response: maps results (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/MaterialService.java`)
- Like service → Material repository: updates counts (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java`)
- Like service → Like repository: checks and saves (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java`)
- Like service → User repository: looks up user (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/LikeService.java`)
- Material repository → Material record: persists (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/MaterialRepository.java`)
- S3 service → AWS S3: signs and verifies (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java`)
- S3 service → Presigned URL: returns URL data (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/aws/S3Service.java`)
- API client → User API: calls API (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/UserController.java`)
- User API → User service: delegates profile work (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/UserController.java`)
- User service → User repository: reads and saves (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/UserService.java`)
- User service → S3 service: creates avatar URL (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/UserService.java`)
- User repository → User record: persists (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/UserRepository.java`)
- Faculty API → Faculty service: delegates queries (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/controller/FacultyController.java`)
- Faculty service → Faculty repository: queries faculty (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/FacultyService.java`)
- Faculty service → Subject response: maps subjects (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/service/FacultyService.java`)
- Faculty repository → Faculty record: persists (evidence: `notebase-backend/src/main/java/chemilabi/trade/notebase_backend/repository/FacultyRepository.java`)
