Skip to content

Commit a76f929

Browse files
committed
2 parents 15bcc98 + cdb35b4 commit a76f929

29 files changed

Lines changed: 819 additions & 314 deletions

File tree

laundry_guest/backend/src/project/config/settings.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ def get_secret(setting, secrets=secrets):
2626
raise ImproperlyConfigured(error_msg)
2727

2828

29-
# SECRET_KEY = 'y=k2hf*g*xdaa9*8b#*&(-$+i#(f2*0)_rp*@_che^iwyuoolj'
3029
SECRET_KEY = get_secret('SECRET_KEY')
3130

3231
# SECURITY WARNING: don't run with debug turned on in production!
@@ -45,6 +44,8 @@ def get_secret(setting, secrets=secrets):
4544
'django.contrib.messages',
4645
'django.contrib.staticfiles',
4746
'rest_framework',
47+
'drf_yasg',
48+
'corsheaders',
4849
'django_mysql',
4950
'myauth',
5051
'laundry',
@@ -54,6 +55,7 @@ def get_secret(setting, secrets=secrets):
5455
MIDDLEWARE = [
5556
'django.middleware.security.SecurityMiddleware',
5657
'django.contrib.sessions.middleware.SessionMiddleware',
58+
'corsheaders.middleware.CorsMiddleware',
5759
'django.middleware.common.CommonMiddleware',
5860
'django.middleware.csrf.CsrfViewMiddleware',
5961
'django.contrib.auth.middleware.AuthenticationMiddleware',
@@ -166,19 +168,18 @@ def get_secret(setting, secrets=secrets):
166168
# 이메일
167169
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
168170
EMAIL_USE_TLS = True
169-
EMAIL_HOST = "smtp.gmail.com"
170-
EMAIL_HOST_USER = 'rkdalstjd9@gmail.com'
171-
EMAIL_HOST_PASSWORD = 'mskang0710@@'
172-
EMAIL_PORT = 587
171+
EMAIL_HOST = get_secret('EMAIL_HOST')
172+
EMAIL_HOST_USER = get_secret('EMAIL_HOST_USER')
173+
EMAIL_HOST_PASSWORD = get_secret('EMAIL_HOST_PASSWORD')
174+
EMAIL_PORT = get_secret('EMAIL_PORT')
173175
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
174176

175-
176177
AUTH_USER_MODEL = "myauth.Profile"
177178

178179
REST_FRAMEWORK = {
179-
# 'DEFAULT_PERMISSION_CLASSES': (
180-
# 'rest_framework.permissions.IsAuthenticated',
181-
# ),
180+
'DEFAULT_PERMISSION_CLASSES': (
181+
'rest_framework.permissions.IsAuthenticated',
182+
),
182183
'DEFAULT_AUTHENTICATION_CLASSES': (
183184
# 'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
184185
'rest_framework.authentication.SessionAuthentication',
@@ -194,3 +195,9 @@ def get_secret(setting, secrets=secrets):
194195
# 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(seconds=400),
195196
# 'JWT_PAYLOAD_HANDLER': 'myauth.utils.jwt_payload_handler',
196197
# }
198+
199+
CORS_ORIGIN_ALLOW_ALL = True
200+
CORS_ORIGIN_WHITELIST = (
201+
'http://localhost:3000',
202+
'http://127.0.0.1:3000'
203+
)
Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,42 @@
11
from django.contrib import admin
22
from django.urls import path, include
3-
from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token, refresh_jwt_token
3+
from django.conf.urls import url
4+
#from rest_framework_jwt.views import obtain_jwt_token, verify_jwt_token, refresh_jwt_token
5+
6+
from drf_yasg.views import get_schema_view
7+
from drf_yasg import openapi
8+
from rest_framework.permissions import AllowAny
49

510
urlpatterns = [
611
path('admin/', admin.site.urls),
712
path('myauth/', include('myauth.urls')),
813
path('laundry/', include('laundry.urls')),
914
path('payment/', include('payment.urls')),
10-
path('jwt/get/', obtain_jwt_token),
11-
path('jwt/verify/', verify_jwt_token),
12-
path('jwt/refresh/', refresh_jwt_token),
15+
# path('jwt/get/', obtain_jwt_token),
16+
# path('jwt/verify/', verify_jwt_token),
17+
# path('jwt/refresh/', refresh_jwt_token),
1318
path('api-auth/', include('rest_framework.urls')),
1419
]
20+
21+
schema_view = get_schema_view(
22+
openapi.Info(
23+
title="Snippets API",
24+
default_version='v1',
25+
description="Test description",
26+
terms_of_service="https://www.google.com/policies/terms/",
27+
contact=openapi.Contact(email="contact@snippets.local"),
28+
license=openapi.License(name="BSD License"),
29+
),
30+
validators=['flex'],
31+
public=True,
32+
permission_classes=(AllowAny,),
33+
)
34+
35+
urlpatterns += [
36+
url(r'^swagger(?P<format>\.json|\.yaml)$',
37+
schema_view.without_ui(cache_timeout=0), name='schema-json'),
38+
url(r'^swagger/$', schema_view.with_ui('swagger',
39+
cache_timeout=0), name='schema-swagger-ui'),
40+
url(r'^redoc/$', schema_view.with_ui('redoc',
41+
cache_timeout=0), name='schema-redoc'),
42+
]

laundry_guest/backend/src/project/laundry/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class LaundryItem(models.Model):
4444
category = models.CharField(max_length=10)
4545
material = models.CharField(max_length=10)
4646
price = models.PositiveIntegerField()
47+
information = models.CharField(max_length=100, blank=True)
4748

4849
def __str__(self):
4950
return self.category

laundry_guest/backend/src/project/laundry/views.py

Lines changed: 104 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919

2020
class LaundryShopView(APIView):
2121
def get(self, request, *args, **kwargs):
22+
'''
23+
# 기능
24+
전체 세탁소 조회
25+
26+
'''
2227
try:
2328
queryset = LaundryShop.objects.all()
2429
except:
@@ -32,14 +37,14 @@ def get(self, request, *args, **kwargs):
3237

3338
class LaundryShopDetailView(APIView):
3439

35-
def get_object(self, request, id):
40+
def get_object(self, id):
3641
try:
3742
return LaundryShop.objects.get(id=id)
3843
except ObjectDoesNotExist:
3944
return None
4045

4146
def get(self, request, id, *args, **kwargs):
42-
laundry_shop = self.get_object(request, id)
47+
laundry_shop = self.get_object(id)
4348
if laundry_shop is None:
4449
return Response({
4550
'response': 'error',
@@ -55,6 +60,11 @@ def get(self, request, id, *args, **kwargs):
5560

5661
class ReviewView(APIView):
5762
def get(self, request, id, *args, **kwargs):
63+
'''
64+
# 기능
65+
{id}세탁소의 전체 리뷰 조회
66+
67+
'''
5868
laundry_shop = LaundryShop.objects.get(id=id)
5969
queryset = Review.objects.filter(laundryshop=laundry_shop)
6070
serializer = ReviewSerializer(queryset, many=True)
@@ -65,6 +75,20 @@ def get(self, request, id, *args, **kwargs):
6575
})
6676

6777
def post(self, request, id, *args, **kwargs):
78+
'''
79+
# 기능
80+
{id}세탁소에 리뷰 생성
81+
# example
82+
{
83+
"review": {
84+
"content": "{}세탁소 최고!",
85+
"grade": 3,
86+
"image": {
87+
"imageUrls": ["이미지주소1", " "]
88+
}
89+
}
90+
}
91+
'''
6892
try:
6993
data = request.data['review']
7094
except:
@@ -91,18 +115,23 @@ def post(self, request, id, *args, **kwargs):
91115

92116

93117
class ReviewDetailView(APIView):
94-
def get_object(self, request, review_id):
118+
def get_object(self, review_id):
95119
try:
96120
return Review.objects.get(id=review_id)
97121
except ObjectDoesNotExist:
98122
return None
99123

100124
def get(self, request, id, review_id):
101-
review = self.get_object(request, review_id)
125+
'''
126+
# 기능
127+
{id}세탁소의 {review_id}리뷰 상세 조회
128+
129+
'''
130+
review = self.get_object(review_id)
102131
if review is None:
103132
return Response({
104133
'response': 'error',
105-
'message': '{} review를 찾을 수 없습니다.'.format(id)
134+
'message': '{} review를 찾을 수 없습니다.'.format(review_id)
106135
})
107136
serializer = ReviewSerializer(review)
108137
return Response({
@@ -112,11 +141,20 @@ def get(self, request, id, review_id):
112141
})
113142

114143
def put(self, request, id, review_id):
115-
review = self.get_object(request, review_id)
144+
'''
145+
# 기능
146+
{id}세탁소의 {review_id}리뷰 수정
147+
# example
148+
{
149+
"content": "스마일 세탁소 사랑해요!"
150+
}
151+
152+
'''
153+
review = self.get_object(review_id)
116154
if review is None:
117155
return Response({
118156
'response': 'error',
119-
'message': '{} review를 찾을 수 없습니다.'.format(id)
157+
'message': '{} review를 찾을 수 없습니다.'.format(review_id)
120158
})
121159
serializer = ReviewSerializer(review, data=request.data, partial=True)
122160
if serializer.is_valid():
@@ -133,7 +171,13 @@ def put(self, request, id, review_id):
133171
})
134172

135173
def delete(self, request, id, review_id):
136-
review = self.get_object(request, review_id)
174+
'''
175+
# 기능
176+
{id}세탁소의 {review_id}리뷰 삭제
177+
178+
'''
179+
180+
review = self.get_object(review_id)
137181
if review is None:
138182
return Response({
139183
'response': 'error',
@@ -155,6 +199,11 @@ def delete(self, request, id, review_id):
155199

156200
class LaundryShopLikeView(APIView):
157201
def post(self, request, id, *args, **kwargs):
202+
'''
203+
# 기능
204+
{id}세탁소의 좋아요 토글
205+
206+
'''
158207
profile = request.user
159208
try:
160209
laundryshop = LaundryShop.objects.get(id=id)
@@ -164,32 +213,36 @@ def post(self, request, id, *args, **kwargs):
164213
'message': '{} laundry shop을 찾을 수 없습니다.'.format(id)
165214
})
166215

167-
like = Like(
168-
profile=profile,
169-
laundryshop=laundryshop
170-
)
216+
is_liked = False
217+
171218
try:
219+
like = Like.objects.get(profile=profile, laundryshop=laundryshop)
220+
except ObjectDoesNotExist:
221+
like = Like(
222+
profile=profile,
223+
laundryshop=laundryshop
224+
)
172225
like.save()
173-
except:
174-
return Response({
175-
'response': 'error',
176-
'message': 'db에서 생성에 실패했습니다.'
177-
})
226+
is_liked = True
227+
228+
if not is_liked:
229+
like.delete()
230+
178231
try:
179-
laundryshop.like_num += 1
232+
laundryshop.like_num += -1 if is_liked else 1
180233
laundryshop.save()
181234
except:
182235
return Response({
183236
'response': 'error',
184-
'message': 'db에서 좋아요 수 증가에 실패했습니다.'
237+
'message': 'db에서 좋아요 수 변화에 실패했습니다.'
185238
})
186239

187240
return Response({
188241
'response': 'success',
189-
'message': 'like가 성공적으로 생성되었습니다.'
242+
'message': 'like가 성공적으로 변화되었습니다.'
190243
})
191244

192-
def delete(self, request, id, *args, **kwargs):
245+
# def delete(self, request, id, *args, **kwargs):
193246
profile = request.user
194247
try:
195248
laundryshop = LaundryShop.objects.get(id=id)
@@ -232,6 +285,16 @@ def delete(self, request, id, *args, **kwargs):
232285

233286
class OrderForReviewView(APIView):
234287
def get(self, request, is_reviewd, *args, **kwargs):
288+
'''
289+
# 기능
290+
사용자가 한 주문
291+
# parameter
292+
is_reviewd : True / False
293+
* True일 경우 : 리뷰가 있는 order
294+
* False일 경우 : 리뷰가 없는 order
295+
296+
'''
297+
235298
profile = request.user
236299
orders = ""
237300
# 사용자가 한 주문 중에 review 를 남긴 주문
@@ -264,13 +327,13 @@ def get_object(self, order_id):
264327
return Order.objects.get(id=order_id)
265328
except ObjectDoesNotExist:
266329
return None
267-
except:
268-
return Response({
269-
'response': 'error',
270-
'message': 'DB 문제'
271-
})
272330

273331
def get(self, request, order_id, *args, **kwargs):
332+
'''
333+
# 기능
334+
주문에 해당되는 리뷰 상세 조회
335+
336+
'''
274337
order = self.get_object(order_id)
275338
if order is None:
276339
return Response({
@@ -285,6 +348,21 @@ def get(self, request, order_id, *args, **kwargs):
285348
})
286349

287350
def post(self, request, order_id, *args, **kwargs):
351+
'''
352+
# 기능
353+
주문에 해당되는 리뷰 생성
354+
# example
355+
{
356+
"review": {
357+
"content": "스마일세탁소가 제일 깨끗해요!!",
358+
"grade": 3,
359+
"image": {
360+
"imageUrls": ["이미지주소1", " "]
361+
}
362+
}
363+
}
364+
365+
'''
288366
try:
289367
data = request.data['review']
290368
except:

laundry_guest/backend/src/project/myauth/urls.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
app_name = 'myauth'
55

66
urlpatterns = [
7-
path('', views.main, name="main"),
87
path('sign_up/', views.CreateProfileView.as_view(), name="sign_up"),
98
path('login/', views.UserLoginView.as_view(), name="login"),
109
path('logout/', views.logout, name="logout"),

0 commit comments

Comments
 (0)