def login(): data = request.json errors = login_request_schema.validate(data) if errors: raise ErrValidation(errors) email = data["email"] password = data["password"] user = UserService.get_by_email(email) if user is None: raise ErrUserNotFound() if user.role == UserRole.CUSTOMER and user.is_active is False: raise ErrUserIsBlocked() if user.check_password(password) is False: if user.role == UserRole.CUSTOMER: if user.last_failed_login_at == '': user.failed_login_attempts = 1 elif parse_datetime(user.last_failed_login_at).timestamp() + 15 * 60 * 60 < datetime.now().timestamp(): user.failed_login_attempts = 0 else: user.failed_login_attempts += 1 if user.failed_login_attempts == 3: user.is_active = False user.last_failed_login_at = datetime_now() UserService.update(user) raise ErrInvalidLogin() if user.role == UserRole.CUSTOMER: user.failed_login_attempts = 0 UserService.update(user) token = create_access_token(identity=user.dump()) return send_ok(login_response_schema.dump({"data": {"token": token}}))
def check_out(pet_id): pet = PetService.get_by_id(pet_id) if pet is None: raise ErrPetNotFound() pet.free_room() PetService.update(pet) return send_ok()
def delete_pet(pet_id): curr_user = get_current_user() pet = PetService.get_by_id(pet_id) if pet is None: raise ErrPetNotFound() if curr_user.is_customer and pet.is_checked_in(): raise ErrForbidden("You can not delete a pet that is checked-in") PetService.delete_by_id(pet_id) return send_ok()
def check_in(pet_id): data = request.json errors = check_in_request_schema.validate(data) if errors: raise ErrValidation(errors) room_id = int(data["room_id"]) if not PetService.is_room_available(room_id): raise ErrRoomIsFull() pet = PetService.get_by_id(pet_id) pet.room_id = room_id PetService.update(pet) return send_ok()
def update_status(customer_id): data = request.json errors = update_status_request_schema.validate(data) if errors: raise ErrValidation(errors) active = data["active"] user = UserService.get_by_id(customer_id) if user is None: raise ErrUserNotFound() if user.role == UserRole.CUSTOMER: user.is_active = active UserService.update(user) return send_ok()
def create_staff(): data = request.json errors = create_staff_request_schema.validate(data) if errors: raise ErrValidation(errors) fullname = data["fullname"] email = data["email"] password = data["password"] user = UserService.get_by_email(email) if user is not None: raise ErrEmailAlreadyExist() staff = StaffService.create(fullname, email, password) UserService.insert(staff) return send_ok(status_code=status.HTTP_201_CREATED, msg=create_staff_response_schema.dump({"data": staff}))
def invite(): data = request.json errors = invite_request_schema.validate(data) if errors: raise ErrValidation(errors) name = data["name"] email = data["email"] user = UserService.get_by_id(email) if user is not None: raise ErrEmailAlreadyExist() sent = UserService.invite(name, email) if sent is False: raise ErrServiceUnavailable() return send_ok()
def creat_pet(): data = request.json errors = create_pet_request_schema.validate(data) if errors: raise ErrValidation(errors) curr_user = get_current_user() name = data["name"] pet_type = PetType(data["type"]) if curr_user.is_customer: pet = PetService.create(name, pet_type, curr_user.identity) else: pet = PetService.create(name, pet_type) PetService.insert(pet) return send_ok(status_code=status.HTTP_201_CREATED, msg=create_pet_response_schema.dump({"data": pet}))
def move_pet(pet_id): data = request.json errors = move_pet_request_schema.validate(data) if errors: raise ErrValidation(errors) new_room_id = int(data["new_room_id"]) pet = PetService.get_by_id(pet_id) if pet is None: raise ErrPetNotFound() if PetService.get_by_room_id(new_room_id) is not None: raise ErrRoomIsFull() pet.room_id = new_room_id PetService.update(pet) return send_ok()
def get_pets(): data = dict(request.args) errors = get_pets_request_schema.validate(data) if errors: raise ErrValidation(errors) curr_user = get_current_user() q = data["q"] page = int(data["page"]) size = int(data["size"]) skip = calc_skip(page, size) if curr_user.is_customer: pets = PetService.get_customer_pets(curr_user.identity, q, skip, size) else: pets = PetService.get_all(q, skip, size) for i, pet in enumerate(pets): owner = UserService.get_by_id(pet.owner_id) pet.owner = owner return send_ok(get_pets_response_schema.dump({"data": pets}))
def edit_pet(): data = request.json errors = edit_pet_request_schema.validate(data) if errors: raise ErrValidation(errors) curr_user = get_current_user() pet_id = data["pet_id"] pet = PetService.get_by_id(pet_id) if pet is None: raise ErrPetNotFound() if curr_user.is_customer and pet.owner_id != curr_user.identity: raise ErrForbidden() if curr_user.is_customer and pet.room_id is None: raise ErrForbidden("cannot update pet that is checked in") pet.name = data["name"] pet.type = PetType(data["type"]) if curr_user.is_manager or curr_user.is_staff: pet.owner_id = data.get("owner", pet.owner_id) PetService.update(pet) return send_ok(edit_pet_response_schema.dump({"data": pet}))
def get_user(): curr_user = get_current_user() user = UserService.get_by_id(curr_user.identity) if user is None: raise ErrUserNotFound() return send_ok(get_user_response_schema.dump({"data": user}))