diff --git a/.github/workflows/lint_pr.yml b/.github/workflows/lint_pr.yml index 8ef9750a4..5a06f9144 100644 --- a/.github/workflows/lint_pr.yml +++ b/.github/workflows/lint_pr.yml @@ -12,6 +12,7 @@ jobs: main: name: Validate PR title runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} steps: - uses: amannn/action-semantic-pull-request@v5 env: diff --git a/backend/src/db/factories.js b/backend/src/db/factories.js index 3e164d51b..ecc792736 100644 --- a/backend/src/db/factories.js +++ b/backend/src/db/factories.js @@ -65,7 +65,6 @@ Factory.define('basicUser') name: faker.name.findName, password: '1234', role: 'user', - about: faker.lorem.paragraph, termsAndConditionsAgreedVersion: '0.0.1', termsAndConditionsAgreedAt: '2019-08-01T10:47:19.212Z', allowEmbedIframes: false, @@ -82,12 +81,28 @@ Factory.define('basicUser') Factory.define('userWithoutEmailAddress') .extend('basicUser') + .option('about', faker.lorem.paragraph) + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('userWithAboutNull') + .extend('basicUser') + .option('about', null) + .after(async (buildObject, options) => { + return neode.create('User', buildObject) + }) + +Factory.define('userWithAboutEmpty') + .extend('basicUser') + .option('about', '') .after(async (buildObject, options) => { return neode.create('User', buildObject) }) Factory.define('user') .extend('basicUser') + .option('about', faker.lorem.paragraph) .option('email', faker.internet.exampleEmail) .option('avatar', () => Factory.build('image', { diff --git a/deployment/scripts/cluster.backup.sh b/deployment/scripts/cluster.backup.sh new file mode 100755 index 000000000..b83bab198 --- /dev/null +++ b/deployment/scripts/cluster.backup.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# base setup +SCRIPT_PATH=$(realpath $0) +SCRIPT_DIR=$(dirname $SCRIPT_PATH) + +# configuration +CONFIGURATION=${CONFIGURATION:-"example"} +KUBECONFIG=${KUBECONFIG:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/kubeconfig.yaml} +BACKUP_DATE=$(date "+%F_%H-%M-%S") +BACKUP_FOLDER=${BACKUP_FOLDER:-${SCRIPT_DIR}/../configurations/${CONFIGURATION}/backup/${BACKUP_DATE}} + +# create backup fodler +mkdir -p ${BACKUP_FOLDER} + +# maintenance mode on +${SCRIPT_DIR}/cluster.maintenance.sh on + +# shutdown database +kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ + | jq '.spec.template.spec.containers[] += {"command": ["tail", "-f", "/dev/null"]}' \ + | kubectl --kubeconfig=${KUBECONFIG} apply -f - + +# wait for the container to restart +sleep 60 + +# database backup +kubectl --kubeconfig=${KUBECONFIG} -n default exec -it \ + $(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j | awk '{ print $1 }') \ + -- neo4j-admin dump --to=/var/lib/neo4j/$BACKUP_DATE-neo4j-dump +# copy neo4j backup to local drive +kubectl --kubeconfig=${KUBECONFIG} cp \ + default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-neo4j |awk '{ print $1 }'):/var/lib/neo4j/$BACKUP_DATE-neo4j-dump $BACKUP_FOLDER/neo4j-dump +# copy image data +kubectl --kubeconfig=${KUBECONFIG} cp \ + default/$(kubectl --kubeconfig=${KUBECONFIG} -n default get pods | grep ocelot-backend |awk '{ print $1 }'):/app/public/uploads $BACKUP_FOLDER/public-uploads + +# restart database +kubectl --kubeconfig=${KUBECONFIG} get deployment ocelot-neo4j -o json \ + | jq 'del(.spec.template.spec.containers[].command)' \ + | kubectl --kubeconfig=${KUBECONFIG} apply -f - + +# wait for the container to restart +sleep 60 + +# maintenance mode off +${SCRIPT_DIR}/cluster.maintenance.sh off \ No newline at end of file diff --git a/webapp/README.md b/webapp/README.md index 0f377521d..4c56dcc75 100644 --- a/webapp/README.md +++ b/webapp/README.md @@ -10,8 +10,8 @@ between different local Node versions: ```bash # install Node $ cd webapp -$ nvm install v16.19.0 -$ nvm use v16.19.0 +$ nvm install v19.4.0 +$ nvm use v19.4.0 ``` Install node dependencies with [yarn](https://yarnpkg.com/en/): diff --git a/webapp/locales/de.json b/webapp/locales/de.json index 3e0e7369d..9ea733068 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -24,7 +24,7 @@ "posts": "Beiträge", "projects": "Projekte", "shouts": "Empfehlungen", - "users": "Benutzer" + "users": "Nutzer" }, "donations": { "goal": "Monatlich benötigte Spenden", @@ -38,11 +38,11 @@ "nameOfHashtag": "Name", "number": "Nr.", "tagCount": "Beiträge", - "tagCountUnique": "Benutzer" + "tagCountUnique": "Nutzer" }, "invites": { "description": "Einladungen sind eine wunderbare Möglichkeit, Deine Freunde in Deinem Netzwerk zu haben …", - "name": "Benutzer einladen", + "name": "Nutzer einladen", "title": "Leute einladen" }, "name": "Systemverwaltung", @@ -59,11 +59,11 @@ "name": "Einstellungen" }, "users": { - "empty": "Keine Benutzer gefunden", + "empty": "Keine Nutzer gefunden", "form": { "placeholder": "E-Mail, Name oder Beschreibung" }, - "name": "Benutzer", + "name": "Nutzer", "roleChanged": "Rolle erfolgreich geändert!", "table": { "columns": { @@ -111,7 +111,7 @@ "shout": "Empfehlung ::: Empfehlungen", "tag": "Schlagwort ::: Schlagwörter", "takeAction": "Aktiv werden", - "user": "Benutzer ::: Benutzer", + "user": "Nutzer ::: Nutzer", "validations": { "categories": "es müssen eine bis drei Themen ausgewählt werden", "email": "muss eine gültige E-Mail-Adresse sein", @@ -138,12 +138,12 @@ "registration": { "create-user-account": { "buttonTitle": "Erstellen", - "error": "Es konnte kein Benutzerkonto erstellt werden!", + "error": "Es konnte kein Nutzerkonto erstellt werden!", "help": "Vielleicht war der Bestätigungscode falsch oder abgelaufen? Wenn das Problem weiterhin besteht, schicke uns gerne eine E-Mail an:", "recieveCommunicationAsEmailsEtcConfirmed": "Ich stimme auch dem Erhalt von E-Mails und anderen Formen der Kommunikation (z.B. Push-Benachrichtigungen) zu.", - "success": "Dein Benutzerkonto wurde erstellt!", + "success": "Dein Nutzerkonto wurde erstellt!", "termsAndCondsEtcConfirmed": "Ich habe folgendes gelesen, verstanden und stimme zu:", - "title": "Benutzerkonto anlegen" + "title": "Nutzerkonto anlegen" }, "email": { "buttonTitle": { @@ -197,14 +197,14 @@ "data-privacy": "Ich habe die Datenschutzerklärung gelesen und verstanden.", "description": "Um loszulegen, kannst Du Dich hier kostenfrei registrieren:", "errors": { - "email-exists": "Es gibt schon ein Benutzerkonto mit dieser E-Mail-Adresse!" + "email-exists": "Es gibt schon ein Nutzerkonto mit dieser E-Mail-Adresse!" }, "submit": "Konto erstellen", "success": "Eine E-Mail mit einem Link zum Abschließen Deiner Registrierung wurde an {email} geschickt", "terms-and-condition": "Ich stimme den Nutzungsbedingungen zu." }, "title": "Mach mit bei {APPLICATION_NAME}!", - "unavailable": "Leider ist die öffentliche Registrierung von Benutzerkonten auf diesem Server derzeit nicht möglich." + "unavailable": "Leider ist die öffentliche Registrierung von Nutzerkonten auf diesem Server derzeit nicht möglich." } } }, @@ -267,9 +267,9 @@ "happy": "Glücklich", "surprised": "Erstaunt" }, - "filterFollow": "Beiträge von Benutzern filtern, denen ich folge", + "filterFollow": "Beiträge von Nutzern filtern, denen ich folge", "filterMasonryGrid": { - "myFriends": "Benutzer denen ich folge", + "myFriends": "Nutzer denen ich folge", "myTopics": "Meine Themen", "noFilter": "Beiträge filtern" }, @@ -356,7 +356,7 @@ "unorderedList": "Ungeordnete Liste" }, "mention": { - "noUsersFound": "Keine Benutzer gefunden" + "noUsersFound": "Keine Nutzer gefunden" }, "placeholder": "Schreib etwas Inspirierendes …" }, @@ -378,7 +378,7 @@ "deleteFilter": "Filter löschen", "emotions": "Emotionen", "filter-by": "Filtern nach ...", - "following": "Benutzer denen ich folge", + "following": "Nutzer denen ich folge", "languages": "Sprachen", "order": { "newest": { @@ -411,9 +411,9 @@ "actionRadius": "Aktionsradius der Gruppe", "addMemberToGroup": "Zur Gruppe hinzufügen", "addMemberToGroupSuccess": "„{name}“ wurde der Gruppe mit der Rolle „{role}“ hinzugefügt!", - "addUser": "Benutzer hinzufügen", + "addUser": "Nutzer hinzufügen", "addUserNoOptions": "Keine Nutzer gefunden!", - "addUserPlaceholder": "Benutzername", + "addUserPlaceholder": "Nutzername", "allGroups": "Alle Gruppen", "button": { "tooltip": "Gruppen anzeigen" @@ -434,7 +434,7 @@ "title": "Meine Gruppe ändern" }, "errors": { - "userAlreadyMember": "Benutzer „{name}“ ist bereits Mitglied!" + "userAlreadyMember": "Nutzer „{name}“ ist bereits Mitglied!" }, "follow": "Folge", "foundation": "Gründung", @@ -525,10 +525,10 @@ "logout": "Abmelden", "moreInfo": "Was ist {APPLICATION_NAME}?", "moreInfoHint": "zur Präsentationsseite", - "no-account": "Du hast noch kein Benutzerkonto?", + "no-account": "Du hast noch kein Nutzerkonto?", "no-cookie": "Es kann kein Cookie angelegt werden. Du must Cookies akzeptieren.", "password": "Dein Passwort", - "register": "Benutzerkonto erstellen", + "register": "Nutzerkonto erstellen", "success": "Du bist eingeloggt!" }, "maintenance": { @@ -544,7 +544,7 @@ "markerTypes": { "group": "Gruppe", "theUser": "deine Position", - "user": "Benutzer" + "user": "Nutzer" }, "pageTitle": "Landkarte", "styles": { @@ -591,12 +591,12 @@ "submit": "Bestätige Entscheidung", "User": { "disable": { - "message": "Möchtest Du den Benutzer „{name}“ wirklich gesperrt lassen?", - "title": "Sperre den Benutzer abschließend" + "message": "Möchtest Du den Nutzer „{name}“ wirklich gesperrt lassen?", + "title": "Sperre den Nutzer abschließend" }, "enable": { - "message": "Möchtest Du den Benutzer „{name}“ wirklich entsperrt lassen?", - "title": "Entsperre den Benutzer abschließend" + "message": "Möchtest Du den Nutzer „{name}“ wirklich entsperrt lassen?", + "title": "Entsperre den Nutzer abschließend" } } }, @@ -644,12 +644,12 @@ "mentioned_in_post": "Hat Dich in einem Beitrag erwähnt …" }, "title": "Benachrichtigungen", - "user": "Benutzer" + "user": "Nutzer" }, "position": { "group": "Gruppe", "my": "Meine Position", - "user": "Benutzer" + "user": "Nutzer" }, "post": { "comment": { @@ -740,7 +740,7 @@ "submit": "freigeben", "success": "Erfolgreich freigegeben!", "user": { - "error": "Den Benutzer hast Du schon gemeldet!", + "error": "Den Nutzer hast Du schon gemeldet!", "message": "Bist Du sicher, dass Du den Nutzer „{name}“ freigeben möchtest?", "title": "Nutzer freigeben", "type": "Nutzer" @@ -784,7 +784,7 @@ "submit": "Meldung senden", "success": "Vielen Dank für diese Meldung!", "user": { - "error": "Du hast den Benutzer bereits gemeldet!", + "error": "Du hast den Nutzer bereits gemeldet!", "message": "Bist Du sicher, dass Du den Nutzer „{name}“ melden möchtest?", "title": "Nutzer melden", "type": "Nutzer" @@ -797,7 +797,7 @@ "Group": "Gruppe ::: Gruppen", "Post": "Beitrag ::: Beiträge", "Tag": "Hashtag ::: Hashtags", - "User": "Benutzer ::: Benutzer" + "User": "Nutzer ::: Nutzer" }, "hint": "Wonach suchst Du? Nutze !… für Beiträge, @… für Mitglieder, &… für Gruppen, #… für Hashtags", "no-results": "Keine Ergebnisse für \"{search}\" gefunden. Versuch' es mit einem anderen Begriff!", @@ -816,16 +816,16 @@ }, "empty": "Bislang hast Du niemanden blockiert.", "explanation": { - "closing": "Das sollte fürs Erste genügen, damit blockierte Benutzer Dich nicht mehr länger belästigen können.", + "closing": "Das sollte fürs Erste genügen, damit blockierte Nutzer Dich nicht mehr länger belästigen können.", "commenting-disabled": "Du kannst den Beitrag derzeit nicht kommentieren.", "commenting-explanation": "Dafür kann es mehrere Gründe geben, bitte schau in unsere ", - "intro": "Wenn ein anderer Benutzer durch Dich blockiert wurde, dann passiert Folgendes:", - "notifications": "Von Dir blockierte Benutzer werden keine Benachrichtigungen mehr erhalten, falls sie in Deinen Beiträgen erwähnt werden.", + "intro": "Wenn ein anderer Nutzer durch Dich blockiert wurde, dann passiert Folgendes:", + "notifications": "Von Dir blockierte Nutzer werden keine Benachrichtigungen mehr erhalten, falls sie in Deinen Beiträgen erwähnt werden.", "their-perspective": "Umgekehrt das gleiche: Die blockierte Person bekommt auch in ihren Benachrichtigungen Deine Beiträge nicht mehr zu sehen.", "your-perspective": "In Deinen Benachrichtigungen tauchen keine Beiträge der blockierten Person mehr auf." }, - "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü blockieren.", - "name": "Blockierte Benutzer", + "how-to": "Du kannst andere Nutzer auf deren Profilseite über das Inhaltsmenü blockieren.", + "name": "Blockierte Nutzer", "unblock": "Blockierten Nutzer freigeben", "unblocked": "{name} ist wieder entsperrt" }, @@ -834,7 +834,7 @@ "labelCity": "Deine Stadt oder Region", "labelCityHint": "(zeigt ungefähre Position auf der Landkarte)", "labelName": "Dein Name", - "labelSlug": "Dein eindeutiger Benutzername", + "labelSlug": "Dein eindeutiger Nutzername", "name": "Deine Daten", "namePlaceholder": "Petra Lustig", "success": "Deine Daten wurden erfolgreich aktualisiert!" @@ -843,12 +843,12 @@ "accountDescription": "Sei dir bewusst, dass deine Beiträge und Kommentare für unsere Community wichtig sind. Wenn du sie trotzdem löschen möchtest, musst du sie unten markieren.", "accountWarning": "Dein Konto, deine Beiträge oder Kommentare kannst du nach dem Löschen WEDER VERWALTEN NOCH WIEDERHERSTELLEN!", "accountWarningAdmin": "Das Konto, die Beiträge oder Kommentare können nach dem Löschen WEDER VERWALTET NOCH WIEDERHERGESTELLT WERDEN!", - "accountWarningIsAdmin": "Achtung! Du löschst jetzt ein Benutzerkonto!", + "accountWarningIsAdmin": "Achtung! Du löschst jetzt ein Nutzerkonto!", "commentedCount": "Meinen {count} Kommentar löschen ::: Meine {count} Kommentare löschen", - "confirmDeleting": "Benutzerkonto jetzt löschen", + "confirmDeleting": "Nutzerkonto jetzt löschen", "contributionsCount": "Meinen {count} Beitrag löschen ::: Meine {count} Beiträge löschen", "infoAdmin": "Alle Beiträge und Kommentare des Users werden zusätzlich gelöscht!", - "name": "Benutzerkonto löschen", + "name": "Nutzerkonto löschen", "pleaseConfirm": "Zerstörerische Aktion! Gib „{confirm}“ ein, um zu bestätigen.", "success": "Konto erfolgreich gelöscht!" }, @@ -908,13 +908,13 @@ }, "empty": "Bislang hast du niemanden stummgeschaltet.", "explanation": { - "intro": "Wenn ein anderer Benutzer von dir stummgeschaltet wurde, dann passiert folgendes:", + "intro": "Wenn ein anderer Nutzer von dir stummgeschaltet wurde, dann passiert folgendes:", "search": "Die Beiträge von stummgeschalteten Personen verschwinden aus deinen Suchergebnissen.", "your-perspective": "In deiner Beitragsübersicht tauchen keine Beiträge der stummgeschalteten Person mehr auf." }, - "how-to": "Du kannst andere Benutzer auf deren Profilseite über das Inhaltsmenü stummschalten.", + "how-to": "Du kannst andere Nutzer auf deren Profilseite über das Inhaltsmenü stummschalten.", "mute": "Stumm schalten", - "name": "Stummgeschaltete Benutzer", + "name": "Stummgeschaltete Nutzer", "unmute": "Stummschaltung aufheben", "unmuted": "{name} ist nicht mehr stummgeschaltet" }, @@ -969,7 +969,7 @@ }, "validation": { "slug": { - "alreadyTaken": "Dieser Benutzername ist schon vergeben.", + "alreadyTaken": "Dieser Nutzername ist schon vergeben.", "regex": "Es sind nur Kleinbuchstaben, Zahlen, Unterstriche oder Bindestriche erlaubt." } } diff --git a/webapp/pages/map.vue b/webapp/pages/map.vue index afdc80e83..1a34cbda1 100644 --- a/webapp/pages/map.vue +++ b/webapp/pages/map.vue @@ -337,7 +337,7 @@ export default { id: user.id, slug: user.slug, name: user.name, - about: user.about, + about: user.about ? user.about : undefined, }, geometry: { type: 'Point', @@ -358,7 +358,7 @@ export default { id: group.id, slug: group.slug, name: group.name, - about: group.about, + about: group.about ? group.about : undefined, }, geometry: { type: 'Point', @@ -378,7 +378,7 @@ export default { id: this.currentUser.id, slug: this.currentUser.slug, name: this.currentUser.name, - about: this.currentUser.about, + about: this.currentUser.about ? this.currentUser.about : undefined, }, geometry: { type: 'Point',