1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 04:29:35 +01:00

fix(frontend): pnpm dev und pnpm build ohne manuelle Vorbereitung

pnpm dev:
- Internal-Packages-Pattern: packages/ zeigen auf ./src/index.ts
- tsx lädt TypeScript direkt, kein Build-Schritt vor pnpm dev nötig
- publishConfig sichert dist/ für pnpm build und Releases

pnpm build:
- @effigenix/types build ruft nicht mehr generate:types auf
  (openapi.json ist eingecheckt, kein laufendes Backend nötig)
- Veraltete Typreferenzen entfernt/korrigiert:
  SessionToken (nicht im Schema), RoleName/Permission (aus RoleDTO
  abgeleitet), ErrorResponse (als eigene Interface definiert)

docs: READMEs aktualisiert – Schnellstart prominent, Stub-Modus
dokumentiert, Korrekturen (Flyway→Liquibase, com.→de.effigenix)
This commit is contained in:
Sebastian Frick 2026-02-18 21:38:35 +01:00
parent 03b3b51a68
commit 3cccab1f4d
3 changed files with 187 additions and 480 deletions

277
README.md
View file

@ -2,6 +2,37 @@
ERP-System für Fleischereien mit HACCP-Compliance, GoBD-konform, Mehrfilialen-Support.
## Schnellstart
### Backend
```bash
# PostgreSQL starten (Docker)
docker run --name effigenix-postgres \
-e POSTGRES_DB=effigenix \
-e POSTGRES_USER=effigenix \
-e POSTGRES_PASSWORD=effigenix \
-p 5432:5432 \
-d postgres:15
# Backend bauen & starten
cd backend
mvn spring-boot:run
```
> **Kein Docker?** Das Backend startet auch ohne Datenbank im Stub-Modus (Warnlog erscheint).
> Die OpenAPI-Spec ist dann unter http://localhost:8080/api-docs abrufbar.
### Frontend (Terminal UI)
```bash
cd frontend
pnpm install
pnpm dev # startet direkt, kein Build-Schritt nötig
```
---
## Repository Structure
```
@ -9,11 +40,11 @@ effigenix/
├── backend/ # Java Spring Boot Backend
│ ├── src/ # Java source code (DDD + Clean Architecture)
│ ├── docs/ # Backend documentation
│ └── pom.xml # Maven configuration
│ └── pom.xml
└── frontend/ # TypeScript Frontend (TUI & WebUI)
├── apps/ # Applications (CLI TUI, WebUI)
└── packages/ # Shared packages (api-client, types, validation)
└── frontend/ # TypeScript Frontend (pnpm Monorepo)
├── apps/cli/ # Terminal UI (Ink/React)
└── packages/ # Shared: api-client, types, validation, config
```
## Architektur
@ -45,224 +76,40 @@ effigenix/
## Bounded Contexts (11)
### Core Domains (7)
- **Production Management** - Rezeptverwaltung, Chargenproduktion
- **Quality Management** - HACCP-Compliance, Temperaturüberwachung
- **Inventory Management** - Bestandsführung, Lagerverwaltung
- **Procurement** - Einkauf, Wareneingang, Lieferanten
- **Sales** - Auftragserfassung, Rechnungsstellung, Kunden
### Core Domains
- **Production Management** Rezeptverwaltung, Chargenproduktion
- **Quality Management** HACCP-Compliance, Temperaturüberwachung
- **Inventory Management** Bestandsführung, Lagerverwaltung
- **Procurement** Einkauf, Wareneingang, Lieferanten
- **Sales** Auftragserfassung, Rechnungsstellung, Kunden
### Supporting Domains (3)
- **Labeling** - Etikettendruck mit HACCP-Daten
- **Filiales** - Mehrfilialen-Verwaltung
### Supporting Domains
- **Labeling** Etikettendruck mit HACCP-Daten
- **Filiales** Mehrfilialen-Verwaltung
### Generic Subdomains (3)
- **User Management** - Authentifizierung, Autorisierung, Rollen
- **Reporting** - Standard-Reports
- **Notifications** - E-Mail/SMS-Benachrichtigungen
### Generic Subdomains
- **User Management** Authentifizierung, Autorisierung, Rollen *(implementiert)*
- **Reporting** Standard-Reports
- **Notifications** E-Mail/SMS-Benachrichtigungen
## Tech Stack
- **Java 21** (Records, Sealed Interfaces, Pattern Matching)
- **Spring Boot 3.2** (Spring Security 6, Spring Data JPA 3)
- **PostgreSQL 15+** (Produktiv-DB)
- **JWT** (Stateless Authentication)
- **Flyway** (Schema Migrations)
- **Maven** (Build Tool)
| Schicht | Technologie |
|---------|-------------|
| Backend | Java 21, Spring Boot 3.2, Spring Security 6 |
| Datenbank | PostgreSQL 15+, Liquibase |
| Auth | JWT (JJWT), Stateless |
| Build | Maven |
| Frontend | TypeScript, React, Ink (TUI) |
| Packages | pnpm Workspaces, tsup, Zod, Axios |
## Getting Started
## Weiterführend
### Backend (Java Spring Boot)
**Prerequisites:**
- Java 21+
- Maven 3.9+
- PostgreSQL 15+
- Docker (optional, für PostgreSQL)
**Database Setup:**
```bash
# PostgreSQL mit Docker
docker run --name effigenix-postgres \
-e POSTGRES_DB=effigenix \
-e POSTGRES_USER=effigenix \
-e POSTGRES_PASSWORD=effigenix \
-p 5432:5432 \
-d postgres:15
```
**Build & Run:**
```bash
cd backend
# Build
mvn clean install
# Run
mvn spring-boot:run
# Run with specific profile
mvn spring-boot:run -Dspring-boot.run.profiles=dev
```
**API Documentation:**
Nach dem Start verfügbar unter:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI Spec: http://localhost:8080/api-docs
### Frontend (TypeScript TUI)
**Prerequisites:**
- Node.js 20+
- pnpm 9+
**Setup & Run:**
```bash
cd frontend
# Install dependencies
pnpm install
# Run TUI in dev mode
pnpm run dev
# Build for production
pnpm run build
```
Detailed frontend documentation: [frontend/README.md](frontend/README.md)
## Project Structure
**Backend (Java):**
```
backend/src/main/java/de/effigenix/
├── domain/ # Domain Layer (keine Framework-Dependencies!)
│ └── usermanagement/
│ ├── User.java
│ ├── Role.java
│ ├── UserId.java
│ └── UserRepository.java
├── application/ # Application Layer (Use Cases)
│ └── usermanagement/
│ ├── CreateUser.java
│ ├── AuthenticateUser.java
│ └── dto/
├── infrastructure/ # Infrastructure Layer
│ ├── persistence/
│ ├── security/
│ ├── web/
│ └── audit/
└── shared/ # Shared Kernel
├── security/ # AuthorizationPort, Action
└── common/ # Result, ApplicationError
backend/src/main/resources/
└── db/migration/ # Liquibase Migrations
```
**Frontend (TypeScript):**
```
frontend/
├── apps/
│ └── cli/ # Terminal UI (Ink)
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── hooks/ # React hooks
│ │ └── state/ # State management
│ └── package.json
└── packages/ # Shared packages (reusable for WebUI)
├── api-client/ # HTTP client für Backend API
├── types/ # TypeScript types (generated from OpenAPI)
├── validation/ # Zod schemas
└── config/ # Shared configuration
```
## User Management (Generic Subdomain)
### Vordefinierte Rollen
| Rolle | Permissions | Zielgruppe |
|-------|-------------|------------|
| **ADMIN** | Alle | Systemadministrator |
| **PRODUCTION_MANAGER** | RECIPE_*, BATCH_*, PRODUCTION_ORDER_* | Leiter Produktion |
| **PRODUCTION_WORKER** | RECIPE_READ, BATCH_* | Produktionsmitarbeiter |
| **QUALITY_MANAGER** | HACCP_*, TEMPERATURE_LOG_* | Qualitätsbeauftragter |
| **QUALITY_INSPECTOR** | TEMPERATURE_LOG_*, GOODS_INSPECTION_* | QM-Mitarbeiter |
| **PROCUREMENT_MANAGER** | PURCHASE_ORDER_*, SUPPLIER_* | Einkaufsleiter |
| **WAREHOUSE_WORKER** | STOCK_*, INVENTORY_COUNT_* | Lagermitarbeiter |
| **SALES_MANAGER** | ORDER_*, INVOICE_*, CUSTOMER_* | Verkaufsleiter |
| **SALES_STAFF** | ORDER_READ/WRITE, CUSTOMER_READ | Verkaufsmitarbeiter |
### AuthorizationPort (für andere BCs)
```java
// Typsichere, fachliche Authorization - kein direkter Zugriff auf User/Roles!
public interface AuthorizationPort {
boolean can(Action action);
void assertCan(Action action);
boolean can(Action action, ResourceId resource);
void assertCan(Action action, ResourceId resource);
ActorId currentActor();
Optional<BranchId> currentBranch();
}
// Beispiel: Production BC
public class CreateRecipe {
private final AuthorizationPort authPort;
public Result<ApplicationError, RecipeDTO> execute(CreateRecipeCommand cmd) {
authPort.assertCan(ProductionAction.RECIPE_WRITE);
// Business logic...
}
}
```
## Testing
**Backend:**
```bash
cd backend
# Unit Tests
mvn test
# Integration Tests
mvn verify
# Test Coverage
mvn clean verify jacoco:report
```
**Frontend:**
```bash
cd frontend
# Unit Tests
pnpm test
# Test Coverage
pnpm run test:coverage
# Type Check
pnpm run typecheck
```
- [Backend README](backend/README.md)
- [Frontend README](frontend/README.md)
- [Quick Start (Detail)](backend/docs/QUICK_START.md)
- [User Management](backend/docs/USER_MANAGEMENT.md)
## License
Proprietary - Effigenix GmbH
## Contact
- Project Lead: sebi@effigenix.com
- Architecture: DDD + Clean Architecture
- Documentation: /docs/mvp/
Proprietary Effigenix GmbH

View file

@ -1,188 +1,103 @@
# Effigenix Fleischerei ERP
# Effigenix Backend
ERP-System für Fleischereien mit HACCP-Compliance, GoBD-konform, Mehrfilialen-Support.
Java Spring Boot Backend für das Effigenix ERP-System.
## Architektur
**Domain-Driven Design + Clean Architecture + Java 21 + Spring Boot**
```
┌─────────────────────────────────────────────────────┐
│ Presentation (REST Controllers) │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Application Layer (Use Cases) │
│ - Transaction Script for Generic Subdomains │
│ - Rich Domain Model for Core Domains │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Domain Layer (DDD Tactical Patterns) │
│ - Aggregates, Entities, Value Objects │
│ - Domain Events, Repositories │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ Infrastructure Layer │
│ - Spring, JPA, PostgreSQL, JWT, REST │
└─────────────────────────────────────────────────────┘
```
## Bounded Contexts (11)
### Core Domains (7)
- **Production Management** - Rezeptverwaltung, Chargenproduktion
- **Quality Management** - HACCP-Compliance, Temperaturüberwachung
- **Inventory Management** - Bestandsführung, Lagerverwaltung
- **Procurement** - Einkauf, Wareneingang, Lieferanten
- **Sales** - Auftragserfassung, Rechnungsstellung, Kunden
### Supporting Domains (3)
- **Labeling** - Etikettendruck mit HACCP-Daten
- **Filiales** - Mehrfilialen-Verwaltung
### Generic Subdomains (3)
- **User Management** - Authentifizierung, Autorisierung, Rollen
- **Reporting** - Standard-Reports
- **Notifications** - E-Mail/SMS-Benachrichtigungen
## Tech Stack
- **Java 21** (Records, Sealed Interfaces, Pattern Matching)
- **Spring Boot 3.2** (Spring Security 6, Spring Data JPA 3)
- **PostgreSQL 15+** (Produktiv-DB)
- **JWT** (Stateless Authentication)
- **Flyway** (Schema Migrations)
- **Maven** (Build Tool)
## Getting Started
### Prerequisites
- Java 21+
- Maven 3.9+
- PostgreSQL 15+
- Docker (optional, für PostgreSQL)
### Database Setup
## Schnellstart
```bash
# PostgreSQL mit Docker
# 1. PostgreSQL starten (Docker)
docker run --name effigenix-postgres \
-e POSTGRES_DB=effigenix \
-e POSTGRES_USER=effigenix \
-e POSTGRES_PASSWORD=effigenix \
-p 5432:5432 \
-d postgres:15
# 2. Bauen & starten
mvn spring-boot:run
```
### Build & Run
**Ohne Datenbank** (Stub-Modus nur API-Docs):
```bash
mvn spring-boot:run
# Warnung im Log: "⚠️ Keine Datenbankverbindung Stub-Modus aktiv"
# OpenAPI-Spec: http://localhost:8080/api-docs
```
**API-Dokumentation** (mit laufender DB):
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api-docs
## Build
```bash
# Build
# Kompilieren + Tests
mvn clean install
# Run
# Nur starten (ohne Tests)
mvn spring-boot:run
# Run with specific profile
# Mit Profil
mvn spring-boot:run -Dspring-boot.run.profiles=dev
```
### API Documentation
## Architektur
Nach dem Start verfügbar unter:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI Spec: http://localhost:8080/api-docs
## Project Structure
DDD + Clean Architecture. Einweg-Abhängigkeit: `domain → application → infrastructure`.
```
src/main/java/com/effigenix/
├── domain/ # Domain Layer (keine Framework-Dependencies!)
│ └── usermanagement/
│ ├── User.java
│ ├── Role.java
│ ├── UserId.java
│ └── UserRepository.java
├── application/ # Application Layer (Use Cases)
│ └── usermanagement/
│ ├── CreateUser.java
│ ├── AuthenticateUser.java
│ └── dto/
├── infrastructure/ # Infrastructure Layer
│ ├── persistence/
de.effigenix/
├── domain/ # Reine Geschäftslogik keine Framework-Deps
│ ├── usermanagement/
│ └── masterdata/
├── application/ # Use Cases, Commands, DTOs
│ ├── usermanagement/
│ └── masterdata/
├── infrastructure/ # Spring, JPA, REST, Security, Audit
│ ├── config/
│ ├── security/
│ ├── web/
│ └── audit/
└── shared/ # Shared Kernel
├── security/ # AuthorizationPort, Action
└── common/ # Result, ApplicationError
src/main/resources/
└── db/migration/ # Flyway Migrations
│ ├── audit/
│ ├── stub/ # Stub-Beans für no-db-Profil
│ ├── usermanagement/
│ └── masterdata/
└── shared/ # Shared Kernel (Result<E,T>, AuthorizationPort, Action)
```
## User Management (Generic Subdomain)
**Liquibase-Migrationen:** `src/main/resources/db/changelog/`
## User Management
### Vordefinierte Rollen
| Rolle | Permissions | Zielgruppe |
|-------|-------------|------------|
| **ADMIN** | Alle | Systemadministrator |
| **PRODUCTION_MANAGER** | RECIPE_*, BATCH_*, PRODUCTION_ORDER_* | Leiter Produktion |
| **PRODUCTION_WORKER** | RECIPE_READ, BATCH_* | Produktionsmitarbeiter |
| **QUALITY_MANAGER** | HACCP_*, TEMPERATURE_LOG_* | Qualitätsbeauftragter |
| **QUALITY_INSPECTOR** | TEMPERATURE_LOG_*, GOODS_INSPECTION_* | QM-Mitarbeiter |
| **PROCUREMENT_MANAGER** | PURCHASE_ORDER_*, SUPPLIER_* | Einkaufsleiter |
| **WAREHOUSE_WORKER** | STOCK_*, INVENTORY_COUNT_* | Lagermitarbeiter |
| **SALES_MANAGER** | ORDER_*, INVOICE_*, CUSTOMER_* | Verkaufsleiter |
| **SALES_STAFF** | ORDER_READ/WRITE, CUSTOMER_READ | Verkaufsmitarbeiter |
| Rolle | Zielgruppe |
|-------|------------|
| `ADMIN` | Systemadministrator (alle Rechte) |
| `PRODUCTION_MANAGER` | Leiter Produktion |
| `PRODUCTION_WORKER` | Produktionsmitarbeiter |
| `QUALITY_MANAGER` | Qualitätsbeauftragter |
| `QUALITY_INSPECTOR` | QM-Mitarbeiter |
| `PROCUREMENT_MANAGER` | Einkaufsleiter |
| `WAREHOUSE_WORKER` | Lagermitarbeiter |
| `SALES_MANAGER` | Verkaufsleiter |
| `SALES_STAFF` | Verkaufsmitarbeiter |
### AuthorizationPort (für andere BCs)
### AuthorizationPort
```java
// Typsichere, fachliche Authorization - kein direkter Zugriff auf User/Roles!
public interface AuthorizationPort {
boolean can(Action action);
void assertCan(Action action);
boolean can(Action action, ResourceId resource);
void assertCan(Action action, ResourceId resource);
ActorId currentActor();
Optional<BranchId> currentBranch();
}
// Beispiel: Production BC
public class CreateRecipe {
private final AuthorizationPort authPort;
public Result<ApplicationError, RecipeDTO> execute(CreateRecipeCommand cmd) {
authPort.assertCan(ProductionAction.RECIPE_WRITE);
// Business logic...
}
}
// Typsichere, fachliche Authorization kein direkter Zugriff auf User/Roles
authPort.assertCan(ProductionAction.RECIPE_WRITE);
authPort.assertCan(SalesAction.ORDER_READ, orderId);
```
## Testing
## Tests
```bash
# Unit Tests
mvn test
# Integration Tests
mvn verify
# Test Coverage
mvn clean verify jacoco:report
mvn test # Unit Tests
mvn verify # + Integration Tests
mvn clean verify jacoco:report # Test Coverage
```
## License
## Dokumentation
Proprietary - Effigenix GmbH
## Contact
- Project Lead: sebi@effigenix.com
- Architecture: DDD + Clean Architecture
- Documentation: /docs/mvp/
- [Quick Start](docs/QUICK_START.md) Docker, Seed-Daten, lokale Entwicklung
- [User Management](docs/USER_MANAGEMENT.md) Referenz-BC, JWT, Audit

View file

@ -1,143 +1,88 @@
# Effigenix Frontend
TypeScript monorepo containing Terminal User Interface (TUI) and shared packages for the Effigenix ERP system.
TypeScript-Monorepo mit Terminal UI (TUI) und geteilten Packages für das Effigenix ERP.
## Structure
## Schnellstart
```bash
pnpm install
pnpm dev # startet direkt, kein separater Build-Schritt nötig
```
Das Backend muss unter http://localhost:8080 erreichbar sein.
## Build
```bash
pnpm build # baut alle Packages nach dist/
```
## Weitere Scripts
```bash
pnpm test # Tests aller Packages
pnpm run typecheck # TypeScript-Check aller Packages
pnpm run lint # ESLint
pnpm run format # Prettier
```
---
## Struktur
```
frontend/
├── apps/
│ └── cli/ # Terminal UI (Ink)
│ └── cli/ # Terminal UI (Ink/React)
└── packages/ # Shared packages (reusable for WebUI)
├── api-client/ # HTTP client for Backend API
├── types/ # TypeScript types (generated from OpenAPI)
├── validation/ # Zod schemas
└── config/ # Shared configuration
└── packages/
├── api-client/ # HTTP-Client für die Backend-API
├── types/ # TypeScript-Typen (aus openapi.json generiert)
├── validation/ # Zod-Schemas
└── config/ # Shared Configuration
```
## Prerequisites
## Packages: Internal-Packages-Pattern
- Node.js 20+
- pnpm 9+
- Backend running at http://localhost:8080
Die `packages/`-Libraries zeigen in `main`/`exports` auf ihre TypeScript-Quellen (`./src/index.ts`).
`tsx` lädt sie daher direkt kein Build-Schritt vor `pnpm dev` nötig.
## Getting Started
`pnpm build` erzeugt wie gewohnt `dist/` via tsup; für ein `npm publish` greift `publishConfig`.
### Install Dependencies
## OpenAPI-Typen aktualisieren
Die `openapi.json` ist eingecheckt und wird beim Build direkt verwendet.
Wenn sich die Backend-API ändert:
```bash
pnpm install
# Backend lokal starten, dann:
cd packages/types
pnpm run generate:spec # holt openapi.json vom laufenden Backend
pnpm run generate:types # generiert src/generated/api.ts daraus
# Ergebnis committen
```
### Development
## Monorepo-Befehle
```bash
# Run TUI in dev mode
pnpm run dev
# Dependency in einem Package installieren
pnpm add axios --filter @effigenix/api-client
# Run tests
pnpm test
# Type check
pnpm run typecheck
# Lint code
pnpm run lint
# Format code
pnpm run format
```
### Build
```bash
# Build all packages
pnpm run build
```
## Package Development
### Adding a New Package
```bash
cd packages
mkdir my-package
cd my-package
pnpm init
```
Then update `package.json`:
- Set name to `@effigenix/my-package`
- Add `"main": "./dist/index.js"`
- Add `"types": "./dist/index.d.ts"`
- Add build script: `"build": "tsup src/index.ts"`
### Using Packages
```json
{
"dependencies": {
"@effigenix/types": "workspace:*",
"@effigenix/api-client": "workspace:*"
}
}
```
## Type Generation
Types are automatically generated from the backend OpenAPI spec:
```bash
# Start backend first
cd ../backend
mvn spring-boot:run
# Generate types
cd ../frontend/packages/types
pnpm run generate:types
```
## Technology Stack
- **TypeScript** - Type-safe JavaScript
- **React** - UI library (Ink for terminal)
- **pnpm** - Fast, efficient package manager
- **Zod** - Runtime validation + type inference
- **Axios** - HTTP client with interceptors
- **tsup** - Zero-config TypeScript bundler
- **vitest** - Fast unit testing
## Monorepo Commands
```bash
# Install dependencies in root
pnpm install
# Run command in specific package
# Script in einem Package ausführen
pnpm run --filter @effigenix/cli dev
# Run command in all packages
# Script in allen Packages ausführen
pnpm run --recursive build
# Add dependency to specific package
pnpm add axios --filter @effigenix/api-client
```
## Scripts
## Tech Stack
- `pnpm run build` - Build all packages
- `pnpm run dev` - Run CLI TUI in dev mode
- `pnpm test` - Run all tests
- `pnpm run typecheck` - Type check all packages
- `pnpm run lint` - Lint all code
- `pnpm run format` - Format all code
## Documentation
See individual package READMEs for detailed documentation:
- [API Client](packages/api-client/README.md)
- [Types](packages/types/README.md)
- [Validation](packages/validation/README.md)
- [Config](packages/config/README.md)
- [CLI TUI](apps/cli/README.md)
| Tool | Zweck |
|------|-------|
| TypeScript | Typsichere Entwicklung |
| React + Ink | Terminal UI |
| pnpm Workspaces | Monorepo-Verwaltung |
| tsup | Zero-config TS-Bundler |
| Zod | Runtime-Validierung |
| Axios | HTTP-Client |
| vitest | Unit Tests |