app.py

 avatar
unknown
python
2 years ago
8.9 kB
33
Indexable
import socketserver
import http.server
import json

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import DeclarativeMeta
from sqlalchemy.orm.collections import InstrumentedList
from sqlalchemy.orm.state import InstanceState

from models import train, ticket, Station, Reservations, Base
from config import *

engine = create_engine("sqlite:///DataBase.db", echo=True)
Session = sessionmaker(bind=engine)
session = Session()

Base.metadata.create_all(engine)

# Set up the server host and port
host = 'localhost'
port = 8000

def commitData():
    session.query(train).delete()
    session.query(ticket).delete()
    session.query(Station).delete()

    Chur = Station(
        station_id="1", 
        name="Chur"
    )
    Filisur = Station(
        station_id="2", 
        name="Filisur"
    )
    nunin = Station(
        station_id="3",
        name="Ňunín"
    )
    Chalen = Station(
        station_id="4",
        name="Chálen" 
    )

    BerEx = train(
        train_id="1", 
        name="Bernina Express", 
        shortDescription="From glaciers to palms", 
        longDescription=longDescriptionA, 
        imageUrl="https://images.ctfassets.net/ugsztf9t14yz/2j6PkgcjkvJzn797rIEg3s/da13f093c91608f313f97857093b56c8/Bernina_Express_beim_Lago_Bianco.jpg?fm=avif&f=center&fit=fill&q=45&w=2522",
        rating="4.3",
        ridesPerDay="1",
        stations=[Chalen], 
        changeNum="0"
    )
    BerExLM = train(
        train_id="2", 
        name="Bernina Express - Last Minute", 
        shortDescription="Benefit from attractive prices", 
        longDescription=longDescriptionB, 
        imageUrl="https://images.ctfassets.net/ugsztf9t14yz/4XXQ9l3gwicxWQT68Mzmu5/51175e8492d42f663c30885263f68b9e/Oberalppass___Glacier_Express_AG_-_Stefan_Schlumpf.jpg?fm=avif&f=center&fit=fill&q=45&h=937&w=1667",
        rating="5.0",
        ridesPerDay="1",
        stations=[Chur, nunin], 
        changeNum="0"
    )
    BerHeEx = train(
        train_id="3", 
        name="Bernina Herb Express", 
        shortDescription="Journey into the Valposchiavo world of herbs", 
        longDescription=longDescriptionC, 
        imageUrl="url",
        rating="4.0",
        ridesPerDay="1",
        stations=[Chur, Filisur], 
        changeNum="0"
    )

    reservationA = Reservations(
        name=BerEx.name, 
        ReservationID="1", 
        fName="Jan", 
        lName="Novák", 
        personalID="123456789", 
        mail="novakjan@seznam.cz"
    )
    reservationB = Reservations(
        name=BerExLM.name, 
        ReservationID="2", 
        fName="Petr", 
        lName="Pán", 
        personalID="123456781", 
        mail="petrpan@email.cz"
    )

    BerExTicket = ticket(
        ticket_id="1", 
        train_id="1", 
        departureTime=Time1A, 
        arrivalTime=Time1B, 
        capacity="140", 
        classNumber="1", 
        price="169"
    )

    session.add(BerEx)
    session.add(BerExLM)
    session.add(BerHeEx)

    session.add(BerExTicket)
    
    session.add(Chur)
    session.add(Filisur)
    session.add(nunin)
    session.add(reservationA)
    session.add(reservationB)

commitData()

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj.__class__, DeclarativeMeta):
            # Convert the SQLAlchemy object to a dictionary
            return {c.name: getattr(obj, c.name) for c in obj.__table__.columns}
        elif isinstance(obj, InstrumentedList):
            # Convert the InstrumentedList to a list of dictionaries
            return [item.__dict__ for item in obj]
        elif isinstance(obj, InstanceState):
            # Convert the InstanceState object to a dictionary or any other JSON-serializable format
            return str(obj)  # Example: Convert to a string representation
        return super().default(obj)
    
class MyRequestHandler(http.server.BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == '/api/train':
            formatted_data = []
            DBdata = session.query(train).all()

            for result in DBdata:
                formatted_data.append({
                    'train_id': result.train_id,
                    'name': result.name,
                    'shortDescription': result.shortDescription,
                    'stations': result.stations,
                })

            json_data = json.dumps(formatted_data, cls=CustomJSONEncoder)
            
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.end_headers()

            self.wfile.write(bytes(json_data, "utf-8"))  

        elif self.path == "/api/ticket":
            formatted_data_ticket = []
            DBdata_ticket = session.query(ticket).all()

            for resultTicket in DBdata_ticket:
                formatted_data_ticket.append({
                    'ticket_id': resultTicket.ticket_id,
                    'train_id': resultTicket.train_id,
                    'departureTime': resultTicket.departureTime.isoformat(),
                    'arrivalTime': resultTicket.arrivalTime.isoformat(),
                    'capacity': resultTicket.capacity,
                    'classNumber': resultTicket.classNumber,
                    'price': resultTicket.price,
                })
            
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.end_headers()

            json_data_ticket = json.dumps(formatted_data_ticket)
            self.wfile.write(bytes(json_data_ticket, "utf-8"))

        elif self.path.startswith('/api/train/'):
            train_id = self.path.split('/')[-1]
            formatted_data_trainByID = []
            train_data = session.query(train).filter_by(train_id=train_id).first()

            if train_data:
                formatted_data_trainByID.append({
                    'train_id': train_data.train_id,
                    'name': train_data.name,
                    'longDescription': train_data.longDescription,
                    'shortDescription': train_data.shortDescription,
                    'imageUrl': train_data.imageUrl,
                    'rating': train_data.rating,
                    'ridesPerDay': train_data.ridesPerDay,
                    'stations': [station.__dict__ for station in train_data.stations],
                    'changeNum': train_data.changeNum,
                })

                json_data_trainByID = json.dumps(formatted_data_trainByID, cls=CustomJSONEncoder)

                self.send_response(200)
                self.send_header("Content-Type", "application/json")
                self.end_headers()
                self.wfile.write(bytes(json_data_trainByID, "utf-8"))
            else:
                self.send_response(404)  # Return a 404 status code
                self.end_headers()
                self.wfile.write(b'404 - Train Not Found')
        elif self.path == '/api/station':
            formatted_data_station = []
            DBdata_station = session.query(Station).all()

            for stationResult in DBdata_station:
                formatted_data_station.append({
                    'station_id': stationResult.station_id,
                    'name': stationResult.name,
                })

            json_data = json.dumps(formatted_data_station, cls=CustomJSONEncoder)
            
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.end_headers()

            self.wfile.write(bytes(json_data, "utf-8"))
        elif self.path == '/api/reservations':
            formatted_data_reservations = []
            DBdata_reservations = session.query(Reservations).all()

            for reservationsResult in DBdata_reservations:
                formatted_data_reservations.append({
                    'personalID': reservationsResult.personalID,
                    'name': reservationsResult.name,
                    'fName': reservationsResult.fName,
                    'lName': reservationsResult.lName,
                    'reservationID': reservationsResult.ReservationID,
                    'mail': reservationsResult.mail,
                })

            json_data = json.dumps(formatted_data_reservations, cls=CustomJSONEncoder)
            
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.end_headers()

            self.wfile.write(bytes(json_data, "utf-8"))
        else:
            self.send_response(404)  # Return a 404 status code 
            self.end_headers()

            self.wfile.write(b'404 - Not Found')  

PORT = 8000  # Specify the port number
Handler = MyRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("Server started at port", PORT)
    httpd.serve_forever()

Editor is loading...