feat(ClubTeam): enhance club team management with lineup features and member eligibility

- Added teamGender and teamAgeGroup fields to ClubTeam model for better categorization.
- Updated create and update club team endpoints to handle new fields and default values.
- Implemented getClubTeamLineup and updateClubTeamLineup functions for managing team lineups.
- Enhanced member management with adultReleaseApproved and adultReserveApproved fields in Member model.
- Updated frontend views to support new lineup features and member eligibility flags.
- Improved localization for new terms related to team management and member eligibility across multiple languages.
This commit is contained in:
Torsten Schulz (local)
2026-03-31 13:44:28 +02:00
parent cb7830571b
commit 5eff1d63aa
28 changed files with 1325 additions and 72 deletions

View File

@@ -42,7 +42,7 @@ export const createClubTeam = async (req, res) => {
try {
const { authcode: token } = req.headers;
const { clubid: clubId } = req.params;
const { name, leagueId, seasonId } = req.body;
const { name, leagueId, seasonId, teamGender, teamAgeGroup } = req.body;
const user = await getUserByToken(token);
@@ -54,7 +54,9 @@ export const createClubTeam = async (req, res) => {
name,
clubId: parseInt(clubId),
leagueId: leagueId ? parseInt(leagueId) : null,
seasonId: seasonId ? parseInt(seasonId) : null
seasonId: seasonId ? parseInt(seasonId) : null,
teamGender: teamGender || 'open',
teamAgeGroup: teamAgeGroup || 'adult'
};
const newClubTeam = await ClubTeamService.createClubTeam(clubTeamData);
@@ -70,7 +72,7 @@ export const updateClubTeam = async (req, res) => {
try {
const { authcode: token } = req.headers;
const { clubteamid: clubTeamId } = req.params;
const { name, leagueId, seasonId } = req.body;
const { name, leagueId, seasonId, teamGender, teamAgeGroup } = req.body;
const user = await getUserByToken(token);
@@ -78,6 +80,8 @@ export const updateClubTeam = async (req, res) => {
if (name !== undefined) updateData.name = name;
if (leagueId !== undefined) updateData.leagueId = leagueId ? parseInt(leagueId) : null;
if (seasonId !== undefined) updateData.seasonId = seasonId ? parseInt(seasonId) : null;
if (teamGender !== undefined) updateData.teamGender = teamGender || 'open';
if (teamAgeGroup !== undefined) updateData.teamAgeGroup = teamAgeGroup || 'adult';
const success = await ClubTeamService.updateClubTeam(clubTeamId, updateData);
if (!success) {
@@ -126,3 +130,47 @@ export const getLeagues = async (req, res) => {
res.status(500).json({ error: "internalerror" });
}
};
export const getClubTeamLineup = async (req, res) => {
try {
const { authcode: token } = req.headers;
const { clubteamid: clubTeamId } = req.params;
const lineupHalf = req.query.half === 'second_half' ? 'second_half' : 'first_half';
await getUserByToken(token);
const clubTeam = await ClubTeamService.getClubTeamById(clubTeamId);
if (!clubTeam) {
return res.status(404).json({ error: "notfound" });
}
const lineup = await ClubTeamService.getTeamLineup(clubTeamId, lineupHalf);
res.status(200).json(lineup);
} catch (error) {
console.error('[getClubTeamLineup] - Error:', error);
res.status(500).json({ error: "internalerror" });
}
};
export const updateClubTeamLineup = async (req, res) => {
try {
const { authcode: token } = req.headers;
const { clubteamid: clubTeamId } = req.params;
const { assignments, lineupHalf: requestLineupHalf } = req.body;
const lineupHalf = requestLineupHalf === 'second_half' || req.query.half === 'second_half' ? 'second_half' : 'first_half';
await getUserByToken(token);
const clubTeam = await ClubTeamService.getClubTeamById(clubTeamId);
if (!clubTeam) {
return res.status(404).json({ error: "notfound" });
}
const lineup = await ClubTeamService.replaceTeamLineup(clubTeamId, assignments, lineupHalf);
res.status(200).json(lineup);
} catch (error) {
console.error('[updateClubTeamLineup] - Error:', error);
if (error?.code === 'TEAM_LINEUP_TABLE_MISSING') {
return res.status(500).json({ error: 'teamlineuptablemissing' });
}
res.status(500).json({ error: "internalerror" });
}
};

View File

@@ -29,11 +29,11 @@ const getWaitingApprovals = async(req, res) => {
const setClubMembers = async (req, res) => {
try {
const { id: memberId, firstname: firstName, lastname: lastName, street, city, postalCode, birthdate, phone, email, active,
testMembership, picsInInternetAllowed, gender, ttr, qttr, memberFormHandedOver, contacts } = req.body;
testMembership, picsInInternetAllowed, gender, ttr, qttr, memberFormHandedOver, adultReleaseApproved, adultReserveApproved, contacts } = req.body;
const { id: clubId } = req.params;
const { authcode: userToken } = req.headers;
const addResult = await MemberService.setClubMember(userToken, clubId, memberId, firstName, lastName, street, city, postalCode, birthdate,
phone, email, active, testMembership, picsInInternetAllowed, gender, ttr, qttr, memberFormHandedOver, contacts);
phone, email, active, testMembership, picsInInternetAllowed, gender, ttr, qttr, memberFormHandedOver, adultReleaseApproved, adultReserveApproved, contacts);
// Emit Socket-Event wenn Member erfolgreich erstellt/aktualisiert wurde
if (addResult.status === 200) {