diff --git a/bot/application/student/student_service.py b/bot/application/student/student_service.py index ba06556..181609c 100644 --- a/bot/application/student/student_service.py +++ b/bot/application/student/student_service.py @@ -8,55 +8,26 @@ from bot.application.discord.event.student_registered.student_registered_observable import ( StudentRegisteredObservable, ) -from bot.application.student.exceptions.invalid_discord_id_format_exception import ( - InvalidDiscordIdFormatException, -) -from bot.application.student.exceptions.invalid_name_format_exception import ( - InvalidNameFormatException, -) -from bot.application.student.exceptions.invalid_ni_format_exception import ( - InvalidNIFormatException, -) -from bot.application.student.exceptions.missing_program_code_exception import ( - MissingProgramCodeException, -) from bot.application.student.exceptions.student_already_exist import ( StudentAlreadyExistsException, ) from bot.application.student.exceptions.student_already_registered_exception import ( StudentAlreadyRegisteredException, ) -from bot.application.student.validators.discord_id_validator import DiscordIdValidator -from bot.application.student.validators.name_validator import NameValidator -from bot.application.student.validators.ni_validator import NIValidator -from bot.application.student.validators.program_code_validator import ( - ProgramCodeValidator, -) from bot.config.logger.logger import Logger from bot.config.service_locator import ServiceLocator +from bot.domain.student.attribut.firstname import Firstname +from bot.domain.student.attribut.lastname import Lastname +from bot.domain.student.attribut.program_code import ProgramCode from bot.domain.utility import Utility -from bot.resource.cog.registration.request.add_student_request import AddStudentRequest -from bot.resource.cog.registration.request.force_register_student_request import ( - ForceRegisterStudentRequest, -) -from bot.resource.cog.registration.request.register_student_request import ( - RegisterStudentRequest, -) -from bot.resource.cog.registration.request.force_unregister_student_request import ( - ForceUnregisterStudentRequest, -) from bot.domain.student.attribut.discord_user_id import DiscordUserId from bot.domain.student.attribut.ni import NI -from bot.domain.student.factory.ni_factory import NIFactory from bot.domain.student.factory.student_factory import StudentFactory from bot.domain.student.student import Student from bot.domain.student.student_repository import StudentRepository from bot.infra.student.exception.student_not_found_exception import ( StudentNotFoundException, ) -from bot.resource.cog.registration.request.unregister_student_request import ( - UnregisterStudentRequest, -) from bot.resource.exception.user_not_in_server_exception import UserNotInServerException @@ -68,13 +39,7 @@ def __init__(self, student_repository: StudentRepository): self.__logger: Logger = ServiceLocator.get_dependency(Logger) self.__student_repository = student_repository - self.__ni_validator = NIValidator() - self.__name_validator = NameValidator() - self.__discord_id_validator = DiscordIdValidator() - self.__program_code_validator = ProgramCodeValidator() - - self.__ni_factory = NIFactory() - self.__student_factory = StudentFactory(self.__ni_factory) + self.__student_factory = StudentFactory() def __does_student_registered(self, ni: NI) -> bool: try: @@ -97,28 +62,18 @@ def __does_discord_user_id_already_registered_an_account( ) return len(students) >= 1 - async def add_student(self, add_student_request: AddStudentRequest): - self.__logger.info( - f"Réception de la requête {repr(add_student_request)}", method="add_student" - ) - - if not self.__name_validator.validate(add_student_request.firstname): - raise InvalidNameFormatException(add_student_request.firstname) - - if not self.__name_validator.validate(add_student_request.lastname): - raise InvalidNameFormatException(add_student_request.lastname) - - if not self.__ni_validator.validate(add_student_request.ni): - raise InvalidNIFormatException(add_student_request.ni) - - if not self.__program_code_validator.validate(add_student_request.program_code): - raise MissingProgramCodeException(add_student_request.program_code) - + async def add_student( + self, + ni: NI, + firstname: Firstname, + lastname: Lastname, + program_code: ProgramCode, + ): student = self.__student_factory.create( - add_student_request.ni, - add_student_request.firstname, - add_student_request.lastname, - add_student_request.program_code, + ni, + firstname, + lastname, + program_code, ) if self.__does_student_registered(student.ni): @@ -129,84 +84,38 @@ async def add_student(self, add_student_request: AddStudentRequest): self.__student_repository.add_student(student) - async def register_student(self, register_student_request: RegisterStudentRequest): - self.__logger.info( - f"Réception de la requête {repr(register_student_request)}", - method="register_student", - ) - - if not self.__ni_validator.validate(register_student_request.ni): - raise InvalidNIFormatException(register_student_request.ni) - - student_ni = self.__ni_factory.create(register_student_request.ni) - discord_user_id = DiscordUserId(register_student_request.discord_id) - - if not self.__does_student_exists(student_ni): + async def register_student(self, ni: NI, discord_id: DiscordUserId): + if not self.__does_student_exists(ni): raise StudentNotFoundException() if self.__does_student_registered( - student_ni - ) or self.__does_discord_user_id_already_registered_an_account(discord_user_id): - raise StudentAlreadyRegisteredException(ni=student_ni) - - self.__student_repository.register_student(student_ni, discord_user_id) - await self.notify_on_student_registered(student_ni) - - async def force_register_student( - self, force_register_student_request: ForceRegisterStudentRequest - ): - self.__logger.info( - f"Réception de la requête {repr(force_register_student_request)}", - method="force_register_student", - ) - - if not self.__ni_validator.validate(force_register_student_request.ni): - raise InvalidNIFormatException(force_register_student_request.ni) - - if not self.__discord_id_validator.validate( - force_register_student_request.discord_id - ): - raise InvalidDiscordIdFormatException( - force_register_student_request.discord_id - ) + ni + ) or self.__does_discord_user_id_already_registered_an_account(discord_id): + raise StudentAlreadyRegisteredException(ni=ni) - if not Utility.does_user_exist_on_server( - force_register_student_request.discord_id - ): - raise UserNotInServerException(force_register_student_request.discord_id) + self.__student_repository.register_student(ni, discord_id) + await self.notify_on_student_registered(ni) - student_ni = self.__ni_factory.create(force_register_student_request.ni) - discord_user_id = DiscordUserId(force_register_student_request.discord_id) + async def force_register_student(self, ni: NI, discord_id: DiscordUserId): + if not Utility.does_user_exist_on_server(discord_id.value): + raise UserNotInServerException(discord_id) - if not self.__does_student_exists(student_ni): + if not self.__does_student_exists(ni): raise StudentNotFoundException() if self.__does_student_registered( - student_ni - ) or self.__does_discord_user_id_already_registered_an_account(discord_user_id): - raise StudentAlreadyRegisteredException(ni=student_ni) + ni + ) or self.__does_discord_user_id_already_registered_an_account(discord_id): + raise StudentAlreadyRegisteredException(ni=ni) - self.__student_repository.register_student(student_ni, discord_user_id) - await self.notify_on_student_registered(student_ni) + self.__student_repository.register_student(ni, discord_id) + await self.notify_on_student_registered(ni) - async def unregister_student( - self, unregister_student_request: UnregisterStudentRequest - ): - self.__logger.info( - f"Réception de la requête {repr(unregister_student_request)}", - method="unregister_student", - ) - - discord_user_id = DiscordUserId(unregister_student_request.discord_id) - - if not self.__does_discord_user_id_already_registered_an_account( - discord_user_id - ): + async def unregister_student(self, discord_id: DiscordUserId): + if not self.__does_discord_user_id_already_registered_an_account(discord_id): raise StudentNotFoundException() - student = self.__student_repository.find_student_by_discord_user_id( - discord_user_id - ) + student = self.__student_repository.find_student_by_discord_user_id(discord_id) self.__student_repository.unregister_student( student.ni, DiscordUserId(DiscordUserId.INVALID_DISCORD_ID) @@ -214,23 +123,13 @@ async def unregister_student( await self.notify_on_student_unregistered(student.discord_user_id) - async def force_unregister_student( - self, force_unregister_student_request: ForceUnregisterStudentRequest - ): - self.__logger.info( - f"Réception de la requête {repr(force_unregister_student_request)}", - method="force_unregister_student", - ) - - if not self.__ni_validator.validate(force_unregister_student_request.ni): - raise InvalidNIFormatException(force_unregister_student_request.ni) - - student_ni = self.__ni_factory.create(force_unregister_student_request.ni) + async def force_unregister_student(self, ni: NI): - student = self.__student_repository.find_student_by_ni(student_ni) + student = self.__student_repository.find_student_by_ni(ni) self.__student_repository.unregister_student( - student_ni, DiscordUserId(DiscordUserId.INVALID_DISCORD_ID) + ni, + DiscordUserId(DiscordUserId.INVALID_DISCORD_ID), ) await self.notify_on_student_unregistered(student.discord_user_id) diff --git a/bot/domain/student/factory/student_factory.py b/bot/domain/student/factory/student_factory.py index 223ba9d..b974951 100644 --- a/bot/domain/student/factory/student_factory.py +++ b/bot/domain/student/factory/student_factory.py @@ -1,8 +1,8 @@ from bot.domain.student.attribut.discord_user_id import DiscordUserId from bot.domain.student.attribut.firstname import Firstname from bot.domain.student.attribut.lastname import Lastname +from bot.domain.student.attribut.ni import NI from bot.domain.student.attribut.program_code import ProgramCode -from bot.domain.student.factory.ni_factory import NIFactory from bot.domain.student.student import Student @@ -10,20 +10,16 @@ class StudentFactory: INVALID_DISCORD_USER_ID: int = -1 - def __init__(self, ni_factory: NIFactory): - self.__ni_factory = ni_factory + def __init__(self): + pass def create( self, - ni: str, - firstname: str, - lastname: str, - program_code: str, + ni: NI, + firstname: Firstname, + lastname: Lastname, + program_code: ProgramCode, ) -> Student: - ni = self.__ni_factory.create(ni) - firstname = Firstname(firstname) - lastname = Lastname(lastname) - program_code = ProgramCode(program_code.upper()) discord_user_id = DiscordUserId(self.INVALID_DISCORD_USER_ID) return Student( diff --git a/bot/resource/cog/registration/factory/add_student_request_factory.py b/bot/resource/cog/registration/factory/add_student_request_factory.py index b2683a3..c760809 100644 --- a/bot/resource/cog/registration/factory/add_student_request_factory.py +++ b/bot/resource/cog/registration/factory/add_student_request_factory.py @@ -1,5 +1,25 @@ import re +from typing import Tuple +from bot.application.student.exceptions.invalid_name_format_exception import ( + InvalidNameFormatException, +) +from bot.application.student.exceptions.invalid_ni_format_exception import ( + InvalidNIFormatException, +) +from bot.application.student.exceptions.missing_program_code_exception import ( + MissingProgramCodeException, +) +from bot.application.student.validators.discord_id_validator import DiscordIdValidator +from bot.application.student.validators.name_validator import NameValidator +from bot.application.student.validators.ni_validator import NIValidator +from bot.application.student.validators.program_code_validator import ( + ProgramCodeValidator, +) +from bot.domain.student.attribut.firstname import Firstname +from bot.domain.student.attribut.lastname import Lastname +from bot.domain.student.attribut.program_code import ProgramCode +from bot.domain.student.factory.ni_factory import NIFactory from bot.resource.cog.registration.factory.request_factory import RequestFactory from bot.resource.cog.registration.request.add_student_request import AddStudentRequest from bot.resource.utility.sanitizer_utility import SanitizerUtility @@ -12,14 +32,43 @@ class AddStudentRequestFactory(RequestFactory): def __init__(self): super().__init__(self.REQUIRED_ARGUMENTS) + self.__ni_validator: NIValidator = NIValidator() + self.__name_validator: NameValidator = NameValidator() + self.__discord_id_validator: DiscordIdValidator = DiscordIdValidator() + self.__program_code_validator: ProgramCodeValidator = ProgramCodeValidator() + + self.__ni_factory: NIFactory = NIFactory() + def __remove_extra_spaces(self, input_string: str) -> str: return re.sub(r"\s+", " ", input_string).strip() + def _validate_arguments(self, content: str) -> Tuple[any, ...] or any: + ni, firstname, lastname, program_code = self._get_arguments(content) + + ni = SanitizerUtility.sanitize_ni(ni) + firstname = self.__remove_extra_spaces(firstname) + lastname = self.__remove_extra_spaces(lastname) + + if not self.__ni_validator.validate(ni): + raise InvalidNIFormatException(ni) + + if not self.__name_validator.validate(firstname): + raise InvalidNameFormatException(firstname) + + if not self.__name_validator.validate(lastname): + raise InvalidNameFormatException(lastname) + + if not self.__program_code_validator.validate(program_code): + raise MissingProgramCodeException(program_code) + + return ni, firstname, lastname, program_code + def create(self, content: str) -> AddStudentRequest: - ni, firstname, lastname, program = self._get_arguments(content) + ni, firstname, lastname, program_code = self._validate_arguments(content) + return AddStudentRequest( - SanitizerUtility.sanitize_ni(ni), - self.__remove_extra_spaces(firstname), - self.__remove_extra_spaces(lastname), - program, + self.__ni_factory.create(ni), + Firstname(firstname), + Lastname(lastname), + ProgramCode(program_code.upper()), ) diff --git a/bot/resource/cog/registration/factory/force_register_student_request_factory.py b/bot/resource/cog/registration/factory/force_register_student_request_factory.py index becd71d..ff193d7 100644 --- a/bot/resource/cog/registration/factory/force_register_student_request_factory.py +++ b/bot/resource/cog/registration/factory/force_register_student_request_factory.py @@ -1,3 +1,15 @@ +from typing import Tuple + +from bot.application.student.exceptions.invalid_discord_id_format_exception import ( + InvalidDiscordIdFormatException, +) +from bot.application.student.exceptions.invalid_ni_format_exception import ( + InvalidNIFormatException, +) +from bot.application.student.validators.discord_id_validator import DiscordIdValidator +from bot.application.student.validators.ni_validator import NIValidator +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.domain.student.factory.ni_factory import NIFactory from bot.resource.cog.registration.factory.request_factory import RequestFactory from bot.resource.cog.registration.request.force_register_student_request import ( ForceRegisterStudentRequest, @@ -6,13 +18,31 @@ class ForceRegisterStudentRequestFactory(RequestFactory): + REQUIRED_ARGUMENTS = 2 def __init__(self): super().__init__(self.REQUIRED_ARGUMENTS) - def create(self, content: str) -> ForceRegisterStudentRequest: + self.__ni_validator: NIValidator = NIValidator() + self.__discord_id_validator: DiscordIdValidator = DiscordIdValidator() + + self.__ni_factory: NIFactory = NIFactory() + + def _validate_arguments(self, content: str) -> Tuple[any, ...] or any: ni, member_discord_id = self._get_arguments(content) + + ni = SanitizerUtility.sanitize_ni(ni) + if not self.__ni_validator.validate(ni): + raise InvalidNIFormatException(ni) + + if not self.__discord_id_validator.validate(member_discord_id): + raise InvalidDiscordIdFormatException(member_discord_id) + + return ni, member_discord_id + + def create(self, content: str) -> ForceRegisterStudentRequest: + ni, member_discord_id = self._validate_arguments(content) return ForceRegisterStudentRequest( - SanitizerUtility.sanitize_ni(ni), int(member_discord_id) + self.__ni_factory.create(ni), DiscordUserId(member_discord_id) ) diff --git a/bot/resource/cog/registration/factory/force_unregister_student_request_factory.py b/bot/resource/cog/registration/factory/force_unregister_student_request_factory.py index d4cc66f..037c703 100644 --- a/bot/resource/cog/registration/factory/force_unregister_student_request_factory.py +++ b/bot/resource/cog/registration/factory/force_unregister_student_request_factory.py @@ -1,3 +1,10 @@ +from typing import Tuple + +from bot.application.student.exceptions.invalid_ni_format_exception import ( + InvalidNIFormatException, +) +from bot.application.student.validators.ni_validator import NIValidator +from bot.domain.student.factory.ni_factory import NIFactory from bot.resource.cog.registration.factory.request_factory import RequestFactory from bot.resource.cog.registration.request.force_unregister_student_request import ( ForceUnregisterStudentRequest, @@ -6,11 +13,25 @@ class ForceUnregisterStudentRequestFactory(RequestFactory): + REQUIRED_ARGUMENTS = 1 def __init__(self): super().__init__(self.REQUIRED_ARGUMENTS) - def create(self, content: str) -> ForceUnregisterStudentRequest: + self.__ni_validator: NIValidator = NIValidator() + self.__ni_factory: NIFactory = NIFactory() + + def _validate_arguments(self, content: str) -> Tuple[any, ...] or any: ni = self._get_arguments(content) - return ForceUnregisterStudentRequest(SanitizerUtility.sanitize_ni(ni)) + + ni = SanitizerUtility.sanitize_ni(ni) + + if not self.__ni_validator.validate(ni): + raise InvalidNIFormatException(ni) + + return ni + + def create(self, content: str) -> ForceUnregisterStudentRequest: + ni = self._validate_arguments(content) + return ForceUnregisterStudentRequest(self.__ni_factory.create(ni)) diff --git a/bot/resource/cog/registration/factory/register_student_request_factory.py b/bot/resource/cog/registration/factory/register_student_request_factory.py index b4a591e..4f8837d 100644 --- a/bot/resource/cog/registration/factory/register_student_request_factory.py +++ b/bot/resource/cog/registration/factory/register_student_request_factory.py @@ -1,3 +1,11 @@ +from typing import Tuple + +from bot.application.student.exceptions.invalid_ni_format_exception import ( + InvalidNIFormatException, +) +from bot.application.student.validators.ni_validator import NIValidator +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.domain.student.factory.ni_factory import NIFactory from bot.resource.cog.registration.factory.request_factory import RequestFactory from bot.resource.cog.registration.request.register_student_request import ( RegisterStudentRequest, @@ -6,11 +14,28 @@ class RegisterStudentRequestFactory(RequestFactory): + REQUIRED_ARGUMENTS = 1 def __init__(self): super().__init__(self.REQUIRED_ARGUMENTS) - def create(self, content: str, author_id: int) -> RegisterStudentRequest: + self.__ni_validator = NIValidator() + + self.__ni_factory: NIFactory = NIFactory() + + def _validate_arguments(self, content: str) -> Tuple[any, ...] or any: ni = self._get_arguments(content) - return RegisterStudentRequest(SanitizerUtility.sanitize_ni(ni), author_id) + + ni = SanitizerUtility.sanitize_ni(ni) + + if not self.__ni_validator.validate(ni): + raise InvalidNIFormatException(ni) + + return ni + + def create(self, content: str, author_id: int) -> RegisterStudentRequest: + ni = self._validate_arguments(content) + return RegisterStudentRequest( + self.__ni_factory.create(ni), DiscordUserId(author_id) + ) diff --git a/bot/resource/cog/registration/factory/request_factory.py b/bot/resource/cog/registration/factory/request_factory.py index 538e0fb..799fab1 100644 --- a/bot/resource/cog/registration/factory/request_factory.py +++ b/bot/resource/cog/registration/factory/request_factory.py @@ -1,4 +1,4 @@ -from abc import ABC +from abc import ABC, abstractmethod from typing import Tuple, List from bot.resource.exception.missing_arguments_exception import MissingArgumentsException @@ -11,6 +11,10 @@ def __init__(self, number_of_arguments): def __strip_arguments(self, arguments: List[str]) -> List[str]: return [argument.strip() for argument in arguments] + @abstractmethod + def _validate_arguments(self, content: str) -> Tuple[any, ...] or any: + pass + def _get_arguments(self, content: str) -> Tuple[any, ...] or any: content = content.rstrip() arguments = content.split(",", self._number_of_arguments - 1) diff --git a/bot/resource/cog/registration/factory/unregister_student_request_factory.py b/bot/resource/cog/registration/factory/unregister_student_request_factory.py new file mode 100644 index 0000000..99f0e51 --- /dev/null +++ b/bot/resource/cog/registration/factory/unregister_student_request_factory.py @@ -0,0 +1,33 @@ +from typing import Tuple + +from bot.application.student.exceptions.invalid_discord_id_format_exception import ( + InvalidDiscordIdFormatException, +) +from bot.application.student.validators.discord_id_validator import DiscordIdValidator +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.resource.cog.registration.factory.request_factory import RequestFactory +from bot.resource.cog.registration.request.unregister_student_request import ( + UnregisterStudentRequest, +) + + +class UnregisterStudentRequestFactory(RequestFactory): + + REQUIRED_ARGUMENTS = 1 + + def __init__(self): + super().__init__(self.REQUIRED_ARGUMENTS) + + self.__discord_id_validator: DiscordIdValidator = DiscordIdValidator() + + def _validate_arguments(self, content: str) -> Tuple[any, ...] or any: + discord_id = self._get_arguments(content) + + if not self.__discord_id_validator.validate(discord_id): + raise InvalidDiscordIdFormatException(discord_id) + + return discord_id + + def create(self, content: str) -> UnregisterStudentRequest: + discord_id = self._validate_arguments(content) + return UnregisterStudentRequest(DiscordUserId(discord_id)) diff --git a/bot/resource/cog/registration/register_member.py b/bot/resource/cog/registration/register_member.py index 8c5a420..15d6aed 100644 --- a/bot/resource/cog/registration/register_member.py +++ b/bot/resource/cog/registration/register_member.py @@ -8,6 +8,9 @@ from bot.resource.cog.registration.factory.force_register_student_request_factory import ( ForceRegisterStudentRequestFactory, ) +from bot.resource.cog.registration.factory.unregister_student_request_factory import ( + UnregisterStudentRequestFactory, +) from bot.resource.cog.registration.request.unregister_student_request import ( UnregisterStudentRequest, ) @@ -46,6 +49,8 @@ def __init__(self): self.__register_student_request_factory = RegisterStudentRequestFactory() + self.__unregister_student_request_factory = UnregisterStudentRequestFactory() + self.__force_register_student_request_factory = ( ForceRegisterStudentRequestFactory() ) @@ -94,9 +99,19 @@ async def add_student(self, context: Context): message: Message = context.message content = Utility.get_content_without_command(message.content) + add_student_request = self.__add_student_request_factory.create(content) - await self.__student_service.add_student(add_student_request) + self.__logger.info( + f"Réception de la requête {repr(add_student_request)}", method="add_student" + ) + + await self.__student_service.add_student( + add_student_request.ni, + add_student_request.firstname, + add_student_request.lastname, + add_student_request.program_code, + ) await message.channel.send(ReplyMessage.SUCCESSFUL_STUDENT_ADDED) @@ -124,7 +139,14 @@ async def register(self, context: Context): content, message.author.id ) - await self.__student_service.register_student(register_student_request) + self.__logger.info( + f"Réception de la requête {repr(register_student_request)}", + method="register_student", + ) + + await self.__student_service.register_student( + register_student_request.ni, register_student_request.discord_id + ) await message.channel.send(ReplyMessage.SUCCESSFUL_REGISTRATION) @@ -151,14 +173,19 @@ async def force_register(self, context: Context): self.__force_register_student_request_factory.create(content) ) + self.__logger.info( + f"Réception de la requête {repr(force_register_student_request)}", + method="force_register_student", + ) + await self.__student_service.force_register_student( - force_register_student_request + force_register_student_request.ni, force_register_student_request.discord_id ) await message.channel.send(ReplyMessage.SUCCESSFUL_FORCE_REGISTRATION) member_to_notify = self.__discord_client.get_user( - force_register_student_request.discord_id + force_register_student_request.discord_id.value ) await member_to_notify.send(ReplyMessage.SUCCESSFUL_REGISTRATION) @@ -180,9 +207,21 @@ async def unregister(self, context: Context): method="unregister", ) - unregister_student_request = UnregisterStudentRequest(context.message.author.id) + message = context.message + + content = Utility.get_content_without_command(message.content) + unregister_student_request: UnregisterStudentRequest = ( + self.__unregister_student_request_factory.create(content) + ) + + self.__logger.info( + f"Réception de la requête {repr(unregister_student_request)}", + method="unregister_student", + ) - await self.__student_service.unregister_student(unregister_student_request) + await self.__student_service.unregister_student( + unregister_student_request.discord_id + ) self.__logger.info( "La commande a été exécutée avec succès.", method="unregister" @@ -209,8 +248,13 @@ async def force_unregister(self, context: Context): self.__force_unregister_student_request_factory.create(content) ) + self.__logger.info( + f"Réception de la requête {repr(force_unregister_student_request)}", + method="force_unregister_student", + ) + await self.__student_service.force_unregister_student( - force_unregister_student_request + force_unregister_student_request.ni ) await message.channel.send(ReplyMessage.SUCCESSFUL_FORCE_UNREGISTER) diff --git a/bot/resource/cog/registration/request/add_student_request.py b/bot/resource/cog/registration/request/add_student_request.py index 48e5e56..4bc95f1 100644 --- a/bot/resource/cog/registration/request/add_student_request.py +++ b/bot/resource/cog/registration/request/add_student_request.py @@ -1,6 +1,18 @@ +from bot.domain.student.attribut.firstname import Firstname +from bot.domain.student.attribut.lastname import Lastname +from bot.domain.student.attribut.ni import NI +from bot.domain.student.attribut.program_code import ProgramCode + + class AddStudentRequest: - def __init__(self, ni: str, firstname: str, lastname: str, program_code: str): + def __init__( + self, + ni: NI, + firstname: Firstname, + lastname: Lastname, + program_code: ProgramCode, + ): self.ni = ni self.firstname = firstname self.lastname = lastname diff --git a/bot/resource/cog/registration/request/force_register_student_request.py b/bot/resource/cog/registration/request/force_register_student_request.py index a4fdcc0..dfbb39d 100644 --- a/bot/resource/cog/registration/request/force_register_student_request.py +++ b/bot/resource/cog/registration/request/force_register_student_request.py @@ -1,6 +1,10 @@ +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.domain.student.attribut.ni import NI + + class ForceRegisterStudentRequest: - def __init__(self, ni: str, discord_id: int): + def __init__(self, ni: NI, discord_id: DiscordUserId): self.ni = ni self.discord_id = discord_id diff --git a/bot/resource/cog/registration/request/force_unregister_student_request.py b/bot/resource/cog/registration/request/force_unregister_student_request.py index 3275895..a048bcc 100644 --- a/bot/resource/cog/registration/request/force_unregister_student_request.py +++ b/bot/resource/cog/registration/request/force_unregister_student_request.py @@ -1,6 +1,9 @@ +from bot.domain.student.attribut.ni import NI + + class ForceUnregisterStudentRequest: - def __init__(self, ni: str): + def __init__(self, ni: NI): self.ni = ni def __repr__(self) -> str: diff --git a/bot/resource/cog/registration/request/register_student_request.py b/bot/resource/cog/registration/request/register_student_request.py index 2347e2d..93bdeff 100644 --- a/bot/resource/cog/registration/request/register_student_request.py +++ b/bot/resource/cog/registration/request/register_student_request.py @@ -1,6 +1,10 @@ +from bot.domain.student.attribut.discord_user_id import DiscordUserId +from bot.domain.student.attribut.ni import NI + + class RegisterStudentRequest: - def __init__(self, ni: str, discord_id: int): + def __init__(self, ni: NI, discord_id: DiscordUserId): self.ni = ni self.discord_id = discord_id diff --git a/bot/resource/cog/registration/request/unregister_student_request.py b/bot/resource/cog/registration/request/unregister_student_request.py index 388addc..6d37bba 100644 --- a/bot/resource/cog/registration/request/unregister_student_request.py +++ b/bot/resource/cog/registration/request/unregister_student_request.py @@ -1,6 +1,9 @@ +from bot.domain.student.attribut.discord_user_id import DiscordUserId + + class UnregisterStudentRequest: - def __init__(self, discord_id: int): + def __init__(self, discord_id: DiscordUserId): self.discord_id = discord_id def __repr__(self) -> str: diff --git a/bot/resource/exception/user_not_in_server_exception.py b/bot/resource/exception/user_not_in_server_exception.py index e45f8b2..9e2b90a 100644 --- a/bot/resource/exception/user_not_in_server_exception.py +++ b/bot/resource/exception/user_not_in_server_exception.py @@ -1,6 +1,9 @@ +from bot.domain.student.attribut.discord_user_id import DiscordUserId + + class UserNotInServerException(RuntimeError): MESSAGE = "L'utilisateur %s n'est pas présent sur le serveur." - def __init__(self, discord_id: int): - super().__init__(self.MESSAGE % discord_id) + def __init__(self, discord_id: DiscordUserId): + super().__init__(self.MESSAGE % discord_id.value) diff --git a/tests/application/test_student_service.py b/tests/application/test_student_service.py index 504447f..e18e173 100644 --- a/tests/application/test_student_service.py +++ b/tests/application/test_student_service.py @@ -2,7 +2,9 @@ from unittest.mock import MagicMock, AsyncMock, patch -from bot.application.student.exceptions.student_already_exist import StudentAlreadyExistsException +from bot.application.student.exceptions.student_already_exist import ( + StudentAlreadyExistsException, +) from bot.application.student.exceptions.student_already_registered_exception import ( StudentAlreadyRegisteredException, ) @@ -20,49 +22,36 @@ StudentNotFoundException, ) from bot.infra.student.in_memory_student_repository import InMemoryStudentRepository -from bot.resource.cog.registration.request.add_student_request import AddStudentRequest -from bot.resource.cog.registration.request.force_register_student_request import ( - ForceRegisterStudentRequest, -) -from bot.resource.cog.registration.request.force_unregister_student_request import ( - ForceUnregisterStudentRequest, -) -from bot.resource.cog.registration.request.register_student_request import ( - RegisterStudentRequest, -) -from bot.resource.cog.registration.request.unregister_student_request import ( - UnregisterStudentRequest, -) from bot.resource.exception.user_not_in_server_exception import UserNotInServerException -A_BAC_NAME: str = "B-GLO" -A_STUDENT_FIRSTNAME: str = "Jack" -A_STUDENT_LASTNAME: str = "Black" +A_PROGRAM_CODE: ProgramCode = ProgramCode("B-GLO") +A_STUDENT_FIRSTNAME: Firstname = Firstname("Jack") +A_STUDENT_LASTNAME: Lastname = Lastname("Black") -A_NI: str = "123456789" -ANOTHER_NI: str = "987654321" -A_DISCORD_ID: int = 123456789012749572 -ANOTHER_DISCORD_ID: int = 944456689012749572 -AN_INVALID_DISCORD_ID: int = -1 +A_NI: NI = NI(123456789) +ANOTHER_NI: NI = NI(987654321) +A_DISCORD_ID: DiscordUserId = DiscordUserId(123456789012749572) +ANOTHER_DISCORD_ID: DiscordUserId = DiscordUserId(944456689012749572) +AN_INVALID_DISCORD_ID: DiscordUserId = DiscordUserId(-1) -def given_unregistered_student(ni: str) -> Student: +def given_unregistered_student(ni: NI) -> Student: return Student( - NI(value=int(ni)), - Firstname(value=A_STUDENT_FIRSTNAME), - Lastname(value=A_STUDENT_LASTNAME), - ProgramCode(value=A_BAC_NAME), - DiscordUserId(value=AN_INVALID_DISCORD_ID), + ni, + A_STUDENT_FIRSTNAME, + A_STUDENT_LASTNAME, + A_PROGRAM_CODE, + AN_INVALID_DISCORD_ID, ) -def given_registered_student(ni: str, discord_user_id: int) -> Student: +def given_registered_student(ni: NI, discord_user_id: DiscordUserId) -> Student: return Student( - NI(value=int(ni)), - Firstname(value=A_STUDENT_FIRSTNAME), - Lastname(value=A_STUDENT_LASTNAME), - ProgramCode(value=A_BAC_NAME), - DiscordUserId(value=discord_user_id), + ni, + A_STUDENT_FIRSTNAME, + A_STUDENT_LASTNAME, + A_PROGRAM_CODE, + discord_user_id, ) @@ -84,12 +73,10 @@ async def test__given_no_students__when_add_student__then_student_is_added( student_service: StudentService = StudentService(student_repository) - request: AddStudentRequest = AddStudentRequest( - A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_BAC_NAME + await student_service.add_student( + A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_PROGRAM_CODE ) - await student_service.add_student(request) - @pytest.mark.asyncio async def test__given_registered_student__when_add_same_student__then_student_already_registered_exception( @@ -99,16 +86,16 @@ async def test__given_registered_student__when_add_same_student__then_student_al ServiceLocator.register_dependency(Logger, logger_mock) registered_student: Student = given_registered_student(A_NI, A_DISCORD_ID) - student_repository: StudentRepository = InMemoryStudentRepository([registered_student]) + student_repository: StudentRepository = InMemoryStudentRepository( + [registered_student] + ) student_service: StudentService = StudentService(student_repository) - request: AddStudentRequest = AddStudentRequest( - A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_BAC_NAME - ) - with pytest.raises(StudentAlreadyRegisteredException): - await student_service.add_student(request) + await student_service.add_student( + A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_PROGRAM_CODE + ) @pytest.mark.asyncio @@ -123,12 +110,10 @@ async def test__given_a_student__when_add_already_existing_student__then_student student_service: StudentService = StudentService(student_repository) - request: AddStudentRequest = AddStudentRequest( - A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_BAC_NAME - ) - with pytest.raises(StudentAlreadyExistsException): - await student_service.add_student(request) + await student_service.add_student( + A_NI, A_STUDENT_FIRSTNAME, A_STUDENT_LASTNAME, A_PROGRAM_CODE + ) @pytest.mark.asyncio @@ -145,11 +130,7 @@ async def test__given_unregistered_student__when_register_student__then_student_ student_service: StudentService = StudentService(student_repository) - register_request: RegisterStudentRequest = RegisterStudentRequest( - A_NI, A_DISCORD_ID - ) - - await student_service.register_student(register_request) + await student_service.register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -166,16 +147,12 @@ async def test__given_unregistered_student__when_force_register_student__then_st student_service: StudentService = StudentService(student_repository) - request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( - A_NI, A_DISCORD_ID - ) - with patch( "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = True - await student_service.force_register_student(request) + await student_service.force_register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -192,17 +169,13 @@ async def test__given_unregistered_student_and_discord_user_id_not_on_server__wh student_service: StudentService = StudentService(student_repository) - request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( - A_NI, ANOTHER_DISCORD_ID - ) - with patch( "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = False with pytest.raises(UserNotInServerException): - await student_service.force_register_student(request) + await student_service.force_register_student(A_NI, ANOTHER_DISCORD_ID) @pytest.mark.asyncio @@ -216,17 +189,13 @@ async def test__given_no_students__when_force_register_student__then_student_not student_service: StudentService = StudentService(student_repository) - request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( - A_NI, A_DISCORD_ID - ) - with patch( "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = True with pytest.raises(StudentNotFoundException): - await student_service.force_register_student(request) + await student_service.force_register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -243,17 +212,13 @@ async def test__given_already_registered_student__when_force_register_student__t student_service: StudentService = StudentService(student_repository) - request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( - A_NI, A_DISCORD_ID - ) - with patch( "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = True with pytest.raises(StudentAlreadyRegisteredException): - await student_service.force_register_student(request) + await student_service.force_register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -271,17 +236,13 @@ async def test__given_already_registered_student__when_force_register_with_same_ student_service: StudentService = StudentService(student_repository) - request: ForceRegisterStudentRequest = ForceRegisterStudentRequest( - ANOTHER_NI, A_DISCORD_ID - ) - with patch( "bot.domain.utility.Utility.does_user_exist_on_server" ) as mock_does_user_exist_on_server: mock_does_user_exist_on_server.return_value = True with pytest.raises(StudentAlreadyRegisteredException): - await student_service.force_register_student(request) + await student_service.force_register_student(ANOTHER_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -299,12 +260,8 @@ async def test__given_already_registered_student__when_register_with_same_discor student_service: StudentService = StudentService(student_repository) - register_request: RegisterStudentRequest = RegisterStudentRequest( - ANOTHER_NI, A_DISCORD_ID - ) - with pytest.raises(StudentAlreadyRegisteredException): - await student_service.register_student(register_request) + await student_service.register_student(ANOTHER_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -317,12 +274,8 @@ async def test__given_no_students_and_unregistered_student__when_register_studen student_repository: StudentRepository = InMemoryStudentRepository([]) student_service: StudentService = StudentService(student_repository) - register_request: RegisterStudentRequest = RegisterStudentRequest( - A_NI, A_DISCORD_ID - ) - with pytest.raises(StudentNotFoundException): - await student_service.register_student(register_request) + await student_service.register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -340,12 +293,8 @@ async def test__given_registered_student__when_register_student__then_raise_stud student_service: StudentService = StudentService(student_repository) - register_request: RegisterStudentRequest = RegisterStudentRequest( - A_NI, A_DISCORD_ID - ) - with pytest.raises(StudentAlreadyRegisteredException): - await student_service.register_student(register_request) + await student_service.register_student(A_NI, A_DISCORD_ID) @pytest.mark.asyncio @@ -363,12 +312,10 @@ async def test__given_registered_student__when_unregister_student__then_student_ student_service: StudentService = StudentService(student_repository) student_service.notify_on_student_unregistered = AsyncMock() - request: UnregisterStudentRequest = UnregisterStudentRequest(A_DISCORD_ID) - - await student_service.unregister_student(request) + await student_service.unregister_student(A_DISCORD_ID) student_service.notify_on_student_unregistered.assert_awaited_once_with( - DiscordUserId(value=A_DISCORD_ID) + A_DISCORD_ID ) @@ -387,10 +334,8 @@ async def test__given_unregistered_student__when_unregister_student__then_studen student_service: StudentService = StudentService(student_repository) student_service.notify_on_student_unregistered = AsyncMock() - request: UnregisterStudentRequest = UnregisterStudentRequest(A_DISCORD_ID) - with pytest.raises(StudentNotFoundException): - await student_service.unregister_student(request) + await student_service.unregister_student(A_DISCORD_ID) @pytest.mark.asyncio @@ -408,9 +353,7 @@ async def test__given_registered_student__when_force_unregister_student__then_st student_service: StudentService = StudentService(student_repository) student_service.notify_on_student_unregistered = AsyncMock() - request: ForceUnregisterStudentRequest = ForceUnregisterStudentRequest(A_NI) - - await student_service.force_unregister_student(request) + await student_service.force_unregister_student(A_NI) with patch( "bot.domain.utility.Utility.does_user_exist_on_server" @@ -418,5 +361,5 @@ async def test__given_registered_student__when_force_unregister_student__then_st mock_does_user_exist_on_server.return_value = True student_service.notify_on_student_unregistered.assert_awaited_once_with( - DiscordUserId(value=A_DISCORD_ID) + A_DISCORD_ID )