# Haptiplan - Onboarding
Sammlung von Hinweisen für den Einstieg in das Projekt "haptische Planspiel"
## CI/CD
von OK
# Laravel CI/CD Workflow
This document outlines the GitHub Actions workflow for the Laravel application, which integrates Continuous Integration (CI) and Continuous Deployment (CD).
## Workflow-Übersicht
Dieser Workflow automatisiert den Prozess von:
1. Continuous Integration (CI):
* Installiert Abhängigkeiten.
* Führt Migrationen aus.
* Stellt sicher, dass die Anwendung bereit für die Bereitstellung ist.
2. Continuous Deployment (CD):
* Stellt die Anwendung auf einem Remote-Server bereit, nachdem die CI-Schritte erfolgreich abgeschlossen wurden.
Der Workflow wird bei Push-Ereignissen auf den main-Branch ausgelöst.
### Workflow YAML Configuration
```yaml
name: Laravel CI/CD
on:
push:
branches: [ main ]
jobs:
laravel-ci:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8
env:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel
MYSQL_USER: laravel
MYSQL_PASSWORD: secret
ports:
- 3306:3306
options: >-
--health-cmd="mysqladmin ping --silent"
--health-interval=10s
--health-timeout=5s
--health-retries=3
steps:
- uses: actions/checkout@v3
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: mbstring, bcmath, pdo, pdo_mysql, curl
coverage: none
- name: Copy .env
run: cp .env.example .env
- name: Install dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Generate app key
run: php artisan key:generate
- name: Set up database
run: php artisan migrate --force
deploy:
runs-on: ubuntu-latest
needs: laravel-ci
if: github.ref == 'refs/heads/main' && success()
steps:
- uses: actions/checkout@v3
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: mbstring, bcmath, pdo, pdo_mysql, curl
coverage: none
- name: Copy .env
run: cp .env.example .env
- name: Install dependencies
run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Generate app key
run: php artisan key:generate
- name: Set up SSH key for deployment
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Deploy to server
run: |
ssh -o StrictHostKeyChecking=no user@your-server-ip "cd /path/to/your/laravel/project && git pull origin main && composer install --no-dev --optimize-autoloader && php artisan migrate --force && php artisan config:cache && php artisan route:cache && php artisan view:cache"
```
### Erklärung der Jobs
#### 1. laravel-ci Job (Continuous Integration)
Dieser Job ist verantwortlich für die Einrichtung der Umgebung und die Vorbereitung der Anwendung für die Bereitstellung. Er umfasst folgende Schritte:
* **Code auschecken**: Ruft den neuesten Code aus dem Repository ab.
* **PHP einrichten**: Konfiguriert die benötigte PHP-Version und -Erweiterungen für die Laravel-Anwendung.
* **.env kopieren**: Kopiert die Datei .env.example zu .env, um die Umgebungsvariablen zu konfigurieren.
* **Abhängigkeiten installieren**: Installiert die Projektabhängigkeiten mit Composer.
* **App-Schlüssel generieren**: Erzeugt den Laravel-App-Schlüssel.
* **Datenbankmigrationen ausführen**: Führt Migrationen aus, um sicherzustellen, dass die Datenbank mit der Anwendung synchronisiert ist.
#### 2. deploy Job (Continuous Deployment)
Nachdem der Job laravel-ci erfolgreich abgeschlossen wurde, wird der Deployment-Job ausgeführt. Dieser beinhaltet folgende Schritte:
* **Code auschecken**: Ruft erneut den neuesten Code aus dem Repository ab.
* **PHP einrichten**: Richtet erneut die PHP-Umgebung ein (zur Gewährleistung der Konsistenz).
* **Abhängigkeiten installieren**: Installiert Produktionsabhängigkeiten mit Composer.
* **App-Schlüssel generieren**: Stellt sicher, dass der Anwendungsschlüssel generiert ist.
* **SSH-Schlüssel einrichten**: Konfiguriert den SSH-Zugang zum Server für die Bereitstellung.
* **Auf Server bereitstellen**: Holt den neuesten Code vom ```main``` Branch auf dem Remote-Server, installiert Produktionsabhängigkeiten, führt Migrationen aus und leert den Cache.
### Workflow Triggers
* ***Auslöser(Trigger)***: Dieser Workflow wird bei ```push``` Ereignissen auf den ```main``` branch ausgelöst.
* ***Erfolgreiche Bereitstellung***: Der Deployment-Job wird nur ausgeführt, wenn der ```laravel-ci``` job erfolgreich abgeschlossen wurde. So wird sichergestellt, dass die Anwendung bereit ist, bevor sie bereitgestellt wird.
### Einrichtungsanleitung
#### 1. SSH-Schlüssel einrichten
Ein privater SSH-Schlüssel muss zu den GitHub Secrets hinzugefügt werden, um einen sicheren Zugriff auf den Deployment-Server zu ermöglichen. So geht’s:
* Gehe zu **Einstellungen > Secrets > Neues Repository-Secret**
* Vergib den Namen ```SSH_PRIVATE_KEY```
* Füge deinen privaten SSH-Schlüssel in das Wertefeld ein
#### 2. Server-Voraussetzungen
Stelle sicher, dass der Server so eingerichtet ist, dass er:
* SSH-Verbindungen akzeptiert
* Git, PHP, Composer und alle erforderlichen Erweiterungen installiert hat
#### 3. Umgebungs-Konfiguration
Die Datei ```.env.example``` wird während des CI/CD-Prozesses in ```.env``` kopiert. Die ```.env``` -Datei kann je nach Umgebung angepasst werden.
## Fazit
Diese CI/CD-Pipeline automatisiert den Prozess der Einrichtung und Bereitstellung einer Laravel-Anwendung auf einem Server. Der Workflow stellt sicher, dass alle Abhängigkeiten installiert und die Migrationen durchgeführt werden, bevor die Anwendung bereitgestellt wird. Durch die Nutzung von GitHub Actions wird der Prozess effizient und erfordert weniger manuelle Eingriffe.
## Frontend
### HTML Drag&Drop API
von NM
```html
<!-- Element zum Löschen auf Löschbereich ziehen -->
<div id="item" draggable="true" ondragstart="dragItem(event)">
<div class="name" id="item_name">Item Name</div>
<div class="price" id="item_price">$20.00</div>
<form class="delete_form">
<input type="hidden" name="item_id">
</form>
</div>
<!-- Löschbereich -->
<div id="drop-zone" ondrop="drop(event)" ondragover="allowDrop(event)">
Löschbereich
</div>
```
```css=
#item {
margin:20px;
padding:10px;
width:90px;
background-color:#E1EEE1;
}
#drop-zone {
margin:20px;
padding:10px;
background-color:#E1EEE1;
/*Feste Position für den Löschbereicht auf dem Bildschirm*/
position: fixed;
top: 25%;
right: 5%;
}
/* Optional */
.dragging {
opacity:0.5;
}
```
```javascript=
// Drag & Drop ermöglichen
function allowDrop(event) {
event.preventDefault();
}
// Drop in den Löschbereich
function drop(event) {
event.preventDefault();
// Item löschen
item.remove();
}
// Drag des Items
function dragItem(event) {
// ID vom Item speichern
const item_id = event.target.querySelector('input[name="item_id"]').value;
event.dataTransfer.setData("text/plain", item_id);
// Optional: nur für CSS
event.target.classList.add("dragging");
event.target.addEventListener('dragend', dragEnd);
}
// Optional: nur für CSS
function dragEnd(event) {
event.target.classList.remove("dragging");
}
```
<iframe height="300" style="width: 100%;" scrolling="no" title="Drag&Drop" src="https://codepen.io/ninamerkt/embed/RwdYPGy?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/ninamerkt/pen/RwdYPGy">
Drag&Drop</a> by ninamerkt (<a href="https://codepen.io/ninamerkt">@ninamerkt</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
## Backend
### DAO (Data Access Object)
DAO steht für Data Access Object. Es ist ein Entwurfsmuster, das dazu dient, die Datenzugriffsschicht einer Anwendung von der Geschäftslogik zu trennen. Es kapselt die Datenbankinteraktionen.
Zusätzlich definiert das DAO meistens Schnittstellen, die die grundlegenden CRUD-Operationen(Create, Read, Update, Delete) für die Daten festlegt.
Durch die Verwendung von DAO müssen Model-Klassen sich nicht mehr um die Details der Datenbankverbindung kümmern. Das bedeutet, dass die Model-Klassen sich auf ihre Hauptaufgabe, nämlich die Datenrepräsentation, konzentrieren können, während DAO sich um den Datenbankzugriff kümmert. Das führt zu saubererem, besser strukturiertem Code und erleichtert die Wartung und Tests der Anwendung.