Skip to content

Commit 99aba7c

Browse files
chore(device): select device base
1 parent 03fce5e commit 99aba7c

File tree

8 files changed

+86
-33
lines changed

8 files changed

+86
-33
lines changed

src/client/index.ts

+9
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ client.add('/calls/set-channel', async (data: { channel: number }) => {
4747
PhoneService.setChannel(data.channel);
4848
});
4949

50+
RegisterCommand(
51+
'select-device',
52+
async (_: unknown, args: string[]) => {
53+
const deviceId = parseInt(args[0], 10);
54+
client.post('/select-device', { deviceId });
55+
},
56+
false,
57+
);
58+
5059
/** Server listener */
5160
onNet(BROADCAST_EVENT_LISTENER, (data: { data: unknown; event: string }) => {
5261
global.SendNUIMessage({ type: NUI_BROADCAST_EVENT, payload: data });

src/server/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { emitMiddleware } from './middlewares/emitMiddleware';
1717
import { messagesRouter } from './router/messages';
1818
import { conversationsRouter } from './router/conversations';
1919
import { contactsRouter } from './router/contacts';
20+
import { selectDeviceMiddleware } from './middlewares/selectDeviceMiddleware';
2021

2122
function bootstrap() {
2223
initDB();
@@ -34,6 +35,7 @@ function bootstrap() {
3435

3536
app.use(emitMiddleware);
3637
app.use(sourceMiddleware);
38+
app.use(selectDeviceMiddleware);
3739
app.use(deviceMiddleware);
3840
app.use(parseBodyMiddleware);
3941

src/server/middlewares/deviceMiddleware.ts

+12-21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { RouterContext } from 'fivem-router';
22
import z from 'zod';
33
import { DeviceWithSimCard } from '../../shared/Types';
44
import DeviceRepository from '../repositories/DeviceRepository';
5+
import PlayerService from '../services/PlayerService';
6+
import { handleError } from '../utils/errors';
7+
import { DeviceNotFoundError } from '../../shared/Errors';
58

69
declare module 'fivem-router' {
710
interface RouterContext {
@@ -48,41 +51,29 @@ try {
4851
}
4952

5053
export const deviceMiddleware = async (ctx: RouterContext, next: () => Promise<void>) => {
51-
const { data: headerDeviceId } = z.coerce
52-
.number()
53-
.safeParse(ctx.request?.headers?.['x-device-id']);
54-
55-
let deviceIdentifier = !headerDeviceId ? getDeviceIdentifierBySource(ctx.source) : '';
56-
57-
if (!deviceIdentifier && !headerDeviceId) {
58-
ctx.throw(401, 'Device ID not found. Are you calling this from the server?');
59-
return next();
60-
}
54+
const deviceIdentifier = PlayerService.getDevice(ctx.source);
6155

6256
try {
63-
let device;
64-
65-
if (headerDeviceId) {
66-
device = await DeviceRepository.getDeviceById(headerDeviceId);
67-
} else {
68-
device = await DeviceRepository.getDeviceByIdentifier(deviceIdentifier);
57+
if (!deviceIdentifier) {
58+
throw new DeviceNotFoundError('CALLER');
6959
}
7060

61+
const device = await DeviceRepository.getDeviceByIdentifier(deviceIdentifier);
62+
7163
if (!device && ctx.url === '/devices/register') {
7264
console.log('Device not found, registering new device');
7365
await next();
7466
return;
7567
}
7668

7769
if (!device) {
78-
ctx.throw(401, 'Device not found');
79-
return next();
70+
throw new DeviceNotFoundError('CALLER');
8071
}
8172

8273
ctx.device = device;
74+
75+
await next();
8376
} catch (error) {
84-
ctx.throw(401, 'Device not found');
77+
handleError(error, ctx);
8578
}
86-
87-
await next();
8879
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { ok } from 'assert';
2+
import { RouterContext } from 'fivem-router';
3+
import { z } from 'zod';
4+
import { handleError } from '../utils/errors';
5+
import PlayerService from '../services/PlayerService';
6+
7+
const selectDeviceSchema = z.object({
8+
deviceIdentifier: z.string(),
9+
});
10+
11+
export const selectDeviceMiddleware = async (ctx: RouterContext, next: () => Promise<void>) => {
12+
if (ctx.url !== '/select-device') {
13+
return next();
14+
}
15+
16+
try {
17+
const { deviceIdentifier } = selectDeviceSchema.parse(ctx.request.body);
18+
await PlayerService.selectDevice(ctx.source, deviceIdentifier);
19+
ctx.status = 200;
20+
ctx.body = {
21+
ok: true,
22+
message: `Device selected: ${deviceIdentifier}`,
23+
};
24+
} catch (error) {
25+
handleError(error, ctx);
26+
}
27+
};

src/server/router/conversations.ts

-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ conversationsRouter.add('/:phoneNumber', async (ctx, next) => {
2626
const { phoneNumber } = z.object({ phoneNumber: z.string().min(2).max(15) }).parse(ctx.params);
2727

2828
const messages = await ConversationService.getConversation(ctx, phoneNumber);
29-
console.log(messages);
3029

3130
ctx.body = {
3231
ok: true,

src/server/services/ConversationService.ts

+1-11
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,6 @@ class ConversationService {
3636
}
3737

3838
async getConversation(ctx: RouterContext, phoneNumber: string) {
39-
const device = await this.deviceRepository.getDeviceById(ctx.device.id);
40-
41-
if (!device) {
42-
throw new SimcardNotFoundError('SENDER');
43-
}
44-
45-
if (!device.sim_card_id) {
46-
throw new SimcardNotFoundError('SENDER');
47-
}
48-
4939
const receiverSimcard = await this.simCardRepository.getSimCardByPhoneNumber(phoneNumber);
5040

5141
if (!receiverSimcard) {
@@ -56,7 +46,7 @@ class ConversationService {
5646
throw new SimCardNotActiveError('RECEIVER');
5747
}
5848

59-
return await this.messageRepository.getConversation(device.sim_card_id, receiverSimcard.id);
49+
return await this.messageRepository.getConversation(ctx.device.sim_card_id, receiverSimcard.id);
6050
}
6151
}
6252

src/server/services/PlayerService.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class PlayerService {
2+
deviceMap: Map<number, string> = new Map();
3+
constructor() {}
4+
5+
public authorizeDevice(src: number, deviceIdentifier: string) {
6+
return true;
7+
}
8+
9+
public async selectDevice(src: number, deviceIdentifier: string) {
10+
if (!this.authorizeDevice(src, deviceIdentifier)) {
11+
throw new Error('Unauthorized');
12+
}
13+
14+
this.deviceMap.set(src, deviceIdentifier);
15+
}
16+
17+
public getDevice(src: number) {
18+
return this.deviceMap.get(src);
19+
}
20+
21+
public async getDevices() {
22+
return Array.from(this.deviceMap.values());
23+
}
24+
}
25+
26+
export default new PlayerService();

src/shared/Errors.ts

+9
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ export class DeviceNotFoundError extends BaseError {
7171
}
7272
}
7373

74+
export class DeviceIdentifierNotFound extends BaseError {
75+
code = 404;
76+
error_code = 'DEVICE_IDENTIFIER_NOT_FOUND' as const;
77+
78+
constructor() {
79+
super(`Device identifier was not found`);
80+
}
81+
}
82+
7483
export class MessageNotFoundError extends BaseError {
7584
code = 404;
7685
error_code = 'MESSAGE_NOT_FOUND' as const;

0 commit comments

Comments
 (0)