feat(ClubSettings): add member data quality requirements configuration
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 38s

- Introduced new settings for member data quality requirements in club settings, allowing configuration of required fields such as street, postal code, city, phone, and email.
- Updated the backend to handle the new memberDataQualityRequirements field in club settings.
- Enhanced the frontend to display and manage these requirements in the ClubSettings view, improving user experience and data integrity.
- Added localization support for new terms related to member data quality across multiple languages.
This commit is contained in:
Torsten Schulz (local)
2026-04-15 22:15:04 +02:00
parent 4cfc82c7aa
commit 5fa34637ba
21 changed files with 237 additions and 24 deletions

View File

@@ -71,7 +71,8 @@ class ClubService {
greetingText,
associationMemberNumber,
myTischtennisFedNickname,
autoFetchRankings
autoFetchRankings,
memberDataQualityRequirements
}) {
await checkAccess(userToken, clubId);
const club = await Club.findByPk(clubId);
@@ -81,9 +82,33 @@ class ClubService {
const updates = { greetingText, associationMemberNumber };
if (myTischtennisFedNickname !== undefined) updates.myTischtennisFedNickname = myTischtennisFedNickname || null;
if (autoFetchRankings !== undefined) updates.autoFetchRankings = !!autoFetchRankings;
if (memberDataQualityRequirements !== undefined) {
updates.memberDataQualityRequirements = this.normalizeMemberDataQualityRequirements(memberDataQualityRequirements);
}
return await club.update(updates);
}
normalizeMemberDataQualityRequirements(settings) {
const defaults = {
requireStreet: true,
requirePostalCode: true,
requireCity: true,
requirePhone: true,
requireEmail: true
};
if (!settings || typeof settings !== 'object' || Array.isArray(settings)) {
return defaults;
}
return Object.fromEntries(
Object.entries(defaults).map(([key, defaultValue]) => [
key,
typeof settings[key] === 'boolean' ? settings[key] : defaultValue
])
);
}
async approveUserClubAccess(userToken, clubId, toApproveUserId) {
await checkAccess(userToken, clubId);
const toApproveUserClub = await UserClub.findOne({