diff --git a/authentication/__init__.py b/authentication/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/authentication/admin.py b/authentication/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/authentication/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/authentication/apps.py b/authentication/apps.py
new file mode 100644
index 0000000..8bab8df
--- /dev/null
+++ b/authentication/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class AuthenticationConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'authentication'
diff --git a/authentication/migrations/__init__.py b/authentication/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/authentication/models.py b/authentication/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/authentication/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/authentication/tests.py b/authentication/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/authentication/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/authentication/urls.py b/authentication/urls.py
new file mode 100644
index 0000000..7a4c9b9
--- /dev/null
+++ b/authentication/urls.py
@@ -0,0 +1,9 @@
+from django.urls import path
+from authentication.views import login, logout
+
+app_name = 'authentication'
+
+urlpatterns = [
+ path('login/', login, name='login'),
+ path('logout/', logout, name='logout'),
+]
\ No newline at end of file
diff --git a/authentication/views.py b/authentication/views.py
new file mode 100644
index 0000000..a01cdec
--- /dev/null
+++ b/authentication/views.py
@@ -0,0 +1,49 @@
+from django.shortcuts import render
+from django.contrib.auth import authenticate, login as auth_login
+from django.http import JsonResponse
+from django.views.decorators.csrf import csrf_exempt
+from django.contrib.auth import logout as auth_logout
+
+@csrf_exempt
+def login(request):
+ username = request.POST['username']
+ password = request.POST['password']
+ user = authenticate(username=username, password=password)
+ if user is not None:
+ if user.is_active:
+ auth_login(request, user)
+ # Status login sukses.
+ return JsonResponse({
+ "username": user.username,
+ "status": True,
+ "message": "Login sukses!"
+ }, status=200)
+ else:
+ return JsonResponse({
+ "status": False,
+ "message": "Login gagal, akun dinonaktifkan."
+ }, status=401)
+
+ else:
+ return JsonResponse({
+ "status": False,
+ "message": "Login gagal, periksa kembali email atau kata sandi."
+ }, status=401)
+
+
+@csrf_exempt
+def logout(request):
+ username = request.user.username
+
+ try:
+ auth_logout(request)
+ return JsonResponse({
+ "username": username,
+ "status": True,
+ "message": "Logout berhasil!"
+ }, status=200)
+ except:
+ return JsonResponse({
+ "status": False,
+ "message": "Logout gagal."
+ }, status=401)
\ No newline at end of file
diff --git a/main/templates/main.html b/main/templates/main.html
index 0cdf496..8e0b2ed 100644
--- a/main/templates/main.html
+++ b/main/templates/main.html
@@ -106,11 +106,11 @@
Add New Product
-
+
Sesi terakhir login: {{ last_login }}
diff --git a/main/urls.py b/main/urls.py
index a328b0f..718eddb 100644
--- a/main/urls.py
+++ b/main/urls.py
@@ -1,5 +1,5 @@
from django.urls import path
-from main.views import show_main, create_product, show_xml, show_json, show_xml_by_id, show_json_by_id, register, login_user, logout_user, edit_product, delete_product, \
+from main.views import create_product_flutter, show_main, create_product, show_xml, show_json, show_xml_by_id, show_json_by_id, register, login_user, logout_user, edit_product, delete_product, \
get_product_json, add_product_ajax
app_name = 'main'
@@ -17,5 +17,6 @@
path('json//', show_json_by_id, name='show_json_by_id'),
path('', show_main, name='show_main'),
path('get-product/', get_product_json, name='get_product_json'),
- path('create-product-ajax/', add_product_ajax, name='add_product_ajax')
+ path('create-product-ajax/', add_product_ajax, name='add_product_ajax'),
+ path('create-flutter/', create_product_flutter, name='create_product_flutter'),
]
\ No newline at end of file
diff --git a/main/views.py b/main/views.py
index e844f31..f64c569 100644
--- a/main/views.py
+++ b/main/views.py
@@ -1,6 +1,7 @@
import datetime
+import json
from django.shortcuts import render
-from django.http import HttpResponseRedirect
+from django.http import HttpResponseNotFound, HttpResponseRedirect, JsonResponse
from main.forms import ProductForm
from django.urls import reverse
from main.models import Product
@@ -127,4 +128,23 @@ def add_product_ajax(request):
return HttpResponse(b"CREATED", status=201)
- return HttpResponseNotFound()
\ No newline at end of file
+ return HttpResponseNotFound()
+
+@csrf_exempt
+def create_product_flutter(request):
+ if request.method == 'POST':
+
+ data = json.loads(request.body)
+
+ new_product = Product.objects.create(
+ user = request.user,
+ name = data["name"],
+ price = int(data["price"]),
+ description = data["description"]
+ )
+
+ new_product.save()
+
+ return JsonResponse({"status": "success"}, status=200)
+ else:
+ return JsonResponse({"status": "error"}, status=401)
\ No newline at end of file
diff --git a/shopping_list/__pycache__/settings.cpython-311.pyc b/shopping_list/__pycache__/settings.cpython-311.pyc
index 9f0de9d..caede6b 100644
Binary files a/shopping_list/__pycache__/settings.cpython-311.pyc and b/shopping_list/__pycache__/settings.cpython-311.pyc differ
diff --git a/shopping_list/__pycache__/urls.cpython-311.pyc b/shopping_list/__pycache__/urls.cpython-311.pyc
index 21bb483..a9217bf 100644
Binary files a/shopping_list/__pycache__/urls.cpython-311.pyc and b/shopping_list/__pycache__/urls.cpython-311.pyc differ
diff --git a/shopping_list/settings.py b/shopping_list/settings.py
index 6eed3df..9e03049 100644
--- a/shopping_list/settings.py
+++ b/shopping_list/settings.py
@@ -43,7 +43,9 @@
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
- 'main'
+ 'main',
+ 'authentication',
+ 'corsheaders',
]
MIDDLEWARE = [
@@ -54,6 +56,7 @@
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
+ 'corsheaders.middleware.CorsMiddleware'
]
ROOT_URLCONF = 'shopping_list.urls'
@@ -137,3 +140,10 @@
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+CORS_ALLOW_ALL_ORIGINS = True
+CORS_ALLOW_CREDENTIALS = True
+CSRF_COOKIE_SECURE = True
+SESSION_COOKIE_SECURE = True
+CSRF_COOKIE_SAMESITE = 'None'
+SESSION_COOKIE_SAMESITE = 'None'
\ No newline at end of file
diff --git a/shopping_list/urls.py b/shopping_list/urls.py
index 88f607e..f87aaac 100644
--- a/shopping_list/urls.py
+++ b/shopping_list/urls.py
@@ -19,5 +19,6 @@
urlpatterns = [
path('admin/', admin.site.urls),
- path('', include('main.urls'))
+ path('', include('main.urls')),
+ path('auth/', include('authentication.urls')),
]