Skip to content

Commit ca2cee7

Browse files
authored
Merge pull request #24 from x-team/feature/XTG-248-change-gametypeid
Feature/xtg 248 change gametypeid to Int
2 parents dfcf85a + a8b87f8 commit ca2cee7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+726
-258
lines changed

Diff for: .env.test

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# API
2+
HOST=0.0.0.0
3+
PORT=3000
4+
5+
# DATABASE
6+
DB_USERNAME=postgres
7+
DB_PASSWORD=*games-2021
8+
DB_NAME=gameshq_api_test
9+
DB_HOSTNAME=127.0.0.1
10+
DB_PORT=5435

Diff for: docker-compose-test.yml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
version: '3.7'
2+
3+
services:
4+
gameshq_api_db_test:
5+
image: postgres:10-alpine
6+
ports:
7+
- '5435:5432'
8+
environment:
9+
POSTGRES_USER: 'postgres'
10+
POSTGRES_DB: 'gameshq_api_test'
11+
POSTGRES_PASSWORD: '*games-2021'
12+
volumes:
13+
- postgres:/var/lib/postgresql/data
14+
networks:
15+
- gameshq_api_db_test_network
16+
volumes:
17+
postgres:
18+
19+
networks:
20+
gameshq_api_db_test_network:

Diff for: migrate.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
#!/usr/bin/env ts-node-script
22

33
import { Sequelize } from 'sequelize';
4-
import { Umzug, SequelizeStorage, MigrationMeta } from 'umzug';
4+
import type { MigrationMeta } from 'umzug';
5+
import { Umzug, SequelizeStorage } from 'umzug';
6+
57
import { sequelizeConfig } from './src/db';
68

79
const sequelize = new Sequelize({ ...sequelizeConfig, logging: undefined });

Diff for: package.json

+5-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"test": "cross-env NODE_ENV=test ENV=test npm run test:all",
1111
"test:integration": "cross-env NODE_ENV=test ENV=test npm run test:_integration",
1212
"test:integration:single": "cross-env NODE_ENV=test ENV=test npm run test:prepare:integration && npm run mocha",
13-
"test:unit": "cross-env NODE_ENV=test ENV=test npm run mocha \"src/**/*.test.ts\" --exclude \"src/**/*.integration.test.ts\"",
13+
"test:unit": "cross-env NODE_ENV=test ENV=test npm run mocha \"test/**/*.test.ts\" --exclude \"test/**/*.integration.test.ts\"",
1414
"test:unit:single": "cross-env NODE_ENV=test ENV=test npm run mocha",
1515
"mocha": "cross-env ENV=test mocha --unhandled-rejections=strict",
1616
"eslint": "eslint src --fix",
@@ -25,13 +25,12 @@
2525
"//1": "/*****************************************************************************",
2626
"//2": "* Rest of those commands are used internally and should not be used directly!",
2727
"//3": "*****************************************************************************/",
28-
"prepare-db": "npm run db:seed:up && npm run db:migrate:up",
28+
"prepare-db": "echo preparing db for $NODE_ENV env && npm run db:seed:up && npm run db:migrate:up",
2929
"clean": "rm -rf dist",
30-
"db:test:create": "cross-env NODE_ENV=test ENV=test sequelize --config='src/config/database.ci.js' db:create || true",
31-
"db:test:drop": "cross-env NODE_ENV=test ENV=test sequelize --config='src/config/database.ci.js' db:drop || true",
30+
"db:test:create": "docker-compose -p gameshq-api-test-project -f 'docker-compose-test.yml' up -d",
3231
"test:all": "concurrently --kill-others-on-fail --names *typescript,*****eslint,*tests:unit,integration --prefix-colors blue.inverse,blue,yellow,green 'npm run tsc' 'npm run eslint --quiet' 'npm run test:unit' 'npm run test:integration'",
33-
"test:prepare:integration": "npm run db:test:drop && npm run db:test:create && npm run prepare-db",
34-
"test:_integration": "npm run test:prepare:integration && npm run mocha \"src/**/*.integration.test.ts\"",
32+
"test:prepare:integration": "npm run db:test:create && cross-env NODE_ENV=test ENV=test npm run prepare-db",
33+
"test:_integration": "npm run test:prepare:integration && npm run mocha \"test/**/*.integration.test.ts\"",
3534
"prepare": "husky install"
3635
},
3736
"author": "X-Team Community",

Diff for: src/api-utils/responseSchemas/gamedev.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import Joi from 'joi';
22

33
const gameItemSchema = Joi.object({
4-
// Pending due to new table design
5-
id: Joi.string(),
4+
id: Joi.number(),
5+
name: Joi.string(),
66
clientSecret: Joi.string(),
77
signingSecret: Joi.string(),
88
_createdById: Joi.number(),

Diff for: src/api-utils/responseSchemas/user.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ const sessionTokenSchema = Joi.object({
1212
const userSessionSchema = Joi.object({
1313
displayName: Joi.string().required(),
1414
email: Joi.string().email().required(),
15-
slackId: Joi.string().optional(),
16-
firebaseUserUid: Joi.string().optional(),
17-
profilePictureUrl: Joi.string().optional(),
15+
slackId: Joi.string().allow(null).optional(),
16+
firebaseUserUid: Joi.string().allow(null).optional(),
17+
profilePictureUrl: Joi.string().allow(null).optional(),
1818
role: Joi.number().required(),
1919
isAdmin: Joi.boolean().required(),
2020
}).options({ stripUnknown: true });
2121

22-
const sessionSchema = Joi.object({
22+
export const sessionSchema = Joi.object({
2323
success: sessionStateSchema,
2424
session: sessionTokenSchema,
2525
user: userSessionSchema,

Diff for: src/config/database.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
const dotenv = require('dotenv');
22
const { getConfig } = require('./index');
33

4-
if (getConfig('NODE_ENV') !== 'production') {
4+
if (getConfig('NODE_ENV') === 'test') {
5+
dotenv.config({ path: '.env.test' });
6+
} else if (getConfig('NODE_ENV') !== 'production') {
57
dotenv.config({ path: '.env.dev' });
68
}
79

@@ -19,7 +21,6 @@ module.exports = {
1921
development: config,
2022
test: {
2123
...config,
22-
database: `${config.database}_test`,
2324
seederStorage: 'none',
2425
},
2526
production: config,

Diff for: src/games/arena/repositories/arena/actions/admin/create-or-finish-game.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { User } from '../../../../../../models';
1+
import type { User } from '../../../../../../models';
22
import { findActiveArenaGame, startArenaGame } from '../../../../../../models/ArenaGame';
33
import { activateAllArenaZones } from '../../../../../../models/ArenaZone';
44
import { enableAllItems } from '../../../../../../models/GameItemAvailability';
@@ -38,7 +38,7 @@ export async function newGame(commandText: string, userRequesting: User) {
3838
transaction
3939
);
4040

41-
await enableAllItems(GAME_TYPE.ARENA, transaction);
41+
await enableAllItems(game._gameTypeId, transaction);
4242
return getGameResponse(arenaCommandReply.adminCreatedGame(game));
4343
});
4444
}
@@ -68,7 +68,7 @@ export async function endGame(userRequesting: User) {
6868
if (!game) {
6969
return getGameError(arenaCommandReply.noActiveGame());
7070
}
71-
await enableAllItems(GAME_TYPE.ARENA, transaction);
71+
await enableAllItems(game._gameTypeId, transaction);
7272
await game.endGame(transaction);
7373
await activateAllArenaZones(transaction);
7474
await publishArenaMessage(arenaCommandReply.channelEndGame(game), true);

Diff for: src/games/arena/repositories/arena/actions/admin/revive-boss.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { User } from '../../../../../../models';
1+
import type { User } from '../../../../../../models';
22
import { findPlayerByUser } from '../../../../../../models/ArenaPlayer';
33
import { findActiveRound } from '../../../../../../models/ArenaRound';
44
import { getUserBySlackId } from '../../../../../../models/User';

Diff for: src/games/arena/repositories/arena/actions/admin/start-round.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { User } from '../../../../../../models';
1+
import type { User } from '../../../../../../models';
22
import { findLivingPlayersByGame } from '../../../../../../models/ArenaPlayer';
33
import {
44
countRoundsCompleted,

Diff for: src/games/arena/repositories/arena/actions/admin/weapons.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { sampleSize } from 'lodash';
2-
import { User, Item } from '../../../../../../models';
2+
3+
import type { User, Item } from '../../../../../../models';
34
import { findActiveArenaGame } from '../../../../../../models/ArenaGame';
45
import { findLivingPlayersByGame } from '../../../../../../models/ArenaPlayer';
56
import { findActiveRound } from '../../../../../../models/ArenaRound';
@@ -24,7 +25,7 @@ export async function selectWeaponForEveryone(userRequesting: User) {
2425
if (!game) {
2526
return getGameError(arenaCommandReply.noActiveGame());
2627
}
27-
const allWeapons = await listActiveWeaponsByGameType(game._gameTypeId, transaction);
28+
const allWeapons = await listActiveWeaponsByGameType(game._gameType.name, transaction);
2829
const [randomWeapon] = sampleSize(allWeapons, ONE);
2930

3031
const slackBlocks = generateGenericWeaponPickerBlock(
@@ -72,7 +73,7 @@ export async function startNarrowWeaponsQuestion(userRequesting: User) {
7273
if (!game) {
7374
return getGameError(arenaCommandReply.noActiveGame());
7475
}
75-
const allWeapons = await listActiveWeaponsByGameType(game._gameTypeId, transaction);
76+
const allWeapons = await listActiveWeaponsByGameType(game._gameType.name, transaction);
7677
const narrowWeaponsBlock = generateNarrowWeaponsBlock(allWeapons);
7778
return getGameResponse(narrowWeaponsBlock);
7879
});

Diff for: src/games/arena/repositories/arena/actions/player/hunt.ts

+6-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { random } from 'lodash';
2-
import { User } from '../../../../../../models';
2+
3+
import type { User } from '../../../../../../models';
34
import { findPlayerByUser } from '../../../../../../models/ArenaPlayer';
45
import { findSinglePlayerPerformance } from '../../../../../../models/ArenaPlayerPerformance';
56
import {
@@ -9,19 +10,16 @@ import {
910
import { findActiveArenaZones } from '../../../../../../models/ArenaZone';
1011
import { findWeaponById } from '../../../../../../models/ItemWeapon';
1112
import { ONE, TRAIT } from '../../../../../consts/global';
12-
import { GameResponse, getGameResponse } from '../../../../../utils';
13+
import type { GameResponse } from '../../../../../utils';
14+
import { getGameResponse } from '../../../../../utils';
1315
import { generateGenericWeaponPickerBlock } from '../../../../../utils/generators/games';
1416
import { ARENA_ACTIONS, ARENA_SECONDARY_ACTIONS } from '../../../../consts';
1517
import {
1618
generateArenaActionsBlockKit,
1719
generateArenaTargetPickerBlock,
1820
} from '../../../../generators/gameplay';
19-
import {
20-
generateTargetGroup,
21-
PlayerActionsDeadOrAlive,
22-
playerActionsParams,
23-
withArenaTransaction,
24-
} from '../../../../utils';
21+
import type { PlayerActionsDeadOrAlive } from '../../../../utils';
22+
import { generateTargetGroup, playerActionsParams, withArenaTransaction } from '../../../../utils';
2523
import { arenaCommandReply } from '../../replies';
2624

2725
export async function hunt(userRequesting: User) {

Diff for: src/games/arena/repositories/arena/engine/index.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import type { Transaction } from 'sequelize/';
2-
import { ArenaRound } from '../../../../../models';
2+
3+
import type { ArenaRound } from '../../../../../models';
34
import { getIdlePlayers } from '../../../../../models/ArenaPlayer';
45
import { setPlayerRoundAction } from '../../../../../models/ArenaRoundAction';
5-
import { ArenaZone, findArenaZoneById } from '../../../../../models/ArenaZone';
6+
import type { ArenaZone } from '../../../../../models/ArenaZone';
7+
import { findArenaZoneById } from '../../../../../models/ArenaZone';
68
import { ZERO } from '../../../../consts/global';
79
import { ARENA_ACTIONS } from '../../../consts';
810
import { filterActionsById, filterActionsByZone, publishArenaMessage } from '../../../utils';
11+
912
import { processChangeLocation } from './processChangeLocation';
1013
import { processCheers } from './processCheer';
1114
import { processHealOrRevive } from './processHealOrRevive';

Diff for: src/games/arena/repositories/arena/engine/processHunt.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import type { Transaction } from 'sequelize';
2-
import { ArenaPlayer, ArenaRound, ArenaRoundAction } from '../../../../../models';
2+
3+
import type { ArenaPlayer, ArenaRound, ArenaRoundAction } from '../../../../../models';
34
import { findPlayersByGame, findVisiblePlayers } from '../../../../../models/ArenaPlayer';
45
import { findWeaponById } from '../../../../../models/ItemWeapon';
56
import { SORT_ACTION_ARRAY_RATE, TRAIT } from '../../../../consts/global';
67
import { hasLuck } from '../../../../utils';
78
import { LOSE_ACTION_RATE } from '../../../consts';
89
import { publishArenaMessage } from '../../../utils';
10+
911
import { bossHuntPlayers, playerHuntPlayers } from './evaluateHunt';
1012
import { arenaEngineReply } from './replies';
1113

Diff for: src/games/arena/utils/index.ts

+9-15
Original file line numberDiff line numberDiff line change
@@ -2,44 +2,38 @@ import { sampleSize } from 'lodash';
22
import type { Transaction } from 'sequelize';
33

44
import { getConfig } from '../../../config';
5-
import {
6-
ArenaPlayer,
5+
import type {
76
ArenaPlayerPerformance,
87
ArenaRound,
98
ArenaRoundAction,
10-
ArenaZone,
119
Item,
1210
User,
1311
} from '../../../models';
12+
import { ArenaPlayer, ArenaZone } from '../../../models';
1413
import { findLivingPlayersByGame, findPlayerByUser } from '../../../models/ArenaPlayer';
1514
import { findActiveRound } from '../../../models/ArenaRound';
16-
import { ARENA_ACTIONS_TYPE } from '../../../models/ArenaRoundAction';
15+
import type { ARENA_ACTIONS_TYPE } from '../../../models/ArenaRoundAction';
1716
import { parseEscapedSlackUserValues } from '../../../utils/slack';
18-
import { ITEM_RARITY, ONE, ZERO } from '../../consts/global';
19-
import {
20-
generateTeamEmoji,
21-
roundActionMessageBuilder,
22-
RoundActionMessageBuilderParams,
23-
} from '../../helpers';
17+
import type { ITEM_RARITY } from '../../consts/global';
18+
import { ONE, ZERO } from '../../consts/global';
19+
import type { RoundActionMessageBuilderParams } from '../../helpers';
20+
import { generateTeamEmoji, roundActionMessageBuilder } from '../../helpers';
2421
import type { SlackBlockKitLayoutElement } from '../../model/SlackBlockKit';
22+
import type { GameResponse } from '../../utils';
2523
import {
26-
GameResponse,
2724
getGameError,
2825
notifyEphemeral,
2926
openView,
3027
slackRequest,
3128
withTransaction,
3229
} from '../../utils';
3330
import { GameError } from '../../utils/GameError';
31+
import type { ARENA_PLAYER_PERFORMANCE, ChangeLocationParams } from '../consts';
3432
import {
35-
ARENA_PLAYER_PERFORMANCE,
3633
ARENA_SECONDARY_ACTIONS,
37-
ChangeLocationParams,
3834
ENEMY_REPOSITORY_NAME,
3935
WEAPON_REPOSITORY_NAME,
4036
ZONE_REPOSITORY_NAME,
41-
} from '../consts';
42-
import {
4337
ADRENALINE_THRESHOLD,
4438
ARENA_PERK,
4539
ARENA_REPOSITORY_NAME,

Diff for: src/games/tower/repositories/tower/actions/admin/create-or-finish-game.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { Game, User } from '../../../../../../models';
1+
import type { User } from '../../../../../../models';
2+
import { Game } from '../../../../../../models';
23
import { startTowerGame } from '../../../../../../models/TowerGame';
34
import { findActiveRound } from '../../../../../../models/TowerRound';
45
import { findTowerStatisticsByGame } from '../../../../../../models/TowerStatistics';
5-
import { adminAction, GameResponse, getGameError, getGameResponse } from '../../../../../utils';
6+
import type { GameResponse } from '../../../../../utils';
7+
import { adminAction, getGameError, getGameResponse } from '../../../../../utils';
68
import { generateTowerEndGameConfirmationBlockKit } from '../../../../generators/gameplay';
79
import { generateTowerInformation } from '../../../../generators/info-setup-and-config';
810
import {

Diff for: src/games/tower/repositories/tower/engine/processSearch.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { Transaction } from 'sequelize/types';
2-
import { TowerRound, TowerRoundAction } from '../../../../../models';
1+
import type { Transaction } from 'sequelize/types';
2+
3+
import type { TowerRound, TowerRoundAction } from '../../../../../models';
34
import { listActiveArmorsByGameType } from '../../../../../models/ItemArmor';
45
import { findHealthkitByName } from '../../../../../models/ItemHealthKit';
56
import { listActiveWeaponsByGameType } from '../../../../../models/ItemWeapon';
@@ -18,6 +19,7 @@ import {
1819
TOWER_HEALTHKITS,
1920
} from '../../../consts';
2021
import { defineSearchRarityParamsByFloor, theTowerNotifyInPrivate } from '../../../utils';
22+
2123
import { towerEngineReply } from './replies';
2224

2325
export async function processSearchHealth(

Diff for: src/games/tower/repositories/universal/weaponRepository.ts

+9-7
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import type { AnonymousGameItemAvailabilityCreationAttributes } from '../../../.
22
import { deleteItem } from '../../../../models/Item';
33
import { createOrUpdateWeapon } from '../../../../models/ItemWeapon';
44
import { withWeaponTransaction } from '../../../arena/utils';
5-
import type { GAME_TYPE, ITEM_RARITY, TRAIT } from '../../../consts/global';
65
import { ITEM_TYPE } from '../../../consts/global';
6+
import type { ITEM_RARITY, TRAIT } from '../../../consts/global';
77

88
export interface IWeaponEditorData {
99
id?: number;
@@ -15,17 +15,19 @@ export interface IWeaponEditorData {
1515
majorDamageRate: number;
1616
usageLimit: number | null;
1717
traits: string[];
18-
gameAvailability: GAME_TYPE[];
18+
gameTypeIds: number[];
1919
}
2020

2121
export const upsertWeapon = async (data: IWeaponEditorData) => {
2222
return withWeaponTransaction((transaction) => {
2323
const gameAvailability: AnonymousGameItemAvailabilityCreationAttributes[] =
24-
data.gameAvailability.map((gameAvailability) => ({
25-
_gameTypeId: gameAvailability,
26-
isArchived: data.isArchived,
27-
isActive: !data.isArchived,
28-
}));
24+
data.gameTypeIds.map((_gameTypeId) => {
25+
return {
26+
_gameTypeId,
27+
isArchived: data.isArchived,
28+
isActive: !data.isArchived,
29+
};
30+
});
2931

3032
return createOrUpdateWeapon(
3133
{

Diff for: src/games/utils/index.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1+
import { URLSearchParams } from 'url';
2+
13
import { WebClient } from '@slack/client';
24
import { random } from 'lodash';
35
import fetch from 'node-fetch';
46
import type { Transaction } from 'sequelize';
5-
import { URLSearchParams } from 'url';
67

78
import { getConfig, logger } from '../../config';
89
import { sequelize } from '../../db';
910
import type { User } from '../../models';
1011
import { parseEscapedSlackUserValues } from '../../utils/slack';
11-
import { GAME_TYPE, ZERO } from '../consts/global';
12-
import { HUNDRED } from '../consts/global';
12+
import { ZERO, HUNDRED } from '../consts/global';
1313
import type { SlackBlockKitLayoutElement } from '../model/SlackBlockKit';
1414

1515
import { GameError } from './GameError';
@@ -46,8 +46,8 @@ export function rateToPercentage(rate: number): string {
4646
return `${Math.round(rate * HUNDRED)}%`;
4747
}
4848

49-
export function generateRandomNameForGame(gameType: GAME_TYPE) {
50-
return `${gameType} ${random(HUNDRED)}.${random(HUNDRED)}.${random(HUNDRED)}`;
49+
export function generateRandomNameForGame(gameTypeName: string) {
50+
return `${gameTypeName} ${random(HUNDRED)}.${random(HUNDRED)}.${random(HUNDRED)}`;
5151
}
5252

5353
export function hasLuck(successRate: number, boost = 0): boolean {

0 commit comments

Comments
 (0)