Skip to content

Commit 6eaa17e

Browse files
authored
Merge pull request #43 from x-team/develop
Updating Firebase protcol & Type-safe models
2 parents 0fb93cf + 8d0f7e3 commit 6eaa17e

Some content is hidden

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

49 files changed

+409
-162
lines changed

.env.test

+7-1
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@ DB_USERNAME=postgres
77
DB_PASSWORD=*games-2021
88
DB_NAME=gameshq_api_test
99
DB_HOSTNAME=127.0.0.1
10-
DB_PORT=5435
10+
DB_PORT=5435
11+
12+
# FIREBASE
13+
GOOGLE_APPLICATION_CREDENTIALS={"type": "fake", "project_id": "fake", "private_key": "fake", "client_email": "fake"}
14+
15+
# SLACK
16+
FRONT_END_APP_BOT_TOKEN=fake

buildspec.yml

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
version: 0.2
22

33
env:
4+
shell: bash
45
git-credential-helper: yes
56
parameter-store:
67
DOCKER_HUB_USER: '/devops/shared/DOCKER_HUB_USER'
@@ -19,17 +20,19 @@ phases:
1920
- sentry-cli --version
2021
pre_build:
2122
commands:
23+
- eval $(./aws-env --recursive)
2224
- export APP_BUILD_VERSION=${CODEBUILD_RESOLVED_SOURCE_VERSION}__$(date -u '+%Y-%m-%dT%T+00:00')
2325
- export PKG_VERSION=$(node -p "require('./package.json').version")
2426
- export SENTRY_VERSION=${ENV}-${PKG_VERSION}_BUILD_${CODEBUILD_RESOLVED_SOURCE_VERSION}
2527
- echo $APP_BUILD_VERSION > ./src/.version
2628
- cat ./src/.version
2729
- aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin $DOCKER_REPOSITORY_URI
2830
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
31+
2932
build:
3033
commands:
31-
#- chmod +x ./codebuild-git-wrapper.sh
32-
#- ./codebuild-git-wrapper.sh "$REPO_URL" "$REPO_BRANCH"
34+
- aws s3 cp s3://gameshq-build-pipeline-artifact-bucket/gameshq/google_credentials_games_api_staging.json ./google_credentials_games_api_staging.json
35+
- aws s3 cp s3://gameshq-build-pipeline-artifact-bucket/gameshq/google_credentials_games_api_prod.json ./google_credentials_games_api_prod.json
3336
- echo $DOCKER_HUB_PASSWORD | docker login --username $DOCKER_HUB_USER --password-stdin
3437
- docker build -t $DOCKER_REPOSITORY_URI:latest .
3538
- docker tag $DOCKER_REPOSITORY_URI:latest $DOCKER_REPOSITORY_URI:$IMAGE_TAG

src/games/general/commands/register.ts

+17-6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import Boom from '@hapi/boom';
22

33
import { USER_ROLE_LEVEL } from '../../../consts/model';
44
import { findOrganizationByName } from '../../../models/Organization';
5-
import { createUser, userExists } from '../../../models/User';
5+
import { upsertUser, userExists, getUserByEmail } from '../../../models/User';
6+
import { createUserInFirebase } from '../../../plugins/firebasePlugin';
67
import { getGameResponse, getSlackUserInfo } from '../../utils';
78

89
export const register = async (slackUserId: string) => {
910
const exists = await userExists(slackUserId);
11+
1012
if (exists) {
1113
return getGameResponse(`Your user is already registered.`);
1214
}
@@ -19,14 +21,23 @@ export const register = async (slackUserId: string) => {
1921
}
2022
const { email, image_512 } = profile;
2123

22-
await createUser({
23-
email: email,
24-
displayName: real_name,
25-
firebaseUserUid: null,
24+
const userInDb = await getUserByEmail(email);
25+
let firebaseUserUid = userInDb?.firebaseUserUid;
26+
27+
if (!firebaseUserUid) {
28+
const firebaseUser = await createUserInFirebase(email, real_name);
29+
firebaseUserUid = firebaseUser.uid;
30+
}
31+
32+
await upsertUser({
33+
id: userInDb?.id,
34+
_roleId: userInDb?._roleId || USER_ROLE_LEVEL.USER,
35+
email,
36+
displayName: userInDb?.displayName || real_name,
2637
profilePictureUrl: image_512,
2738
slackId: id,
28-
_roleId: USER_ROLE_LEVEL.USER,
2939
_organizationId: xteamOrganization?.id,
40+
firebaseUserUid,
3041
});
3142

3243
return getGameResponse(

src/games/utils/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ export async function getSlackUserInfo(slackId: string): Promise<SlackUser> {
178178
user: slackId,
179179
}),
180180
};
181-
const response = await (await fetch(url, options)).json();
181+
const rslt = await fetch(url, options);
182+
const response = await rslt.json();
182183
const responseUser: SlackUser = response as SlackUser;
183184
return responseUser;
184185
} catch (error) {

src/models/AchievementUnlocked.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,14 @@ export class AchievementUnlocked
7373
onUpdate: 'CASCADE',
7474
onDelete: 'CASCADE',
7575
})
76-
_user?: User;
76+
declare _user?: User;
7777

7878
@BelongsTo(() => Achievement, {
7979
foreignKey: '_achievementId',
8080
onUpdate: 'CASCADE',
8181
onDelete: 'CASCADE',
8282
})
83-
_achievement?: Achievement;
83+
declare _achievement?: Achievement;
8484

8585
static associations: {
8686
_user: Association<AchievementUnlocked, User>;

src/models/Achievements.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export class Achievement
8181
onUpdate: 'CASCADE',
8282
onDelete: 'CASCADE',
8383
})
84-
_gameType?: GameType;
84+
declare _gameType?: GameType;
8585

8686
static associations: {
8787
_gameType: Association<Achievement, GameType>;

src/models/ArenaGame.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ export class ArenaGame
8888
onUpdate: 'CASCADE',
8989
onDelete: 'CASCADE',
9090
})
91-
_game?: Game;
91+
declare _game?: Game;
9292

9393
@HasMany(() => ArenaRound, '_gameId')
94-
_rounds?: ArenaRound[];
94+
declare _rounds?: ArenaRound[];
9595

9696
static associations: {
9797
_rounds: Association<ArenaGame, ArenaRound>;

src/models/ArenaItemInventory.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export class ArenaItemInventory
4949
declare _arenaPlayerId: number;
5050

5151
@BelongsTo(() => ArenaPlayer, '_arenaPlayerId')
52-
_player?: ArenaPlayer;
52+
declare _player: ArenaPlayer;
5353

5454
@ForeignKey(() => Item)
5555
@Column(DataType.INTEGER)
@@ -60,7 +60,7 @@ export class ArenaItemInventory
6060
onUpdate: 'CASCADE',
6161
onDelete: 'CASCADE',
6262
})
63-
_item?: Item;
63+
declare _item?: Item;
6464

6565
@Column(DataType.INTEGER)
6666
declare remainingUses: number | null;

src/models/ArenaPlayer.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ export class ArenaPlayer
178178
onUpdate: 'CASCADE',
179179
onDelete: 'CASCADE',
180180
})
181-
_user?: User;
181+
declare _user?: User;
182182

183183
@AllowNull(true)
184184
@ForeignKey(() => Team)
@@ -190,7 +190,7 @@ export class ArenaPlayer
190190
onUpdate: 'CASCADE',
191191
onDelete: 'SET NULL',
192192
})
193-
_team?: Team | null;
193+
declare _team?: Team | null;
194194

195195
@ForeignKey(() => Game)
196196
@Column(DataType.INTEGER)
@@ -201,39 +201,39 @@ export class ArenaPlayer
201201
onUpdate: 'CASCADE',
202202
onDelete: 'SET NULL',
203203
})
204-
_game?: Game;
204+
declare _game?: Game;
205205

206206
@AllowNull(true)
207207
@ForeignKey(() => ArenaZone)
208208
@Column(DataType.INTEGER)
209209
declare _arenaZoneId: number | null;
210210

211211
@BelongsTo(() => ArenaZone)
212-
_zone?: ArenaZone;
212+
declare _zone?: ArenaZone;
213213

214214
@BelongsToMany(() => Item, {
215215
through: () => ArenaItemInventory,
216216
foreignKey: '_arenaPlayerId',
217217
otherKey: '_itemId',
218218
as: '_weapons',
219219
})
220-
_weapons?: Array<Item & { ArenaItemInventory: ArenaItemInventory }>;
220+
declare _weapons?: Array<Item & { ArenaItemInventory: ArenaItemInventory }>;
221221

222222
@BelongsToMany(() => Item, {
223223
through: () => ArenaItemInventory,
224224
foreignKey: '_arenaPlayerId',
225225
otherKey: '_itemId',
226226
as: '_armors',
227227
})
228-
_armors?: Array<Item & { ArenaItemInventory: ArenaItemInventory }>;
228+
declare _armors?: Array<Item & { ArenaItemInventory: ArenaItemInventory }>;
229229

230230
@BelongsToMany(() => Item, {
231231
through: () => ArenaItemInventory,
232232
foreignKey: '_arenaPlayerId',
233233
otherKey: '_itemId',
234234
as: '_healthkits',
235235
})
236-
_healthkits?: Array<Item & { ArenaItemInventory: ArenaItemInventory }>;
236+
declare _healthkits?: Array<Item & { ArenaItemInventory: ArenaItemInventory }>;
237237

238238
static associations: {
239239
_user: Association<ArenaPlayer, User>;

src/models/ArenaPlayerPerformance.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,15 @@ export class ArenaPlayerPerformance
5151
declare _arenaPlayerId: number;
5252

5353
@BelongsTo(() => ArenaPlayer, '_arenaPlayerId')
54-
_player?: ArenaPlayer;
54+
declare _player?: ArenaPlayer;
5555

5656
@PrimaryKey
5757
@ForeignKey(() => Game)
5858
@Column(DataType.INTEGER)
5959
declare _gameId: number;
6060

6161
@BelongsTo(() => Game, '_gameId')
62-
_game?: Game;
62+
declare _game?: Game;
6363

6464
@Default(ZERO)
6565
@Column(DataType.INTEGER)

src/models/ArenaRound.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -110,17 +110,17 @@ export class ArenaRound
110110
declare _gameId: number;
111111

112112
@BelongsTo(() => Game, '_gameId')
113-
_game?: Game;
113+
declare _game?: Game;
114114

115115
@ForeignKey(() => User)
116116
@Column(DataType.INTEGER)
117117
declare _createdById: number;
118118

119119
@BelongsTo(() => User, '_createdById')
120-
_createdBy?: User;
120+
declare _createdBy?: User;
121121

122122
@HasMany(() => ArenaRoundAction, '_arenaRoundId')
123-
_actions?: ArenaRoundAction[];
123+
declare _actions?: ArenaRoundAction[];
124124

125125
static associations: {
126126
_game: Association<ArenaRound, Game>; // TBD association with ArenaGame?

src/models/ArenaRoundAction.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,15 @@ export class ArenaRoundAction
5454
declare _arenaPlayerId: number;
5555

5656
@BelongsTo(() => ArenaPlayer, '_arenaPlayerId')
57-
_player?: ArenaPlayer;
57+
declare _player?: ArenaPlayer;
5858

5959
@PrimaryKey
6060
@ForeignKey(() => ArenaRound)
6161
@Column(DataType.INTEGER)
6262
declare _arenaRoundId: number;
6363

6464
@BelongsTo(() => ArenaRound, '_arenaRoundId')
65-
_round?: ArenaRound;
65+
declare _round?: ArenaRound;
6666

6767
@Default(false)
6868
@Column(DataType.BOOLEAN)
@@ -84,7 +84,7 @@ export class ArenaRoundAction
8484
onUpdate: 'CASCADE',
8585
onDelete: 'CASCADE',
8686
})
87-
_action?: AvailableAction;
87+
declare _action?: AvailableAction;
8888

8989
@Column(DataType.JSONB)
9090
declare actionJSON: ArenaAction;

src/models/ArenaZone.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,10 @@ export class ArenaZone
8888
onUpdate: 'CASCADE',
8989
as: '_organization',
9090
})
91-
_organization?: Organization;
91+
declare _organization?: Organization;
9292

9393
@HasMany(() => ArenaPlayer, '_arenaZoneId')
94-
_players?: ArenaPlayer[];
94+
declare _players?: ArenaPlayer[];
9595

9696
static associations: {
9797
_players: Association<ArenaZone, ArenaPlayer>;

src/models/Enemy.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export class Enemy
9595

9696
@AllowNull(true)
9797
@Column(DataType.TEXT)
98-
gifUrl?: string;
98+
declare gifUrl?: string;
9999

100100
@Default(Ability.defaultProps())
101101
@Column(DataType.JSONB)
@@ -110,7 +110,7 @@ export class Enemy
110110
onUpdate: 'CASCADE',
111111
onDelete: 'SET NULL',
112112
})
113-
_enemyPattern?: EnemyPattern;
113+
declare _enemyPattern?: EnemyPattern;
114114

115115
@ForeignKey(() => Organization)
116116
@Column(DataType.INTEGER)
@@ -122,15 +122,15 @@ export class Enemy
122122
onUpdate: 'CASCADE',
123123
as: '_organization',
124124
})
125-
_organization?: Organization;
125+
declare _organization?: Organization;
126126

127127
@BelongsToMany(() => Trait, {
128128
through: () => EnemyTrait,
129129
foreignKey: '_enemyId',
130130
otherKey: '_traitId',
131131
as: '_traits',
132132
})
133-
_traits?: Array<Trait & { EnemyTrait: EnemyTrait }>;
133+
declare _traits?: Array<Trait & { EnemyTrait: EnemyTrait }>;
134134

135135
static associations: {
136136
_enemyPattern: Association<Enemy, EnemyPattern>;

src/models/EnemyTrait.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export class EnemyTrait
3434
onUpdate: 'CASCADE',
3535
onDelete: 'CASCADE',
3636
})
37-
_enemy?: Enemy;
37+
declare _enemy?: Enemy;
3838

3939
@ForeignKey(() => Trait)
4040
@Column(DataType.TEXT)
@@ -45,7 +45,7 @@ export class EnemyTrait
4545
onUpdate: 'CASCADE',
4646
onDelete: 'CASCADE',
4747
})
48-
_trait?: Trait;
48+
declare _trait?: Trait;
4949

5050
static associations: {
5151
_enemy: Association<EnemyTrait, Enemy>;

src/models/Game.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,13 @@ export class Game extends Model<GameAttributes, GameCreationAttributes> implemen
118118
onUpdate: 'CASCADE',
119119
onDelete: 'CASCADE',
120120
})
121-
_createdBy?: User;
121+
declare _createdBy?: User;
122122

123123
@HasOne(() => ArenaGame)
124-
_arena?: ArenaGame;
124+
declare _arena?: ArenaGame;
125125

126126
@HasOne(() => TowerGame)
127-
_tower?: TowerGame;
127+
declare _tower?: TowerGame;
128128

129129
static associations: {
130130
_arena: Association<Game, ArenaGame>;

src/models/GameItemAvailability.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export class GameItemAvailability
5555
onUpdate: 'CASCADE',
5656
onDelete: 'CASCADE',
5757
})
58-
_gameType?: GameType;
58+
declare _gameType?: GameType;
5959

6060
@PrimaryKey
6161
@ForeignKey(() => Item)
@@ -67,7 +67,7 @@ export class GameItemAvailability
6767
onUpdate: 'CASCADE',
6868
onDelete: 'CASCADE',
6969
})
70-
_item?: Item;
70+
declare _item?: Item;
7171

7272
@Default(true)
7373
@Column(DataType.BOOLEAN)

0 commit comments

Comments
 (0)