{"id":29955091,"url":"https://github.com/iptoux/sap_sf-lms-mockserver","last_synced_at":"2025-10-06T19:33:39.805Z","repository":{"id":305037268,"uuid":"1021709504","full_name":"iptoux/sap_sf-lms-mockserver","owner":"iptoux","description":"SAP SuccessFactor LMS - MockServer for development","archived":false,"fork":false,"pushed_at":"2025-07-17T23:24:08.000Z","size":2223,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-08T05:44:08.171Z","etag":null,"topics":["sap","sap-sf","successfactor","successfactors","successfactors-lms"],"latest_commit_sha":null,"homepage":"https://www.sap.com/germany/products/hcm/corporate-lms.html","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iptoux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-17T20:25:06.000Z","updated_at":"2025-07-17T23:24:11.000Z","dependencies_parsed_at":"2025-07-18T02:21:48.785Z","dependency_job_id":"e0b6c049-57f8-499b-a281-2aa3062ff808","html_url":"https://github.com/iptoux/sap_sf-lms-mockserver","commit_stats":null,"previous_names":["iptoux/sap_sf-lms-mockserver"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/iptoux/sap_sf-lms-mockserver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Fsap_sf-lms-mockserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Fsap_sf-lms-mockserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Fsap_sf-lms-mockserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Fsap_sf-lms-mockserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iptoux","download_url":"https://codeload.github.com/iptoux/sap_sf-lms-mockserver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iptoux%2Fsap_sf-lms-mockserver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278668938,"owners_count":26025511,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["sap","sap-sf","successfactor","successfactors","successfactors-lms"],"created_at":"2025-08-03T17:09:53.432Z","updated_at":"2025-10-06T19:33:39.751Z","avatar_url":"https://github.com/iptoux.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003ch1\u003eSAP SuccessFactors LMS MockServer\u003c/h1\u003e\n\n**📅 Letzte Aktualisierung:** Juli 2025 | **🏷️ Version:** 1.0.0\n\n[![Python](https://img.shields.io/badge/Python-3.13+-blue.svg)](https://python.org)\n[![Flask](https://img.shields.io/badge/Flask-2.3+-green.svg)](https://flask.palletsprojects.com)\n[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](Dockerfile)\n\n\u003c/div\u003e\n\nEin vollständiger Mock-Server für die SAP SuccessFactors Learning Management System (LMS) API mit realistischen Mock-Daten und OData v4 Unterstützung.\n\n## Inhaltsverzeichnis\n\n- [Übersicht](#übersicht)\n- [Features](#features)\n- [Architektur](#architektur)\n- [Installation](#installation)\n- [Konfiguration](#konfiguration)\n- [API-Dokumentation](#api-dokumentation)\n- [Testing](#testing)\n- [Deployment](#deployment)\n- [Docker](#docker)\n- [Anpassung](#anpassung)\n- [Troubleshooting](#troubleshooting)\n- [Beitragen](#beitragen)\n- [Lizenz](#lizenz)\n- [Support](#support)\n- [Changelog](#changelog)\n\n## Übersicht\n\nDer SAP SuccessFactors LMS MockServer ist eine vollständige Implementierung eines Mock-Servers, der die SAP SuccessFactors Learning Management System (LMS) API emuliert. Dieser Server wurde basierend auf der offiziellen SAP SuccessFactors Learning OData APIs Dokumentation entwickelt und unterstützt alle 36 dokumentierten API-Endpunkte mit realistischen Mock-Daten.\n\n**Basis-URL:** `http://localhost:5001`\n\n## Features\n\n### 🚀 Vollständige API-Abdeckung\n- **36 API-Endpunkte** vollständig implementiert\n- **OData v4** konforme Responses\n- **REST API** Endpunkte für Partner-Integration\n- **Metadata-Endpunkte** für alle Services\n- **CRUD-Operationen** für Daten-Endpunkte\n\n### 📊 Realistische Mock-Daten\n- Separate JSON-Dateien für jeden Endpunkt\n- Strukturierte Daten entsprechend der API-Spezifikation\n- Realistische Beispieldaten für bessere Tests\n- Konsistente Datenbeziehungen zwischen Endpunkten\n\n### 🛠️ Entwicklerfreundlich\n- **CORS-Unterstützung** für Frontend-Integration\n- **Detaillierte Logging** für Debugging\n- **Flexible Konfiguration** über Umgebungsvariablen\n- **Docker-ready** für einfache Bereitstellung\n\n## Architektur\n\n### Technologie-Stack\n- **Flask** - Python Web Framework\n- **Flask-CORS** - Cross-Origin Resource Sharing\n- **SQLAlchemy** - Database ORM\n- **JSON** - Mock-Daten-Storage\n- **Python 3.13** - Runtime Environment\n\n### Projektstruktur\n```\nsap-lms-mockserver/\n├── src/\n│   ├── main.py                 # Hauptanwendung\n│   ├── routes/\n│   │   ├── user.py            # Beispiel-Routen\n│   │   └── sap_lms_api.py     # SAP LMS API Routen\n│   ├── models/\n│   │   └── user.py            # Datenmodelle\n│   ├── mock_data/             # Mock-Daten-Dateien\n│   │   ├── partner_extract_config.json\n│   │   ├── admin_curriculum_service_metadata.json\n│   │   ├── catalog_courses.json\n│   │   └── ... (weitere 30+ Dateien)\n│   ├── database/              # SQLite-Datenbank\n│   └── static/                # Statische Dateien\n├── docs/                      # Dokumentation\n│   └── API_DOCUMENTATION.md   # Detaillierte API-Dokumentation\n├── Dockerfile                 # Docker-Konfiguration\n├── docker-compose.yml         # Docker Compose\n├── requirements.txt           # Python-Abhängigkeiten\n├── LICENSE                    # MIT-Lizenz\n└── README.md                  # Projekt-Dokumentation\n```\n\n## Installation\n\n### Voraussetzungen\n- Python 3.13 oder höher\n- pip (Python Package Manager)\n- Git (für Klonen des Repositories)\n\n### 🐍 Lokale Installation\n\n1. **Repository klonen**\n   ```bash\n   git clone \u003crepository-url\u003e\n   cd sap-lms-mockserver\n   ```\n\n2. **Virtuelle Umgebung erstellen und aktivieren**\n   ```bash\n   python -m venv venv\n   source venv/bin/activate  # Linux/Mac\n   # oder\n   venv\\Scripts\\activate     # Windows\n   ```\n\n3. **Abhängigkeiten installieren**\n   ```bash\n   pip install -r requirements.txt\n   ```\n\n4. **Server starten**\n   ```bash\n   python src/main.py\n   ```\n\nDer Server läuft standardmäßig auf `http://localhost:5001`\n\n### 🐳 Docker Installation\n\n```bash\n# Docker Image erstellen\ndocker build -t sap-lms-mockserver .\n\n# Container starten\ndocker run -p 5001:5001 sap-lms-mockserver\n\n# Oder mit Docker Compose\ndocker-compose up -d\n```\n\n## Konfiguration\n\n### Umgebungsvariablen\n| Variable | Beschreibung | Standard |\n|----------|-------------|----------|\n| `FLASK_ENV` | Umgebung (development/production) | `production` |\n| `FLASK_DEBUG` | Debug-Modus | `False` |\n| `PORT` | Server-Port | `5001` |\n| `HOST` | Server-Host | `0.0.0.0` |\n\n### Beispiel .env Datei\n```env\nFLASK_ENV=development\nFLASK_DEBUG=True\nPORT=5001\nHOST=0.0.0.0\n```\n\n## API-Dokumentation\n\nEine detaillierte API-Dokumentation mit allen Endpunkten, Parametern und Beispielen finden Sie in der [**API_DOCUMENTATION.md**](docs/API_DOCUMENTATION.md).\n\n### 🔧 Schnellstart - Wichtige Endpunkte\n\n#### Health Check\n```bash\ncurl -X GET http://localhost:5001/health\n```\n\n#### Partner Extract Configuration\n```bash\ncurl -X GET \"http://localhost:5001/learning/public-api/rest/v1/partnerExtractConfig?partnerID=PARTNER001\"\n```\n\n#### Curriculum Service\n```bash\ncurl -X GET \"http://localhost:5001/learning/odatav4/public/admin/curriculum-service/v1/Curricula\"\n```\n\n### 📚 API-Kategorien\n\n- **System-Endpunkte** - Health Check, Root Information\n- **Partner Extract Services** - Konfiguration und Datenextraktion\n- **Curriculum Services** - Admin und User Curriculum Management\n- **Learning Event Services** - Lernereignisse und externe Events\n- **Scheduled Offering Services** - Geplante Kursangebote\n- **Search Services** - Suche nach Programmen, Studenten und Items\n- **User Assignment Services** - Benutzer-Zuweisungen (v1 und v2)\n- **User Learning Service** - Lernhistorie und Fortschritte\n- **User Services** - Benutzerverwaltung und Genehmigungen\n- **Catalog Services** - Katalogsuche und -verwaltung\n- **Financial Transactions** - Finanztransaktionen\n\n### 🔍 OData v4 Unterstützung\n\nDer Server unterstützt alle wichtigen OData v4 Query-Parameter:\n\n- `$filter` - Filterung der Ergebnisse\n- `$select` - Auswahl spezifischer Felder\n- `$expand` - Erweitern verwandter Entitäten\n- `$orderby` - Sortierung der Ergebnisse\n- `$top` - Begrenzung der Anzahl Ergebnisse\n- `$skip` - Überspringen von Ergebnissen\n- `$count` - Anzahl der Ergebnisse einschließen\n\n**Beispiel:**\n```bash\ncurl \"http://localhost:5001/learning/odatav4/public/admin/curriculum-service/v1/Curricula?\\$filter=status eq 'Active'\u0026\\$select=curriculumID,title\u0026\\$top=10\"\n```\n\n## Testing\n\n### 🧪 Manuelle Tests\n\n#### cURL-Beispiele\n```bash\n# Health Check\ncurl -X GET http://localhost:5001/health\n\n# Partner Extract Config\ncurl -X GET \"http://localhost:5001/learning/public-api/rest/v1/partnerExtractConfig?partnerID=PARTNER001\"\n\n# Curriculum Metadata\ncurl -X GET \"http://localhost:5001/learning/odatav4/public/admin/curriculum-service/v1/\\$metadata\"\n```\n\n#### Browser-Tests\nEinfache GET-Endpunkte können direkt im Browser getestet werden:\n- `http://localhost:5001/health`\n- `http://localhost:5001/`\n- `http://localhost:5001/learning/odatav4/public/admin/curriculum-service/v1/$metadata`\n\n### 🔬 Automatisierte Tests\n\n```python\nimport unittest\nimport requests\n\nclass TestSAPLMSMockServer(unittest.TestCase):\n    BASE_URL = \"http://localhost:5001\"\n    \n    def test_health_check(self):\n        response = requests.get(f\"{self.BASE_URL}/health\")\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.json()[\"status\"], \"healthy\")\n    \n    def test_partner_extract_config(self):\n        response = requests.get(\n            f\"{self.BASE_URL}/learning/public-api/rest/v1/partnerExtractConfig\",\n            params={\"partnerID\": \"PARTNER001\"}\n        )\n        self.assertEqual(response.status_code, 200)\n        self.assertEqual(response.json()[\"restOperationStatusVOX\"][\"status\"], \"SUCCESS\")\n```\n\n## Deployment\n\n### 🖥️ Lokale Entwicklung\n```bash\n# Entwicklungsserver starten\npython src/main.py\n```\n\n### 🏭 Produktions-Deployment\n\n#### Mit Gunicorn\n```bash\n# Gunicorn installieren\npip install gunicorn\n\n# Server mit Gunicorn starten\ngunicorn --bind 0.0.0.0:5001 --workers 4 src.main:app\n```\n\n#### Mit systemd (Linux)\n```ini\n# /etc/systemd/system/sap-lms-mockserver.service\n[Unit]\nDescription=SAP LMS MockServer\nAfter=network.target\n\n[Service]\nType=simple\nUser=www-data\nWorkingDirectory=/opt/sap-lms-mockserver\nExecStart=/opt/sap-lms-mockserver/venv/bin/gunicorn --bind 0.0.0.0:5001 --workers 4 src.main:app\nRestart=always\n\n[Install]\nWantedBy=multi-user.target\n```\n\n## Docker\n\n### 🐳 Docker-Befehle\n\n```bash\n# Image erstellen\ndocker build -t sap-lms-mockserver .\n\n# Container starten\ndocker run -p 5001:5001 sap-lms-mockserver\n\n# Container im Hintergrund ausführen\ndocker run -d -p 5001:5001 --name sap-lms-server sap-lms-mockserver\n\n# Container-Logs anzeigen\ndocker logs sap-lms-server\n\n# Container stoppen\ndocker stop sap-lms-server\n```\n\n### Docker Compose\n\n```yaml\nversion: '3.8'\n\nservices:\n  sap-lms-mockserver:\n    build: .\n    ports:\n      - \"5001:5001\"\n    environment:\n      - FLASK_ENV=production\n      - FLASK_DEBUG=False\n    volumes:\n      - ./src/database:/app/src/database\n    restart: unless-stopped\n```\n\n```bash\n# Service starten\ndocker-compose up -d\n\n# Service stoppen\ndocker-compose down\n\n# Logs anzeigen\ndocker-compose logs -f\n```\n\n## Anpassung\n\n### 🛠️ Mock-Daten anpassen\n\nMock-Daten können einfach durch Bearbeitung der JSON-Dateien im `src/mock_data/` Verzeichnis angepasst werden:\n\n1. **Neue Daten hinzufügen:** Neue Objekte zu den Arrays hinzufügen\n2. **Bestehende Daten ändern:** Werte in den JSON-Objekten modifizieren\n3. **Neue Endpunkte:** Neue JSON-Dateien erstellen und entsprechende Routen hinzufügen\n\n### 🔧 Neue Endpunkte hinzufügen\n\n```python\n@sap_lms_bp.route('/new/endpoint/v1/$metadata', methods=['GET'])\ndef new_endpoint_metadata():\n    \"\"\"Get new endpoint metadata\"\"\"\n    data = load_mock_data('new_endpoint_metadata.json')\n    return jsonify(data)\n```\n\n### 📝 Logging konfigurieren\n\n```python\nimport logging\n\n# Logging konfigurieren\nlogging.basicConfig(\n    level=logging.INFO,\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n)\n```\n\n## Troubleshooting\n\n### 🚨 Häufige Probleme\n\n#### Port bereits belegt\n```bash\n# Anderen Port verwenden\npython src/main.py --port 5002\n\n# Prozess auf Port 5001 finden und beenden\nlsof -ti:5001 | xargs kill -9\n```\n\n#### CORS-Fehler\n```python\n# CORS für spezifische Origins konfigurieren\nCORS(app, origins=['http://localhost:3000', 'http://localhost:8080'])\n```\n\n#### Mock-Daten nicht gefunden\n```bash\n# Überprüfen, ob Dateien existieren\nls src/mock_data/\n\n# Pfade in load_mock_data() überprüfen\n```\n\n#### Virtuelle Umgebung Probleme\n```bash\n# Neue virtuelle Umgebung erstellen\npython -m venv new_venv\nsource new_venv/bin/activate\npip install -r requirements.txt\n```\n\n### 🔍 Debug-Modus\n\n```python\n# Debug-Informationen aktivieren\napp.run(host='0.0.0.0', port=5001, debug=True)\n\n# Detaillierte Logs\nimport logging\nlogging.getLogger('flask').setLevel(logging.DEBUG)\n```\n\n## Beitragen\n\n### 👥 Entwicklungsrichtlinien\n\n1. **Code-Stil:** PEP 8 befolgen\n2. **Dokumentation:** Alle neuen Funktionen dokumentieren\n3. **Tests:** Tests für neue Endpunkte hinzufügen\n4. **Mock-Daten:** Realistische und konsistente Daten verwenden\n\n### 🔀 Pull Requests\n\n1. Fork des Repositories erstellen\n2. Feature-Branch erstellen (`git checkout -b feature/amazing-feature`)\n3. Änderungen committen (`git commit -m 'Add amazing feature'`)\n4. Branch pushen (`git push origin feature/amazing-feature`)\n5. Pull Request erstellen\n\n## Lizenz\n\nDieses Projekt steht unter der MIT-Lizenz. Siehe [LICENSE](LICENSE) für Details.\n\n## Support\n\n### 📞 Hilfe und Unterstützung\n\n- **GitHub Issues:** Bug-Reports und Feature-Requests\n- **API-Dokumentation:** Detaillierte Endpunkt-Informationen in [API_DOCUMENTATION.md](docs/API_DOCUMENTATION.md)\n- **Community:** Diskussionen über GitHub Discussions\n\n### 🆘 Schnelle Hilfe\n\n| Problem | Lösung |\n|---------|--------|\n| Server startet nicht | Port-Konflikt prüfen, Dependencies installieren |\n| API-Antworten fehlerhaft | Mock-Daten validieren, Logs prüfen |\n| CORS-Probleme | CORS-Konfiguration anpassen |\n| Docker-Probleme | Dockerfile und docker-compose.yml prüfen |\n\n## Changelog\n\n### 📋 Version 1.0.0 (Juli 2025)\n- ✅ Initiale Implementierung aller 36 SAP LMS API Endpunkte\n- ✅ Vollständige OData v4 Unterstützung\n- ✅ Realistische Mock-Daten für alle Services\n- ✅ CORS-Unterstützung für Frontend-Integration\n- ✅ Docker-Unterstützung\n- ✅ Umfassende Dokumentation und Beispiele\n- ✅ SQLAlchemy-Integration für Datenpersistenz\n- ✅ Automatisierte Tests und CI/CD-Pipeline\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**🔧 Entwickelt mit Unterstützung von [Manus AI](https://manus.im)**\n\n\u003c/div\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiptoux%2Fsap_sf-lms-mockserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiptoux%2Fsap_sf-lms-mockserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiptoux%2Fsap_sf-lms-mockserver/lists"}