All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.svws_nrw.data.schule.DataAbteilungen Maven / Gradle / Ivy

Go to download

Diese Bibliothek unterstützt bei dem Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW

There is a newer version: 1.0.1
Show newest version
package de.svws_nrw.data.schule;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import de.svws_nrw.core.data.schule.Abteilung;
import de.svws_nrw.core.data.schule.AbteilungKlassenzuordnung;
import de.svws_nrw.data.DTOMapper;
import de.svws_nrw.data.DataManager;
import de.svws_nrw.db.DBEntityManager;
import de.svws_nrw.db.dto.current.schild.schule.DTOAbteilungen;
import de.svws_nrw.db.dto.current.schild.schule.DTOAbteilungsKlassen;
import de.svws_nrw.db.utils.ApiOperationException;
import jakarta.validation.constraints.NotNull;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;

/**
 * Diese Klasse erweitert den abstrakten {@link DataManager} für den
 * Core-DTO {@link Abteilung}.
 */
public final class DataAbteilungen extends DataManager {

	/** Die ID des Schuljahresabschnittes */
	private final Long idSchuljahresabschnitt;

	/**
	 * Erstellt einen neuen {@link DataManager} für den Core-DTO {@link Abteilung}.
	 *
	 * @param conn                     die Datenbankverbindung
	 * @param idSchuljahresabschnitt   die ID des Schuljahresabschnittes, auf den sich die Anfragen beziehen
	 */
	public DataAbteilungen(final DBEntityManager conn, final Long idSchuljahresabschnitt) {
		super(conn);
		this.idSchuljahresabschnitt = idSchuljahresabschnitt;
	}


	/**
	 * Lambda-Ausdruck zum Umwandeln eines Datenbank-DTOs {@link DTOAbteilungen} in einen Core-DTO {@link Abteilung}.
	 */
	public static final DTOMapper dtoMapper = (final DTOAbteilungen dto) -> {
		final Abteilung daten = new Abteilung();
		daten.id = dto.ID;
		daten.bezeichnung = dto.Bezeichnung;
		daten.idSchuljahresabschnitts = dto.Schuljahresabschnitts_ID;
		daten.idAbteilungsleiter = dto.AbteilungsLeiter_ID;
		daten.raum = dto.Raum;
		daten.email = dto.Email;
		daten.durchwahl = dto.Durchwahl;
		daten.sortierung = (dto.Sortierung == null) ? 32000 : dto.Sortierung;
		return daten;
	};


	@Override
	public Response getAll() throws ApiOperationException {
		return this.getList();
	}


	/**
	 * Gibt die Liste der Abteilungen für den Schuljahresabschnitt mit der angegebenen ID zurück.
	 * Ist die ID null, so werden die Daten für alle Schuljahresabschnitte zurückgegeben.
	 *
	 * @param conn                     die Datenbankverbindung
	 * @param idSchuljahresabschnitt   die ID des Schuljahresabschnittes oder null
	 *
	 * @return die Liste der Abteilungen
	 *
	 * @throws ApiOperationException im Fehlerfall
	 */
	public static List getAbteilungen(final @NotNull DBEntityManager conn, final Long idSchuljahresabschnitt) throws ApiOperationException {
		// Ermittle die Abteilungen ...
		final List abteilungen = (idSchuljahresabschnitt == null) ? conn.queryAll(DTOAbteilungen.class)
				: conn.queryList(DTOAbteilungen.QUERY_BY_SCHULJAHRESABSCHNITTS_ID, DTOAbteilungen.class, idSchuljahresabschnitt);
		if (abteilungen.isEmpty())
			return new ArrayList<>();
		final List result = new ArrayList<>();
		for (final DTOAbteilungen abteilung : abteilungen)
			result.add(dtoMapper.apply(abteilung));
		// ... ermittle die Klassenzuordnungen ...
		final List idsAbteilungen = abteilungen.stream().map(a -> a.ID).toList();
		final List dtosZuordnungen =
				conn.queryList(DTOAbteilungsKlassen.QUERY_LIST_BY_ABTEILUNG_ID, DTOAbteilungsKlassen.class, idsAbteilungen);
		final List zuordnungen = new ArrayList<>();
		for (final DTOAbteilungsKlassen dtoZuordnung : dtosZuordnungen)
			zuordnungen.add(DataAbteilungenKlassenzuordnungen.dtoMapper.apply(dtoZuordnung));
		final Map> mapZuordnungen = zuordnungen.stream().collect(Collectors.groupingBy(z -> z.idAbteilung));
		for (final Abteilung abteilung : result)
			if (mapZuordnungen.containsKey(abteilung.id))
				abteilung.klassen.addAll(mapZuordnungen.get(abteilung.id));
		// ... und gib die Abteilungsinformationen zurück.
		return result;
	}


	/**
	 * Gibt die Abteilung für die übergebene ID zurück.
	 *
	 * @param conn   die Datenbankverbindung
	 * @param id     die ID der Abteilung
	 *
	 * @return die Informationen zu der Abteilung
	 *
	 * @throws ApiOperationException im Fehlerfall
	 */
	public static Abteilung getAbteilung(final @NotNull DBEntityManager conn, final long id) throws ApiOperationException {
		final DTOAbteilungen abteilung = conn.queryByKey(DTOAbteilungen.class, id);
		if (abteilung == null)
			throw new ApiOperationException(Status.NOT_FOUND, "Eine Abteilung mit der ID %d konnte nicht gefunden werden.".formatted(id));
		final Abteilung result = dtoMapper.apply(abteilung);
		result.klassen.addAll(DataAbteilungenKlassenzuordnungen.getZuordnungen(conn, id));
		return result;
	}


	@Override
	public Response getList() throws ApiOperationException {
		final List daten = getAbteilungen(conn, this.idSchuljahresabschnitt);
		return Response.status(Status.OK).type(MediaType.APPLICATION_JSON).entity(daten).build();
	}

	@Override
	public Response get(final Long id) throws ApiOperationException {
		final Abteilung daten = getAbteilung(conn, id);
		return Response.status(Status.OK).type(MediaType.APPLICATION_JSON).entity(daten).build();
	}

	@Override
	public Response patch(final Long id, final InputStream is) {
		// Umsetzung mit patchBasic
		throw new UnsupportedOperationException();
	}

	// TODO add

	// TODO addMultiple

	// TODO delete

	// TODO deleteMultiple

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy