From 7325b6f82dd445e9dfb6265241626b4257fda5a4 Mon Sep 17 00:00:00 2001
From: Navin Chandra <nc01009@surrey.ac.uk>
Date: Tue, 30 Apr 2024 13:27:12 +0530
Subject: [PATCH] code changes modifed into microservices

---
 crud.py                                       |  36 -------
 database.py                                   |  13 ---
 main.py                                       |  53 ----------
 .../__pycache__/main.cpython-39.pyc           | Bin 0 -> 2691 bytes
 microservices/bikes_service/bikes.db          | Bin 0 -> 8192 bytes
 microservices/bikes_service/bikes.py          |  90 ----------------
 microservices/bikes_service/main.py           |  99 ++++++++++++++++++
 .../__pycache__/main.cpython-39.pyc           | Bin 0 -> 2781 bytes
 microservices/reviews_service/main.py         |  95 +++++++++++++++++
 microservices/reviews_service/review.db       | Bin 0 -> 8192 bytes
 microservices/reviews_service/reviews.py      |  85 ---------------
 .../__pycache__/main.cpython-39.pyc           | Bin 0 -> 3974 bytes
 microservices/users_service/bikes.db          | Bin 8192 -> 8192 bytes
 microservices/users_service/main.py           |  67 ++++++++++--
 microservices/users_service/users.py          |   0
 models.py                                     |  26 -----
 schemas.py                                    |  37 -------
 sql_app.db                                    |   0
 18 files changed, 250 insertions(+), 351 deletions(-)
 delete mode 100644 crud.py
 delete mode 100644 database.py
 delete mode 100644 main.py
 create mode 100644 microservices/bikes_service/__pycache__/main.cpython-39.pyc
 delete mode 100644 microservices/bikes_service/bikes.py
 create mode 100644 microservices/reviews_service/__pycache__/main.cpython-39.pyc
 delete mode 100644 microservices/reviews_service/reviews.py
 create mode 100644 microservices/users_service/__pycache__/main.cpython-39.pyc
 delete mode 100644 microservices/users_service/users.py
 delete mode 100644 models.py
 delete mode 100644 schemas.py
 delete mode 100644 sql_app.db

diff --git a/crud.py b/crud.py
deleted file mode 100644
index 7f64109..0000000
--- a/crud.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from sqlalchemy.orm import Session
-
-from . import models, schemas
-
-
-def get_user(db: Session, user_id: int):
-    return db.query(models.User).filter(models.User.id == user_id).first()
-
-
-def get_user_by_email(db: Session, email: str):
-    return db.query(models.User).filter(models.User.email == email).first()
-
-
-def get_users(db: Session, skip: int = 0, limit: int = 100):
-    return db.query(models.User).offset(skip).limit(limit).all()
-
-
-def create_user(db: Session, user: schemas.UserCreate):
-    fake_hashed_password = user.password + "notreallyhashed"
-    db_user = models.User(email=user.email, hashed_password=fake_hashed_password)
-    db.add(db_user)
-    db.commit()
-    db.refresh(db_user)
-    return db_user
-
-
-def get_items(db: Session, skip: int = 0, limit: int = 100):
-    return db.query(models.Item).offset(skip).limit(limit).all()
-
-
-def create_user_item(db: Session, item: schemas.ItemCreate, user_id: int):
-    db_item = models.Item(**item.dict(), owner_id=user_id)
-    db.add(db_item)
-    db.commit()
-    db.refresh(db_item)
-    return db_item
\ No newline at end of file
diff --git a/database.py b/database.py
deleted file mode 100644
index 62838e6..0000000
--- a/database.py
+++ /dev/null
@@ -1,13 +0,0 @@
-from sqlalchemy import create_engine
-from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import sessionmaker
-
-SQLALCHEMY_DATABASE_URL = "sqlite:///./sql_app.db"
-# SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"
-
-engine = create_engine(
-    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
-)
-SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
-
-Base = declarative_base()
\ No newline at end of file
diff --git a/main.py b/main.py
deleted file mode 100644
index 8a2b9eb..0000000
--- a/main.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from fastapi import Depends, FastAPI, HTTPException
-from sqlalchemy.orm import Session
-
-from curd import crud, models, schemas
-from database import SessionLocal, engine
-
-models.Base.metadata.create_all(bind=engine)
-
-app = FastAPI()
-
-
-# Dependency
-def get_db():
-    db = SessionLocal()
-    try:
-        yield db
-    finally:
-        db.close()
-
-
-@app.post("/users/", response_model=schemas.User)
-def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
-    db_user = crud.get_user_by_email(db, email=user.email)
-    if db_user:
-        raise HTTPException(status_code=400, detail="Email already registered")
-    return crud.create_user(db=db, user=user)
-
-
-@app.get("/users/", response_model=list[schemas.User])
-def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
-    users = crud.get_users(db, skip=skip, limit=limit)
-    return users
-
-
-@app.get("/users/{user_id}", response_model=schemas.User)
-def read_user(user_id: int, db: Session = Depends(get_db)):
-    db_user = crud.get_user(db, user_id=user_id)
-    if db_user is None:
-        raise HTTPException(status_code=404, detail="User not found")
-    return db_user
-
-
-@app.post("/users/{user_id}/items/", response_model=schemas.Item)
-def create_item_for_user(
-    user_id: int, item: schemas.ItemCreate, db: Session = Depends(get_db)
-):
-    return crud.create_user_item(db=db, item=item, user_id=user_id)
-
-
-@app.get("/items/", response_model=list[schemas.Item])
-def read_items(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
-    items = crud.get_items(db, skip=skip, limit=limit)
-    return items
\ No newline at end of file
diff --git a/microservices/bikes_service/__pycache__/main.cpython-39.pyc b/microservices/bikes_service/__pycache__/main.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..15982096213a2d18b2dddc1f6f3da28cf06c055b
GIT binary patch
literal 2691
zcmZuy&2!U66xT|!B!9#hLI~;SPH8(a<H7V}+UX1h5+Wc&Fqy<q&_yG(>qJzR%t{85
zhD%|3<J2BGB-2w){UbX4Cv@$p|3D9Ihv|DOM@fuj@6+zSebW2*{hqw3sfq&E&%a*m
z{Zv+zKXGyN(qVBGM)EfZrZ5sJed3V5>Zk<QYN+*fN0)OgEcFe?kaImW9g~w6ieqte
zx6Dd=#HsMgZgo#_s=T^eW5ymK3hYenDMY!UFq2s?6=re$h33?`_2>jE^E#`%QbAT<
z6INqWFZCD1X@Kq|=nP(;Q&7+9?8Hk2G^eDdF|wLwC&B6zo0e9mK{vw+9h^D+T4gir
zjMSdt*6u88>=B+@&9bv{|18tjmFC=E5WCV;GxNHaqzkLd+0@N$ch!F8^FbQKQIlll
zMK9sEW5z>R=qo{zcDAjD!S_75z#e+DL{Tafu4`-dLf59<g~b({E?=jeJ6&quUtaI7
z(?vW?=jAaxipFlh=yIoP->}!{>e}+{g|!Ftmi?er9O~m6Y1h8rJ={xDFC8Xhn_=vG
z=<3+EA4e>hus;xi&)oqR?q)m`bjiL3FJGDe>|%?4-aLF&2<dS9UJ#``@*=QcUdrhb
zgm`%7sCpCf5{oVAgp8qC@iDbWFAWw~VI<c<aK#}^an!pC*SOBerTngr?%L?C!@UIh
z(r9gr?&c)`6cn(W>6qTEB=eOSd5SXYAS+q9NJLgY9(y)3G01FsLR_7uky)-Ad42A>
zS;ckXb;A(nHP?MS^um!wOHz@Ya9uBoVkj1rC4n=gUKo4nz9LRT;8Of^tGyZbc{}o+
z1W|h__J@5QrAhlKf0%NAv%MkW;ouwBf7<Q`zK9bpo<P}>w#1z~TDH;A3xh3Tz+>OX
z#MVJnh;`&Ab=zic*lrT1E_gBkw>XBt!+pRsKGX*s7Z=X4cl-_``4U8`>=H(Hlt(HI
z4TcV*1jB$~!mxVg9(0Ygyjwxe?<i0jwX^+O0q5n;y1mv#$ln?9p-|0BM_M#5U5g%+
zu0@N|wdnEE!J$d`Y|#m&YtrIP_ZC*}+Us=wN{f#FoAS_pH8cF7NMezh{2BL$DHkTh
zFDw+$L=}N~5mgj56jLBF9UP6oGVb?-RGh*6qS9gpPgH%ufj};%x(OSyQi^Jn8l?6{
z{ZF?nBCvwTID=(C&d4(0Q}Z%lbA_3@r#vqbJ-u$P*w?!BJiWel=XRdqrY7dVNW25W
zv3fl9H@y&=m{XD{8h5b*9x~}*@-<i_2r5NIG>H#jw%r(E=m)fh_VpZ~V~*y>(4)d>
z{I*E9FTmsgJv|~ZlDkfJfc`^8oKH2TGL7l4)E{9Fa8v4Re=;E)`rS=?%`TefxAaQz
z3uI`!z6kzMpd0PQ!-zpIujWW{eE_&)FrIor*wo)jMjUa0>D^Zag`1c~F;=&7k(A4z
zP2>kvtxJB@h&YE9AA#^O=7S682oM?nS1=jHPk=oH*h7Fl1lU7>Jp|Z89$7m|&pO5*
z%meV}j{>@PSF!hwQ)k`oQpp|)={R6eK0jblzABiMFN?<>r`5=E618&G1bU&Oc-&hh
zk{WRqk|6Ump5E$kfZr8~x*KrlfEGrB)ZeK8>SX}m$FP44Ur37rUkJ@He5tz{_8>%6
zfO*tA+vk>m9+196a=eYE%<S_d@izGOoJ15fN1k#<lc5itH|Y(-aO)_F#Jlin@g9l~
zQH&v{n%m3J?ty;9C&Z5U6xPi-$Lv9-y+I%lF%pW7HP~WaltRzP2s0zy8U)dXD8a%p
zlgD9@@-H&Y8w@fNdk**0+>L_hxkJd^OdrJXHNvivX&XG1EY39eqD$On+F+Q<<Yqt-
z3{|>yBn%ml>|WNT{Bw61Q=g#s(6-=bsfGp(LaWp)y-}-?##Dn;47gi0a;k2T{{d2&
Bi=zMl

literal 0
HcmV?d00001

diff --git a/microservices/bikes_service/bikes.db b/microservices/bikes_service/bikes.db
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..352ef9786f33f0f7db1862f23eac8f9f8674509c 100644
GIT binary patch
literal 8192
zcmeI#&r8EF6bJBR2!fyp9txh`af2cL_y_E^Aj2wJdvK?cwHXVx%}BF@SMfjf=3il2
zoRuMX@*>|y)AC+lN%OhAhx<r7MGIp~>F9zTGS1m05o3(|)$?l;O}?{9{Ikh_3(ig!
z@B6-sAG|StAs_$&2tWV=5P$##AOHafKmY=NCGc|0cY`3{uSZVK3pLVDs%~$+aV)|_
zP!f(JL2Zfpd-NG|-<Rr~rniZ>5;5Jy)0;4!(Y2TjznV&utAY~om~^$;Nw==IiiOFf
z)27-gXQs;a5A~JRnMzm6rc1N7G!bLJdDK5U9n$%r+p3VYOG~LMrz%<bFLLRJ`H4SN
u*Yo}LQrFJd=k_PsGYp#9+z<T-2tWV=5P$##AOHafKmY;|fB*#kvA_pMFII2>

literal 0
HcmV?d00001

diff --git a/microservices/bikes_service/bikes.py b/microservices/bikes_service/bikes.py
deleted file mode 100644
index 5b09376..0000000
--- a/microservices/bikes_service/bikes.py
+++ /dev/null
@@ -1,90 +0,0 @@
-from fastapi import FastAPI, HTTPException
-from pydantic import BaseModel
-from typing import List
-import sqlite3
-
-app = FastAPI()
-
-# SQLite connection
-conn = sqlite3.connect('bikes.db')
-cursor = conn.cursor()
-
-# Create the Bikes table if it doesn't exist
-cursor.execute('''
-    CREATE TABLE IF NOT EXISTS Bikes (
-        bike_id INTEGER PRIMARY KEY,
-        model TEXT,
-        status TEXT,
-        location TEXT,
-        condition TEXT,
-        price_per_hour DECIMAL(10, 2),
-        last_maintenance_date DATE,
-        maintenance_history TEXT
-    )
-''')
-conn.commit()
-
-
-# Bike model
-class Bike(BaseModel):
-    model: str
-    status: str
-    location: str
-    condition: str
-    price_per_hour: float
-    last_maintenance_date: str
-    maintenance_history: str
-    
-
-
-# Routes
-@app.post("/bikes/", response_model=Bike)
-async def create_bike(bike: Bike):
-    cursor.execute('''
-        INSERT INTO Bikes 
-        (model, status, location, condition, price_per_hour, last_maintenance_date, maintenance_history) 
-        VALUES (?, ?, ?, ?, ?, ?, ?)
-    ''', (
-        bike.model, bike.status, bike.location, bike.condition,
-        bike.price_per_hour, bike.last_maintenance_date, bike.maintenance_history
-    ))
-    conn.commit()
-    return bike
-
-
-@app.get("/bikes/", response_model=List[Bike])
-async def read_bikes():
-    cursor.execute('SELECT * FROM Bikes')
-    bikes = cursor.fetchall()
-    return bikes
-
-
-@app.get("/bikes/{bike_id}", response_model=Bike)
-async def read_bike(bike_id: int):
-    cursor.execute('SELECT * FROM Bikes WHERE bike_id = ?', (bike_id,))
-    bike = cursor.fetchone()
-    if bike is None:
-        raise HTTPException(status_code=404, detail="Bike not found")
-    return bike
-
-
-@app.put("/bikes/{bike_id}", response_model=Bike)
-async def update_bike(bike_id: int, bike: Bike):
-    cursor.execute('''
-        UPDATE Bikes 
-        SET model = ?, status = ?, location = ?, condition = ?, 
-        price_per_hour = ?, last_maintenance_date = ?, maintenance_history = ?
-        WHERE bike_id = ?
-    ''', (
-        bike.model, bike.status, bike.location, bike.condition,
-        bike.price_per_hour, bike.last_maintenance_date, bike.maintenance_history, bike_id
-    ))
-    conn.commit()
-    return bike
-
-
-@app.delete("/bikes/{bike_id}")
-async def delete_bike(bike_id: int):
-    cursor.execute('DELETE FROM Bikes WHERE bike_id = ?', (bike_id,))
-    conn.commit()
-    return {"message": "Bike deleted successfully"}
diff --git a/microservices/bikes_service/main.py b/microservices/bikes_service/main.py
index e69de29..22834e6 100644
--- a/microservices/bikes_service/main.py
+++ b/microservices/bikes_service/main.py
@@ -0,0 +1,99 @@
+from fastapi import FastAPI, HTTPException
+from pydantic import BaseModel
+from typing import List
+import sqlite3
+
+app = FastAPI()
+
+# SQLite connection
+conn = sqlite3.connect('bikes.db')
+cursor = conn.cursor()
+
+# Create the Bikes table if it doesn't exist
+cursor.execute('''
+    CREATE TABLE IF NOT EXISTS Bikes (
+        bike_id INTEGER PRIMARY KEY,
+        model TEXT,
+        status TEXT,
+        location TEXT,
+        condition TEXT,
+        price_per_hour DECIMAL(10, 2),
+        last_maintenance_date DATE,
+        maintenance_history TEXT
+    )
+''')
+conn.commit()
+
+
+# Bike model
+class Bike(BaseModel):
+    model: str
+    status: str
+    location: str
+    condition: str
+    price_per_hour: float
+    last_maintenance_date: str
+    maintenance_history: str
+    
+
+
+# Routes
+@app.post("/bikes/", response_model=Bike)
+async def create_bike(bike: Bike):
+    cursor.execute('''
+        INSERT INTO Bikes 
+        (model, status, location, condition, price_per_hour, last_maintenance_date, maintenance_history) 
+        VALUES (?, ?, ?, ?, ?, ?, ?)
+    ''', (
+        bike.model, bike.status, bike.location, bike.condition,
+        bike.price_per_hour, bike.last_maintenance_date, bike.maintenance_history
+    ))
+    conn.commit()
+    return bike
+
+
+@app.get("/bikes/", response_model=List[Bike])
+async def read_bikes():
+    cursor.execute('SELECT * FROM Bikes')
+    bikes = cursor.fetchall()
+    bike_objects = []
+    for bike in bikes:
+        bike_obj = Bike(
+            brand=bike[0],
+            model=bike[1],
+            year=bike[2],
+            price=bike[3]
+        )
+        bike_objects.append(bike_obj)
+    return bike_objects
+
+
+@app.get("/bikes/{bike_id}", response_model=Bike)
+async def read_bike(bike_id: int):
+    cursor.execute('SELECT * FROM Bikes WHERE bike_id = ?', (bike_id,))
+    bike = cursor.fetchone()
+    if bike is None:
+        raise HTTPException(status_code=404, detail="Bike not found")
+    return bike
+
+
+@app.put("/bikes/{bike_id}", response_model=Bike)
+async def update_bike(bike_id: int, bike: Bike):
+    cursor.execute('''
+        UPDATE Bikes 
+        SET model = ?, status = ?, location = ?, condition = ?, 
+        price_per_hour = ?, last_maintenance_date = ?, maintenance_history = ?
+        WHERE bike_id = ?
+    ''', (
+        bike.model, bike.status, bike.location, bike.condition,
+        bike.price_per_hour, bike.last_maintenance_date, bike.maintenance_history, bike_id
+    ))
+    conn.commit()
+    return bike
+
+
+@app.delete("/bikes/{bike_id}")
+async def delete_bike(bike_id: int):
+    cursor.execute('DELETE FROM Bikes WHERE bike_id = ?', (bike_id,))
+    conn.commit()
+    return {"message": "Bike deleted successfully"}
diff --git a/microservices/reviews_service/__pycache__/main.cpython-39.pyc b/microservices/reviews_service/__pycache__/main.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8404ca9f3a0c6afcbf3856038ea1b197ba97a44b
GIT binary patch
literal 2781
zcma)8PjlNu6yKF(Np|eSP18SV2S&g^<4&lVDFXvjXp=^1JtR)XaiA5$XcX-_Rj?&@
zS8f~ExzHZC^v1D=WH{w>@GW%Z)GxpR7~t(nR{pe|LGnKBzV}wz_uJolYp+r%A-F#N
z^^?x$(ED8sj$axKZb9RJfFOwAF6v<i_Y_CLVytx4p5|z>uXYPP-O*)V>l%(h@iXL@
z)YvbQ!U1+lw6s5QfSd_Bv0o<o0mcY4l>>y)9YhRbK1al)+B4Oeq~^{PDbh(&dZB=v
zc!^1wRGw?kuu}!w8L;Veaux|YnIu!s5m=_BrJBt;OU}ToX>wN1ngQE6lH0&%=A}Z;
zk@M1eo|^j?Nc8~Ibk+rOQR*)eZ3ES2UqS4srX<F)$K!?dMpC)kZm-)<eA<tLD6HY6
zxae`Z8WGxsfwmIxxH&8``Y51}uaPb9ON>y-g6nq6UTE7^dtq_Kwi?S;bFFRJ_Zl1R
z4XY)+xiu#pg>yRJ4T#lfw(UE1%UW+WRu@|Lt#9o6^SRrAQ<ga$DYt?j>1#^n#X-0&
z-ge~ZN4*{mW2<f7JEqM(O}v;|OR(a0W7R&Iv%J=_8+V#w8P;6(`I^<Tm+h9_ylrn-
zo3JFFTi!A;TjGg{i?D1yH@3(SYb9U6fBaHma0?p$3<O0ECdg4X5ml*1@Qw7TWKR{I
z1<-5Rvv30u9X8cS^c3;L$RbFL?7NAc0+kpUILX8@JeoB<F<m$Gden83lI!*&GU$qa
z*>xWdyl!SugD_5}T-OW3C<fr8kb{rPV|IwxG%Q?-KUeDyq8_b>-lHI_FGc=9>;|tt
zrdu)fAJn&5H0Xcf`j6|qz-JNQ`Y7-zucr&*Zl<XBydb>R-(@<y_#FX_Nb3?dvs>zi
z#qqRy4Lg&J@;)qziU4T$5JT9Kf<BNnzeL}J_8T-l4<bhUnBWoGQJ|^NG-w5AdZ%yz
zH6b?kO_9+f1RyKT;nSR_jpl~kY76$Q<z&x|W3tR!*(S_e=_bru*(QKOF3%ODtXcWY
zZx>cJfpT*<=dGh(O_~pjiS7>=k62>RC)6Lrlo=2M6A`hZ5CSGP0V2`-C=9_L@*#-X
zjL_%1#Lfzjiq9x~+fCQ;5vX_>1XA?E%)iRtnqgvg8OA60Dhg;0U>gQ0fTH+8PdPw)
zXdCSTpiAh7Pxq8q9VtYaMIcovH7N^H>QL~E7ll1_g!i?PD&Fz%(g*|4W^=f>VXxS?
z+g8Tr{|ThE+*(^5ZwC{*{YnZ&^hBP$5&_f-Z^aEv7r=vE1mTz+8v75tZddXx(Y=13
zhNPxBM#fjcI#CqeXlsZ1F=yw*w9=9CH0EW1oMede>)^~Ufk29&wgyeX`uP4!H_Dj3
z2iD<CPV}eQs{^tJ49`k36vh)I7r}}!CCRTrXH4=AmXuES36G%83=q2-s|0q3XfKqX
zKnLg-n!{R#{?!wJTHoD;k~k(V6!NdEo53#t@UYsFI9N~{tWGolkd$PCL!B6K*N1#`
zbV6e<=+?B?;Eh7c#LgTl>;rg62v5TX1uKVb37lj(K+2>n2Y`|wFZ&RLFJd2GqA#-I
zG!7V&9YeBXNOla#j(7AC>gXrZUEl!e{&Sv}o9p7>7*p#gUpMTWqXLecr|BR&qNHJb
zG|54>kMcwUMgEyLAS`X{JOm;`JdI6d&=+sXNVN)Xd=i96<0{twfkZYTk*|Q}1W80%
z<Rp0)2B%1(?5m>g32Foa46Ql5vIHp!7#z>BH&G%ndX#f-n+`8$w19$4V@fPO@S)oC
z&Y;`fJx&ES3kzT(71;YioUT;q{4B)p!Gnu~AteB-L9aIJ7#;XG<Mjh3wp}vHG5fp3
z3u8EGM5Kux@Alyj11rG5G5Eu75Yy|43Rx|V#xR5oP8X6_fOJXXTZz_>;H(q%Fj2Q@
zEEAJW!BCPfQTu~ff}8-;MX+*N#{!Wd$+~OaNRQaB#TIZu-6}4_Z7RA7bwDkZO|4oi
R<7&BzOI3K9WjtLm@qgM3mJI*^

literal 0
HcmV?d00001

diff --git a/microservices/reviews_service/main.py b/microservices/reviews_service/main.py
index e69de29..fef99cc 100644
--- a/microservices/reviews_service/main.py
+++ b/microservices/reviews_service/main.py
@@ -0,0 +1,95 @@
+from fastapi import FastAPI, HTTPException
+from pydantic import BaseModel
+from typing import List
+import sqlite3
+
+app = FastAPI()
+
+# SQLite connection
+conn = sqlite3.connect('review.db')
+cursor = conn.cursor()
+
+# Create the Reviews table if it doesn't exist
+cursor.execute('''
+    CREATE TABLE IF NOT EXISTS Reviews (
+        review_id INTEGER PRIMARY KEY,
+        user_id INT,
+        bike_id INT,
+        rating INT,
+        comment TEXT,
+        review_date DATETIME,
+        FOREIGN KEY (user_id) REFERENCES Users(user_id),
+        FOREIGN KEY (bike_id) REFERENCES Bikes(bike_id)
+    )
+''')
+conn.commit()
+
+
+# Review model
+class Review(BaseModel):
+    user_id: int
+    bike_id: int
+    rating: int
+    comment: str
+    review_date: str
+
+
+# Routes
+@app.post("/reviews/", response_model=Review)
+async def create_review(review: Review):
+    cursor.execute('''
+        INSERT INTO Reviews 
+        (user_id, bike_id, rating, comment, review_date) 
+        VALUES (?, ?, ?, ?, ?)
+    ''', (
+        review.user_id, review.bike_id, review.rating, review.comment, review.review_date
+    ))
+    conn.commit()
+    return review
+
+
+@app.get("/reviews/", response_model=List[Review])
+async def read_reviews():
+    cursor.execute('SELECT user_id, bike_id, rating, comment, review_date FROM Reviews')
+    reviews = cursor.fetchall()
+    review_objects = []
+    for review in reviews:
+        review_obj = Review(
+            user_id=review[0],
+            bike_id=review[1],
+            rating=review[2],
+            comment=review[3],
+            review_date=review[4]
+        )
+        review_objects.append(review_obj)
+    return review_objects
+
+
+@app.get("/reviews/{review_id}", response_model=Review)
+async def read_review(review_id: int):
+    cursor.execute('SELECT * FROM Reviews WHERE review_id = ?', (review_id,))
+    review = cursor.fetchone()
+    if review is None:
+        raise HTTPException(status_code=404, detail="Review not found")
+    return review
+
+
+@app.put("/reviews/{review_id}", response_model=Review)
+async def update_review(review_id: int, review: Review):
+    cursor.execute('''
+        UPDATE Reviews 
+        SET user_id = ?, bike_id = ?, rating = ?, comment = ?, review_date = ?
+        WHERE review_id = ?
+    ''', (
+        review.user_id, review.bike_id, review.rating, review.comment,
+        review.review_date, review_id
+    ))
+    conn.commit()
+    return review
+
+
+@app.delete("/reviews/{review_id}")
+async def delete_review(review_id: int):
+    cursor.execute('DELETE FROM Reviews WHERE review_id = ?', (review_id,))
+    conn.commit()
+    return {"message": "Review deleted successfully"}
diff --git a/microservices/reviews_service/review.db b/microservices/reviews_service/review.db
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2d07e1bc5127de7eeaae96265f68529a2dc32ee0 100644
GIT binary patch
literal 8192
zcmeI#&q~8E90%}Z42FV#ZXR~|2_80ZI;#(0w`HTaP0cFUlXNy4LAOF%_25l>ET6<j
z@F`47+!PV<D13jUO`H7E{Q9|Nbl%sQqDh?0!i)~tCgYqP6EVh0_A*@&+}z9dIq&lK
z-=f6!CU0vdi?6>h(-07V00bZa0SG_<0uX=z1Rwx`KMOp$ys}lT^5-B6$G1wVd#xT)
z+m+f<xV|9YZS@7&L8`5ijikuF(h+$>U-X2eGwBUn8PJIcb{A=PsY-0pa&W9~)VIMT
z%=CPke{Gp~9nWTJo{=vuKaJY0qtG0@JElh88;Iqa?x_@BZ<v=sHM@PCr05DMhHWvT
z3sX|MnE7F$E%D33mMJ@}easZUSTD}z8?VeX1Oy-e0SG_<0uX=z1Rwwb2tWV=|4v|s
gSJ(>Y``eFYosmu{q-h*Sl%M~dgGSS7I8Ep19YK|ASpWb4

literal 0
HcmV?d00001

diff --git a/microservices/reviews_service/reviews.py b/microservices/reviews_service/reviews.py
deleted file mode 100644
index 7034387..0000000
--- a/microservices/reviews_service/reviews.py
+++ /dev/null
@@ -1,85 +0,0 @@
-from fastapi import FastAPI, HTTPException
-from pydantic import BaseModel
-from typing import List
-import sqlite3
-
-app = FastAPI()
-
-# SQLite connection
-conn = sqlite3.connect('bikes.db')
-cursor = conn.cursor()
-
-# Create the Reviews table if it doesn't exist
-cursor.execute('''
-    CREATE TABLE IF NOT EXISTS Reviews (
-        review_id INTEGER PRIMARY KEY,
-        user_id INT,
-        bike_id INT,
-        rating INT,
-        comment TEXT,
-        review_date DATETIME,
-        FOREIGN KEY (user_id) REFERENCES Users(user_id),
-        FOREIGN KEY (bike_id) REFERENCES Bikes(bike_id)
-    )
-''')
-conn.commit()
-
-
-# Review model
-class Review(BaseModel):
-    user_id: int
-    bike_id: int
-    rating: int
-    comment: str
-    review_date: str
-
-
-# Routes
-@app.post("/reviews/", response_model=Review)
-async def create_review(review: Review):
-    cursor.execute('''
-        INSERT INTO Reviews 
-        (user_id, bike_id, rating, comment, review_date) 
-        VALUES (?, ?, ?, ?, ?)
-    ''', (
-        review.user_id, review.bike_id, review.rating, review.comment, review.review_date
-    ))
-    conn.commit()
-    return review
-
-
-@app.get("/reviews/", response_model=List[Review])
-async def read_reviews():
-    cursor.execute('SELECT * FROM Reviews')
-    reviews = cursor.fetchall()
-    return reviews
-
-
-@app.get("/reviews/{review_id}", response_model=Review)
-async def read_review(review_id: int):
-    cursor.execute('SELECT * FROM Reviews WHERE review_id = ?', (review_id,))
-    review = cursor.fetchone()
-    if review is None:
-        raise HTTPException(status_code=404, detail="Review not found")
-    return review
-
-
-@app.put("/reviews/{review_id}", response_model=Review)
-async def update_review(review_id: int, review: Review):
-    cursor.execute('''
-        UPDATE Reviews 
-        SET user_id = ?, bike_id = ?, rating = ?, comment = ?, review_date = ?
-        WHERE review_id = ?
-    ''', (
-        review.user_id, review.bike_id, review.rating, review.comment,
-        review.review_date, review_id
-    ))
-    conn.commit()
-    return review
-
-
-@app.delete("/reviews/{review_id}")
-async def delete_review(review_id: int):
-    cursor.execute('DELETE FROM Reviews WHERE review_id = ?', (review_id,))
-    conn.commit()
-    return {"message": "Review deleted successfully"}
diff --git a/microservices/users_service/__pycache__/main.cpython-39.pyc b/microservices/users_service/__pycache__/main.cpython-39.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..c7bbb65aad6d812c8095dd550bcab4eea8af8d10
GIT binary patch
literal 3974
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
Rb+t|#zlLVj>FTmY{{wXzs9^vA

literal 0
HcmV?d00001

diff --git a/microservices/users_service/bikes.db b/microservices/users_service/bikes.db
index 84b1acb9efcb41e46f039ef3d17b61e2da479c4e..cda0f3126502b897de95355f5de66de3ee9fa967 100644
GIT binary patch
delta 144
zcmZp0XmFSy&B!uQ#+jdmK`-qUF9QPuBj0NVzSkQItN1p*;FDn#VB=lFz~9F&#kYV@
zllM9Al8uEEctsr9I2q)Xbrl&D8M5*-^5RqSQ;jDtl$Vw_G%_|ZH8Z!cG%z&MH89aN
bGB7f7VC7_xg(#jpQ(jpFo0`p<a@QFFI=~`K

delta 58
zcmZp0XmFSy&B!!S#+jdqL9eWfmw|zSk?%DF-|LNqReYOY@X0Xpu<&Uz@b~dc@h#xf
O+*l~dw^>u}IwJtCrViTx

diff --git a/microservices/users_service/main.py b/microservices/users_service/main.py
index f95802c..f93f5ef 100644
--- a/microservices/users_service/main.py
+++ b/microservices/users_service/main.py
@@ -26,15 +26,14 @@ cursor.execute('''
 conn.commit()
 
 
-# User model
 class User(BaseModel):
     username: str
     password: str
     email: str
     phone_number: str
-    credit_card_info: Optional[str]
+    credit_card_info: Optional[str] = None
     registration_date: str
-    last_login: Optional[str]
+    last_login: Optional[str] = None
 
 
 class UserResponse(BaseModel):
@@ -63,22 +62,68 @@ async def read_users():
         user_objects.append(user_obj)
     return user_objects
 
+
 # Routes
 @app.post("/users/", response_model=User)
 async def create_user(user: User):
     print('hit')
-    cursor.execute('''
-        INSERT INTO Users 
-        (username, password, email, phone_number, credit_card_info, registration_date, last_login) 
-        VALUES (?, ?, Optional[str]?, ?, ?, ?, ?)
-    ''', (
-        user.username, user.password, user.email, user.phone_number,
-        user.credit_card_info, user.registration_date, user.last_login
-    ))
+    # Use a tuple to conditionally include the optional fields in the SQL query
+    if user.credit_card_info is None and user.last_login is None:
+        cursor.execute('''
+            INSERT INTO Users 
+            (username, password, email, phone_number, registration_date) 
+            VALUES (?, ?, ?, ?, ?)
+        ''', (
+            user.username, user.password, user.email, user.phone_number,
+            user.registration_date
+        ))
+    elif user.credit_card_info is None:
+        cursor.execute('''
+            INSERT INTO Users 
+            (username, password, email, phone_number, registration_date, last_login) 
+            VALUES (?, ?, ?, ?, ?, ?)
+        ''', (
+            user.username, user.password, user.email, user.phone_number,
+            user.registration_date, user.last_login
+        ))
+    elif user.last_login is None:
+        cursor.execute('''
+            INSERT INTO Users 
+            (username, password, email, phone_number, credit_card_info, registration_date) 
+            VALUES (?, ?, ?, ?, ?, ?)
+        ''', (
+            user.username, user.password, user.email, user.phone_number,
+            user.credit_card_info, user.registration_date
+        ))
+    else:
+        cursor.execute('''
+            INSERT INTO Users 
+            (username, password, email, phone_number, credit_card_info, registration_date, last_login) 
+            VALUES (?, ?, ?, ?, ?, ?, ?)
+        ''', (
+            user.username, user.password, user.email, user.phone_number,
+            user.credit_card_info, user.registration_date, user.last_login
+        ))
     conn.commit()
     return user
 
 
+# # Routes
+# @app.post("/users/", response_model=User)
+# async def create_user(user: User):
+#     print('hit')
+#     cursor.execute('''
+#         INSERT INTO Users 
+#         (username, password, email, phone_number, credit_card_info, registration_date, last_login) 
+#         VALUES (?, ?, Optional[str]?, ?, ?, ?, ?)
+#     ''', (
+#         user.username, user.password, user.email, user.phone_number,
+#         user.credit_card_info, user.registration_date, user.last_login
+#     ))
+#     conn.commit()
+#     return user
+
+
 # @app.get("/users/", response_model=List[User])
 # async def read_users():
 #     cursor.execute('SELECT * FROM Users')
diff --git a/microservices/users_service/users.py b/microservices/users_service/users.py
deleted file mode 100644
index e69de29..0000000
diff --git a/models.py b/models.py
deleted file mode 100644
index 3041a3d..0000000
--- a/models.py
+++ /dev/null
@@ -1,26 +0,0 @@
-from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
-from sqlalchemy.orm import relationship
-
-from .database import Base
-
-
-class User(Base):
-    __tablename__ = "users"
-
-    id = Column(Integer, primary_key=True)
-    email = Column(String, unique=True, index=True)
-    hashed_password = Column(String)
-    is_active = Column(Boolean, default=True)
-
-    items = relationship("Item", back_populates="owner")
-
-
-class Item(Base):
-    __tablename__ = "items"
-
-    id = Column(Integer, primary_key=True)
-    title = Column(String, index=True)
-    description = Column(String, index=True)
-    owner_id = Column(Integer, ForeignKey("users.id"))
-
-    owner = relationship("User", back_populates="items")
\ No newline at end of file
diff --git a/schemas.py b/schemas.py
deleted file mode 100644
index cf51ac2..0000000
--- a/schemas.py
+++ /dev/null
@@ -1,37 +0,0 @@
-from typing import Union
-
-from pydantic import BaseModel
-
-
-class ItemBase(BaseModel):
-    title: str
-    description: Union[str, None] = None
-
-
-class ItemCreate(ItemBase):
-    pass
-
-
-class Item(ItemBase):
-    id: int
-    owner_id: int
-
-    class Config:
-        orm_mode = True
-
-
-class UserBase(BaseModel):
-    email: str
-
-
-class UserCreate(UserBase):
-    password: str
-
-
-class User(UserBase):
-    id: int
-    is_active: bool
-    items: list[Item] = []
-
-    class Config:
-        orm_mode = True
\ No newline at end of file
diff --git a/sql_app.db b/sql_app.db
deleted file mode 100644
index e69de29..0000000
-- 
GitLab