Feat: [#56] 초대관련 서비스(url 생성, 코드유효성검사, 사용자초대) 구현

This commit is contained in:
sm4640
2025-05-16 03:39:13 +09:00
parent e55457a45f
commit 73248e0fa6

View File

@@ -10,16 +10,25 @@ from rest_framework.views import APIView
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status from rest_framework import status
from .models import CertificationCode from .models import *
from common.models.choiceModels import CertificateCodeUseType from common.models.choiceModels import CertificateCodeUseType, InviteCodeUseType
from common.utils.codeManger import set_expire from common.utils.codeManger import set_expire
from solapi import SolapiMessageService from solapi import SolapiMessageService
from solapi.model import RequestMessage from solapi.model import RequestMessage
from users.models import User
from projects.models import Project, ProjectTeamList
# from .schemas import send_sms_post_schema # Swagger나 drf-spectacular 등에 사용되는 데코레이터 # from .schemas import send_sms_post_schema # Swagger나 drf-spectacular 등에 사용되는 데코레이터
INVITE_CHOICE_USE_TYPE ={
'p': InviteCodeUseType.PROJECT,
'h': InviteCodeUseType.HACKATHON
}
class CertificateService: class CertificateService:
@staticmethod @staticmethod
def send(code, identifier): def send(code, identifier):
@@ -80,3 +89,45 @@ class SmsService(CertificateService):
except Exception as e: except Exception as e:
# print(f"메시지 발송 실패: {str(e)}") # print(f"메시지 발송 실패: {str(e)}")
return False return False
class InviteService:
# 종류마다 사용하는 테이블이 다르므로 오버라이딩
@staticmethod
def add_member(invitee, work):
pass
# url 생성
@staticmethod
def create_invite_object_and_url(use_type, identifier, code) -> str:
InviteCode.objects.create(
use_type = INVITE_CHOICE_USE_TYPE[use_type],
code = code,
expire_at = set_expire(10080),
identifier = identifier,
)
return f"https://{settings.DOMAIN_NAME}/invite?t={use_type}&i={identifier}&c={code}"
# 코드 유효성 검사
@staticmethod
def check_code(use_type, identifier, code) -> bool:
if InviteCode.objects.filter(
use_type = INVITE_CHOICE_USE_TYPE[use_type],
identifier = identifier,
code = code,
expire_at__gte=now()
).exists():
return True
else:
return False
class ProjectInviteService(InviteService):
# 사용자 초대
@staticmethod
def add_member(invitee: User, work: Project):
return ProjectTeamList.objects.create(user=invitee, project=work)