feat(tournament-suggestions): implement save functionality for tournament suggestions
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 8m44s

This commit is contained in:
Torsten Schulz (local)
2026-09-04 12:47:25 +02:00
parent 6aeff309cd
commit c16883f381
4 changed files with 52 additions and 2 deletions

View File

@@ -2,6 +2,20 @@ import { checkAccess } from '../utils/userUtils.js';
import officialTournamentService from '../services/officialTournamentService.js';
import clickTtTournamentRegistrationService from '../services/clickTtTournamentRegistrationService.js';
export const saveTournamentSuggestion = async (req, res) => {
try {
const { authcode: userToken } = req.headers;
const { clubId, id } = req.params;
await checkAccess(userToken, clubId);
const result = await officialTournamentService.saveTournamentSuggestion(clubId, id);
if (!result) return res.status(404).json({ error: 'Turniervorschlag nicht gefunden.' });
return res.status(result.created ? 201 : 200).json(result);
} catch (error) {
console.error('[saveTournamentSuggestion] Error:', error);
return res.status(error.status || 500).json({ error: error.message || 'Turniervorschlag konnte nicht gespeichert werden.' });
}
};
export const updateOfficialTournament = async (req, res) => {
try {
const { authcode: userToken } = req.headers;

View File

@@ -11,7 +11,7 @@ import {
listClubParticipations,
updateParticipantStatus,
autoRegisterOfficialTournamentParticipants
, listTacticPlans, saveTacticPlan, deleteTacticPlan
, listTacticPlans, saveTacticPlan, deleteTacticPlan, saveTournamentSuggestion
} from '../controllers/officialTournamentController.js';
import { fetchTournamentSuggestions, listTournamentSuggestions, updateTournamentSuggestion } from '../controllers/tournamentSuggestionController.js';
@@ -23,6 +23,7 @@ router.use(authenticate);
router.get('/:clubId', listOfficialTournaments);
router.get('/:clubId/suggestions', listTournamentSuggestions);
router.post('/:clubId/suggestions/fetch', fetchTournamentSuggestions);
router.post('/:clubId/suggestions/:id/save', saveTournamentSuggestion);
router.patch('/:clubId/suggestions/:id', updateTournamentSuggestion);
router.get('/:clubId/participations/summary', listClubParticipations);
router.post('/:clubId/upload', upload.single('pdf'), uploadTournamentPdf);

View File

@@ -7,10 +7,36 @@ import OfficialTournament from '../models/OfficialTournament.js';
import OfficialCompetition from '../models/OfficialCompetition.js';
import OfficialCompetitionMember from '../models/OfficialCompetitionMember.js';
import OfficialTournamentTacticPlan from '../models/OfficialTournamentTacticPlan.js';
import TournamentSuggestion from '../models/TournamentSuggestion.js';
import Member from '../models/Member.js';
import OfficialTournamentParserService from './officialTournamentParserService.js';
class OfficialTournamentService {
async saveTournamentSuggestion(clubId, suggestionId) {
const suggestion = await TournamentSuggestion.findOne({ where: { id: suggestionId, clubId } });
if (!suggestion) return null;
let tournament = await OfficialTournament.findOne({
where: { clubId, title: suggestion.title, eventDate: suggestion.eventDate },
});
const created = !tournament;
if (!tournament) {
tournament = await OfficialTournament.create({
clubId,
title: suggestion.title,
eventDate: suggestion.eventDate,
organizer: suggestion.organizer,
host: suggestion.organizer,
venues: JSON.stringify(suggestion.location ? [suggestion.location] : []),
competitionTypes: JSON.stringify([]),
registrationDeadlines: JSON.stringify([]),
entryFees: JSON.stringify({}),
});
}
await suggestion.update({ status: 'reviewed' });
return { id: String(tournament.id), created };
}
async listTacticPlans(clubId, tournamentId) {
const tournament = await OfficialTournament.findOne({ where: { id: tournamentId, clubId } });
if (!tournament) return null;