diff --git a/OSDS/settings.py b/OSDS/settings.py index ba7f77f..ec5cb7f 100644 --- a/OSDS/settings.py +++ b/OSDS/settings.py @@ -185,5 +185,14 @@ def get_secret(setting, secrets=secrets): "http://localhost", "http://127.0.0.1" ] - -CSRF_TRUSTED_ORIGINS = ['https://*.cloudtype.app'] \ No newline at end of file +SECURE_CONTENT_TYPE_NOSNIFF = True +SECURE_BROWSER_XSS_FILTER = True +SESSION_COOKIE_SECURE = True +CSRF_COOKIE_SECURE = True +SECURE_SSL_REDIRECT = True +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +CSRF_TRUSTED_ORIGINS = [ + 'https://*.cloudtype.app', + 'https://*.osds.kro.kr', + "http://*.osds.kro.kr", + ] \ No newline at end of file diff --git a/README.md b/README.md index 7152761..ec31d49 100644 --- a/README.md +++ b/README.md @@ -1 +1,42 @@ -# OSDS-server \ No newline at end of file +# OSDS-server + + + +
+ +# 👨‍👩‍👧‍👦 Participants 👨‍👩‍👧‍👦 +| name | 역할 | +|-------|----------| +| [unanchoi](https://github.com/unanchoi)| Develop | +| [na-yk](https://github.com/na-yk)| Leader, Develop | +| [jinu-kim](https://github.com/jinu-u-kim) | Develop | +| [hi-there-insahae](https://github.com/hi-there-insahae)| Develop | + + +## 🖥 Implementation + +##### 0. Virtual Environment +```python +python -m venv venv +source venv/bin/activate +``` + +##### 1. Run Server + +``` pytho +glt clone https://github.com/NodabFamily/OSDS-server.git + +python manage.py migrate + +python manage.py runserver +``` + +## 🗒 Commit Convention +| 제목 | 내용 | +|-------|----------| +| feat | 기능 추가| +| fix | 버그 수정| +| refactor | 기능 개선 및 코드 좋은 방향으로 개선 | +| docs | 문서 관리| +| style | 코드 스타일 변경, 코드 깔끔하게 관리 | +| chore | 기본 세팅 및 settings.py 관련, 패키지 관리 | diff --git a/accounts/migrations/__init__.py b/accounts/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/accounts/urls.py b/accounts/urls.py index 40470da..b8bfa85 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -8,7 +8,7 @@ urlpatterns = [ path("users", create_user, name="create_user"), - path("users/", read_edit_delete_user, name ="read_edit_delete_user"), + path("users/", read_edit_delete_user, name ="read_edit_delete_user"), path("users/login",login_view, name ="login"), path("users/logout", logout_view, name ="logout"), ] \ No newline at end of file diff --git a/accounts/views.py b/accounts/views.py index 05dd1f0..981d1ae 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,140 +1,152 @@ import json -from django.http import JsonResponse, HttpResponse +from django.http import HttpResponse from django.shortcuts import get_object_or_404 from django.contrib.auth import authenticate, login, logout, get_user_model from django.views.decorators.http import require_http_methods -from django.http import JsonResponse from django.contrib.auth.hashers import make_password -# Create your views here. + + User = get_user_model() + @require_http_methods(['POST']) def create_user(request): body = json.loads(request.body.decode('utf-8')) - new_user = User.objects.create( - username = body["username"], - password = body["password"], - name = body["name"], - birth = body["birth"], - bio = body["bio"], - is_participant = body["is_participant"], - avatar = body["avatar"], - nickname = body["nickname"] - ) + new_user = User.objects.create( + username=body["username"], + password=body["password"], + name=body["name"], + birth=body["birth"], + bio=body["bio"], + is_participant=body["is_participant"], + avatar=body["avatar"], + nickname=body["nickname"] + ) new_user.password = make_password(body["password"]) new_user.save() - new_user_json={ - "id" : new_user.id, - "username" : new_user.username, - "name" : new_user.name, - "birth" : new_user.birth, - "bio" : new_user.bio, - "avatar" : new_user.avatar, - "nickname" : new_user.nickname, - "is_participant" : new_user.is_participant - } + new_user_data = { + "id": new_user.id, + "username": new_user.username, + "name": new_user.name, + "birth": new_user.birth, + "bio": new_user.bio, + "avatar": new_user.avatar, + "nickname": new_user.nickname, + "is_participant": new_user.is_participant + } + + json_res = json.dumps({ + 'success': True, + 'message': '생성 성공!', + 'data': new_user_data + }, ensure_ascii=False) - - - json_res=json.dumps( - { - 'status': 200, - 'success': True, - 'message': '생성 성공!', - 'data': new_user_json - }, - ensure_ascii=False - ) return HttpResponse( - json_res, - content_type=u"application/json; charset=utf-8", - status=200 - ) + json_res, + content_type=u"application/json; charset=utf-8", + status=200 + ) + @require_http_methods(['POST']) def login_view(request): - print("request.user : ", request.user) - print("request.POST : ", request.POST.get("username")) - print("request.body : ", request.body) data = json.loads(request.body.decode("utf-8")) - print("data : ", data) - username = data['username'] password = data['password'] - - print(username) - print(password) - user = authenticate(request, username=username , password = password) + user = authenticate(request, username=username, password=password) if user is not None: login(request, user) user_data = { - "id" : user.id, - "username" : user.username, - "name" : user.name, - "birth": user.birth, - "bio":user.bio, - "nickname":user.nickname, - "is_participant":user.is_participant - } - return JsonResponse({"success": True, "message" : "로그인 성공", "data" : user_data}, status = 200) - else: - return JsonResponse({"success": False, "message": "로그인 실패"}, status = 403) - + "id": user.id, + "username": user.username, + "name": user.name, + "birth": user.birth, + "bio": user.bio, + "avatar": user.avatar, + "nickname": user.nickname, + "is_participant": user.is_participant + } + + json_res = json.dumps({ + "success": True, + "message": "로그인 성공", + "data": user_data + }, ensure_ascii=False) + + return HttpResponse( + json_res, + content_type=u"application/json; charset=utf-8", + status=200 + ) + else: + json_res = json.dumps({ + "success": False, + "message": "로그인 실패" + }) + + return HttpResponse( + json_res, + content_type=u"application/json; charset=utf-8", + status=403 + ) + @require_http_methods(['POST']) def logout_view(request): logout(request) - return JsonResponse({ + json_res = json.dumps({ "success": True, - "message": "로그아웃 성공"}, - status = 200) + "message": "로그아웃 성공", + "data": None + }, ensure_ascii=False) + + return HttpResponse( + json_res, + content_type=u"application/json; charset=utf-8", + status=200 + ) -@require_http_methods(['GET','DELETE','PUT']) -def read_edit_delete_user(request,id): +@require_http_methods(['GET', 'DELETE', 'PUT']) +def read_edit_delete_user(request, user_id): if request.method == "GET": - user_detail = get_object_or_404(User, pk =id) - user_detail_json={ - "id" : user_detail.id, - "username" : user_detail.username, - "name" : user_detail.name, - "birth" : user_detail.birth, - "bio" : user_detail.bio, - "avatar" : user_detail.avatar, - "nickname" : user_detail.nickname, - "is_participant" : user_detail.is_participant + user_detail = get_object_or_404(User, pk=user_id) + user_detail_json = { + "id": user_detail.id, + "username": user_detail.username, + "name": user_detail.name, + "birth": user_detail.birth, + "bio": user_detail.bio, + "avatar": user_detail.avatar, + "nickname": user_detail.nickname, + "is_participant": user_detail.is_participant } - json_res = json.dumps( - { - "status": 200, - "success": True, - "message": "조희 성공!", - "data": user_detail_json - }, - ensure_ascii=False - ) + + json_res = json.dumps({ + "success": True, + "message": "조희 성공!", + "data": user_detail_json + }, ensure_ascii=False) return HttpResponse( json_res, content_type=u"application/json; charset=utf-8", status=200 ) + elif request.method == "DELETE": - delete_user = get_object_or_404(User, pk=id) + delete_user = get_object_or_404(User, pk=user_id) delete_user.delete() - json_res = json.dumps( - { - "status": 200, - "success": True, - "message": "삭제 성공", - "data": None - }, - ensure_ascii=False - ) + + json_res = json.dumps({ + "success": True, + "message": "삭제 성공", + "data": None + }, ensure_ascii=False) return HttpResponse( json_res, @@ -145,7 +157,7 @@ def read_edit_delete_user(request,id): elif request.method == "PUT": body = json.loads(request.body.decode('utf-8')) - update_user = get_object_or_404(User, pk =id) + update_user = get_object_or_404(User, pk=user_id) update_user.username = body["username"] update_user.name = body["name"] update_user.birth = body["birth"] @@ -154,29 +166,24 @@ def read_edit_delete_user(request,id): update_user.nickname = body["nickname"] update_user.save() - - update_user_json={ - "id" : update_user.id, - "username" : update_user.username, - "name" : update_user.name, - "birth" : update_user.birth, - "bio" : update_user.bio, - "avatar" : update_user.avatar, - "nickname" : update_user.nickname, + update_user_json = { + "id": update_user.id, + "username": update_user.username, + "name": update_user.name, + "birth": update_user.birth, + "bio": update_user.bio, + "avatar": update_user.avatar, + "nickname": update_user.nickname, } - json_res = json.dumps( - { - "status": 200, - "success": True, - "message": "수정 성공", - "data": update_user_json - }, - ensure_ascii=False - ) + json_res = json.dumps({ + "success": True, + "message": "수정 성공", + "data": update_user_json + }, ensure_ascii=False) return HttpResponse( json_res, content_type=u"application/json; charset=utf-8", status=200 - ) \ No newline at end of file + ) \ No newline at end of file diff --git a/archives/migrations/0001_initial.py b/archives/migrations/0001_initial.py deleted file mode 100644 index e2db17a..0000000 --- a/archives/migrations/0001_initial.py +++ /dev/null @@ -1,98 +0,0 @@ -# Generated by Django 4.0.6 on 2022-08-19 20:26 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('families', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Album', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('title', models.CharField(max_length=31)), - ('cover_image', models.URLField(blank=True, default='', max_length=500)), - ('family_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='families.family')), - ('user_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Tag', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content', models.CharField(max_length=255)), - ('album_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archives.album')), - ('family_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='families.family')), - ], - ), - migrations.CreateModel( - name='Photo', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('photo_image', models.URLField(blank=True, default='', max_length=500)), - ('like_count', models.IntegerField(default=0)), - ('album_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archives.album')), - ('family_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='families.family')), - ('user_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Like', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('photo_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archives.photo')), - ('user_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='Comment', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('comment', models.CharField(default='', max_length=255, null=True)), - ('photo_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archives.photo')), - ('user_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - options={ - 'abstract': False, - }, - ), - migrations.CreateModel( - name='Bookmark', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('photo_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='archives.photo')), - ('user_id', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AddConstraint( - model_name='like', - constraint=models.UniqueConstraint(fields=('user_id', 'photo_id'), name='unique_user_photo'), - ), - migrations.AddConstraint( - model_name='bookmark', - constraint=models.UniqueConstraint(fields=('user_id', 'photo_id'), name='unique_user_photo_bookmark'), - ), - ] diff --git a/archives/migrations/__init__.py b/archives/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/families/migrations/__init__.py b/families/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/notifications/migrations/__init__.py b/notifications/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/serviceAccountKey.json b/serviceAccountKey.json new file mode 100644 index 0000000..fcf6745 --- /dev/null +++ b/serviceAccountKey.json @@ -0,0 +1,12 @@ +{ +"type": "service_account", +"project_id": "osds-server", +"private_key_id": "1d9ab61f79bd8b116f6d190af20091ae461fe321", +"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC0SBXpEZyXDDtV\n8PKrRkmQVRxlDKRANWNvzcc9CiB9BeBdQmEFLRwtHmKObz4p5UqSAa+MOZFU7Nzy\nIx1vHnQGfSLEuqV4cowARSgwoOIuRMtqx7f6ZPAv18tp7wKUZOF4LeYe91I6X7FM\n8xeDJtGe3tHvQALp9F80WdZ89gHRH7Lb3NRnFwti/sWBC9N998CN0qPE3Ahjc9hC\n1gZSb6CQHS0YKEiMXLQV0ru3XD6i3d9dB/6F4zZuFmFSou6xipFZ8kW3eA9djQi1\nH8c7KpnwmUweVIo8sB3kRwpiyavXCvPH2mmm/MeyeoDZA+2iq5cVGQtB9W7mK1Zs\nvprm5G5RAgMBAAECggEAEfu2Vs5TT9RwJ0uek1Pyst9wkopjKIYC1iRhXV8BHGON\njNP6JFdqffwv0dw6J9j32i5pndvgucdaZ1t2HE9d/Mc3BIeHScdoXH8JiidERKAH\naA6F1UgEFwuoPngRam7ROGkgsUJTvR+uSpodpG8m/hllON/KYp7GL+1Nul+aUQs0\nlIi9VAGXVN1dQ73Pk1JsuCZSEwImwunQuymfnydqPaKEWjgfNaPMrCwGq2GUki1/\n2Vcd7BRxfiQcYXYiOXWSi0Ro2U6mN0/Wij7SoBdcmZvt4V3IOWqW3++iqY7v6oJw\n03DpylBIFP3mqmpuEaL7NzNMTPmKJ2+dabI1GxFK2QKBgQD05Rna56vzDMCJ0kjd\nH+OvEXhQg1QWqbT68PaqQGlaMHspAK2kjdfzlYfe7zWgO/ELdCuGKLMITAU+w4GG\nmCH3DCO6it3RDlWZYUNHs/bdeoTraHeAOAHzhFzh44rixUIsQIq/VpbUCpMAUBnu\nTzJMQXAfyZ7FWBJMaK3kD+nIKQKBgQC8dOk6nrv//IBl0umesu/ZXgq3D3751/5E\nj0Z61X9L4N+ZgA9uAe9TrFqNT7YJhv0yBBuUfMuOoiJEMvpbfbz4vkPIUW/bdnUD\nlj3xFEeHV7SVmm5HKbK9nPqCIBz/KRl9E45oxFY2ua2v0TadCcOS4gLg+XVX9mDx\nGSmh3S9Z6QKBgG6zdXmPyhmnRQ3IAen7NVf5BLMYepV4B3h8HnSdg0Iisjm5tcSx\n3dGdYXr0FQCmt/Keg+I0WaHBg4l4pP9rm8bqNOhpR5Xt7eHUpq4t+sTpUlZ7tbE/\nIBqtVbNCwZB67MvGLTIK+UlGsmasztv77terqPyljmDUzAjANQLn8pzpAoGBALJ1\nU1Z7cjPafAvwSeJKN+5yq1rmhas56kIqGue+vKix7YuCRRo7ItLtZ2JhlVQ4TBPM\n6AEYm/oZdrF2RLXWv9gc9DsBQxdjeTNIVqewOHvlhdAVSVCCIAyGVoJavpqx5L0Y\ng8aaBboU4nCXgUv8LwMsmuVH1OLTIMGuvknVFj3hAoGBAKOMzdz6PlJbvLYXlVO/\nky2loZJ+5lsNwIASVcgg5IHHvn4cY9pdlafKoS6MdKzy9AGy6blNQz04TI50WZIH\n6vXyMbBnHdVbrcadK/Ri1NGsHaNVMHlPkEBpa1r569O/rYmuWcXTsf4cr+WCX4Rz\nZMKJpfhtS2FNHT06om+OPurb\n-----END PRIVATE KEY-----\n", +"client_email": "firebase-adminsdk-lu9tb@osds-server.iam.gserviceaccount.com", +"client_id": "117954532341797569375", +"auth_uri": "https://accounts.google.com/o/oauth2/auth", +"token_uri": "https://oauth2.googleapis.com/token", +"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", +"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-lu9tb%40osds-server.iam.gserviceaccount.com" +} \ No newline at end of file diff --git a/static/img/morakmorak.png b/static/img/morakmorak.png new file mode 100644 index 0000000..cba588c Binary files /dev/null and b/static/img/morakmorak.png differ