Add adult verification and erotic moderation features: Implement new routes and controller methods for managing adult verification requests, status updates, and document retrieval. Introduce erotic moderation actions and reports, enhancing administrative capabilities. Update chat and navigation controllers to support adult content filtering and access control. Enhance user parameter handling for adult verification status and requests, improving overall user experience and compliance.

This commit is contained in:
Torsten Schulz (local)
2026-03-27 09:14:54 +01:00
parent b9e420cd37
commit 922e22f444
73 changed files with 4459 additions and 197 deletions

View File

@@ -46,6 +46,19 @@
<span>{{ $t("settings.account.showinsearch") }}</span>
</label>
<section class="account-settings__adult surface-card">
<h3>{{ $t("settings.account.adultAccessTitle") }}</h3>
<p>{{ $t("settings.account.adultAccessIntro") }}</p>
<div class="account-settings__adult-status">
<strong>{{ adultStatusTitle }}</strong>
<span>{{ adultStatusText }}</span>
<span v-if="adultVerificationRequest?.originalName">{{ adultVerificationRequest.originalName }}</span>
</div>
<div class="account-settings__adult-actions" v-if="canRequestAdultVerification">
<router-link to="/socialnetwork/erotic/access">{{ $t("settings.account.requestAdultVerification") }}</router-link>
</div>
</section>
<div class="account-settings__actions">
<button @click="changeAccount">{{ $t("settings.account.changeaction") }}</button>
</div>
@@ -69,6 +82,9 @@ export default {
newpasswordretype: "",
showInSearch: false,
oldpassword: "",
isAdult: false,
adultVerificationStatus: "none",
adultVerificationRequest: null,
};
},
computed: {
@@ -81,6 +97,21 @@ export default {
},
passwordsMatch() {
return this.newpassword === this.newpasswordretype;
},
canRequestAdultVerification() {
return this.isAdult && ['none', 'rejected'].includes(this.adultVerificationStatus);
},
adultStatusTitle() {
if (!this.isAdult) {
return this.$t('settings.account.adultStatus.ineligible.title');
}
return this.$t(`settings.account.adultStatus.${this.adultVerificationStatus}.title`);
},
adultStatusText() {
if (!this.isAdult) {
return this.$t('settings.account.adultStatus.ineligible.body');
}
return this.$t(`settings.account.adultStatus.${this.adultVerificationStatus}.body`);
}
},
methods: {
@@ -137,13 +168,17 @@ export default {
console.error('Fehler beim Speichern der Account-Einstellungen:', error);
showApiError(this, error, 'Ein Fehler ist beim Speichern der Account-Einstellungen aufgetreten.');
}
}
},
},
async mounted() {
const response = await apiClient.post('/api/settings/account', { userId: this.user.id });
this.username = response.data.username;
this.showInSearch = response.data.showinsearch;
this.email = response.data.email;
this.isAdult = !!response.data.isAdult;
this.adultVerificationStatus = response.data.adultVerificationStatus || 'none';
this.adultVerificationRequest = response.data.adultVerificationRequest || null;
// Stelle sicher, dass Passwort-Felder leer sind
this.newpassword = '';
@@ -228,6 +263,29 @@ export default {
margin-top: 18px;
}
.account-settings__adult {
margin-top: 18px;
padding: 18px;
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
background: rgba(250, 244, 235, 0.72);
}
.account-settings__adult p,
.account-settings__adult-status {
color: var(--color-text-secondary);
}
.account-settings__adult-status {
display: grid;
gap: 6px;
margin-top: 10px;
}
.account-settings__adult-actions {
margin-top: 14px;
}
@media (max-width: 760px) {
.account-settings__grid {
grid-template-columns: 1fr;