|
|
@@ -1,55 +1,34 @@
|
|
|
+import { PhoneListService } from './../phone-list/phone-list.service'
|
|
|
import { Inject, Injectable, Logger, OnModuleInit, forwardRef } from '@nestjs/common'
|
|
|
import { InjectRepository } from '@nestjs/typeorm'
|
|
|
-import { PhoneList } from './entities/phone-list.entity'
|
|
|
-import { Repository } from 'typeorm'
|
|
|
-import { Phone } from './entities/phone.entity'
|
|
|
import { Task, TaskStatus } from './entities/task.entity'
|
|
|
+import { Repository } from 'typeorm'
|
|
|
import { TaskItem, TaskItemStatus } from './entities/task-item.entity'
|
|
|
-import { PageRequest } from 'src/common/dto/page-request'
|
|
|
+import { PageRequest } from '../common/dto/page-request'
|
|
|
import { Pagination, paginate } from 'nestjs-typeorm-paginate'
|
|
|
-import { EventsGateway } from 'src/events/events.gateway'
|
|
|
-import axios from 'axios'
|
|
|
-import { USACodeApiService } from './usacode-api-service'
|
|
|
-import { Device } from './entities/device.entity'
|
|
|
-import { NumberRequest } from './entities/number-request.entity'
|
|
|
+import { EventsGateway } from '../events/events.gateway'
|
|
|
import { randomUUID } from 'crypto'
|
|
|
import { setTimeout } from 'timers/promises'
|
|
|
+import { DeviceService } from '../device/device.service'
|
|
|
|
|
|
@Injectable()
|
|
|
-export class RcsService implements OnModuleInit {
|
|
|
+export class TaskService implements OnModuleInit {
|
|
|
constructor(
|
|
|
- @InjectRepository(PhoneList)
|
|
|
- private phoneListRepository: Repository<PhoneList>,
|
|
|
- @InjectRepository(Phone)
|
|
|
- private phoneRepository: Repository<Phone>,
|
|
|
@InjectRepository(Task)
|
|
|
private taskRepository: Repository<Task>,
|
|
|
@InjectRepository(TaskItem)
|
|
|
private taskItemRepository: Repository<TaskItem>,
|
|
|
- @InjectRepository(Device)
|
|
|
- private deviceRepository: Repository<Device>,
|
|
|
- @InjectRepository(NumberRequest)
|
|
|
- private numberRequestRepository: Repository<NumberRequest>,
|
|
|
@Inject(forwardRef(() => EventsGateway))
|
|
|
private readonly eventsGateway: EventsGateway,
|
|
|
- @Inject(forwardRef(() => USACodeApiService))
|
|
|
- private readonly USACodeApiService: USACodeApiService
|
|
|
+ private readonly phoneListService: PhoneListService,
|
|
|
+ private readonly deviceService: DeviceService
|
|
|
) {}
|
|
|
|
|
|
- private taskControllers: { [key: number]: AbortController } = {}
|
|
|
-
|
|
|
onModuleInit() {
|
|
|
- this.deviceRepository.update({}, { online: false, busy: false })
|
|
|
this.taskRepository.update({ status: TaskStatus.PENDING }, { status: TaskStatus.IDLE })
|
|
|
}
|
|
|
|
|
|
- async findAllPhoneList(req: PageRequest<PhoneList>): Promise<Pagination<PhoneList>> {
|
|
|
- return await paginate<PhoneList>(this.phoneListRepository, req.page, req.search)
|
|
|
- }
|
|
|
-
|
|
|
- async findAllPhone(req: PageRequest<Phone>): Promise<Pagination<Phone>> {
|
|
|
- return await paginate<Phone>(this.phoneRepository, req.page, req.search)
|
|
|
- }
|
|
|
+ private taskControllers: { [key: number]: AbortController } = {}
|
|
|
|
|
|
async findAllTask(req: PageRequest<Task>): Promise<Pagination<Task>> {
|
|
|
return await paginate<Task>(this.taskRepository, req.page, req.search)
|
|
|
@@ -59,28 +38,9 @@ export class RcsService implements OnModuleInit {
|
|
|
return await paginate<TaskItem>(this.taskItemRepository, req.page, req.search)
|
|
|
}
|
|
|
|
|
|
- async createPhoneList(phoneList: PhoneList): Promise<PhoneList> {
|
|
|
- return await this.phoneListRepository.save(phoneList)
|
|
|
- }
|
|
|
-
|
|
|
- async importList(listId: number, phones: string[]): Promise<Phone[]> {
|
|
|
- return await this.phoneRepository.save(
|
|
|
- phones.map((number) => {
|
|
|
- const phone = new Phone()
|
|
|
- phone.listId = listId
|
|
|
- phone.number = number
|
|
|
- return phone
|
|
|
- })
|
|
|
- )
|
|
|
- }
|
|
|
-
|
|
|
- async createPhone(phone: Phone): Promise<Phone> {
|
|
|
- return await this.phoneRepository.save(phone)
|
|
|
- }
|
|
|
-
|
|
|
async createTask(task: Task): Promise<Task> {
|
|
|
task = await this.taskRepository.save(task)
|
|
|
- const phones = await this.phoneRepository.findBy({ listId: task.listId })
|
|
|
+ const phones = await this.phoneListService.findPhoneByListId(task.listId)
|
|
|
await this.taskItemRepository.save(
|
|
|
phones.map((phone) => {
|
|
|
const taskItem = new TaskItem()
|
|
|
@@ -94,14 +54,6 @@ export class RcsService implements OnModuleInit {
|
|
|
return task
|
|
|
}
|
|
|
|
|
|
- async delPhoneList(id: number): Promise<void> {
|
|
|
- await this.phoneListRepository.delete(id)
|
|
|
- }
|
|
|
-
|
|
|
- async delPhone(id: number): Promise<void> {
|
|
|
- await this.phoneRepository.delete(id)
|
|
|
- }
|
|
|
-
|
|
|
async delTask(id: number): Promise<void> {
|
|
|
await this.taskRepository.delete(id)
|
|
|
}
|
|
|
@@ -156,9 +108,7 @@ export class RcsService implements OnModuleInit {
|
|
|
Logger.log('Task aborted', 'RcsService')
|
|
|
return
|
|
|
}
|
|
|
- device = await this.deviceRepository.findOne({
|
|
|
- where: { online: true, canSend: true, busy: false }
|
|
|
- })
|
|
|
+ device = await this.deviceService.findAvailableDevice()
|
|
|
if (device === null) {
|
|
|
Logger.log('No device available, waiting...', 'RcsService')
|
|
|
await setTimeout(2000)
|
|
|
@@ -167,8 +117,7 @@ export class RcsService implements OnModuleInit {
|
|
|
taskItems.forEach((taskItem) => {
|
|
|
taskItem.status = TaskItemStatus.PENDING
|
|
|
})
|
|
|
- device.busy = true
|
|
|
- await this.deviceRepository.save(device)
|
|
|
+ await this.deviceService.setBusy(device.id, true)
|
|
|
await this.taskItemRepository.save(taskItems)
|
|
|
Logger.log(`Send task to device ${device.id}(${device.model})`, 'RcsService')
|
|
|
Promise.race([
|
|
|
@@ -213,43 +162,4 @@ export class RcsService implements OnModuleInit {
|
|
|
|
|
|
this.taskControllers[task.id] = null
|
|
|
}
|
|
|
-
|
|
|
- async findAllDevice(req: PageRequest<Device>): Promise<Pagination<Device>> {
|
|
|
- return await paginate<Device>(this.deviceRepository, req.page, req.search)
|
|
|
- }
|
|
|
-
|
|
|
- async deviceConnect(id: string, socketId: string, model: string, name?: string, canSend: boolean = false) {
|
|
|
- let device = await this.deviceRepository.findOneBy({ id })
|
|
|
- if (!device) {
|
|
|
- device = new Device()
|
|
|
- }
|
|
|
- device.id = id
|
|
|
- device.socketId = socketId
|
|
|
- device.model = model
|
|
|
- device.name = name
|
|
|
- device.online = true
|
|
|
- device.canSend = canSend
|
|
|
- device.busy = false
|
|
|
- await this.deviceRepository.save(device)
|
|
|
- }
|
|
|
-
|
|
|
- async deviceDisconnect(id: string) {
|
|
|
- const device = await this.deviceRepository.findOneBy({ id })
|
|
|
- if (device) {
|
|
|
- device.online = false
|
|
|
- device.busy = false
|
|
|
- device.canSend = false
|
|
|
- await this.deviceRepository.save(device)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- async updateDevice(socketId: string, data: any) {
|
|
|
- const device = await this.deviceRepository.findOneBy({ socketId })
|
|
|
- if (device) {
|
|
|
- Object.assign(device, data)
|
|
|
- await this.deviceRepository.save(device)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- async requestNumber(device: string) {}
|
|
|
}
|