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

de.svws_nrw.data.schule.DataSchulen 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.Set;
import java.util.function.ObjLongConsumer;

import de.svws_nrw.core.data.kataloge.SchulEintrag;
import de.svws_nrw.core.data.schule.SchulformKatalogEintrag;
import de.svws_nrw.core.types.schule.Schulform;
import de.svws_nrw.data.DTOMapper;
import de.svws_nrw.data.DataBasicMapper;
import de.svws_nrw.data.DataManager;
import de.svws_nrw.data.JSONMapper;
import de.svws_nrw.db.DBEntityManager;
import de.svws_nrw.db.dto.current.schild.katalog.DTOSchuleNRW;
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 SchulEintrag}.
 */
public final class DataSchulen extends DataManager {

	/**
	 * Erstellt einen neuen {@link DataManager} für den Core-DTO {@link SchulEintrag}.
	 *
	 * @param conn            die Datenbank-Verbindung für den Datenbankzugriff
	 */
	public DataSchulen(final DBEntityManager conn) {
		super(conn);
	}


	/**
	 * Lambda-Ausdruck zum Umwandeln eines Datenbank-DTOs {@link DTOSchuleNRW} in einen Core-DTO {@link SchulEintrag}.
	 */
	private static final DTOMapper dtoMapper = (final DTOSchuleNRW e) -> {
		final SchulEintrag daten = new SchulEintrag();
		daten.id = e.ID;
		daten.kuerzel = e.Kuerzel;
		daten.kurzbezeichnung = e.KurzBez;
		daten.schulnummer = e.SchulNr;
		daten.name = (e.Name == null) ? "" : e.Name;
		daten.schulformID = (e.SchulformNr == null) ? null : Schulform.getByNummer(e.SchulformNr).daten.id;
		daten.strassenname = e.Strassenname;
		daten.hausnummer = e.HausNr;
		daten.hausnummerZusatz = e.HausNrZusatz;
		daten.plz = e.PLZ;
		daten.ort = e.Ort;
		daten.telefon = e.Telefon;
		daten.fax = e.Fax;
		daten.email = e.Email;
		daten.schulleiter = e.Schulleiter;
		daten.sortierung = (e.Sortierung == null) ? 32000 : e.Sortierung;
		daten.istSichtbar = (e.Sichtbar == null) || e.Sichtbar;
		return daten;
	};


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


	/**
	 * Gibt die Einträge im Katalog der Schulen zurück.
	 *
	 * @param conn   die Datenbankverbindung
	 *
	 * @return die Liste der Schulen
	 *
	 * @throws ApiOperationException   im Fehlerfall
	 */
	public static List getSchulen(final @NotNull DBEntityManager conn) throws ApiOperationException {
		final List eintraege = conn.queryAll(DTOSchuleNRW.class);
		final ArrayList daten = new ArrayList<>();
		for (final DTOSchuleNRW e : eintraege)
			daten.add(dtoMapper.apply(e));
		return daten;
	}


	/**
	 * Gibt die Einträge im Katalog der Schulen zurück, welche ein Kürzel gesetzt haben.
	 *
	 * @param conn   die Datenbankverbindung
	 *
	 * @return die Liste der Schulen, welche ein Kürzel gesetzt haben
	 *
	 * @throws ApiOperationException   im Fehlerfall
	 */
	public static List getSchulenMitKuerzel(final @NotNull DBEntityManager conn) throws ApiOperationException {
		final List eintraege = conn.queryAll(DTOSchuleNRW.class);
		final ArrayList daten = new ArrayList<>();
		for (final DTOSchuleNRW e : eintraege)
			if ((e.Kuerzel != null) && (!e.Kuerzel.isBlank()))
				daten.add(dtoMapper.apply(e));
		return daten;
	}


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


	@Override
	public Response get(final Long id) throws ApiOperationException {
		if (id == null)
			throw new ApiOperationException(Status.BAD_REQUEST, "Eine Anfrage zu einem Eintrag im Katalog der Schulen mit der ID null ist unzulässig.");
		final DTOSchuleNRW schule = conn.queryByKey(DTOSchuleNRW.class, id);
		if (schule == null)
			throw new ApiOperationException(Status.NOT_FOUND, "Es wurde kein Eintrag im Katalog der Schulen mit der ID %d gefunden.".formatted(id));
		final SchulEintrag daten = dtoMapper.apply(schule);
		return Response.status(Status.OK).type(MediaType.APPLICATION_JSON).entity(daten).build();
	}


	private static final Map> patchMappings = Map.ofEntries(
			Map.entry("id", (conn, dto, value, map) -> {
				final Long patch_id = JSONMapper.convertToLong(value, true);
				if ((patch_id == null) || (patch_id.longValue() != dto.ID))
					throw new ApiOperationException(Status.BAD_REQUEST);
			}),
			Map.entry("schulnummer", (conn, dto, value, map) -> {
				final String strSchulnummer = JSONMapper.convertToString(value, true, false, 6);
				dto.SchulNr = strSchulnummer;
			}),
			Map.entry("kuerzel", (conn, dto, value, map) -> dto.Kuerzel = JSONMapper.convertToString(value, true, false, 10)),
			Map.entry("kurzbezeichnung", (conn, dto, value, map) -> dto.KurzBez = JSONMapper.convertToString(value, true, false, 40)),
			Map.entry("name", (conn, dto, value, map) -> dto.Name = JSONMapper.convertToString(value, false, false, 120)),
			Map.entry("schulformID", (conn, dto, value, map) -> {
				final Long id = JSONMapper.convertToLong(value, true);
				if (id == null) {
					dto.SchulformBez = null;
					dto.SchulformKrz = null;
					dto.SchulformNr = null;
				} else {
					final SchulformKatalogEintrag sf = Schulform.getEintragByID(id);
					if (sf == null)
						throw new ApiOperationException(Status.BAD_REQUEST);
					dto.SchulformBez = sf.bezeichnung;
					dto.SchulformKrz = sf.kuerzel;
					dto.SchulformNr = sf.nummer;
				}
			}),
			Map.entry("strassenname", (conn, dto, value, map) -> dto.Strassenname = JSONMapper.convertToString(value, false, true, 55)),
			Map.entry("hausnummer", (conn, dto, value, map) -> dto.HausNr = JSONMapper.convertToString(value, false, true, 10)),
			Map.entry("hausnummerZusatz", (conn, dto, value, map) -> dto.HausNrZusatz = JSONMapper.convertToString(value, false, true, 30)),
			Map.entry("plz", (conn, dto, value, map) -> dto.PLZ = JSONMapper.convertToString(value, false, true, 10)),
			Map.entry("ort", (conn, dto, value, map) -> dto.Ort = JSONMapper.convertToString(value, false, true, 50)),
			Map.entry("telefon", (conn, dto, value, map) -> dto.Telefon = JSONMapper.convertToString(value, false, true, 20)),
			Map.entry("fax", (conn, dto, value, map) -> dto.Fax = JSONMapper.convertToString(value, false, true, 20)),
			Map.entry("email", (conn, dto, value, map) -> dto.Email = JSONMapper.convertToString(value, false, true, 40)),
			Map.entry("schulleiter", (conn, dto, value, map) -> dto.Schulleiter = JSONMapper.convertToString(value, false, true, 40)),
			Map.entry("sortierung", (conn, dto, value, map) -> dto.Sortierung = JSONMapper.convertToInteger(value, false)),
			Map.entry("istSichtbar", (conn, dto, value, map) -> dto.Sichtbar = JSONMapper.convertToBoolean(value, false)));


	@Override
	public Response patch(final Long id, final InputStream is) throws ApiOperationException {
		return super.patchBasic(id, is, DTOSchuleNRW.class, patchMappings);
	}


	private static final Set requiredCreateAttributes = Set.of("schulnummer");

	private final ObjLongConsumer initDTO = (dto, id) -> dto.ID = id;

	/**
	 * Fügt ein Schul-Katalog-Eintrag mit den übergebenen JSON-Daten der Datenbank hinzu und gibt das
	 * zugehörige CoreDTO zurück. Falls ein Fehler auftritt wird ein entsprechender Response-Code
	 * zurückgegeben.
	 *
	 * @param is   der InputStream mit den JSON-Daten
	 *
	 * @return die Response mit den Daten
	 *
	 * @throws ApiOperationException im Fehlerfall
	 */
	public Response add(final InputStream is) throws ApiOperationException {
		return super.addBasic(is, DTOSchuleNRW.class, initDTO, dtoMapper, requiredCreateAttributes, patchMappings);
	}


	/**
	 * Löscht einen Schul-Katalog-Eintrag
	 *
	 * @param id   die ID des Schul-Katalog-Eintrag
	 *
	 * @return die HTTP-Response, welchen den Erfolg der Lösch-Operation angibt.
	 *
	 * @throws ApiOperationException im Fehlerfall
	 */
	public Response delete(final Long id) throws ApiOperationException {
		return super.deleteBasic(id, DTOSchuleNRW.class, dtoMapper);
	}


	/**
	 * Löscht mehrere Schul-Katalog-Einträge
	 *
	 * @param ids   die IDs der Einträge
	 *
	 * @return die HTTP-Response, welchen den Erfolg der Lösch-Operation angibt.
	 *
	 * @throws ApiOperationException im Fehlerfall
	 */
	public Response deleteMultiple(final List ids) throws ApiOperationException {
		return super.deleteBasicMultiple(ids, DTOSchuleNRW.class, dtoMapper);
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy