diff --git a/README.md b/README.md
index 5884e26a5b..04a22a5318 100644
--- a/README.md
+++ b/README.md
@@ -1 +1 @@
-# coding-project-template
\ No newline at end of file
+# fullstack_developer_capstone
diff --git a/server/database/app.js b/server/database/app.js
index 00f52b2008..4682488712 100644
--- a/server/database/app.js
+++ b/server/database/app.js
@@ -56,19 +56,38 @@ app.get('/fetchReviews/dealer/:id', async (req, res) => {
}
});
+// Express route to fetch all dealerships
// Express route to fetch all dealerships
app.get('/fetchDealers', async (req, res) => {
-//Write your code here
+ try {
+ const documents = await Dealerships.find();
+ res.json(documents);
+ } catch (error) {
+ res.status(500).json({ error: 'Error fetching dealerships' });
+ }
});
+
// Express route to fetch Dealers by a particular state
+
app.get('/fetchDealers/:state', async (req, res) => {
-//Write your code here
+ try {
+ const documents = await Dealerships.find({ state: req.params.state });
+ res.json(documents);
+ } catch (error) {
+ res.status(500).json({ error: 'Error fetching dealerships by state' });
+ }
});
+
// Express route to fetch dealer by a particular id
app.get('/fetchDealer/:id', async (req, res) => {
-//Write your code here
+ try {
+ const document = await Dealerships.findOne({ id: req.params.id });
+ res.json(document);
+ } catch (error) {
+ res.status(500).json({ error: 'Error fetching dealership by id' });
+ }
});
//Express route to insert review
diff --git a/server/djangoapp/urls.py b/server/djangoapp/urls.py
index 0edc274f90..dd63385386 100644
--- a/server/djangoapp/urls.py
+++ b/server/djangoapp/urls.py
@@ -1,16 +1,14 @@
# Uncomment the imports before you add the code
-# from django.urls import path
+from django.urls import path
from django.conf.urls.static import static
from django.conf import settings
-# from . import views
+from . import views
app_name = 'djangoapp'
urlpatterns = [
- # # path for registration
-
- # path for login
- # path(route='login', view=views.login_user, name='login'),
-
+ path(route='login', view=views.login_user, name='login'),
+ path('logout/', views.logout_request, name='logout'),
+ path('registration/', views.registration, name='registration'),
# path for dealer reviews view
# path for add a review view
diff --git a/server/djangoapp/views.py b/server/djangoapp/views.py
index b16409f419..4d49ab8077 100644
--- a/server/djangoapp/views.py
+++ b/server/djangoapp/views.py
@@ -1,19 +1,19 @@
# Uncomment the required imports before adding the code
-# from django.shortcuts import render
-# from django.http import HttpResponseRedirect, HttpResponse
-# from django.contrib.auth.models import User
-# from django.shortcuts import get_object_or_404, render, redirect
-# from django.contrib.auth import logout
-# from django.contrib import messages
-# from datetime import datetime
+from django.shortcuts import render
+from django.http import HttpResponseRedirect, HttpResponse
+from django.contrib.auth.models import User
+from django.shortcuts import get_object_or_404, render, redirect
+from django.contrib.auth import logout
+from django.contrib import messages
+from datetime import datetime
from django.http import JsonResponse
from django.contrib.auth import login, authenticate
import logging
import json
from django.views.decorators.csrf import csrf_exempt
-# from .populate import initiate
+from .populate import initiate
# Get an instance of a logger
@@ -39,12 +39,45 @@ def login_user(request):
return JsonResponse(data)
# Create a `logout_request` view to handle sign out request
-# def logout_request(request):
+def logout_request(request):
+ logout(request) # Terminate user session
+ data = {"userName":""} # Return empty username
+ return JsonResponse(data)
# ...
# Create a `registration` view to handle sign up request
-# @csrf_exempt
-# def registration(request):
+@csrf_exempt
+def registration(request):
+ context = {}
+
+ # Load JSON data from the request body
+ data = json.loads(request.body)
+ username = data['userName']
+ password = data['password']
+ first_name = data['firstName']
+ last_name = data['lastName']
+ email = data['email']
+ username_exist = False
+ email_exist = False
+ try:
+ # Check if user already exists
+ User.objects.get(username=username)
+ username_exist = True
+ except:
+ # If not, simply log this is a new user
+ logger.debug("{} is new user".format(username))
+
+ # If it is a new user
+ if not username_exist:
+ # Create user in auth_user table
+ user = User.objects.create_user(username=username, first_name=first_name, last_name=last_name,password=password, email=email)
+ # Login the user and redirect to list page
+ login(request, user)
+ data = {"userName":username,"status":"Authenticated"}
+ return JsonResponse(data)
+ else :
+ data = {"userName":username,"error":"Already Registered"}
+ return JsonResponse(data)
# ...
# # Update the `get_dealerships` view to render the index page with
diff --git a/server/djangoproj/settings.py b/server/djangoproj/settings.py
index e0b1092a5c..ae98e6b31b 100644
--- a/server/djangoproj/settings.py
+++ b/server/djangoproj/settings.py
@@ -28,8 +28,8 @@
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
-ALLOWED_HOSTS = []
-CSRF_TRUSTED_ORIGINS = []
+ALLOWED_HOSTS=['localhost','https://omerisler031-8000.theianext-0-labs-prod-misc-tools-us-east-0.proxy.cognitiveclass.ai']
+CSRF_TRUSTED_ORIGINS=['https://omerisler031-8000.theianext-0-labs-prod-misc-tools-us-east-0.proxy.cognitiveclass.ai']
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [],
@@ -61,7 +61,11 @@
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
- 'DIRS': [],
+ 'DIRS': [
+ os.path.join(BASE_DIR, 'frontend/static'),
+ os.path.join(BASE_DIR, 'frontend/build'),
+ os.path.join(BASE_DIR, 'frontend/build/static'),
+ ],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
@@ -134,5 +138,9 @@
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
-STATICFILES_DIRS = []
+STATICFILES_DIRS = [
+ os.path.join(BASE_DIR, 'frontend/static'),
+ os.path.join(BASE_DIR, 'frontend/build'),
+ os.path.join(BASE_DIR, 'frontend/build/static'),
+]
diff --git a/server/djangoproj/urls.py b/server/djangoproj/urls.py
index 6808da9141..eaf6254de6 100644
--- a/server/djangoproj/urls.py
+++ b/server/djangoproj/urls.py
@@ -23,4 +23,8 @@
path('admin/', admin.site.urls),
path('djangoapp/', include('djangoapp.urls')),
path('', TemplateView.as_view(template_name="Home.html")),
+ path('about/', TemplateView.as_view(template_name="About.html")),
+ path('contact/', TemplateView.as_view(template_name="Contact.html")),
+ path('login/', TemplateView.as_view(template_name="index.html")),
+ path('register/', TemplateView.as_view(template_name="index.html")),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
diff --git a/server/frontend/package-lock.json b/server/frontend/package-lock.json
index 0797425307..bdb21fad35 100644
--- a/server/frontend/package-lock.json
+++ b/server/frontend/package-lock.json
@@ -16,6 +16,9 @@
"react-router-dom": "^6.19.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
+ },
+ "devDependencies": {
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -646,9 +649,18 @@
}
},
"node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "version": "7.21.11",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz",
+ "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==",
+ "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.18.6",
+ "@babel/helper-create-class-features-plugin": "^7.21.0",
+ "@babel/helper-plugin-utils": "^7.20.2",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
+ },
"engines": {
"node": ">=6.9.0"
},
@@ -1891,6 +1903,18 @@
"@babel/core": "^7.0.0-0"
}
},
+ "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/preset-env/node_modules/semver": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
diff --git a/server/frontend/src/App.js b/server/frontend/src/App.js
index aceac6974d..1d06c0b62c 100644
--- a/server/frontend/src/App.js
+++ b/server/frontend/src/App.js
@@ -1,10 +1,12 @@
import LoginPanel from "./components/Login/Login"
import { Routes, Route } from "react-router-dom";
+import Register from "./components/Register/Register";
function App() {
return (