today's
unknown
plain_text
2 years ago
4.0 kB
1
Indexable
import { AppDataSource } from '../../data-source' import { NextFunction, Request, Response } from "express" import { Station } from "../Station/Model" import { Trainline } from './Model'; import { StationController } from "../Station/Controller"; export class TrainlineController { readonly manager = AppDataSource.manager; readonly trainlineRepo = AppDataSource.getRepository(Trainline); readonly stationRepo = AppDataSource.getRepository(Station); async addLine(request: Request, response: Response, next: NextFunction) { try { const { stations, name } = request.body; const stationsToAdd = await this.updateStations(stations); const trainline = this.trainlineRepo.create({ name: name, stations: stationsToAdd }); return this.trainlineRepo.save(trainline); } catch (err) { return response.status(400).json({ error: 'Invalid request' }); } } private async updateStations(stationsToAdd: string[]): Promise<Station[]> { const stations = [] await Promise.all(stationsToAdd.map(async (station) => { let existingStation = await this.stationRepo.findOne({ where: { stationName: station, }, }); if (!existingStation) { existingStation = this.stationRepo.create({ stationName: station, parents: [], children: [] }); await this.stationRepo.save(existingStation); } stations.push(existingStation) })); console.log(stations); for (let i = 0; i < stations.length; i++) { let existingStation = stations[i]; if (existingStation) { if (i != 0) { //concat previous station in line existingStation.parents = existingStation.parents.concat(stations[i - 1]); } await this.stationRepo.save(existingStation); } } return stations } async route(request: Request, response: Response, next: NextFunction) { try { const origin = request.query.origin as string; const destination = request.query.destination as string; const max = await this.stationRepo.count({}) const Q = [origin] //bfs let currentStation = await this.stationRepo.findOneBy({ stationName: origin }); while (Q.length >= 0) { // Q is a queue of paths // (a path is an array of stations as strings taken from origin) let curr = Q.shift() // curr is the path at top of q, q is shifted if (curr[-1] == destination) { // if the top of curr is our destination, return return response.json({ route: curr }) // bfs guarantees shortest path in unweighted undirected cyclic graph } let currentStation = await this.stationRepo.findOneBy({ stationName: curr[-1] }) // add all neighbours of curr to q const rawData = await this.stationRepo.query(`SELECT * FROM trainline_stations_station`) console.log(rawData) } } catch { return response.status(400).json({ error: 'Invalid request' }); } } async remove(request: Request, response: Response, next: NextFunction) { const name = request.params.name let trainlineToRemove = await this.trainlineRepo.findOneBy({ name: name, }); if (!trainlineToRemove) { return "this trainline not exist" } await Trainline.remove(trainlineToRemove) return "Trainline has been removed" } async removeall(request: Request, response: Response, next: NextFunction) { return Trainline.delete({}) } async all(request: Request, response: Response, next: NextFunction) { return Trainline.find() } }
Editor is loading...