# jolapsh/voting-system architecture

> Architecture diagram of the GitHub repository jolapsh/voting-system, 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/jolapsh/voting-system
- Repository: https://github.com/jolapsh/voting-system

## Overview

This Spring Boot REST API supports an admin-maintained restaurant and daily-dish catalog, plus user voting: users browse restaurants and dishes, then cast one vote per day and may change it before 11 a.m. Admin endpoints manage restaurants and dishes; Spring Security applies role-based access and basic authentication. The domain model and JPA repositories persist users, restaurants, dishes, and votes. The README documents HSQL/JPA, but the excerpts do not show runtime database wiring, so that connection is marked unverified.

Main entry points: [`src/main/java/top/graduation/rs/service/VoteServiceImpl.java`](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/VoteServiceImpl.java) (Vote service), [`src/main/java/top/graduation/rs/service/RestaurantServiceImp.java`](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/RestaurantServiceImp.java) (Restaurant service), [`src/main/java/top/graduation/rs/service/DishServiceImpl.java`](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/DishServiceImpl.java) (Dish service), [`src/main/java/top/graduation/rs/service/UserServiceSecurity.java`](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/UserServiceSecurity.java) (User details)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["REST API"]
  node_app["Spring Boot app<br/>[SpringBootApp.java]"]
  node_root["Browse restaurants"]
  node_voteapi["Vote endpoint"]
  node_adminrest["Restaurant admin"]
  node_admindish["Dish admin"]
  node_errors["API errors"]
end

subgraph group_security["Security"]
  node_authconfig["Security config"]
  node_userdetails["User details"]
  node_authorized["Authorized user"]
  node_securityutil["Security utilities<br/>[SecurityUtil.java]"]
end

subgraph group_domain["Voting Domain"]
  node_restaurantsvc["Restaurant service"]
  node_dishsvc["Dish service"]
  node_votesvc["Vote service"]
  node_voteto["Vote result<br/>[VoteTo.java]"]
  node_entities["Domain entities"]
  node_validation["Validation helpers"]
end

subgraph group_persistence["Persistence"]
  node_restaurantrepo["Restaurant repository"]
  node_dishrepo["Dish repository"]
  node_userrepo["User repository"]
  node_voterepo["Vote repository"]
  node_database[("HSQL database")]
end

node_client(("REST client"))

node_client -->|"sends requests"| node_app
node_root -->|"queries restaurants"| node_restaurantsvc
node_voteapi -->|"submits votes"| node_votesvc
node_voteapi -->|"gets user"| node_securityutil
node_adminrest -->|"manages restaurants"| node_restaurantsvc
node_admindish -->|"manages dishes"| node_dishsvc
node_authconfig -->|"loads users"| node_userdetails
node_userdetails -->|"looks up users"| node_userrepo
node_userdetails -->|"creates principal"| node_authorized
node_securityutil -->|"reads principal"| node_authorized
node_restaurantsvc -->|"queries and saves"| node_restaurantrepo
node_dishsvc -->|"queries and saves"| node_dishrepo
node_dishsvc -->|"resolves restaurant"| node_restaurantsvc
node_votesvc -->|"loads restaurant"| node_restaurantrepo
node_votesvc -->|"loads user"| node_userrepo
node_votesvc -->|"stores and queries"| node_voterepo
node_votesvc -->|"returns vote result"| node_voteto
node_restaurantsvc -->|"checks results"| node_validation
node_dishsvc -->|"checks results"| node_validation
node_restaurantrepo -.->|"persists entities"| node_database
node_dishrepo -.->|"persists entities"| node_database
node_userrepo -.->|"persists entities"| node_database
node_voterepo -.->|"persists entities"| node_database

click node_app "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/SpringBootApp.java"
click node_root "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/user/RootController.java"
click node_voteapi "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/user/VoteController.java"
click node_adminrest "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/admin/RestaurantAdminController.java"
click node_admindish "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/admin/DishAdminController.java"
click node_errors "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/ExceptionInfoHandler.java"
click node_authconfig "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/config/WebSecurityConfig.java"
click node_userdetails "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/UserServiceSecurity.java"
click node_authorized "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/AuthorizedUser.java"
click node_securityutil "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/SecurityUtil.java"
click node_restaurantsvc "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/RestaurantServiceImp.java"
click node_dishsvc "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/DishServiceImpl.java"
click node_votesvc "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/VoteServiceImpl.java"
click node_voteto "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/to/VoteTo.java"
click node_entities "https://github.com/jolapsh/voting-system/tree/master/src/main/java/top/graduation/rs/model"
click node_validation "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/util/ValidationUtil.java"
click node_restaurantrepo "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/RestaurantRepository.java"
click node_dishrepo "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/DishRepository.java"
click node_userrepo "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/UserRepository.java"
click node_voterepo "https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/VoteRepository.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_app,node_root,node_voteapi,node_adminrest,node_admindish,node_errors,node_client toneBlue
class node_authconfig,node_userdetails,node_authorized,node_securityutil toneAmber
class node_restaurantsvc,node_dishsvc,node_votesvc,node_voteto,node_entities,node_validation toneMint
class node_restaurantrepo,node_dishrepo,node_userrepo,node_voterepo,node_database toneRose
```

## Components

### REST API

- [Spring Boot app](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/SpringBootApp.java): `src/main/java/top/graduation/rs/SpringBootApp.java`
- [Browse restaurants](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/user/RootController.java): `src/main/java/top/graduation/rs/web/user/RootController.java`
- [Vote endpoint](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/user/VoteController.java): `src/main/java/top/graduation/rs/web/user/VoteController.java`
- [Restaurant admin](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/admin/RestaurantAdminController.java): `src/main/java/top/graduation/rs/web/admin/RestaurantAdminController.java`
- [Dish admin](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/admin/DishAdminController.java): `src/main/java/top/graduation/rs/web/admin/DishAdminController.java`
- [API errors](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/ExceptionInfoHandler.java): `src/main/java/top/graduation/rs/web/ExceptionInfoHandler.java`

### Security

- [Security config](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/config/WebSecurityConfig.java): `src/main/java/top/graduation/rs/config/WebSecurityConfig.java`
- [User details](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/UserServiceSecurity.java): `src/main/java/top/graduation/rs/service/UserServiceSecurity.java`
- [Authorized user](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/AuthorizedUser.java): `src/main/java/top/graduation/rs/AuthorizedUser.java`
- [Security utilities](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/web/SecurityUtil.java): `src/main/java/top/graduation/rs/web/SecurityUtil.java`

### Voting Domain

- [Restaurant service](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/RestaurantServiceImp.java): `src/main/java/top/graduation/rs/service/RestaurantServiceImp.java`
- [Dish service](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/DishServiceImpl.java): `src/main/java/top/graduation/rs/service/DishServiceImpl.java`
- [Vote service](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/service/VoteServiceImpl.java): `src/main/java/top/graduation/rs/service/VoteServiceImpl.java`
- [Vote result](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/to/VoteTo.java): `src/main/java/top/graduation/rs/to/VoteTo.java`
- [Domain entities](https://github.com/jolapsh/voting-system/tree/master/src/main/java/top/graduation/rs/model): `src/main/java/top/graduation/rs/model`
- [Validation helpers](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/util/ValidationUtil.java): `src/main/java/top/graduation/rs/util/ValidationUtil.java`

### Persistence

- [Restaurant repository](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/RestaurantRepository.java): `src/main/java/top/graduation/rs/repository/datajpa/RestaurantRepository.java`
- [Dish repository](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/DishRepository.java): `src/main/java/top/graduation/rs/repository/datajpa/DishRepository.java`
- [User repository](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/UserRepository.java): `src/main/java/top/graduation/rs/repository/datajpa/UserRepository.java`
- [Vote repository](https://github.com/jolapsh/voting-system/blob/master/src/main/java/top/graduation/rs/repository/datajpa/VoteRepository.java): `src/main/java/top/graduation/rs/repository/datajpa/VoteRepository.java`
- **HSQL database**

### Other components

- **REST client**

## Connections

- REST client → Spring Boot app: sends requests (evidence: `README.md`)
- Browse restaurants → Restaurant service: queries restaurants (evidence: `src/main/java/top/graduation/rs/web/user/RootController.java`)
- Vote endpoint → Vote service: submits votes (evidence: `src/main/java/top/graduation/rs/web/user/VoteController.java`)
- Vote endpoint → Security utilities: gets user (evidence: `src/main/java/top/graduation/rs/web/user/VoteController.java`)
- Restaurant admin → Restaurant service: manages restaurants (evidence: `src/main/java/top/graduation/rs/web/admin/RestaurantAdminController.java`)
- Dish admin → Dish service: manages dishes (evidence: `src/main/java/top/graduation/rs/web/admin/DishAdminController.java`)
- Security config → User details: loads users (evidence: `src/main/java/top/graduation/rs/config/WebSecurityConfig.java`)
- User details → User repository: looks up users (evidence: `src/main/java/top/graduation/rs/service/UserServiceSecurity.java`)
- User details → Authorized user: creates principal (evidence: `src/main/java/top/graduation/rs/service/UserServiceSecurity.java`)
- Security utilities → Authorized user: reads principal (evidence: `src/main/java/top/graduation/rs/web/SecurityUtil.java`)
- Restaurant service → Restaurant repository: queries and saves (evidence: `src/main/java/top/graduation/rs/service/RestaurantServiceImp.java`)
- Dish service → Dish repository: queries and saves (evidence: `src/main/java/top/graduation/rs/service/DishServiceImpl.java`)
- Dish service → Restaurant service: resolves restaurant (evidence: `src/main/java/top/graduation/rs/service/DishServiceImpl.java`)
- Vote service → Restaurant repository: loads restaurant (evidence: `src/main/java/top/graduation/rs/service/VoteServiceImpl.java`)
- Vote service → User repository: loads user (evidence: `src/main/java/top/graduation/rs/service/VoteServiceImpl.java`)
- Vote service → Vote repository: stores and queries (evidence: `src/main/java/top/graduation/rs/service/VoteServiceImpl.java`)
- Vote service → Vote result: returns vote result (evidence: `src/main/java/top/graduation/rs/service/VoteServiceImpl.java`)
- Restaurant service → Validation helpers: checks results (evidence: `src/main/java/top/graduation/rs/service/RestaurantServiceImp.java`)
- Dish service → Validation helpers: checks results (evidence: `src/main/java/top/graduation/rs/service/DishServiceImpl.java`)
- Restaurant repository → HSQL database: persists entities
- Dish repository → HSQL database: persists entities
- User repository → HSQL database: persists entities
- Vote repository → HSQL database: persists entities
