forked from sh-edraft.de/sh_discord_bot
		
	Added get filtered servers #72
This commit is contained in:
		| @@ -2,9 +2,11 @@ from cpl_core.configuration import ConfigurationABC | ||||
| from cpl_core.environment import ApplicationEnvironmentABC | ||||
| from cpl_core.mailing import EMailClientABC, EMailClientSettings | ||||
| from cpl_translation import TranslatePipe | ||||
| from flask import Response, jsonify | ||||
| from flask import Response, jsonify, request | ||||
|  | ||||
| from bot_api.api import Api | ||||
| from bot_api.filter.discord.server_select_criteria import ServerSelectCriteria | ||||
| from bot_api.json_processor import JSONProcessor | ||||
| from bot_api.logging.api_logger import ApiLogger | ||||
| from bot_api.route.route import Route | ||||
| from bot_api.service.discord_service import DiscordService | ||||
| @@ -41,6 +43,14 @@ class ServerController: | ||||
|         result = result.select(lambda x: x.to_dict()) | ||||
|         return jsonify(result) | ||||
|  | ||||
|     @Route.get(f'{BasePath}/servers/get/filtered') | ||||
|     @Route.authorize | ||||
|     async def get_all_servers_by_user(self) -> Response: | ||||
|         dto: ServerSelectCriteria = JSONProcessor.process(ServerSelectCriteria, request.get_json(force=True, silent=True)) | ||||
|         result = await self._discord_service.get_filtered_servers_async(dto) | ||||
|         result.result = result.result.select(lambda x: x.to_dict()) | ||||
|         return jsonify(result.to_dict()) | ||||
|  | ||||
|     @Route.get(f'{BasePath}/servers-by-user') | ||||
|     @Route.authorize | ||||
|     async def get_all_servers_by_user(self) -> Response: | ||||
|   | ||||
							
								
								
									
										0
									
								
								kdb-bot/src/bot_api/filter/discord/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								kdb-bot/src/bot_api/filter/discord/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										17
									
								
								kdb-bot/src/bot_api/filter/discord/server_select_criteria.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								kdb-bot/src/bot_api/filter/discord/server_select_criteria.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| from bot_api.abc.select_criteria_abc import SelectCriteriaABC | ||||
|  | ||||
|  | ||||
| class ServerSelectCriteria(SelectCriteriaABC): | ||||
|  | ||||
|     def __init__( | ||||
|             self, | ||||
|             page_index: int, | ||||
|             page_size: int, | ||||
|             sort_direction: str, | ||||
|             sort_column: str, | ||||
|  | ||||
|             name: str, | ||||
|     ): | ||||
|         SelectCriteriaABC.__init__(self, page_index, page_size, sort_direction, sort_column) | ||||
|  | ||||
|         self.name = name | ||||
| @@ -0,0 +1,21 @@ | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_api.abc.dto_abc import DtoABC | ||||
| from bot_data.filtered_result import FilteredResult | ||||
|  | ||||
|  | ||||
| class ServerFilteredResultDTO(DtoABC, FilteredResult): | ||||
|  | ||||
|     def __init__(self, result: List = None, total_count: int = 0): | ||||
|         DtoABC.__init__(self) | ||||
|         FilteredResult.__init__(self, result, total_count) | ||||
|  | ||||
|     def from_dict(self, values: dict): | ||||
|         self._result = values['servers'] | ||||
|         self._total_count = values['totalCount'] | ||||
|  | ||||
|     def to_dict(self) -> dict: | ||||
|         return { | ||||
|             'servers': self.result, | ||||
|             'totalCount': self.total_count | ||||
|         } | ||||
| @@ -7,7 +7,9 @@ from flask import jsonify | ||||
| from bot_api.abc.auth_service_abc import AuthServiceABC | ||||
| from bot_api.exception.service_error_code_enum import ServiceErrorCode | ||||
| from bot_api.exception.service_exception import ServiceException | ||||
| from bot_api.filter.discord.server_select_criteria import ServerSelectCriteria | ||||
| from bot_api.model.discord.server_dto import ServerDTO | ||||
| from bot_api.model.discord.server_filtered_result_dto import ServerFilteredResultDTO | ||||
| from bot_api.model.error_dto import ErrorDTO | ||||
| from bot_api.transformer.server_transformer import ServerTransformer | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| @@ -35,6 +37,29 @@ class DiscordService: | ||||
|             lambda x: ServerTransformer.to_dto(x, self._bot.get_guild(x.discord_server_id).name, self._bot.get_guild(x.discord_server_id).member_count) | ||||
|         ) | ||||
|  | ||||
|     async def get_filtered_servers_async(self, criteria: ServerSelectCriteria) -> ServerFilteredResultDTO: | ||||
|         token = self._auth.get_decoded_token_from_request() | ||||
|         if token is None or 'email' not in token or 'role' not in token: | ||||
|             raise ServiceException(ServiceErrorCode.InvalidData, 'Token invalid') | ||||
|  | ||||
|         role = AuthRoleEnum(token['role']) | ||||
|         role = AuthRoleEnum(token['role']) | ||||
|         filtered_result = self._servers.get_filtered_servers(criteria) | ||||
|         servers = filtered_result.result | ||||
|         if role != AuthRoleEnum.admin: | ||||
|             user = await self._auth.find_auth_user_by_email_async(token['email']) | ||||
|             user_from_db = self._users.find_user_by_id(0 if user.user_id is None else user.user_id) | ||||
|             servers = servers.where(lambda x: user_from_db is not None and x.server_id == user_from_db.server.server_id) | ||||
|  | ||||
|         result = servers.select( | ||||
|             lambda x: ServerTransformer.to_dto(x, self._bot.get_guild(x.discord_server_id).name, self._bot.get_guild(x.discord_server_id).member_count) | ||||
|         ) | ||||
|  | ||||
|         return ServerFilteredResultDTO( | ||||
|             List(ServerDTO, result), | ||||
|             servers.total_count | ||||
|         ) | ||||
|  | ||||
|     async def get_all_servers_by_user(self) -> List[ServerDTO]: | ||||
|         token = self._auth.get_decoded_token_from_request() | ||||
|         if token is None or 'email' not in token or 'role' not in token: | ||||
|   | ||||
| @@ -3,6 +3,8 @@ from typing import Optional | ||||
|  | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_api.filter.discord.server_select_criteria import ServerSelectCriteria | ||||
| from bot_data.filtered_result import FilteredResult | ||||
| from bot_data.model.server import Server | ||||
|  | ||||
|  | ||||
| @@ -13,6 +15,9 @@ class ServerRepositoryABC(ABC): | ||||
|      | ||||
|     @abstractmethod | ||||
|     def get_servers(self) -> List[Server]: pass | ||||
|  | ||||
|     @abstractmethod | ||||
|     def get_filtered_servers(self, criteria: ServerSelectCriteria) -> FilteredResult: pass | ||||
|      | ||||
|     @abstractmethod | ||||
|     def get_server_by_id(self, id: int) -> Server: pass | ||||
|   | ||||
| @@ -3,8 +3,10 @@ from typing import Optional | ||||
| from cpl_core.database.context import DatabaseContextABC | ||||
| from cpl_query.extension import List | ||||
|  | ||||
| from bot_api.filter.discord.server_select_criteria import ServerSelectCriteria | ||||
| from bot_core.logging.database_logger import DatabaseLogger | ||||
| from bot_data.abc.server_repository_abc import ServerRepositoryABC | ||||
| from bot_data.filtered_result import FilteredResult | ||||
| from bot_data.model.server import Server | ||||
|  | ||||
|  | ||||
| @@ -28,6 +30,29 @@ class ServerRepositoryService(ServerRepositoryABC): | ||||
|  | ||||
|         return servers | ||||
|  | ||||
|     def get_filtered_servers(self, criteria: ServerSelectCriteria) -> FilteredResult: | ||||
|         servers = self.get_servers() | ||||
|         self._logger.trace(__name__, f'Send SQL command: {Server.get_select_all_string()}') | ||||
|         query = servers | ||||
|  | ||||
|         if criteria.name is not None and criteria.name != '': | ||||
|             query = query.where(lambda x: criteria.name in x.first_name or x.first_name == criteria.name) | ||||
|  | ||||
|         # sort | ||||
|         if criteria.sort_column is not None and criteria.sort_column != '' and criteria.sort_direction is not None and criteria.sort_direction: | ||||
|             crit_sort_direction = criteria.sort_direction.lower() | ||||
|             if crit_sort_direction == "desc" or crit_sort_direction == "descending": | ||||
|                 query = query.order_by_descending(lambda x: getattr(x, criteria.sort_column)) | ||||
|             else: | ||||
|                 query = query.order_by(lambda x: getattr(x, criteria.sort_column)) | ||||
|  | ||||
|         result = FilteredResult() | ||||
|         result.total_count = query.count() | ||||
|         skip = criteria.page_size * criteria.page_index | ||||
|         result.result = query.skip(skip).take(criteria.page_size) | ||||
|  | ||||
|         return result | ||||
|  | ||||
|     def get_server_by_id(self, server_id: int) -> Server: | ||||
|         self._logger.trace(__name__, f'Send SQL command: {Server.get_select_by_id_string(server_id)}') | ||||
|         result = self._context.select(Server.get_select_by_id_string(server_id))[0] | ||||
|   | ||||
		Reference in New Issue
	
	Block a user