diff --git a/openapi.json b/openapi.json index d69505c3..de8cae85 100644 --- a/openapi.json +++ b/openapi.json @@ -1 +1,1521 @@ -{"openapi":"3.0.3","info":{"title":"Title","version":"1.0.0","description":""},"paths":{"klimafaktoren":{"get":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plz":{"type":"string","minLength":4,"maxLength":5},"startdatum":{"type":"string","format":"date-time"},"enddatum":{"type":"string","format":"date-time"},"genauigkeit":{"type":"string","enum":["months","years"]}},"required":["plz","startdatum","enddatum","genauigkeit"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"month":{"type":"number"},"year":{"type":"number"},"klimafaktor":{"type":"number"}},"required":["month","year","klimafaktor"],"additionalProperties":false}}}}}}}},"postleitzahlen":{"get":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"plz":{"type":"string","minLength":1,"maxLength":5},"limit":{"type":"integer","maximum":50,"minimum":1,"default":10}},"required":["plz"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"plz":{"type":"string","minLength":4,"maxLength":5},"stadt":{"type":"string"},"bundesland":{"type":"string"},"landkreis":{"type":"string"},"lat":{"type":"number"},"lon":{"type":"number"}},"required":["plz","stadt","bundesland","landkreis","lat","lon"],"additionalProperties":false}}}}}}}},"index":{"put":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"latitude":{"type":"number","nullable":true},"longitude":{"type":"number","nullable":true},"plz":{"type":"string","nullable":true,"description":"Postleitzahl des Gebäudes"},"ort":{"type":"string","nullable":true,"description":"Ort des Gebäudes"},"adresse":{"type":"string","nullable":true,"description":"Adresse (Straße und Hausnummer) des Gebäudes"}},"required":["latitude","longitude","plz","ort","adresse"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"uid":{"type":"string","format":"uuid"}},"required":["uid"],"additionalProperties":false}}}}}}},"[uid]":{"patch":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ausweisart":{"type":"string","enum":["VerbrauchsausweisWohnen","VerbrauchsausweisGewerbe","BedarfsausweisWohnen","BedarfsausweisGewerbe"],"description":"Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen","nullable":true},"gebaeudetyp":{"type":"string","nullable":true,"description":"Art des Gebäudes und seiner primären Nutzungsart"},"gebaeudeteil":{"type":"string","nullable":true,"description":"Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil"},"baujahr_gebaeude":{"type":"array","items":{"type":"integer"},"description":"Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde"},"baujahr_heizung":{"type":"array","items":{"type":"integer"},"description":"Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde"},"baujahr_klima":{"type":"array","items":{"type":"integer"},"description":"Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde"},"einheiten":{"type":"integer","description":"Anzahl der (Wohn)Einheiten im Gebäude","nullable":true},"flaeche":{"type":"integer","description":"Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden","nullable":true},"nutzflaeche":{"type":"integer","description":"(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche","nullable":true},"saniert":{"type":"boolean","nullable":true,"description":"Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen"},"keller":{"type":"string","enum":["BEHEIZT","UNBEHEIZT","NICHT_VORHANDEN"],"description":"Ob ein Keller vorhanden, beheizt oder unbeheizt ist","nullable":true},"dachgeschoss":{"type":"string","enum":["BEHEIZT","UNBEHEIZT","NICHT_VORHANDEN"],"description":"Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist","nullable":true},"lueftung":{"type":"string","enum":["Fensterlueftung","Schachtlueftung","LueftungsanlageMitWaermerueckgewinnung","LueftungsanlageOhneWaermerueckgewinnung"],"description":"Art der Gebäudelüftung","nullable":true},"kuehlung":{"type":"string","nullable":true,"description":"Art der Gebäudekühlung"},"leerstand":{"type":"integer","description":"Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr","nullable":true},"alternative_heizung":{"type":"boolean","nullable":true,"description":"Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen"},"alternative_warmwasser":{"type":"boolean","nullable":true,"description":"Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen"},"alternative_lueftung":{"type":"boolean","nullable":true,"description":"Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen"},"alternative_kuehlung":{"type":"boolean","nullable":true,"description":"Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen"},"brennstoff_1":{"type":"string","nullable":true,"description":"Genutzer Brennstoff der primären Energiequelle"},"brennstoff_2":{"type":"string","nullable":true,"description":"Genutzer Brennstoff der sekundären Energiequelle"},"storniert":{"type":"boolean","nullable":true,"description":"Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen"},"erledigt":{"type":"boolean","nullable":true,"description":"Falls der Ausweis erledigt ist, sollte dieser Wert auf true stehen"},"bestellt":{"type":"boolean","nullable":true,"description":"Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen"},"zurueckgestellt":{"type":"boolean","nullable":true,"description":"Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen"},"prueftext":{"type":"string","nullable":true,"description":"Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung"},"boxpruefung":{"type":"boolean","nullable":true},"energieeffizienzklasse":{"type":"string","nullable":true,"description":"Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes"},"erstellungsdatum":{"type":"string","format":"date-time","description":"Datum an dem der Kunde den Ausweis erstellt hat","nullable":true},"ausstellungsdatum":{"type":"string","format":"date-time","description":"Datum an dem der Aussteller den Ausweis ausgestellt hat","nullable":true},"zentralheizung":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen"},"solarsystem_warmwasser":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen"},"warmwasser_rohre_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen"},"niedertemperatur_kessel":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen"},"brennwert_kessel":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen"},"heizungsrohre_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen"},"standard_kessel":{"type":"boolean","nullable":true},"waermepumpe":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen"},"raum_temperatur_regler":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen"},"photovoltaik":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen"},"durchlauf_erhitzer":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen"},"einzelofen":{"type":"boolean","nullable":true},"zirkulation":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen"},"einfach_verglasung":{"type":"boolean","nullable":true,"description":"Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen"},"dreifach_verglasung":{"type":"boolean","nullable":true,"description":"Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen"},"fenster_teilweise_undicht":{"type":"boolean","nullable":true,"description":"Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen"},"doppel_verglasung":{"type":"boolean","nullable":true,"description":"Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen"},"fenster_dicht":{"type":"boolean","nullable":true,"description":"Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen"},"rolllaeden_kaesten_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen"},"isolier_verglasung":{"type":"boolean","nullable":true,"description":"Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen"},"tueren_undicht":{"type":"boolean","nullable":true,"description":"Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen"},"tueren_dicht":{"type":"boolean","nullable":true,"description":"Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen"},"dachgeschoss_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen"},"keller_decke_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen"},"keller_wand_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen"},"aussenwand_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen"},"oberste_geschossdecke_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen"},"aussenwand_min_12cm_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen"},"dachgeschoss_min_12cm_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen"},"oberste_geschossdecke_min_12cm_gedaemmt":{"type":"boolean","nullable":true,"description":"Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen"}},"required":["ausweisart","gebaeudetyp","gebaeudeteil","baujahr_gebaeude","baujahr_heizung","baujahr_klima","einheiten","flaeche","nutzflaeche","saniert","keller","dachgeschoss","lueftung","kuehlung","leerstand","alternative_heizung","alternative_warmwasser","alternative_lueftung","alternative_kuehlung","brennstoff_1","brennstoff_2","storniert","erledigt","bestellt","zurueckgestellt","prueftext","boxpruefung","energieeffizienzklasse","erstellungsdatum","ausstellungsdatum","zentralheizung","solarsystem_warmwasser","warmwasser_rohre_gedaemmt","niedertemperatur_kessel","brennwert_kessel","heizungsrohre_gedaemmt","standard_kessel","waermepumpe","raum_temperatur_regler","photovoltaik","durchlauf_erhitzer","einzelofen","zirkulation","einfach_verglasung","dreifach_verglasung","fenster_teilweise_undicht","doppel_verglasung","fenster_dicht","rolllaeden_kaesten_gedaemmt","isolier_verglasung","tueren_undicht","tueren_dicht","dachgeschoss_gedaemmt","keller_decke_gedaemmt","keller_wand_gedaemmt","aussenwand_gedaemmt","oberste_geschossdecke_gedaemmt","aussenwand_min_12cm_gedaemmt","dachgeschoss_min_12cm_gedaemmt","oberste_geschossdecke_min_12cm_gedaemmt"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{}}}}}}},"ticket":{"put":{"description":"Erstellt ein neues Support Ticket und weist den Ersteller diesem zu, falls ein Authorization Header mitgegeben wurde.","tags":["Tickets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"titel":{"type":"string"},"beschreibung":{"type":"string"},"metadata":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"$ref":"#/properties/metadata"}},{"type":"object","additionalProperties":{"$ref":"#/properties/metadata"}}]},"email":{"type":"string"}},"required":["titel","beschreibung","metadata","email"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"uid":{"type":"string","format":"uuid"}},"required":["uid"],"additionalProperties":false}}}}}}},"access-token":{"get":{"description":"Erstellt, basierend auf einem existierenden und gültigen Refresh Tokens, einen neuen Access Token, welcher zur Authentifizierung genutzt werden kann. Der resultierende Access Token ist nur 2 Tage gültig und muss danach neu generiert werden. Diese Funktion gibt ebenfalls einen neuen Refresh Token zurück, der alte wird dadurch invalidiert.","tags":["Benutzer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"refreshToken":{"type":"string"}},"required":["refreshToken"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"accessToken":{"type":"string"},"accessTokenExpiry":{"type":"number"},"refreshToken":{"type":"string"},"refreshTokenExpiry":{"type":"number"}},"required":["accessToken","accessTokenExpiry","refreshToken","refreshTokenExpiry"],"additionalProperties":false}}}}}}},"refresh-token":{"get":{"description":"Erstellt sowohl einen neuen Refresh Token als auch einen Access Token für den gegebenen Benutzer. Der Refresh Token kann später für die Erstellung neuer Access Token genutzt werden.","tags":["Benutzer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"passwort":{"type":"string","minLength":8,"maxLength":100}},"required":["email","passwort"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"uid":{"type":"string","format":"uuid"},"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"refreshTokenBase64":{"type":"string"},"accessTokenBase64":{"type":"string"},"exp":{"type":"number"}},"required":["uid","accessToken","refreshToken","refreshTokenBase64","accessTokenBase64","exp"],"additionalProperties":false}}}}}}},"self":{"get":{"description":"Gibt die Daten des momentan eingeloggten Benutzers zurück. Falls der Authorization Key invalid ist wird stattdessen null zurückgegeben.","tags":["Benutzer"],"requestBody":{"required":true,"content":{"application/json":{"schema":{}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"uid":{"type":"string"},"name":{"type":"string","nullable":true},"vorname":{"type":"string","nullable":true},"email":{"type":"string"},"profilbild":{"type":"string","nullable":true},"plz":{"type":"string","nullable":true},"ort":{"type":"string","nullable":true},"adresse":{"type":"string","nullable":true},"telefon":{"type":"string","nullable":true},"anrede":{"type":"string","nullable":true},"rolle":{"type":"string","enum":["USER","ADMIN"]}},"required":["uid","name","vorname","email","profilbild","plz","ort","adresse","telefon","anrede","rolle"],"additionalProperties":false},{"enum":["null"],"nullable":true}]}}}}}}},"bilder":{"put":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kategorie":{"type":"string","enum":["Heizung","Fenster","Gebaeude","Daemmung"]},"base64":{"type":"string"}},"required":["kategorie","base64"],"additionalProperties":false}}}},"parameters":[],"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"uid":{"type":"string","description":"Die UID des Bildes."}},"required":["uid"],"additionalProperties":false}}}}}}}}} \ No newline at end of file +{ + "openapi": "3.0.3", + "info": { "title": "Title", "version": "1.0.0", "description": "" }, + "paths": { + "/klimafaktoren": { + "get": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "plz": { + "type": "string", + "minLength": 4, + "maxLength": 5 + }, + "startdatum": { + "type": "string", + "format": "date-time" + }, + "enddatum": { + "type": "string", + "format": "date-time" + }, + "genauigkeit": { + "type": "string", + "enum": ["months", "years"] + } + }, + "required": [ + "plz", + "startdatum", + "enddatum", + "genauigkeit" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "month": { "type": "number" }, + "year": { "type": "number" }, + "klimafaktor": { "type": "number" } + }, + "required": [ + "month", + "year", + "klimafaktor" + ], + "additionalProperties": false + } + } + } + } + } + } + } + }, + "/postleitzahlen": { + "get": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "plz": { + "type": "string", + "minLength": 1, + "maxLength": 5 + }, + "limit": { + "type": "integer", + "maximum": 50, + "minimum": 1, + "default": 10 + } + }, + "required": ["plz"], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "plz": { + "type": "string", + "minLength": 4, + "maxLength": 5 + }, + "stadt": { "type": "string" }, + "bundesland": { "type": "string" }, + "landkreis": { "type": "string" }, + "lat": { "type": "number" }, + "lon": { "type": "number" } + }, + "required": [ + "plz", + "stadt", + "bundesland", + "landkreis", + "lat", + "lon" + ], + "additionalProperties": false + } + } + } + } + } + } + } + }, + "/verbrauchsausweis-wohnen/": { + "patch": { + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { "application/json": { "schema": {} } } + } + } + } + }, + "/verbrauchsausweis-wohnen/{uid}": { + "patch": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ausstellgrund": { + "type": "string", + "enum": [ + "Neubau", + "Vermietung", + "Verkauf", + "Modernisierung", + "Sonstiges" + ], + "description": "Ausstellgrund wie z.B. Vermietung oder Verkauf", + "nullable": true + }, + "registriernummer": { + "type": "string", + "nullable": true, + "description": "Die Registriernummer des Ausweises" + }, + "zusaetzliche_heizquelle": { + "type": "boolean", + "nullable": true, + "description": "Falls eine sekundäre Heizquelle existiert, sollte dieser Wert auf true stehen" + }, + "einheit_1": { + "type": "string", + "nullable": true, + "description": "Einheit des Energieträgers der primären Heizquelle" + }, + "einheit_2": { + "type": "string", + "nullable": true, + "description": "Einheit des Energieträgers der sekundären Heizquelle" + }, + "startdatum": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "verbrauch_1": { + "type": "integer", + "description": "Energieverbrauch der primären Heizquelle im ersten der drei Verbrauchsjahre", + "nullable": true + }, + "verbrauch_2": { + "type": "integer", + "description": "Energieverbrauch der primären Heizquelle im zweiten der drei Verbrauchsjahre", + "nullable": true + }, + "verbrauch_3": { + "type": "integer", + "description": "Energieverbrauch der primären Heizquelle im letzten der drei Verbrauchsjahre", + "nullable": true + }, + "verbrauch_4": { + "type": "integer", + "description": "Energieverbrauch der sekund̈́ären Heizquelle im ersten der drei Verbrauchsjahre", + "nullable": true + }, + "verbrauch_5": { + "type": "integer", + "description": "Energieverbrauch der sekund̈́ären Heizquelle im zweiten der drei Verbrauchsjahre", + "nullable": true + }, + "verbrauch_6": { + "type": "integer", + "description": "Energieverbrauch der sekund̈́ären Heizquelle im letzten der drei Verbrauchsjahre", + "nullable": true + }, + "warmwasser_enthalten": { + "type": "boolean", + "nullable": true, + "description": "Falls Warmwasser im Verbrauchswert enthalten ist, sollte dieser Wert auf true stehen" + }, + "warmwasser_anteil_bekannt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Warmwasser Anteil am Verbrauch bekannt ist, sollte dieser Wert auf true stehen" + }, + "wird_gekuehlt": { + "type": "boolean", + "nullable": true, + "description": "Falls Kühlung im Verbrauch enthalten ist, sollte dieser Wert auf true stehen" + }, + "keller_beheizt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Keller des Gebäudes beheizt wird, sollte dieser Wert auf true stehen" + }, + "faktorKeller": { + "type": "number", + "nullable": true, + "description": "Der Faktor mit dem die Wohnfläche erhöht wird wenn die beheizte Gesamtfläche (energetische Nutzfläche) unbekannt ist." + }, + "alternative_heizung": { + "type": "boolean", + "nullable": true, + "description": "Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet, sollte dieser Wert auf true stehen." + }, + "alternative_warmwasser": { + "type": "boolean", + "nullable": true, + "description": "Falls der Warmwasserverbrauch alternative Energieversorgungssysteme (z.B. Solarsystem, Wärmepumpe, etc.) beinhaltet, sollte dieser Wert auf true stehen." + }, + "alternative_lueftung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen." + }, + "alternative_kuehlung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen." + }, + "anteil_warmwasser_1": { + "type": "number", + "nullable": true, + "description": "Anteil des Warmwassers am Gesamtverbrauch der primären Energiequelle in Prozent" + }, + "anteil_warmwasser_2": { + "type": "number", + "nullable": true, + "description": "Anteil des Warmwassers am Gesamtverbrauch der sekundären Energiequelle in Prozent" + } + }, + "additionalProperties": false + } + } + } + }, + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { "type": "string" } + }, + { + "name": "Authorization", + "schema": { "type": "string" }, + "required": true, + "in": "header" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { "application/json": { "schema": {} } } + } + } + } + }, + "/aufnahme/": { + "put": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "aufnahme": { + "type": "object", + "properties": { + "ausweisart": { + "type": "string", + "enum": [ + "VerbrauchsausweisWohnen", + "VerbrauchsausweisGewerbe", + "BedarfsausweisWohnen", + "BedarfsausweisGewerbe" + ], + "description": "Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen", + "nullable": true + }, + "gebaeudetyp": { + "type": "string", + "nullable": true, + "description": "Art des Gebäudes und seiner primären Nutzungsart" + }, + "gebaeudeteil": { + "type": "string", + "nullable": true, + "description": "Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil" + }, + "baujahr_gebaeude": { + "type": "array", + "items": { "type": "integer" }, + "description": "Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde" + }, + "baujahr_heizung": { + "type": "array", + "items": { "type": "integer" }, + "description": "Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde" + }, + "baujahr_klima": { + "type": "array", + "items": { + "type": "integer", + "exclusiveMinimum": true, + "minimum": 0 + }, + "nullable": true + }, + "einheiten": { + "type": "integer", + "description": "Anzahl der (Wohn)Einheiten im Gebäude", + "nullable": true + }, + "flaeche": { + "type": "integer", + "description": "Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden", + "nullable": true + }, + "nutzflaeche": { + "type": "integer", + "description": "(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche", + "nullable": true + }, + "saniert": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen" + }, + "keller": { + "type": "string", + "enum": [ + "BEHEIZT", + "UNBEHEIZT", + "NICHT_VORHANDEN" + ], + "description": "Ob ein Keller vorhanden, beheizt oder unbeheizt ist", + "nullable": true + }, + "dachgeschoss": { + "type": "string", + "enum": [ + "BEHEIZT", + "UNBEHEIZT", + "NICHT_VORHANDEN" + ], + "description": "Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist", + "nullable": true + }, + "lueftung": { + "type": "string", + "enum": [ + "Fensterlueftung", + "Schachtlueftung", + "LueftungsanlageMitWaermerueckgewinnung", + "LueftungsanlageOhneWaermerueckgewinnung" + ], + "description": "Art der Gebäudelüftung", + "nullable": true + }, + "kuehlung": { + "type": "string", + "nullable": true, + "description": "Art der Gebäudekühlung" + }, + "leerstand": { + "type": "integer", + "description": "Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr", + "nullable": true + }, + "alternative_heizung": { + "type": "boolean", + "nullable": true, + "description": "Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "alternative_warmwasser": { + "type": "boolean", + "nullable": true, + "description": "Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "alternative_lueftung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "alternative_kuehlung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "brennstoff_1": { + "type": "string", + "nullable": true, + "description": "Genutzer Brennstoff der primären Energiequelle" + }, + "brennstoff_2": { + "type": "string", + "nullable": true, + "description": "Genutzer Brennstoff der sekundären Energiequelle" + }, + "storniert": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen" + }, + "erledigt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis erledigt ist, sollte dieser Wert auf true stehen" + }, + "bestellt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen" + }, + "zurueckgestellt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen" + }, + "prueftext": { + "type": "string", + "nullable": true, + "description": "Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung" + }, + "boxpruefung": { + "type": "boolean", + "nullable": true + }, + "energieeffizienzklasse": { + "type": "string", + "nullable": true, + "description": "Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes" + }, + "erstellungsdatum": { + "type": "string", + "format": "date-time", + "description": "Datum an dem der Kunde den Ausweis erstellt hat", + "nullable": true + }, + "ausstellungsdatum": { + "type": "string", + "format": "date-time", + "description": "Datum an dem der Aussteller den Ausweis ausgestellt hat", + "nullable": true + }, + "zentralheizung": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen" + }, + "solarsystem_warmwasser": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen" + }, + "warmwasser_rohre_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "niedertemperatur_kessel": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen" + }, + "brennwert_kessel": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen" + }, + "heizungsrohre_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "standard_kessel": { + "type": "boolean", + "nullable": true + }, + "waermepumpe": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen" + }, + "raum_temperatur_regler": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen" + }, + "photovoltaik": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen" + }, + "durchlauf_erhitzer": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen" + }, + "einzelofen": { + "type": "boolean", + "nullable": true + }, + "zirkulation": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen" + }, + "einfach_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen" + }, + "dreifach_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen" + }, + "fenster_teilweise_undicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen" + }, + "doppel_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen" + }, + "fenster_dicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen" + }, + "rolllaeden_kaesten_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen" + }, + "isolier_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen" + }, + "tueren_undicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen" + }, + "tueren_dicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen" + }, + "dachgeschoss_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen" + }, + "keller_decke_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen" + }, + "keller_wand_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "aussenwand_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "oberste_geschossdecke_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen" + }, + "aussenwand_min_12cm_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen" + }, + "dachgeschoss_min_12cm_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen" + }, + "oberste_geschossdecke_min_12cm_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen" + } + }, + "required": [ + "baujahr_gebaeude", + "baujahr_heizung" + ], + "additionalProperties": false + }, + "uid_objekt": { "type": "string" } + }, + "required": ["aufnahme", "uid_objekt"], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uid": { "type": "string" } + }, + "required": ["uid"], + "additionalProperties": false + } + } + } + } + } + } + }, + "/aufnahme/{uid}": { + "patch": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ausweisart": { + "type": "string", + "enum": [ + "VerbrauchsausweisWohnen", + "VerbrauchsausweisGewerbe", + "BedarfsausweisWohnen", + "BedarfsausweisGewerbe" + ], + "description": "Art des korrespondierenden Ausweises, wie z.B. VerbrauchsausweisWohnen", + "nullable": true + }, + "gebaeudetyp": { + "type": "string", + "nullable": true, + "description": "Art des Gebäudes und seiner primären Nutzungsart" + }, + "gebaeudeteil": { + "type": "string", + "nullable": true, + "description": "Betrachteter Teil des Gebäudes, z.B. Gesamtgebäude, Wohnteil, Gewerbeteil" + }, + "baujahr_gebaeude": { + "type": "array", + "items": { "type": "integer" }, + "description": "Alle Jahre in denen das Gebäude konstruiert oder grundlegend verändert wurde" + }, + "baujahr_heizung": { + "type": "array", + "items": { "type": "integer" }, + "description": "Alle Jahre in denen die Heizung eingebaut oder grundlegend verändert wurde" + }, + "baujahr_klima": { + "type": "array", + "items": { "type": "integer" }, + "description": "Alle Jahre in denen die Klimaanlage eingebaut oder grundlegend verändert wurde" + }, + "einheiten": { + "type": "integer", + "description": "Anzahl der (Wohn)Einheiten im Gebäude", + "nullable": true + }, + "flaeche": { + "type": "integer", + "description": "Wohnfläche bei Wohngebäuden, Nutzfläche bei Gewerbegebäuden", + "nullable": true + }, + "nutzflaeche": { + "type": "integer", + "description": "(energetische) Nutzfläche des Gebäudes. Bei Gewerbegebäuden entspricht Sie der Nutzfläche", + "nullable": true + }, + "saniert": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude energetisch saniert ist, sollte dieser Wert auf true stehen" + }, + "keller": { + "type": "string", + "enum": [ + "BEHEIZT", + "UNBEHEIZT", + "NICHT_VORHANDEN" + ], + "description": "Ob ein Keller vorhanden, beheizt oder unbeheizt ist", + "nullable": true + }, + "dachgeschoss": { + "type": "string", + "enum": [ + "BEHEIZT", + "UNBEHEIZT", + "NICHT_VORHANDEN" + ], + "description": "Ob ein Dachgeschoss vorhanden, beheizt oder unbeheizt ist", + "nullable": true + }, + "lueftung": { + "type": "string", + "enum": [ + "Fensterlueftung", + "Schachtlueftung", + "LueftungsanlageMitWaermerueckgewinnung", + "LueftungsanlageOhneWaermerueckgewinnung" + ], + "description": "Art der Gebäudelüftung", + "nullable": true + }, + "kuehlung": { + "type": "string", + "nullable": true, + "description": "Art der Gebäudekühlung" + }, + "leerstand": { + "type": "integer", + "description": "Prozentualer Leerstand des Gebäudes in einem durchschnittlichen Jahr", + "nullable": true + }, + "alternative_heizung": { + "type": "boolean", + "nullable": true, + "description": "Falls der Heizungsverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "alternative_warmwasser": { + "type": "boolean", + "nullable": true, + "description": "Falls der Warmwasserverbrauch alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "alternative_lueftung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Lüftung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "alternative_kuehlung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kühlung alternative Energieversorgungssysteme beinhaltet sollte dieser Wert auf true stehen" + }, + "brennstoff_1": { + "type": "string", + "nullable": true, + "description": "Genutzer Brennstoff der primären Energiequelle" + }, + "brennstoff_2": { + "type": "string", + "nullable": true, + "description": "Genutzer Brennstoff der sekundären Energiequelle" + }, + "storniert": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis storniert wurde, sollte dieser Wert auf true stehen" + }, + "erledigt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis erledigt ist, sollte dieser Wert auf true stehen" + }, + "bestellt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis bestellt wurde, sollte dieser Wert auf true stehen" + }, + "zurueckgestellt": { + "type": "boolean", + "nullable": true, + "description": "Falls der Ausweis vom Aussteller zurückgestellt wurde, sollte dieser Wert auf true stehen" + }, + "prueftext": { + "type": "string", + "nullable": true, + "description": "Durch den Kunden hinzugefügte Anmerkung zur Vorabprüfung" + }, + "boxpruefung": { + "type": "boolean", + "nullable": true + }, + "energieeffizienzklasse": { + "type": "string", + "nullable": true, + "description": "Die aus der Berechnung hervorgehende Energieeffizienzklasse des Gebäudes" + }, + "erstellungsdatum": { + "type": "string", + "format": "date-time", + "description": "Datum an dem der Kunde den Ausweis erstellt hat", + "nullable": true + }, + "ausstellungsdatum": { + "type": "string", + "format": "date-time", + "description": "Datum an dem der Aussteller den Ausweis ausgestellt hat", + "nullable": true + }, + "zentralheizung": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Zentralbeheizung verfügt, sollte dieser Wert auf true stehen" + }, + "solarsystem_warmwasser": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über ein Solarsystem für Warmwasser verfügt, sollte dieser Wert auf true stehen" + }, + "warmwasser_rohre_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Warmwasserrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "niedertemperatur_kessel": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Niedertemperaturkessel verfügt, sollte dieser Wert auf true stehen" + }, + "brennwert_kessel": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Brennwertkessel verfügt, sollte dieser Wert auf true stehen" + }, + "heizungsrohre_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Heizungsrohre des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "standard_kessel": { + "type": "boolean", + "nullable": true + }, + "waermepumpe": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Wärmepumpe verfügt, sollte dieser Wert auf true stehen" + }, + "raum_temperatur_regler": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Raumtemperaturregler verfügt, sollte dieser Wert auf true stehen" + }, + "photovoltaik": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Photovoltaikanlage verfügt, sollte dieser Wert auf true stehen" + }, + "durchlauf_erhitzer": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über einen Durchlauferhitzer verfügt, sollte dieser Wert auf true stehen" + }, + "einzelofen": { + "type": "boolean", + "nullable": true + }, + "zirkulation": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über eine Zirkulationspumpe verfügt, sollte dieser Wert auf true stehen" + }, + "einfach_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes einfach gedämmt sind, sollte dieser Wert auf true stehen" + }, + "dreifach_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes dreifach gedämmt sind, sollte dieser Wert auf true stehen" + }, + "fenster_teilweise_undicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes teilweise undicht sind, sollte dieser Wert auf true stehen" + }, + "doppel_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes doppelt gedämmt sind, sollte dieser Wert auf true stehen" + }, + "fenster_dicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes dicht sind, sollte dieser Wert auf true stehen" + }, + "rolllaeden_kaesten_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls das Gebäude über gedämmte Rolllädenkästen verfügt, sollte dieser Wert auf true stehen" + }, + "isolier_verglasung": { + "type": "boolean", + "nullable": true, + "description": "Falls die Fenster des Gebäudes isolier Verglasung haben, sollte dieser Wert auf true stehen" + }, + "tueren_undicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Türen des Gebäudes undicht sind, sollte dieser Wert auf true stehen" + }, + "tueren_dicht": { + "type": "boolean", + "nullable": true, + "description": "Falls die Türen des Gebäudes dicht sind, sollte dieser Wert auf true stehen" + }, + "dachgeschoss_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls das Dachgeschoss des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen" + }, + "keller_decke_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kellerdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen" + }, + "keller_wand_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Kellerwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "aussenwand_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Außenwände des Gebäudes gedämmt sind, sollte dieser Wert auf true stehen" + }, + "oberste_geschossdecke_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die oberste Geschossdecke des Gebäudes gedämmt ist, sollte dieser Wert auf true stehen" + }, + "aussenwand_min_12cm_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die Außenwände des Gebäudes mindestens 12cm gedämmt sind, sollte dieser Wert auf true stehen" + }, + "dachgeschoss_min_12cm_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls das Dachgeschoss des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen" + }, + "oberste_geschossdecke_min_12cm_gedaemmt": { + "type": "boolean", + "nullable": true, + "description": "Falls die oberste Geschossdecke des Gebäudes mindestens 12cm gedämmt ist, sollte dieser Wert auf true stehen" + } + }, + "required": [ + "baujahr_gebaeude", + "baujahr_heizung", + "baujahr_klima" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { "application/json": { "schema": {} } } + } + } + } + }, + "/ticket": { + "put": { + "description": "Erstellt ein neues Support Ticket und weist den Ersteller diesem zu, falls ein Authorization Header mitgegeben wurde.", + "tags": ["Tickets"], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "titel": { "type": "string" }, + "beschreibung": { "type": "string" }, + "metadata": { + "anyOf": [ + { + "anyOf": [ + { "type": "string" }, + { "type": "number" }, + { "type": "boolean" } + ] + }, + { + "type": "array", + "items": { + "$ref": "#/properties/metadata" + } + }, + { + "type": "object", + "additionalProperties": { + "$ref": "#/properties/metadata" + } + } + ] + }, + "email": { "type": "string" } + }, + "required": [ + "titel", + "beschreibung", + "metadata", + "email" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uid": { "type": "string" } + }, + "required": ["uid"], + "additionalProperties": false + } + } + } + } + } + } + }, + "/auth/access-token": { + "get": { + "description": "Erstellt, basierend auf einem existierenden und gültigen Refresh Tokens, einen neuen Access Token, welcher zur Authentifizierung genutzt werden kann. Der resultierende Access Token ist nur 2 Tage gültig und muss danach neu generiert werden. Diese Funktion gibt ebenfalls einen neuen Refresh Token zurück, der alte wird dadurch invalidiert.", + "tags": ["Benutzer"], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "refreshToken": { "type": "string" } + }, + "required": ["refreshToken"], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "accessToken": { "type": "string" }, + "accessTokenExpiry": { + "type": "number" + }, + "refreshToken": { "type": "string" }, + "refreshTokenExpiry": { + "type": "number" + } + }, + "required": [ + "accessToken", + "accessTokenExpiry", + "refreshToken", + "refreshTokenExpiry" + ], + "additionalProperties": false + } + } + } + } + } + } + }, + "/auth/refresh-token": { + "get": { + "description": "Erstellt sowohl einen neuen Refresh Token als auch einen Access Token für den gegebenen Benutzer. Der Refresh Token kann später für die Erstellung neuer Access Token genutzt werden.", + "tags": ["Benutzer"], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "passwort": { + "type": "string", + "minLength": 8, + "maxLength": 100 + } + }, + "required": ["email", "passwort"], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uid": { "type": "string" }, + "accessToken": { "type": "string" }, + "refreshToken": { "type": "string" }, + "refreshTokenBase64": { + "type": "string" + }, + "accessTokenBase64": { + "type": "string" + }, + "exp": { "type": "number" } + }, + "required": [ + "uid", + "accessToken", + "refreshToken", + "refreshTokenBase64", + "accessTokenBase64", + "exp" + ], + "additionalProperties": false + } + } + } + } + } + } + }, + "/user/self": { + "get": { + "description": "Gibt die Daten des momentan eingeloggten Benutzers zurück. Falls der Authorization Key invalid ist wird stattdessen null zurückgegeben.", + "tags": ["Benutzer"], + "requestBody": { + "required": true, + "content": { "application/json": { "schema": {} } } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "type": "object", + "properties": { + "uid": { "type": "string" }, + "name": { + "type": "string", + "nullable": true + }, + "vorname": { + "type": "string", + "nullable": true + }, + "email": { "type": "string" }, + "profilbild": { + "type": "string", + "nullable": true + }, + "plz": { + "type": "string", + "nullable": true + }, + "ort": { + "type": "string", + "nullable": true + }, + "adresse": { + "type": "string", + "nullable": true + }, + "telefon": { + "type": "string", + "nullable": true + }, + "anrede": { + "type": "string", + "nullable": true + }, + "rolle": { + "type": "string", + "enum": ["USER", "ADMIN"] + } + }, + "required": [ + "uid", + "email", + "rolle" + ], + "additionalProperties": false + }, + { "enum": ["null"], "nullable": true } + ] + } + } + } + } + } + } + }, + "/user/": { + "put": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "format": "email" + }, + "passwort": { + "type": "string", + "minLength": 6 + }, + "vorname": { "type": "string" }, + "name": { "type": "string" } + }, + "required": [ + "email", + "passwort", + "vorname", + "name" + ], + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uid": { "type": "string" } + }, + "required": ["uid"], + "additionalProperties": false + } + } + } + } + } + } + }, + "/objekt/{uid}/bilder": { + "put": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "kategorie": { + "type": "string", + "enum": [ + "Heizung", + "Fenster", + "Gebaeude", + "Daemmung" + ] + }, + "base64": { "type": "string" } + }, + "required": ["kategorie", "base64"], + "additionalProperties": false + } + } + } + }, + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { "type": "string" } + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uid": { + "type": "string", + "description": "Die UID des Bildes." + } + }, + "required": ["uid"], + "additionalProperties": false + } + } + } + } + } + } + }, + "/objekt/{uid}/": { + "patch": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "latitude": { + "type": "number", + "nullable": true + }, + "longitude": { + "type": "number", + "nullable": true + }, + "plz": { + "type": "string", + "nullable": true, + "description": "Postleitzahl des Gebäudes" + }, + "ort": { + "type": "string", + "nullable": true, + "description": "Ort des Gebäudes" + }, + "adresse": { + "type": "string", + "nullable": true, + "description": "Adresse (Straße und Hausnummer) des Gebäudes" + } + }, + "additionalProperties": false + } + } + } + }, + "parameters": [ + { + "name": "uid", + "in": "path", + "required": true, + "schema": { "type": "string" } + }, + { + "name": "Authorization", + "schema": { "type": "string" }, + "required": true, + "in": "header" + } + ], + "responses": { + "200": { + "description": "Successful response", + "content": { "application/json": { "schema": {} } } + } + } + } + }, + "/objekt/": { + "put": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "latitude": { + "type": "number", + "nullable": true + }, + "longitude": { + "type": "number", + "nullable": true + }, + "plz": { + "type": "string", + "nullable": true, + "description": "Postleitzahl des Gebäudes" + }, + "ort": { + "type": "string", + "nullable": true, + "description": "Ort des Gebäudes" + }, + "adresse": { + "type": "string", + "nullable": true, + "description": "Adresse (Straße und Hausnummer) des Gebäudes" + } + }, + "additionalProperties": false + } + } + } + }, + "parameters": [], + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "uid": { "type": "string" } + }, + "required": ["uid"], + "additionalProperties": false + } + } + } + } + } + } + } + }, + "servers": [{ "url": "awd" }] +} diff --git a/persistent/images/3c319927-d226-4c84-8650-11bcc3d90670.webp b/persistent/images/3c319927-d226-4c84-8650-11bcc3d90670.webp deleted file mode 100644 index 68fcce0a..00000000 Binary files a/persistent/images/3c319927-d226-4c84-8650-11bcc3d90670.webp and /dev/null differ diff --git a/src/astro-typesafe-api-caller.ts b/src/astro-typesafe-api-caller.ts index 704b51a5..41cafcbe 100644 --- a/src/astro-typesafe-api-caller.ts +++ b/src/astro-typesafe-api-caller.ts @@ -10,9 +10,9 @@ export const createCaller = createCallerFactory({ "auth/refresh-token": await import("../src/pages/api/auth/refresh-token.ts"), "bedarfsausweis-wohnen": await import("../src/pages/api/bedarfsausweis-wohnen/index.ts"), "objekt": await import("../src/pages/api/objekt/index.ts"), + "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "user": await import("../src/pages/api/user/index.ts"), "user/self": await import("../src/pages/api/user/self.ts"), - "verbrauchsausweis-gewerbe": await import("../src/pages/api/verbrauchsausweis-gewerbe/index.ts"), "verbrauchsausweis-wohnen/[uid]": await import("../src/pages/api/verbrauchsausweis-wohnen/[uid].ts"), "verbrauchsausweis-wohnen": await import("../src/pages/api/verbrauchsausweis-wohnen/index.ts"), "objekt/[uid]/bilder": await import("../src/pages/api/objekt/[uid]/bilder.ts"), diff --git a/src/components/Ausweis/types.ts b/src/components/Ausweis/types.ts index 345a2836..ac3194d4 100644 --- a/src/components/Ausweis/types.ts +++ b/src/components/Ausweis/types.ts @@ -1,3 +1,4 @@ +import { VALID_UUID_PREFIXES } from "#lib/constants.js"; import { Aufnahme, BedarfsausweisWohnen, @@ -103,4 +104,16 @@ export type OptionalNullable = T extends object ? { [K in keyof PickNullable]?: OptionalNullable } & { [K in keyof PickNotNullable]: OptionalNullable -} : T; \ No newline at end of file +} : T; + +export const UUidWithPrefix = z.string().refine((value) => { + const prefixedUUidRegex = /^([0-9a-z]+)-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i + + const match = value.match(prefixedUUidRegex) + + if (match && match[1] in VALID_UUID_PREFIXES) { + return true; + } + + return false; +}) \ No newline at end of file diff --git a/src/lib/constants.ts b/src/lib/constants.ts index f50a2fb6..a1dfbefb 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -4,6 +4,22 @@ export const API_ACCESS_TOKEN_COOKIE_NAME = "accessToken"; export const API_REFRESH_TOKEN_COOKIE_NAME = "refreshToken"; export const API_UID_COOKIE_NAME = "uid"; +export enum VALID_UUID_PREFIXES { + "auf" = "Aufnahme", + "obj" = "Objekt", + "vaw" = "Verbrauchsausweis Wohnen", + "vag" = "Verbrauchsausweis Gewerbe", + "baw" = "Bedarfsausweis Wohnen", + "bag" = "Bedarfsausweis Gewerbe", + "usr" = "User", + "ant" = "Anteilshaber", + "evt" = "Event", + "img" = "Bild", + "inv" = "Rechnung", + "tkt" = "Ticket", + "pln" = "Gebäude Plan", +} + /** * Ein Objekt welches alle definierten Preise für unsere Basisprodukte enthält. */ @@ -12,15 +28,18 @@ export const PRICES: Record = { BedarfsausweisWohnen: [135, 145, 290], VerbrauchsausweisWohnen: [65, 75, 180], VerbrauchsausweisGewerbe: [95, 115, 360], - BedarfsausweisGewerbe: [500, 0, 0] + BedarfsausweisGewerbe: [500, 0, 0], }; -export const SERVICES: Record> = { +export const SERVICES: Record< + Enums.Ausweisart, + Record +> = { BedarfsausweisWohnen: { Qualitaetsdruck: 9, Aushang: 10, SameDay: 29, - Telefonberatung: 30, + Telefonberatung: 30, }, VerbrauchsausweisWohnen: { Qualitaetsdruck: 9, @@ -34,4 +53,10 @@ export const SERVICES: Record> = SameDay: 29, Telefonberatung: 25, }, - }; + BedarfsausweisGewerbe: { + Aushang: 0, + Qualitaetsdruck: 0, + SameDay: 0, + Telefonberatung: 0, + }, +}; diff --git a/src/lib/middleware/authorization.ts b/src/lib/middleware/authorization.ts index 322162ad..2b2df868 100644 --- a/src/lib/middleware/authorization.ts +++ b/src/lib/middleware/authorization.ts @@ -2,6 +2,7 @@ import { decodeToken } from "#lib/auth/token.js"; import { hashPassword } from "#lib/password.js"; import { prisma } from "@ibcornelsen/database/server"; import { APIError, TypesafeAPIContextWithRequest } from "astro-typesafe-api/server"; +import { z } from "zod"; export async function authorizationMiddleware(input: any, context: TypesafeAPIContextWithRequest) { const authorization: string | undefined = context.request.headers.get("Authorization"); @@ -86,4 +87,8 @@ export async function maybeAuthorizationMiddleware(input: any, ctx: TypesafeAPIC } catch(e) { return null; } +} + +export const authorizationHeaders = { + Authorization: z.string() } \ No newline at end of file diff --git a/src/pages/api/aufnahme/[uid].ts b/src/pages/api/aufnahme/[uid].ts index e22bb302..f2f3bed4 100644 --- a/src/pages/api/aufnahme/[uid].ts +++ b/src/pages/api/aufnahme/[uid].ts @@ -1,4 +1,4 @@ -import { AufnahmeClient, OptionalNullable, ZodOverlap } from "#components/Ausweis/types.js"; +import { AufnahmeClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js"; import { exclude } from "#lib/exclude.js"; import { authorizationMiddleware } from "#lib/middleware/authorization.js"; import { AufnahmeSchema, prisma } from "@ibcornelsen/database/server"; @@ -62,7 +62,7 @@ export const GET = defineApiRoute({ objekt_id: true, benutzer_id: true }).merge(z.object({ - uid_objekt: z.string().uuid() + uid_objekt: UUidWithPrefix }))), middleware: authorizationMiddleware, async fetch(input, context, user) { diff --git a/src/pages/api/aufnahme/index.ts b/src/pages/api/aufnahme/index.ts index 000c90f8..789da870 100644 --- a/src/pages/api/aufnahme/index.ts +++ b/src/pages/api/aufnahme/index.ts @@ -1,3 +1,4 @@ +import { UUidWithPrefix } from "#components/Ausweis/types.js" import { authorizationMiddleware } from "#lib/middleware/authorization.js" import { AufnahmeSchema, ObjektSchema, prisma } from "@ibcornelsen/database/server" import { APIError, defineApiRoute } from "astro-typesafe-api/server" @@ -11,12 +12,12 @@ export const PUT = defineApiRoute({ benutzer_id: true, objekt_id: true, }).merge(z.object({ - baujahr_klima: z.array(z.number().int().positive()).nullish() + baujahr_klima: z.array(z.number().int().positive()).optional() })), - uid_objekt: z.string().uuid() + uid_objekt: UUidWithPrefix }), output: z.object({ - uid: z.string().uuid() + uid: UUidWithPrefix }), middleware: authorizationMiddleware, async fetch(input, context, user) { diff --git a/src/pages/api/auth/access-token.ts b/src/pages/api/auth/access-token.ts index a7313a77..bff9220f 100644 --- a/src/pages/api/auth/access-token.ts +++ b/src/pages/api/auth/access-token.ts @@ -16,7 +16,6 @@ export const GET = defineApiRoute({ input: z.object({ refreshToken: z.string(), }), - output: z.object({ accessToken: z.string(), accessTokenExpiry: z.number(), diff --git a/src/pages/api/auth/refresh-token.ts b/src/pages/api/auth/refresh-token.ts index 7616f46f..3e754e13 100644 --- a/src/pages/api/auth/refresh-token.ts +++ b/src/pages/api/auth/refresh-token.ts @@ -5,6 +5,7 @@ import { encodeToken } from "../../../lib/auth/token.js"; import { validatePassword } from "../../../lib/password.js"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { TokenType } from "#lib/auth/types.js"; +import { UUidWithPrefix } from "#components/Ausweis/types.js"; export const GET = defineApiRoute({ meta: { @@ -18,7 +19,7 @@ export const GET = defineApiRoute({ passwort: z.string().min(8).max(100), }), output: z.object({ - uid: z.string().uuid(), + uid: UUidWithPrefix, accessToken: z.string(), refreshToken: z.string(), refreshTokenBase64: z.string(), diff --git a/src/pages/api/objekt/index.ts b/src/pages/api/objekt/index.ts index 8a22344e..4d241001 100644 --- a/src/pages/api/objekt/index.ts +++ b/src/pages/api/objekt/index.ts @@ -1,3 +1,4 @@ +import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { authorizationMiddleware } from "#lib/middleware/authorization.js"; import { ObjektSchema, prisma } from "@ibcornelsen/database/server"; import { defineApiRoute } from "astro-typesafe-api/server"; @@ -10,7 +11,7 @@ export const PUT = defineApiRoute({ benutzer_id: true }), output: z.object({ - uid: z.string().uuid() + uid: UUidWithPrefix }), middleware: authorizationMiddleware, async fetch(input, context, user) { diff --git a/src/pages/api/ticket.ts b/src/pages/api/ticket.ts index 5a999a18..30266906 100644 --- a/src/pages/api/ticket.ts +++ b/src/pages/api/ticket.ts @@ -2,6 +2,7 @@ import { z } from "zod"; import { TicketsSchema, prisma } from "@ibcornelsen/database/server"; import { defineApiRoute } from "astro-typesafe-api/server"; import { maybeAuthorizationMiddleware } from "#lib/middleware/authorization.js"; +import { UUidWithPrefix } from "#components/Ausweis/types.js"; export const PUT = defineApiRoute({ meta: { @@ -23,7 +24,7 @@ export const PUT = defineApiRoute({ updated_at: true, }), output: z.object({ - uid: z.string().uuid(), + uid: UUidWithPrefix, }), middleware: maybeAuthorizationMiddleware, async fetch(input, ctx, user) { diff --git a/src/pages/api/user/index.ts b/src/pages/api/user/index.ts index 958b9b25..10ed09c1 100644 --- a/src/pages/api/user/index.ts +++ b/src/pages/api/user/index.ts @@ -1,3 +1,4 @@ +import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { hashPassword } from "#lib/password.js"; import { prisma } from "@ibcornelsen/database/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; @@ -11,7 +12,7 @@ export const PUT = defineApiRoute({ name: z.string() }), output: z.object({ - uid: z.string().uuid() + uid: UUidWithPrefix }), async fetch(input) { const user = await prisma.benutzer.findUnique({ diff --git a/src/pages/api/verbrauchsausweis-wohnen/[uid].ts b/src/pages/api/verbrauchsausweis-wohnen/[uid].ts index 388349a6..21cb5c32 100644 --- a/src/pages/api/verbrauchsausweis-wohnen/[uid].ts +++ b/src/pages/api/verbrauchsausweis-wohnen/[uid].ts @@ -1,4 +1,4 @@ -import { OptionalNullable, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js"; +import { OptionalNullable, UUidWithPrefix, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js"; import { exclude } from "#lib/exclude.js"; import { authorizationMiddleware } from "#lib/middleware/authorization.js"; import { prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server"; @@ -61,9 +61,9 @@ export const GET = defineApiRoute({ } }, output: ZodOverlap>(VerbrauchsausweisWohnenSchema.merge(z.object({ - uid_aufnahme: z.string().uuid(), - uid_objekt: z.string().uuid(), - uid_benutzer: z.string().uuid().optional() + uid_aufnahme: UUidWithPrefix, + uid_objekt: UUidWithPrefix, + uid_benutzer: UUidWithPrefix.optional() })).omit({ id: true, aufnahme_id: true, diff --git a/src/pages/api/verbrauchsausweis-wohnen/index.ts b/src/pages/api/verbrauchsausweis-wohnen/index.ts index c7ebd158..4d384540 100644 --- a/src/pages/api/verbrauchsausweis-wohnen/index.ts +++ b/src/pages/api/verbrauchsausweis-wohnen/index.ts @@ -1,4 +1,5 @@ -import { authorizationMiddleware } from "#lib/middleware/authorization.js"; +import { UUidWithPrefix } from "#components/Ausweis/types.js"; +import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js"; import { prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { z } from "zod"; @@ -21,13 +22,14 @@ export const PUT = defineApiRoute({ uid: true, aufnahme_id: true }), - uid_aufnahme: z.string().uuid() + uid_aufnahme: UUidWithPrefix }), output: z.object({ - uid: z.string().uuid(), - objekt_uid: z.string().uuid(), - aufnahme_uid: z.string().uuid(), + uid: UUidWithPrefix, + objekt_uid: UUidWithPrefix, + aufnahme_uid: UUidWithPrefix, }), + headers: authorizationHeaders, middleware: authorizationMiddleware, async fetch(input, ctx, user) { const aufnahme = await prisma.aufnahme.findUnique({