BerniWittmann/spielplanismaning

View on GitHub
src/routes/teams.js

Summary

Maintainability
C
7 hrs
Test Coverage
module.exports = function () {
    const logger = require('winston').loggers.get('apiTeams');
    const express = require('express');
    const router = express.Router();
    const mongoose = require('mongoose');
    const Gruppe = mongoose.model('Gruppe');
    const Jugend = mongoose.model('Jugend');
    const Team = mongoose.model('Team');
    const async = require('async');
    const cls = require('../config/cls.js');

    const messages = require('./messages/messages.js')();
    const helpers = require('./helpers.js');
    const handler = require('./handler.js');

    /**
     * @api {get} /teams Get Team
     * @apiName GetTeams
     * @apiDescription Lädt Teams, entweder Alle oder gefiltert nach ID, Jugend oder Gruppe
     * @apiGroup Teams
     *
     * @apiParam {String} [id] Optionale ID des Teams.
     * @apiParam {String} [gruppe] Optionale ID der Gruppe.
     * @apiParam {String} [jugend] Optionale ID der Jugend.
     *
     * @apiSuccess {String} _id ID des Teams
     * @apiSuccess {name} name Name des Teams
     * @apiUse JugendObject
     * @apiUse GruppeObject
     * @apiSuccess {Integer} tore Anzahl Tore des Teams
     * @apiSuccess {Integer} gtore Anzahl Gegen-Tore des Teams
     * @apiSuccess {Integer} punkte Anzahl Punkte des Teams
     * @apiSuccess {Integer} gpunkte Anzahl Gegenpunkte des Teams
     * @apiUse vResponse
     *
     * @apiUse ErrorTeamNotFoundMessage
     *
     * @apiSuccessExample Success-Response:
     *     HTTP/1.1 200 OK
     *     {
     *         _id: '57cffb4055a8d45fc084c108',
     *         name: 'Team A1',
     *         jugend: [ Object ],
     *         gruppe: [ Object ],
     *         tore: 4,
     *         gtore: 1,
     *         punkte: 2,
     *         gpunkte: 0
     *         __v: 3
     *     }
     **/
    router.get('/', function (req, res) {
        return helpers.getEntity(Team, 'gruppe jugend gruppe.teams zwischengruppe zwischengruppe.teams', messages.ErrorTeamNotFound, res, req);
    });

    /**
     * @api {del} /teams Delete Team
     * @apiName DeleteTeams
     * @apiDescription Löscht ein Team
     * @apiGroup Teams
     * @apiPermission Admin
     * @apiUse AuthHeader
     *
     * @apiParam {String} id ID des Teams.
     *
     * @apiUse SuccessDeleteMessage
     **/
    router.delete('/', function (req, res) {
        const beachEventID = cls.getBeachEventID();
        const clsSession = cls.getNamespace();
        return clsSession.run(function () {
            clsSession.set('beachEventID', beachEventID);
            logger.verbose('Delete Team %s', req.query.id);
            Team.findById(req.query.id, function (err, team) {
                if (err) return messages.Error(res, err);

                return clsSession.run(function () {
                    clsSession.set('beachEventID', beachEventID);
                    Team.deepPopulate(team, 'gruppe, jugend', function (err, team) {
                        if (err) {
                            return messages.Error(res, err);
                        }
                        logger.verbose('Remove Team from Jugend');
                        return clsSession.run(function () {
                            clsSession.set('beachEventID', beachEventID);
                            team.jugend.teams.splice(team.jugend.teams.indexOf(team), 1);
                            team.jugend.save(function (err) {
                                if (err) {
                                    return messages.Error(res, err);
                                }

                                logger.verbose('Remove Team from Gruppe');
                                return clsSession.run(function () {
                                    clsSession.set('beachEventID', beachEventID);
                                    team.gruppe.teams.splice(team.gruppe.teams.indexOf(team), 1);
                                    team.gruppe.save(function (err) {
                                        if (err) {
                                            return messages.Error(res, err);
                                        }

                                        logger.verbose('Delete Team');
                                        return clsSession.run(function () {
                                            clsSession.set('beachEventID', beachEventID);
                                            return helpers.removeEntityBy(Team, '_id', team, function (err) {
                                                return handler.handleErrorAndDeleted(err, res);
                                            });
                                        });
                                    });
                                });
                            });
                        });
                    });
                });
            });
        });
    });

    /**
     * @api {post} /teams Create Team
     * @apiName CreateTeams
     * @apiDescription Speichert ein neues Team
     * @apiGroup Teams
     *
     * @apiParam {String} gruppe ID der Gruppe.
     * @apiParam {String} jugend ID der Jugend.
     * @apiParam {String} name Name des Teams.
     *
     * @apiSuccess {String} _id ID des Teams
     * @apiSuccess {name} name Name des Teams
     * @apiUse JugendObject
     * @apiUse GruppeObject
     * @apiSuccess {Integer} tore Anzahl Tore des Teams
     * @apiSuccess {Integer} gtore Anzahl Gegen-Tore des Teams
     * @apiSuccess {Integer} punkte Anzahl Punkte des Teams
     * @apiSuccess {Integer} gpunkte Anzahl Gegenpunkte des Teams
     * @apiUse vResponse
     * @apiPermission Admin
     * @apiUse AuthHeader
     *
     * @apiSuccessExample Success-Response:
     *     HTTP/1.1 200 OK
     *     [{
     *         _id: '57cffb4055a8d45fc084c108',
     *         name: 'Neues Team',
     *         jugend: [ Object ],
     *         gruppe: [ Object ],
     *         tore: 0,
     *         gtore: 0,
     *         punkte: 0,
     *         gpunkte: 0
     *         __v: 3
     *     }]
     **/
    router.post('/', function (req, res) {
        logger.verbose('Create new Team', req.body);
        const beachEventID = cls.getBeachEventID();
        const clsSession = cls.getNamespace();
        return clsSession.run(function () {
            clsSession.set('beachEventID', beachEventID);
            const team = new Team(req.body);
            team.jugend = req.query.jugend;
            team.gruppe = req.query.gruppe;
            team.veranstaltung = beachEventID;
            team.save(function (err, team) {
                if (err) {
                    return messages.Error(res, err);
                }

                async.parallel([
                    function (cb) {
                        logger.verbose('Add Team to Gruppe');
                        clsSession.run(function () {
                            clsSession.set('beachEventID', beachEventID);
                            return helpers.findEntityAndPushTeam(Gruppe, team.gruppe, team, res, cb);
                        });
                    },
                    function (cb) {
                        logger.verbose('Add Team to Jugend');
                        clsSession.run(function () {
                            clsSession.set('beachEventID', beachEventID);
                            return helpers.findEntityAndPushTeam(Jugend, team.jugend, team, res, cb);
                        });
                    }
                ], function (err) {
                    return handler.handleErrorAndResponse(err, res, team);
                });
            });
        });
    });

    /**
     * @api {put} /teams Update Team
     * @apiName UpdateTeam
     * @apiDescription Speichert einen neuen Team Namen
     * @apiGroup Teams
     *
     * @apiParam {String} id ID des Teams.
     *
     * @apiSuccess {String} _id ID des Teams
     * @apiSuccess {name} name Name des Teams
     * @apiUse JugendObject
     * @apiUse GruppeObject
     * @apiSuccess {Integer} tore Anzahl Tore des Teams
     * @apiSuccess {Integer} gtore Anzahl Gegen-Tore des Teams
     * @apiSuccess {Integer} punkte Anzahl Punkte des Teams
     * @apiSuccess {Integer} gpunkte Anzahl Gegenpunkte des Teams
     * @apiUse vResponse
     *
     * @apiPermission Admin
     * @apiUse AuthHeader
     *
     * @apiSuccessExample Success-Response:
     *     HTTP/1.1 200 OK
     *     [{
     *         _id: '57cffb4055a8d45fc084c108',
     *         name: 'Neuer Name',
     *         jugend: [ Object ],
     *         gruppe: [ Object ],
     *         tore: 4,
     *         gtore: 1,
     *         punkte: 2,
     *         gpunkte: 0
     *         __v: 3
     *     }]
     **/
    router.put('/', function (req, res) {
        const beachEventID = cls.getBeachEventID();
        const clsSession = cls.getNamespace();
        return clsSession.run(function () {
            clsSession.set('beachEventID', beachEventID);
            Team.findById(req.query.id, function (err, team) {
                if (err) {
                    return messages.Error(res, err);
                }

                team = helpers.updateDocByKeys(team, ['name', 'anmeldungsId'], req.body);

                return clsSession.run(function () {
                    clsSession.set('beachEventID', beachEventID);
                    team.save(function (err, team) {
                        return handler.handleErrorAndResponse(err, res, team);
                    });
                });
            });
        });
    });

    /**
     * @api {put} /teams/resetErgebnisse Reset Team-Ergebnis
     * @apiName ResetTeamErgebnis
     * @apiDescription Setzt die Ergebnisse aller Teams zurück
     * @apiGroup Teams
     *
     * @apiPermission Admin
     * @apiUse AuthHeader
     *
     * @apiUse ResetMessage
     * @apiUse Deprecated
     **/
    router.put('/resetErgebnisse', function (req, res) {
        return messages.ErrorDeprecated(res);
    });

    /**
     * @api {put} /teams/reloadAnmeldeObjekte Reload AnmeldeObjekte
     * @apiName ReloadAnmeldeObject
     * @apiDescription Aktualisert die Anmeldeobjekte der Teams
     * @apiGroup Teams
     *
     * @apiPermission Admin
     * @apiUse AuthHeader
     *
     * @apiUse SuccessMessage
     **/
    router.put('/reloadAnmeldeObjekte', function (req, res) {
        const beachEventID = cls.getBeachEventID();
        const clsSession = cls.getNamespace();
        return clsSession.run(function () {
            clsSession.set('beachEventID', beachEventID);
            return helpers.reloadAnmeldeObjects(function (err) {
                return handler.handleErrorAndSuccess(err, res);
            });
        });
    });

    return router;
};