diff --git a/api/getRegNummer.ts b/api/getRegNummer.ts index a0b35dc..58f34b9 100644 --- a/api/getRegNummer.ts +++ b/api/getRegNummer.ts @@ -3,42 +3,54 @@ import { sanitize } from "isomorphic-dompurify"; import { VercelRequest, VercelResponse } from "@vercel/node"; import { IStatensVegvesenFullData } from "../scripts/types/typeDefinitions"; -export default async function getRegNummer( +// https://autosys-kjoretoy-api.atlas.vegvesen.no/api-ui/index-enkeltoppslag.html + +export default async function handler( req: VercelRequest, res: VercelResponse ): Promise { const { regNummer = "" } = req.query; if (regNummer === undefined) { - res.send({ error: "Mangler regNummer parameter" }); + res.status(400).json({ error: "Mangler regNummer parameter" }); return; } - const urlToFetch = `https://www.vegvesen.no/ws/no/vegvesen/kjoretoy/kjoretoyoppslag/v1/kjennemerkeoppslag/kjoretoy/${regNummer}`; + const urlToFetch = `https://www.vegvesen.no/ws/no/vegvesen/kjoretoy/felles/datautlevering/enkeltoppslag/kjoretoydata?kjennemerke=${regNummer}`; try { - const response = await axios.get(urlToFetch); + const response = await axios.get(urlToFetch, { + headers: { + "SVV-Authorization": `Apikey ${process.env.SVV_API_KEY}`, + "X-Client-Identifier": "my-app", + }, + }); if (response.status === 200) { const { - kjennemerke, - registrering: { forstegangsregistrering, forstegangsregistreringEier }, - periodiskKjoretoykontroll: { sistKontrollert }, + kjoretoydataListe: [ + { + kjoretoyId: { kjennemerke }, + forstegangsregistrering: { + registrertForstegangNorgeDato: forstegangsregistrering, + }, + periodiskKjoretoyKontroll: { sistGodkjent: sistKontrollert }, + }, + ], } = response.data; const sanitizedData = { kjennemerke: sanitize(kjennemerke), - forstegangsregistreringEier: sanitize(forstegangsregistreringEier), - forstegangsregistrering: sanitize(forstegangsregistrering), - sistKontrollert: sanitize(sistKontrollert), + forstegangsregistrering: sanitize(forstegangsregistrering.toString()), + sistKontrollert: sanitize(sistKontrollert.toString()), }; - res.send(sanitizedData); + res.status(200).json(sanitizedData); } else { - res.send({ error: "Feil under henting av data" }); + res.status(500).json({ error: "Feil under henting av data " }); } } catch (error) { console.error(error); - res.send({ error: "Feil under henting av data" }); + res.status(500).json({ error: "Feil under henting av data" }); } } diff --git a/scripts/types/typeDefinitions.ts b/scripts/types/typeDefinitions.ts index 20d0ac9..a698a34 100644 --- a/scripts/types/typeDefinitions.ts +++ b/scripts/types/typeDefinitions.ts @@ -1,76 +1,286 @@ /** - * Type definition for data returned from API. - * Returns an object with strings. - */ - -export interface IStatensVegvesenBilData { - // Will return error message if the car was not found - melding: string; - /** - * Registration number for personalised number plate) - * @see https://www.vegvesen.no/en/vehicles/own-and-maintain/number-plates/personalised-number-plates - */ + + Type definition for data returned from API. + Returns an object with strings and optional values. + */ + +export interface IStatensVegvesenFullData { + kjoretoydataListe: KjoretoydataListe[]; +} + +export interface KjoretoydataListe { + kjoretoyId: KjoretoyID; + forstegangsregistrering: Forstegangsregistrering; + kjennemerke: Kjennemerke[]; + registrering: Registrering; + godkjenning: Godkjenning; + periodiskKjoretoyKontroll: PeriodiskKjoretoyKontroll; +} + +export interface Forstegangsregistrering { + registrertForstegangNorgeDato: Date; +} + +export interface Godkjenning { + forstegangsGodkjenning: ForstegangsGodkjenning; + kjoretoymerknad: Kjoretoymerknad[]; + registreringsbegrensninger: Registreringsbegrensninger; + tekniskGodkjenning: TekniskGodkjenning; + tilleggsgodkjenninger: string[]; +} + +export interface ForstegangsGodkjenning { + forstegangRegistrertDato: Date; + godkjenningsId: string; + godkjenningsundertype: KjoringensArt; + gyldigFraDato: Date; + gyldigFraDatoTid: Date; + kvalitetskodeForstegangRegDato: KjoringensArt; + unntak: string[]; +} + +export interface KjoringensArt { + kodeNavn?: string; + kodeVerdi: string; + tidligereKodeVerdi: string[]; + kodeBeskrivelse?: string; + kodeTypeId?: string; +} + +export interface Kjoretoymerknad { + merknad: string; + merknadtypeKode: string; +} + +export interface Registreringsbegrensninger { + registreringsbegrensning: string[]; +} + +export interface TekniskGodkjenning { + godkjenningsId: string; + godkjenningsundertype: KjoringensArt; + gyldigFraDato: Date; + gyldigFraDatoTid: Date; + kjoretoyklassifisering: Kjoretoyklassifisering; + krav: Krav[]; + tekniskeData: TekniskeData; + unntak: string[]; +} + +export interface Kjoretoyklassifisering { + beskrivelse: string; + efTypegodkjenning: EfTypegodkjenning; + kjoretoyAvgiftsKode: KjoringensArt; + nasjonalGodkjenning: NasjonalGodkjenning; + spesielleKjennetegn: string; + tekniskKode: KjoringensArt; + tekniskUnderkode: TekniskUnderkode; + iSamsvarMedTypegodkjenning: boolean; +} + +export interface EfTypegodkjenning { + typegodkjenningNrTekst: string; + typegodkjenningnummer: Typegodkjenningnummer; + variant: string; +} + +export interface Typegodkjenningnummer { + direktiv: string; + land: string; + serie: string; + utvidelse: string; +} + +export interface NasjonalGodkjenning { + nasjonaltGodkjenningsAr: string; + nasjonaltGodkjenningsHovednummer: string; + nasjonaltGodkjenningsUndernummer: string; +} + +export interface TekniskUnderkode { + kodeVerdi: string; + tidligereKodeVerdi: string[]; +} + +export interface Krav { + kravomrade: KjoringensArt; + kravoppfyllelse: KjoringensArt; +} + +export interface TekniskeData { + akslinger: Akslinger; + bremser: Bremser; + dekkOgFelg: DekkOgFelg; + dimensjoner: Dimensjoner; + generelt: Generelt; + karosseriOgLasteplan: KarosseriOgLasteplan; + miljodata: Miljodata; + motorOgDrivverk: MotorOgDrivverk; + ovrigeTekniskeData: string[]; + persontall: Persontall; + tilhengerkopling: Tilhengerkopling; + vekter: Vekter; +} + +export interface Akslinger { + akselGruppe: AkselGruppe[]; + antallAksler: number; +} + +export interface AkselGruppe { + akselListe: AkselListe; + egenvektAkselGruppe: number; + id: number; + plasseringAkselGruppe: string; + tekniskTillattAkselGruppeLast: number; +} + +export interface AkselListe { + aksel: Aksel[]; +} + +export interface Aksel { + avstandTilNesteAksling?: number; + drivAksel: boolean; + egenvektAksel: number; + id: number; + plasseringAksel: string; + sporvidde: number; + tekniskTillattAkselLast: number; +} + +export interface Bremser { + tilhengerBremseforbindelse: string[]; +} + +export interface DekkOgFelg { + akselDekkOgFelgKombinasjon: AkselDekkOgFelgKombinasjon[]; +} + +export interface AkselDekkOgFelgKombinasjon { + akselDekkOgFelg: AkselDekkOgFelg[]; +} + +export interface AkselDekkOgFelg { + akselId: number; + belastningskodeDekk: string; + dekkdimensjon: string; + felgdimensjon: string; + hastighetskodeDekk: string; + innpress: string; +} + +export interface Dimensjoner { + bredde: number; + lengde: number; +} + +export interface Generelt { + fabrikant: string[]; + handelsbetegnelse: string[]; + merke: Merke[]; + tekniskKode: KjoringensArt; + typebetegnelse: string; +} + +export interface Merke { + merke: string; + merkeKode: string; +} + +export interface KarosseriOgLasteplan { + antallDorer: string[]; + dorUtforming: string[]; + kjennemerketypeBak: KjoringensArt; + kjennemerkestorrelseBak: KjoringensArt; + kjennemerketypeForan: KjoringensArt; + kjennemerkestorrelseForan: KjoringensArt; + kjoringSide: string; + oppbygningUnderstellsnummer: string; + plasseringFabrikasjonsplate: KjoringensArt[]; + plasseringUnderstellsnummer: KjoringensArt[]; + rFarge: KjoringensArt[]; +} + +export interface Miljodata { + miljoOgdrivstoffGruppe: MiljoOgdrivstoffGruppe[]; + okoInnovasjon: boolean; +} + +export interface MiljoOgdrivstoffGruppe { + drivstoffKodeMiljodata: KjoringensArt; + lyd: Lyd; +} + +export interface Lyd { + standstoy: number; + stoyMalingOppgittAv: KjoringensArt; + vedAntallOmdreininger: number; +} + +export interface MotorOgDrivverk { + girkassetype: KjoringensArt; + girutvekslingPrGir: string[]; + hybridKategori: KjoringensArt; + maksimumHastighet: number[]; + maksimumHastighetMalt: string[]; + motor: Motor[]; +} + +export interface Motor { + antallSylindre: number; + drivstoff: Drivstoff[]; + motorKode: string; + slagvolum: number; +} + +export interface Drivstoff { + drivstoffKode: KjoringensArt; + maksNettoEffekt: number; +} + +export interface Persontall { + sitteplasserForan: number; + sitteplasserTotalt: number; +} + +export interface Tilhengerkopling { + kopling: string[]; +} + +export interface Vekter { + egenvekt: number; + egenvektMinimum: number; + nyttelast: number; + tillattTaklast: number; + tillattTilhengervektMedBrems: number; + tillattTilhengervektUtenBrems: number; + tillattTotalvekt: number; + tillattVertikalKoplingslast: number; + tillattVogntogvekt: number; + vogntogvektAvhBremsesystem: string[]; +} + +export interface Kjennemerke { + fomTidspunkt: Date; kjennemerke: string; - // Details about when car was registered for the first time - forstegangsregistrering: string; - // Details about when car was registered on owner - forstegangsregistreringEier: string; - // Last time the car had a mandatory roadworthiness test - sistKontrollert: string; + kjennemerkekategori: string; + kjennemerketype: KjoringensArt; } -export interface IStatensVegvesenFullData { +export interface KjoretoyID { kjennemerke: string; understellsnummer: string; - kuid: string; - personligKjennemerke: string | null; - registrering: { - registreringsstatus: string; - registreringsstatusDato: string; - forstegangsregistrering: string; - forstegangsregistreringNorge: string; - forstegangsregistreringEier: string; - avregistrertHosBilforhandler: boolean; - kjennemerkefarge: string; - }; - periodiskKjoretoykontroll: { sistKontrollert: string; nesteKontroll: string }; - tekniskKjoretoy: { - handelsbetegnelse: string; - typebetegnelse: string; - merke: string; - kjoretoyAvgiftskode: string; - tekniskKode: string; - miljoEuroklasse: null; - sitteplasser: number; - staplasser: null; - oppbygd: boolean; - lengde: number; - bredde: number; - hoyde: null; - lastegenskaper: { - egenvekt: number; - tillattTotalvekt: number; - nyttelast: number; - tillattTilhengervektMedBrems: number; - tillattTilhengervektUtenBrems: number; - tillattVertikalKoplingslast: number; - tillattVogntogvekt: number; - tillattTaklast: number; - }; - maksimumHastighet: number; - hybridElektriskKjoretoy: null | boolean; - girkasse: string; - hybridkategori: string; - motorer: string; - karosseri: { farge: string; fargekode: string }; - forbrukOgUtslipp: Array; - aksler: { - drivaksler: number; - dekkOgFelger: Array; - aksler: Array; - }; - unntak: Array; - }; - bruktimport: null | boolean; - vektarsavgiftOppgittGrunnlag: null; +} + +export interface PeriodiskKjoretoyKontroll { + kontrollfrist: Date; + sistGodkjent: Date; +} + +export interface Registrering { + fomTidspunkt: Date; + kjoringensArt: KjoringensArt; + registreringsstatus: KjoringensArt; + registrertForstegangPaEierskap: Date; }