Skip to content

Commit cccb14b

Browse files
committed
CI/CD pipeline
1 parent bd8007f commit cccb14b

File tree

9 files changed

+115
-42
lines changed

9 files changed

+115
-42
lines changed

server/database/docker-compose.yml

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,7 @@ services:
1212
- mongo_data:/data/db
1313

1414
#Postgres service
15-
postgres_db:
16-
container_name: postgres_container
17-
image: postgres:latest
18-
environment:
19-
POSTGRES_USER: postgres
20-
POSTGRES_PASSWORD: postgres
21-
POSTGRES_DB: postgres_db
22-
PGDATA: /var/lib/postgresql/data
23-
ports:
24-
- 5432:5432
25-
restart: always
26-
volumes:
27-
- postgres_data:/var/lib/postgresql/data
28-
healthcheck:
29-
test: ["CMD", "pg_isready"]
30-
interval: 10s
31-
timeout: 5s
32-
retries: 5
33-
start_period: 30s
15+
3416

3517

3618
# Node api service
@@ -40,11 +22,8 @@ services:
4022
- 3030:3030
4123
depends_on:
4224
- mongo_db
43-
- postgres_db
44-
45-
46-
25+
4726
volumes:
4827
mongo_data: {}
49-
postgres_data: {}
28+
5029

server/djangoapp/.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
backend_url =http://127.0.0.1:3030/
2-
sentiment_analyzer_url=your code engine deployment url
1+
backend_url =http://127.0.0.1:3030
2+
sentiment_analyzer_url=http://localhost:5000/

server/djangoapp/restapis.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
'backend_url', default="http://localhost:3030")
1111
sentiment_analyzer_url = os.getenv(
1212
'sentiment_analyzer_url',
13-
default="http://localhost:5050/")
13+
default="http://localhost:5000/")
1414

1515
# def get_request(endpoint, **kwargs):
1616
def get_request(endpoint, **kwargs):
@@ -27,7 +27,29 @@ def get_request(endpoint, **kwargs):
2727
except:
2828
print("Network exception occurred")
2929

30-
30+
def analyze_review_sentiments(text):
31+
request_url = sentiment_analyzer_url+"analyze/"+text
32+
try:
33+
# Call get method of requests library with URL and parameters
34+
response = requests.get(request_url)
35+
return response.json()
36+
except Exception as err:
37+
print(f"Unexpected {err=}, {type(err)=}")
38+
print("Network exception occurred")
39+
40+
def post_review(data_dict):
41+
request_url = backend_url + "/insert_review"
42+
try:
43+
# Call post method of requests library with URL and parameters
44+
response = requests.post(request_url, json=data_dict)
45+
print(response.json())
46+
return response.json()
47+
except Exception as err:
48+
print(f"Unexpected {err=}, {type(err)=}")
49+
print("Network exception occurred")
50+
# print("POST to {}".format(request_url))
51+
52+
3153

3254

3355

server/djangoapp/urls.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@
1414
path(route='registration', view=views.registration, name='registration'),
1515
# path for car makes view
1616
path(route='get_cars', view=views.get_cars, name='getcars'),
17+
#get_dealerships
18+
path(route='get_dealers', view=views.get_dealerships, name='get_dealers'),
19+
path(route='get_dealers/<str:state>', view=views.get_dealerships, name='get_dealers_by_state'),
20+
path(route='dealer/<int:dealer_id>', view=views.get_dealer_details, name='dealer_details'),
21+
22+
#dealer review
23+
path(route='reviews/dealer/<int:dealer_id>', view=views.get_dealer_reviews, name='dealer_reviews'),
24+
25+
#add review
26+
path(route='add_review', view=views.add_review, name='add_review'),
27+
28+
1729
# path for home view
1830

1931

server/djangoapp/views.py

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
from django.views.decorators.csrf import csrf_exempt
1616
from .models import CarModel, CarMake
1717
from .populate import initiate
18+
from .restapis import get_request
19+
from .restapis import analyze_review_sentiments
20+
from .restapis import post_review
21+
22+
1823

1924

2025
# Get an instance of a logger
@@ -78,20 +83,57 @@ def registration(request):
7883

7984
# # Update the `get_dealerships` view to render the index page with
8085
# a list of dealerships
81-
# def get_dealerships(request):
82-
# ...
86+
def get_dealerships(request, state="All"):
87+
# Get dealers from the URL
88+
if(state == "All"):
89+
endpoint = "/fetchDealers"
90+
else:
91+
endpoint = "/fetchDealers/" + state
92+
dealerships = get_request(endpoint)
93+
# Render the index page with the list of dealerships
94+
return JsonResponse({"status": "200", "dealers": dealerships})
8395

8496
# Create a `get_dealer_reviews` view to render the reviews of a dealer
85-
# def get_dealer_reviews(request,dealer_id):
86-
# ...
97+
def get_dealer_reviews(request,dealer_id):
98+
if(dealer_id):
99+
endpoint = "/fetchReviews/" + str(dealer_id)
100+
reviews = get_request(endpoint)
101+
return JsonResponse({"status": "200", "reviews": reviews})
102+
else:
103+
return JsonResponse({"status": "404", "message": "Bad Request"})
87104

88105
# Create a `get_dealer_details` view to render the dealer details
89-
# def get_dealer_details(request, dealer_id):
90-
# ...
91-
106+
def get_dealer_details(request, dealer_id):
107+
if(dealer_id):
108+
endpoint = "/fetchDealer/"+str(dealer_id)
109+
dealership = get_request(endpoint)
110+
return JsonResponse({"status":200,"dealer":dealership})
111+
else:
112+
return JsonResponse({"status":400,"message":"Bad Request"})
113+
def get_dealer_reviews(request, dealer_id):
114+
# if dealer id has been provided
115+
if(dealer_id):
116+
endpoint = "/fetchReviews/dealer/"+str(dealer_id)
117+
reviews = get_request(endpoint)
118+
print(reviews)
119+
for review_detail in reviews:
120+
response = analyze_review_sentiments(review_detail['review'])
121+
print(response)
122+
review_detail['sentiment'] = response['sentiment']
123+
return JsonResponse({"status":200,"reviews":reviews})
124+
else:
125+
return JsonResponse({"status":400,"message":"Bad Request"})
92126
# Create a `add_review` view to submit a review
93-
# def add_review(request):
94-
# ...
127+
def add_review(request):
128+
if(request.user.is_anonymous == False):
129+
data =json.loads(request.body)
130+
try:
131+
response = post_review(data)
132+
return JsonResponse({"status":200,"message":"Review Submitted"})
133+
except:
134+
return JsonResponse({"status":401,"message":"Error in posting review"})
135+
else:
136+
return JsonResponse({"status":403,"message":"unauthorized"})
95137

96138
def get_cars(request):
97139
count = CarMake.objects.filter().count()

server/djangoproj/urls.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,8 @@
2828
path('login/', TemplateView.as_view(template_name="index.html")),
2929
path('register/', TemplateView.as_view(template_name="index.html")),
3030
path('logout/', TemplateView.as_view(template_name="index.html")),
31+
path('dealers/', TemplateView.as_view(template_name="index.html")),
32+
path('dealer/<int:dealer_id>',TemplateView.as_view(template_name="index.html")),
33+
path('postreview/<int:dealer_id>',TemplateView.as_view(template_name="index.html")),
34+
3135
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

server/frontend/src/App.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
import LoginPanel from "./components/Login/Login"
22
import Register from "./components/Register/Register";
33
import { Routes, Route } from "react-router-dom";
4+
import Dealers from "./components/Dealers/Dealers";
5+
import Dealer from "./components/Dealers/Dealer";
6+
import PostReview from "./components/Dealers/PostReview";
47

58
function App() {
69
return (
710
<Routes>
811
<Route path="/login" element={<LoginPanel />} />
912
<Route path="/register" element={<Register />} />
13+
<Route path="/dealers" element={<Dealers />} />
14+
<Route path="/dealer/:id" element={<Dealer />} />
15+
<Route path="/postreview/:id" element={<PostReview />} />
16+
1017
</Routes>
1118
);
1219
}

server/frontend/src/components/Dealers/Dealer.jsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ return(
7575
<h4 style={{color:"grey"}}>{dealer['city']},{dealer['address']}, Zip - {dealer['zip']}, {dealer['state']} </h4>
7676
</div>
7777
<div class="reviews_panel">
78-
{reviews.length === 0 && unreviewed === false ? (
79-
<text>Loading Reviews....</text>
80-
): unreviewed === true? <div>No reviews yet! </div> :
78+
{reviews.length === '0' ? (
79+
<span>Loading Reviews....</span>
80+
): unreviewed ? <div>No reviews yet! </div> :
8181
reviews.map(review => (
8282
<div className='review_panel'>
8383
<img src={senti_icon(review.sentiment)} className="emotion_icon" alt='Sentiment'/>

server/frontend/src/components/Dealers/Dealers.jsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const Dealers = () => {
2020
method: "GET"
2121
});
2222
const retobj = await res.json();
23-
if(retobj.status === 200) {
23+
if(retobj.status === '200') {
2424
let state_dealers = Array.from(retobj.dealers)
2525
setDealersList(state_dealers)
2626
}
@@ -30,20 +30,27 @@ const Dealers = () => {
3030
const res = await fetch(dealer_url, {
3131
method: "GET"
3232
});
33+
console.log(res)
34+
3335
const retobj = await res.json();
34-
if(retobj.status === 200) {
36+
console.log('retobj',retobj)
37+
console.log('retobj.status',retobj.status)
38+
if(retobj.status === '200') {
3539
let all_dealers = Array.from(retobj.dealers)
3640
let states = [];
3741
all_dealers.forEach((dealer)=>{
3842
states.push(dealer.state)
3943
});
4044

45+
console.log('all_dealers', all_dealers)
46+
4147
setStates(Array.from(new Set(states)))
4248
setDealersList(all_dealers)
4349
}
4450
}
4551
useEffect(() => {
4652
get_dealers();
53+
console.log("dealersList",dealersList)
4754
},[]);
4855

4956

0 commit comments

Comments
 (0)