# SummerCMS

A Scala/ZIO-based Content Management Framework — a modern rewrite of WinterCMS/OctoberCMS with better performance, type safety, and horizontal scaling.

## Status

**Phase 1: Foundation** — Complete

- Mill build system with Scala 3.3.4
- ZIO HTTP server with health endpoints
- PostgreSQL integration via Quill (compile-time SQL validation)
- Flyway database migrations
- Repository pattern with typed errors
- Pulumi/Besom infrastructure for AWS deployment
- Docker containerization

## Requirements

- Java 21+ (tested with Java 25)
- PostgreSQL 14+
- Mill 1.1.1+ (included as `./mill` launcher)

## Quick Start

### 1. Database Setup

```bash
# Create database user and database
sudo -u postgres psql -c "CREATE USER summercms WITH PASSWORD 'summercms';"
sudo -u postgres psql -c "CREATE DATABASE summercms OWNER summercms;"
```

Or use environment variables to connect to an existing database.

### 2. Run the Server

```bash
# Start the development server
./mill summercms.run
```

You should see the SummerCMS banner and the server starting on port 8080.

### 3. Verify

```bash
# Health check (always returns 200)
curl http://localhost:8080/health

# Readiness check (returns 200 if database connected, 503 otherwise)
curl http://localhost:8080/ready
```

## Configuration

Configuration uses HOCON format in `summercms/resources/application.conf`. Environment variables override defaults:

| Variable | Default | Description |
|----------|---------|-------------|
| `SERVER_HOST` | 0.0.0.0 | Server bind address |
| `SERVER_PORT` | 8080 | Server port |
| `DB_HOST` | localhost | PostgreSQL host |
| `DB_PORT` | 5432 | PostgreSQL port |
| `DB_NAME` | summercms | Database name |
| `DB_USER` | summercms | Database user |
| `DB_PASSWORD` | summercms | Database password |

## Project Structure

```
summercms/
├── build.mill                 # Mill build configuration
├── summercms/
│   ├── src/
│   │   ├── Main.scala         # Application entry point
│   │   ├── api/               # HTTP routes
│   │   │   ├── Routes.scala
│   │   │   └── HealthRoutes.scala
│   │   ├── config/            # Configuration
│   │   │   └── AppConfig.scala
│   │   ├── db/                # Database layer
│   │   │   ├── QuillContext.scala
│   │   │   └── Migrator.scala
│   │   ├── model/             # Domain models
│   │   │   └── User.scala
│   │   └── repository/        # Data access
│   │       ├── RepositoryError.scala
│   │       └── UserRepository.scala
│   └── resources/
│       ├── application.conf   # HOCON configuration
│       └── db/migration/      # Flyway SQL migrations
├── infra/                     # Pulumi/Besom infrastructure
│   ├── project.scala
│   └── Main.scala
└── Dockerfile                 # Container build
```

## Development

### Build Commands

```bash
# Compile
./mill summercms.compile

# Run
./mill summercms.run

# Build fat JAR
./mill summercms.assembly

# Run tests
./mill summercms.test
```

### Database Migrations

Migrations are in `summercms/resources/db/migration/` using Flyway naming convention (`V1__description.sql`).

Migrations are **not** auto-run on startup. They will be invoked via CLI commands (coming in Phase 5).

### Docker

```bash
# Build image
docker build -t summercms .

# Run container
docker run -p 8080:8080 \
  -e DB_HOST=host.docker.internal \
  -e DB_PASSWORD=secret \
  summercms
```

### Infrastructure (Pulumi)

The `infra/` directory contains Pulumi infrastructure using Besom (Scala Pulumi SDK):

```bash
cd infra
pulumi stack init dev
pulumi config set dbPassword --secret <password>
pulumi up
```

Defines:
- S3 bucket for assets
- RDS PostgreSQL instance

## Tech Stack

| Component | Technology |
|-----------|------------|
| Language | Scala 3.3.4 |
| Effect System | ZIO 2.1.14 |
| HTTP Server | zio-http 3.0.1 |
| Database | PostgreSQL + Quill 4.8.5 |
| Migrations | Flyway 10.21.0 |
| Configuration | zio-config + HOCON |
| Build | Mill 1.1.1 |
| Infrastructure | Pulumi + Besom 0.5.0 |

## Roadmap

SummerCMS is being built in phases:

- [x] **Phase 1: Foundation** — Database, migrations, repository pattern, deployment
- [ ] **Phase 2: Plugin System** — Plugin discovery, lifecycle, dependencies, extension API
- [ ] **Phase 3: Component System** — Reusable UI components with HTMX handlers
- [ ] **Phase 4: Theme Engine** — Layouts, partials, asset management, Vue integration
- [ ] **Phase 5: CLI Scaffolding** — Commands to create plugins, themes, components
- [ ] **Phase 6: Backend Authentication** — Admin users, login/logout, RBAC
- [ ] **Phase 7: Admin Forms & Lists** — YAML-driven form and list generation
- [ ] **Phase 8: Admin Dashboard** — Dashboard widgets and plugin settings
- [ ] **Phase 9: Content Management** — CMS pages, media library, menus
- [ ] **Phase 10: Core Plugins** — User plugin and Blog plugin

## License

[TBD]
