Photo Map MVP is a full-stack application for managing photos with geolocation. Built with Angular 18, Spring Boot 3, and PostgreSQL, it provides photo uploading, EXIF GPS extraction, interactive map visualization, and rating system.
- Upload & Processing - Automatic EXIF extraction (GPS, date) and thumbnail generation
- Gallery & Map - Responsive grid view and interactive Leaflet.js map
- Rating System - Rate photos 1-5 stars with average rating from all users
- Security - JWT authentication, BCrypt hashing, permission-based access
- Admin Panel - User management and permissions (VIEW_PHOTOS, RATE_PHOTOS)
Frontend:
- Angular 18.2.0 (standalone components, Signals)
- TypeScript 5.5.2+ (strict mode)
- Tailwind CSS 3.4.17
- Leaflet.js 1.9.4 (maps + markercluster)
- RxJS 7.8.0 (BehaviorSubject pattern)
Backend:
- Spring Boot 3.2.11 (Java 17 LTS)
- PostgreSQL 15
- Spring Security 6 (JWT, BCrypt)
- metadata-extractor 2.19.0 (EXIF)
- Flyway (migrations)
Testing:
- Frontend: Karma + Jasmine (199 tests)
- Backend: JUnit 5 + Mockito (78 tests)
- E2E: Playwright (6 specs, 15+ tests)
- Coverage: >50% (backend + frontend)
Deployment:
- Docker Compose (backend + frontend)
- Nginx (reverse proxy)
- Mikrus VPS (PostgreSQL shared service)
- Node.js 18+ (frontend)
- Java 17 JDK + Maven (backend)
- PostgreSQL 15+ (or Docker)
- Git
Option A: Quick Setup (Recommended - One Command)
# 1. Clone repository
git clone <repository-url>
cd photo-map-app
# 2. Copy environment template
cp .env.example .env
# 3. Edit .env with your credentials (database, admin password, JWT secret)
nano .env
# 4. Initialize everything (database schema, directories, admin user)
./scripts/reset-data.sh
# 5. Start application
./scripts/start-dev.shWhat happens:
- β PostgreSQL starts automatically (Docker Compose)
- β Database schema created (Flyway migrations)
- β Upload directories set up
- β
Admin user created from
.envcredentials - β Backend runs on http://localhost:8080
- β Frontend runs on http://localhost:4200
Option B: Manual Setup
1. Clone repository:
git clone <repository-url>
cd photo-map-app2. Backend setup:
cd backend
cp .env.example .env
# Edit .env with database credentials and JWT secret
./mvnw spring-boot:run
# Backend runs on http://localhost:80803. Frontend setup:
cd frontend
npm install
ng serve
# Frontend runs on http://localhost:42004. Database setup:
psql -U postgres
CREATE DATABASE photomap;
CREATE USER photomap_user WITH PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE photomap TO photomap_user;
\q
# Migrations run automatically on backend startup# Start backend + frontend + PostgreSQL
./scripts/start-dev.sh
# Stop backend + frontend
./scripts/stop-dev.sh
# Run all tests (unit + E2E)
./scripts/run-all-tests.sh
# Install pre-push hook (auto-runs tests)
./scripts/install-hooks.shFor detailed scripts documentation, see Scripts Reference or scripts/README.md.
For detailed documentation, see the GitHub Wiki:
- Home - Project overview and navigation
- Quick Start - 5-step setup guide
- User Guide - How to use the application
- Development Setup - Prerequisites, project structure, workflow
- Architecture - Tech stack, frontend/backend architecture, database schema
- API Documentation - REST endpoints, authentication, Swagger UI
- Testing & Quality - Unit tests, E2E tests, CI/CD pipeline
- Scripts Reference - Development scripts guide
- Contributing - Code conventions, git workflow, PR process
- Deployment Guide - Docker Compose, Mikrus VPS, SSL configuration
- AI Development Methodology - Claude Code, GitHub Copilot, Gemini CLI
CLAUDE.md- Claude Code workflow instructionsPROGRESS_TRACKER.md- Implementation roadmap and status.ai/- Implementation specs (PRD, tech stack, API/DB/UI plans).decisions/- Decision rationale and context
# Frontend
cd frontend && npm run test:coverage
# Backend
cd backend && ./mvnw test jacoco:reportcd frontend && npm run test:e2e./scripts/run-all-tests.sh# Install (one-time)
./scripts/install-hooks.sh
# Tests run automatically on git push
# Bypass (emergency only): git push --no-verifyInteractive API docs available at: http://localhost:8080/swagger-ui/index.html
Endpoints:
/api/auth/**- Authentication/api/photos/**- Photo management/api/admin/**- Admin operations
- SonarCloud:
- GitHub Actions: Workflows
See Contributing Guide for:
- Code conventions (English code, self-documenting style)
- Git workflow (Conventional Commits)
- Testing policy (TDD-like, >70% coverage)
- Pull request process
MIT License - see LICENSE file for details