feat: invite code
This commit is contained in:
@@ -1,9 +1,15 @@
|
||||
import datetime
|
||||
import random
|
||||
import string
|
||||
import time
|
||||
|
||||
from sqlalchemy import select, update, delete, insert, and_
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
from backend import config
|
||||
from external.s3_uploader.uploader import S3Uploader
|
||||
from models import User, user_position, user_pay_rate, PassportImage, DepartmentSection, UserDepartmentSection
|
||||
from models import User, user_position, user_pay_rate, PassportImage, DepartmentSection, UserDepartmentSection, \
|
||||
InviteCode
|
||||
from services.base import BaseService
|
||||
from schemas.user import *
|
||||
|
||||
@@ -159,3 +165,41 @@ class UserService(BaseService):
|
||||
)
|
||||
except Exception as e:
|
||||
return UploadPassportImageResponse(ok=False, message=str(e))
|
||||
|
||||
@staticmethod
|
||||
def _generate_invite_code(length=10):
|
||||
timestamp = str(int(time.time() * 1000))[-6:]
|
||||
chars = string.ascii_letters + string.digits
|
||||
random_part = ''.join(random.choice(chars) for _ in range(length - len(timestamp))).upper()
|
||||
code = list(timestamp + random_part)
|
||||
random.shuffle(code)
|
||||
return ''.join(code)
|
||||
|
||||
async def generate_invite_code(self, user: User) -> GenerateInviteCodeResponse:
|
||||
MAX_ATTEMPTS = 5
|
||||
try:
|
||||
if not user.is_admin:
|
||||
return GenerateInviteCodeResponse(ok=False,
|
||||
message="Сгенерировать код приглашения может только администратор")
|
||||
code_in_database = True
|
||||
attempt = 0
|
||||
invite_code = ""
|
||||
while code_in_database and attempt < MAX_ATTEMPTS:
|
||||
invite_code = self._generate_invite_code()
|
||||
stmt = select(InviteCode).where(InviteCode.code == invite_code, InviteCode.is_activated == False)
|
||||
user_with_code = await self.session.scalar(stmt)
|
||||
code_in_database = bool(user_with_code)
|
||||
attempt += 1
|
||||
if code_in_database or not invite_code:
|
||||
return GenerateInviteCodeResponse(ok=False, message="Не удалось сгенерировать уникальный код")
|
||||
new_invite_code = InviteCode(
|
||||
code=invite_code,
|
||||
created_at=datetime.datetime.now(),
|
||||
created_by_id=user.id
|
||||
)
|
||||
self.session.add(new_invite_code)
|
||||
await self.session.commit()
|
||||
return GenerateInviteCodeResponse(ok=True, message="Код приглашения успешно создан",
|
||||
invite_code=invite_code)
|
||||
except Exception as e:
|
||||
return GenerateInviteCodeResponse(ok=False, message=str(e))
|
||||
|
||||
Reference in New Issue
Block a user