diff --git a/kdb-bot/src/bot_data/model/user_warnings_history.py b/kdb-bot/src/bot_data/model/user_warnings_history.py new file mode 100644 index 00000000..a0ddef24 --- /dev/null +++ b/kdb-bot/src/bot_data/model/user_warnings_history.py @@ -0,0 +1,43 @@ +from typing import Optional + +from bot_data.abc.history_table_abc import HistoryTableABC + + +# had to name it UserWarnings instead of UserWarning because UserWarning is a builtin class +class UserWarningsHistory(HistoryTableABC): + def __init__( + self, + description: str, + user: int, + author: Optional[int], + deleted: bool, + date_from: str, + date_to: str, + id=0, + ): + HistoryTableABC.__init__(self) + + self._id = id + self._description = description + self._user = user + self._author = author + + self._deleted = deleted + self._date_from = date_from + self._date_to = date_to + + @property + def id(self) -> int: + return self._id + + @property + def description(self) -> str: + return self._description + + @property + def user(self) -> int: + return self._user + + @property + def author(self) -> Optional[int]: + return self._author diff --git a/kdb-bot/src/bot_graphql/filter/achievement_filter.py b/kdb-bot/src/bot_graphql/filter/achievement_filter.py index 674af502..b95e00c0 100644 --- a/kdb-bot/src/bot_graphql/filter/achievement_filter.py +++ b/kdb-bot/src/bot_graphql/filter/achievement_filter.py @@ -1,3 +1,4 @@ +from cpl_core.dependency_injection import ServiceProviderABC from cpl_query.extension import List from bot_data.model.user import User @@ -5,9 +6,14 @@ from bot_graphql.abc.filter_abc import FilterABC class AchievementFilter(FilterABC): - def __init__(self): + def __init__( + self, + services: ServiceProviderABC, + ): FilterABC.__init__(self) + self._services = services + self._id = None self._name = None self._description = None diff --git a/kdb-bot/src/bot_graphql/filter/user_warning_filter.py b/kdb-bot/src/bot_graphql/filter/user_warning_filter.py new file mode 100644 index 00000000..2c716c9e --- /dev/null +++ b/kdb-bot/src/bot_graphql/filter/user_warning_filter.py @@ -0,0 +1,56 @@ +from cpl_core.dependency_injection import ServiceProviderABC +from cpl_query.extension import List + +from bot_data.model.user_warnings import UserWarnings +from bot_graphql.abc.filter_abc import FilterABC + + +class UserWarningFilter(FilterABC): + def __init__( + self, + services: ServiceProviderABC, + ): + FilterABC.__init__(self) + + self._services = services + + self._id = None + self._user = None + self._description = None + self._author = None + + def from_dict(self, values: dict): + if "id" in values: + self._id = int(values["id"]) + + if "user" in values: + from bot_graphql.filter.user_filter import UserFilter + + self._user: UserFilter = self._services.get_service(UserFilter) + self._user.from_dict(values["user"]) + + if "description" in values: + self._description = values["description"] + + if "author" in values: + from bot_graphql.filter.user_filter import UserFilter + + self._author: UserFilter = self._services.get_service(UserFilter) + self._author.from_dict(values["author"]) + + def filter(self, query: List[UserWarnings]) -> List[UserWarnings]: + if self._id is not None: + query = query.where(lambda x: x.id == self._id) + + if self._user is not None: + users = self._user.filter(query.select(lambda x: x.user)).select(lambda x: x.id) + query = query.where(lambda x: x.id in users) + + if self._description is not None: + query = query.where(lambda x: x.description == self._description or self._description in x.description) + + if self._author is not None: + users = self._author.filter(query.select(lambda x: x.author)).select(lambda x: x.id) + query = query.where(lambda x: x.id in users) + + return query diff --git a/kdb-bot/src/bot_graphql/graphql/query.gql b/kdb-bot/src/bot_graphql/graphql/query.gql index 8946e9a9..ffa3c21f 100644 --- a/kdb-bot/src/bot_graphql/graphql/query.gql +++ b/kdb-bot/src/bot_graphql/graphql/query.gql @@ -41,6 +41,9 @@ type Query { shortRoleNames(filter: ShortRoleNameFilter, page: Page, sort: Sort): [ShortRoleName] shortRoleNamePositions: [String] + userWarningCount: Int + userWarnings(filter: UserWarningFilter, page: Page, sort: Sort): [UserWarning] + technicianConfig: TechnicianConfig possibleFeatureFlags: [String] discord: Discord diff --git a/kdb-bot/src/bot_graphql/graphql/user.gql b/kdb-bot/src/bot_graphql/graphql/user.gql index 38db3573..84800a8b 100644 --- a/kdb-bot/src/bot_graphql/graphql/user.gql +++ b/kdb-bot/src/bot_graphql/graphql/user.gql @@ -20,6 +20,9 @@ type User implements TableWithHistoryQuery { achievementCount: Int achievements(filter: AchievementFilter, page: Page, sort: Sort): [Achievement] + userWarningCount: Int + userWarnings(filter: UserWarningFilter, page: Page, sort: Sort): [UserWarning] + server: Server leftServer: Boolean diff --git a/kdb-bot/src/bot_graphql/graphql/userWarning.gql b/kdb-bot/src/bot_graphql/graphql/userWarning.gql new file mode 100644 index 00000000..22454da3 --- /dev/null +++ b/kdb-bot/src/bot_graphql/graphql/userWarning.gql @@ -0,0 +1,27 @@ +type UserWarning implements TableWithHistoryQuery { + id: ID + user: User + description: String + author: User + + createdAt: String + modifiedAt: String + + history: [UserWarningHistory] +} + +type UserWarningHistory implements HistoryTableQuery { + id: ID + user: ID + description: String + author: ID + + deleted: Boolean + dateFrom: String + dateTo: String +} + +input UserWarningFilter { + id: ID + user: UserFilter +} \ No newline at end of file diff --git a/kdb-bot/src/bot_graphql/graphql_module.py b/kdb-bot/src/bot_graphql/graphql_module.py index 96c72797..07d028c0 100644 --- a/kdb-bot/src/bot_graphql/graphql_module.py +++ b/kdb-bot/src/bot_graphql/graphql_module.py @@ -18,6 +18,7 @@ from bot_graphql.filter.user_filter import UserFilter from bot_graphql.filter.user_joined_game_server_filter import UserJoinedGameServerFilter from bot_graphql.filter.user_joined_server_filter import UserJoinedServerFilter from bot_graphql.filter.user_joined_voice_channel_filter import UserJoinedVoiceChannelFilter +from bot_graphql.filter.user_warning_filter import UserWarningFilter from bot_graphql.graphql_service import GraphQLService from bot_graphql.mutation import Mutation from bot_graphql.mutations.achievement_mutation import AchievementMutation @@ -66,6 +67,8 @@ from bot_graphql.queries.user_joined_server_query import UserJoinedServerQuery from bot_graphql.queries.user_joined_voice_channel_history_query import UserJoinedVoiceChannelHistoryQuery from bot_graphql.queries.user_joined_voice_channel_query import UserJoinedVoiceChannelQuery from bot_graphql.queries.user_query import UserQuery +from bot_graphql.queries.user_warning_history_query import UserWarningHistoryQuery +from bot_graphql.queries.user_warning_query import UserWarningQuery from bot_graphql.query import Query from bot_graphql.schema import Schema @@ -115,6 +118,8 @@ class GraphQLModule(ModuleABC): services.add_transient(QueryABC, UserJoinedGameServerQuery) services.add_transient(QueryABC, ShortRoleNameHistoryQuery) services.add_transient(QueryABC, ShortRoleNameQuery) + services.add_transient(QueryABC, UserWarningHistoryQuery) + services.add_transient(QueryABC, UserWarningQuery) services.add_transient(QueryABC, DiscordQuery) services.add_transient(QueryABC, GuildQuery) @@ -135,6 +140,7 @@ class GraphQLModule(ModuleABC): services.add_transient(FilterABC, UserJoinedVoiceChannelFilter) services.add_transient(FilterABC, UserJoinedGameServerFilter) services.add_transient(FilterABC, ShortRoleNameFilter) + services.add_transient(FilterABC, UserWarningFilter) # mutations services.add_transient(QueryABC, AutoRoleMutation) diff --git a/kdb-bot/src/bot_graphql/queries/user_query.py b/kdb-bot/src/bot_graphql/queries/user_query.py index 9bb4a48b..f015c847 100644 --- a/kdb-bot/src/bot_graphql/queries/user_query.py +++ b/kdb-bot/src/bot_graphql/queries/user_query.py @@ -6,6 +6,7 @@ from bot_data.abc.achievement_repository_abc import AchievementRepositoryABC from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameServerRepositoryABC from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC from bot_data.abc.user_joined_voice_channel_repository_abc import UserJoinedVoiceChannelRepositoryABC +from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC from bot_data.model.user import User from bot_data.model.user_history import UserHistory from bot_graphql.abc.data_query_with_history_abc import DataQueryWithHistoryABC @@ -13,6 +14,7 @@ from bot_graphql.filter.achievement_filter import AchievementFilter from bot_graphql.filter.user_joined_game_server_filter import UserJoinedGameServerFilter from bot_graphql.filter.user_joined_server_filter import UserJoinedServerFilter from bot_graphql.filter.user_joined_voice_channel_filter import UserJoinedVoiceChannelFilter +from bot_graphql.filter.user_warning_filter import UserWarningFilter from modules.level.service.level_service import LevelService from modules.permission.abc.permission_service_abc import PermissionServiceABC @@ -29,6 +31,7 @@ class UserQuery(DataQueryWithHistoryABC): user_joined_game_server: UserJoinedGameServerRepositoryABC, permissions: PermissionServiceABC, achievements: AchievementRepositoryABC, + user_warnings: UserWarningsRepositoryABC, ): DataQueryWithHistoryABC.__init__(self, "User", "UsersHistory", UserHistory, db) @@ -67,6 +70,9 @@ class UserQuery(DataQueryWithHistoryABC): self.add_collection( "achievement", lambda user, *_: achievements.get_achievements_by_user_id(user.id), AchievementFilter ) + self.add_collection( + "userWarning", lambda user, *_: user_warnings.get_user_warnings_by_user_id(user.id), UserWarningFilter + ) self.set_field("server", self.resolve_server) self.set_field("leftServer", self.resolve_left_server) diff --git a/kdb-bot/src/bot_graphql/queries/user_warning_history_query.py b/kdb-bot/src/bot_graphql/queries/user_warning_history_query.py new file mode 100644 index 00000000..c120e360 --- /dev/null +++ b/kdb-bot/src/bot_graphql/queries/user_warning_history_query.py @@ -0,0 +1,11 @@ +from bot_graphql.abc.history_query_abc import HistoryQueryABC + + +class UserWarningHistoryQuery(HistoryQueryABC): + def __init__(self): + HistoryQueryABC.__init__(self, "UserWarning") + + self.set_field("id", lambda x, *_: x.id) + self.set_field("user", lambda x, *_: x.user) + self.set_field("description", lambda x, *_: x.description) + self.set_field("author", lambda x, *_: x.author) diff --git a/kdb-bot/src/bot_graphql/queries/user_warning_query.py b/kdb-bot/src/bot_graphql/queries/user_warning_query.py new file mode 100644 index 00000000..f6243d5e --- /dev/null +++ b/kdb-bot/src/bot_graphql/queries/user_warning_query.py @@ -0,0 +1,17 @@ +from cpl_core.database.context import DatabaseContextABC + +from bot_data.model.user_warnings_history import UserWarningsHistory +from bot_graphql.abc.data_query_with_history_abc import DataQueryWithHistoryABC + + +class UserWarningQuery(DataQueryWithHistoryABC): + def __init__( + self, + db: DatabaseContextABC, + ): + DataQueryWithHistoryABC.__init__(self, "UserWarning", "UserWarningsHistory", UserWarningsHistory, db) + + self.set_field("id", lambda x, *_: x.id) + self.set_field("user", lambda x, *_: x.user) + self.set_field("description", lambda x, *_: x.description) + self.set_field("author", lambda x, *_: x.author) diff --git a/kdb-bot/src/bot_graphql/query.py b/kdb-bot/src/bot_graphql/query.py index abde5cb0..5ddb67dd 100644 --- a/kdb-bot/src/bot_graphql/query.py +++ b/kdb-bot/src/bot_graphql/query.py @@ -15,6 +15,7 @@ from bot_data.abc.user_joined_game_server_repository_abc import UserJoinedGameSe from bot_data.abc.user_joined_server_repository_abc import UserJoinedServerRepositoryABC from bot_data.abc.user_joined_voice_channel_repository_abc import UserJoinedVoiceChannelRepositoryABC from bot_data.abc.user_repository_abc import UserRepositoryABC +from bot_data.abc.user_warnings_repository_abc import UserWarningsRepositoryABC from bot_data.model.short_role_name_position_enum import ShortRoleNamePositionEnum from bot_graphql.abc.query_abc import QueryABC from bot_graphql.filter.achievement_filter import AchievementFilter @@ -28,6 +29,7 @@ from bot_graphql.filter.user_filter import UserFilter from bot_graphql.filter.user_joined_game_server_filter import UserJoinedGameServerFilter from bot_graphql.filter.user_joined_server_filter import UserJoinedServerFilter from bot_graphql.filter.user_joined_voice_channel_filter import UserJoinedVoiceChannelFilter +from bot_graphql.filter.user_warning_filter import UserWarningFilter from bot_graphql.model.discord import Discord from modules.achievements.achievement_service import AchievementService @@ -48,6 +50,7 @@ class Query(QueryABC): users: UserRepositoryABC, achievements: AchievementRepositoryABC, short_role_names: ShortRoleNameRepositoryABC, + user_warnings: UserWarningsRepositoryABC, achievement_service: AchievementService, technician_config: TechnicianConfigRepositoryABC, ): @@ -76,11 +79,13 @@ class Query(QueryABC): self.add_collection("user", lambda *_: users.get_users(), UserFilter) self.add_collection("achievement", lambda *_: achievements.get_achievements(), AchievementFilter) self.add_collection("shortRoleName", lambda *_: short_role_names.get_short_role_names(), ShortRoleNameFilter) + self.add_collection("userWarning", lambda *_: user_warnings.get_user_warnings(), UserWarningFilter) self.set_field("technicianConfig", lambda *_: technician_config.get_technician_config()) self.set_field("achievementAttributes", lambda *_: achievement_service.get_attributes()) self.set_field("achievementOperators", lambda *_: achievement_service.get_operators()) self.set_field("shortRoleNamePositions", lambda *_: [x.value for x in ShortRoleNamePositionEnum]) + self.set_field("possibleFeatureFlags", lambda *_: [e.value for e in FeatureFlagsEnum]) self.set_field("discord", lambda *_: Discord(bot.guilds, List(any).extend(bot.users))) diff --git a/kdb-web/package.json b/kdb-web/package.json index 1b99a94e..c7f77d8c 100644 --- a/kdb-web/package.json +++ b/kdb-web/package.json @@ -1,6 +1,6 @@ { "name": "kdb-web", - "version": "1.1.10", + "version": "1.1.dev402", "scripts": { "ng": "ng", "update-version": "ts-node update-version.ts", @@ -51,4 +51,4 @@ "tslib": "^2.4.1", "typescript": "~4.9.5" } -} +} \ No newline at end of file diff --git a/kdb-web/src/app/models/data/user.model.ts b/kdb-web/src/app/models/data/user.model.ts index 6d649da4..8082e781 100644 --- a/kdb-web/src/app/models/data/user.model.ts +++ b/kdb-web/src/app/models/data/user.model.ts @@ -5,6 +5,7 @@ import { UserJoinedServer } from "./user_joined_server.model"; import { UserJoinedVoiceChannel } from "./user_joined_voice_channel.model"; import { UserJoinedGameServer } from "./user_joined_game_server.model"; import { Achievement } from "./achievement.model"; +import { UserWarning } from "./user_warning.model"; export interface User extends DataWithHistory { id?: number; @@ -29,6 +30,9 @@ export interface User extends DataWithHistory { achievementCount?: number; achievements?: Achievement[]; + + userWarningCount?: number; + userWarnings?: UserWarning[]; } export interface UserFilter { diff --git a/kdb-web/src/app/models/data/user_warning.model.ts b/kdb-web/src/app/models/data/user_warning.model.ts new file mode 100644 index 00000000..37ceeae9 --- /dev/null +++ b/kdb-web/src/app/models/data/user_warning.model.ts @@ -0,0 +1,16 @@ +import { DataWithHistory } from "./data.model"; +import { User, UserFilter } from "./user.model"; + +export interface UserWarning extends DataWithHistory { + id?: number; + user?: User; + description?: string; + author?: User; +} + +export interface UserWarningFilter { + id?: number; + user?: UserFilter; + description?: string; + author?: UserFilter; +} diff --git a/kdb-web/src/app/models/graphql/queries.model.ts b/kdb-web/src/app/models/graphql/queries.model.ts index 02c2da1d..4f87d53b 100644 --- a/kdb-web/src/app/models/graphql/queries.model.ts +++ b/kdb-web/src/app/models/graphql/queries.model.ts @@ -208,7 +208,7 @@ export class Queries { query { shortRoleNamePositions } - ` + `; static shortRoleNameQuery = ` query ShortRoleNameList($serverId: ID, $filter: ShortRoleNameFilter, $page: Page, $sort: Sort) { @@ -279,58 +279,94 @@ export class Queries { static userProfile = ` query UserProfile($serverId: ID, $userId: ID, $page: Page, $sort: Sort) { - servers(filter: {id: $serverId}) { - userCount - users(filter: {id: $userId}, page: $page, sort: $sort) { + userCount + users(filter: {server: {id: $serverId}, id: $userId}, page: $page, sort: $sort) { + id + discordId + name + xp + ontime + level { id - discordId name - xp - ontime - level { + } + leftServer + server { + id + name + } + + joinedServerCount + joinedServers { + id + joinedOn + leavedOn + } + + createdAt + modifiedAt + } + } + `; + + static userProfileAchievements = ` + query UserProfile($serverId: ID, $userId: ID, $page: Page, $sort: Sort) { + users(filter: {server: {id: $serverId}, id: $userId}, page: $page, sort: $sort) { + achievementCount + achievements { + id + name + description + createdAt + } + } + } + `; + + static userProfileVoiceChannelJoins = ` + query UserProfile($serverId: ID, $userId: ID, $page: Page, $sort: Sort) { + users(filter: {server: {id: $serverId}, id: $userId}, page: $page, sort: $sort) { + joinedVoiceChannelCount + joinedVoiceChannels { + id + channelId + channelName + time + joinedOn + leavedOn + } + } + } + `; + + static userProfileGameserverJoins = ` + query UserProfile($serverId: ID, $userId: ID, $page: Page, $sort: Sort) { + users(filter: {server: {id: $serverId}, id: $userId}, page: $page, sort: $sort) { + userJoinedGameServerCount + userJoinedGameServers { + id + gameServer + time + joinedOn + leavedOn + } + } + } + `; + + static userProfileWarnings = ` + query UserProfile($serverId: ID, $userId: ID, $page: Page, $sort: Sort) { + users(filter: {server: {id: $serverId}, id: $userId}, page: $page, sort: $sort) { + userWarningCount + userWarnings { + id + description + author { id name } - leftServer - server { - id - name - } - - joinedServerCount - joinedServers { - id - joinedOn - leavedOn - } - - joinedVoiceChannelCount - joinedVoiceChannels { - id - channelId - channelName - time - joinedOn - leavedOn - } - - userJoinedGameServerCount - userJoinedGameServers { - id - gameServer - time - joinedOn - leavedOn - } - - achievements { - id - name - createdAt - } createdAt - modifiedAt } } } diff --git a/kdb-web/src/app/models/graphql/query.model.ts b/kdb-web/src/app/models/graphql/query.model.ts index 7fc95684..f98f9a4a 100644 --- a/kdb-web/src/app/models/graphql/query.model.ts +++ b/kdb-web/src/app/models/graphql/query.model.ts @@ -8,6 +8,7 @@ import { TechnicianConfig } from "../config/technician-config.model"; import { ServerConfig } from "../config/server-config.model"; import { ShortRoleName } from "../data/short_role_name.model"; import { FeatureFlag } from "../config/feature-flags.model"; +import { UserWarning } from "../data/user_warning.model"; export interface Query { serverCount: number; @@ -31,6 +32,11 @@ export interface UserListQuery { users: User[]; } +export interface UserWarningQuery { + userWarningCount: number; + userWarnings: UserWarning[]; +} + export interface GameServerListQuery { gameServerCount: number; gameServers: GameServer[]; diff --git a/kdb-web/src/app/modules/view/server/profile/profile.component.html b/kdb-web/src/app/modules/view/server/profile/profile.component.html index 28de57cb..a101087f 100644 --- a/kdb-web/src/app/modules/view/server/profile/profile.component.html +++ b/kdb-web/src/app/modules/view/server/profile/profile.component.html @@ -76,9 +76,103 @@ +