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