status?: string
message?: string
document_id: number
+ owner_id?: number
}
import { DocumentService } from './rest/document.service'
import { HttpEventType, HttpResponse } from '@angular/common/http'
import WS from 'jest-websocket-mock'
+import { SettingsService } from './settings.service'
describe('ConsumerStatusService', () => {
let httpTestingController: HttpTestingController
beforeEach(() => {
TestBed.configureTestingModule({
- providers: [ConsumerStatusService, DocumentService],
+ providers: [
+ ConsumerStatusService,
+ DocumentService,
+ SettingsService,
+ {
+ provide: SettingsService,
+ useValue: {
+ currentUser: {
+ id: 1,
+ username: 'testuser',
+ is_superuser: false,
+ },
+ },
+ },
+ ],
imports: [HttpClientTestingModule],
})
1
)
})
+
+ it('should not notify current user if document has different expected owner', () => {
+ consumerStatusService.connect()
+ server.send({
+ task_id: '1234',
+ filename: 'file1.pdf',
+ current_progress: 50,
+ max_progress: 100,
+ docuement_id: 12,
+ owner_id: 1,
+ status: 'WORKING',
+ })
+
+ server.send({
+ task_id: '5678',
+ filename: 'file2.pdf',
+ current_progress: 50,
+ max_progress: 100,
+ docuement_id: 13,
+ owner_id: 2,
+ status: 'WORKING',
+ })
+
+ consumerStatusService.disconnect()
+ expect(consumerStatusService.getConsumerStatusNotCompleted()).toHaveLength(
+ 1
+ )
+ })
})
import { Subject } from 'rxjs'
import { environment } from 'src/environments/environment'
import { WebsocketConsumerStatusMessage } from '../data/websocket-consumer-status-message'
+import { SettingsService } from './settings.service'
// see ConsumerFilePhase in src/documents/consumer.py
export enum FileStatusPhase {
documentId: number
+ ownerId: number
+
getProgress(): number {
switch (this.phase) {
case FileStatusPhase.STARTED:
providedIn: 'root',
})
export class ConsumerStatusService {
- constructor() {}
+ constructor(private settingsService: SettingsService) {}
private statusWebSocket: WebSocket
this.statusWebSocket.onmessage = (ev) => {
let statusMessage: WebsocketConsumerStatusMessage = JSON.parse(ev['data'])
+ // tasks are async so we rely on checking user id
+ if (
+ statusMessage.owner_id &&
+ statusMessage.owner_id !== this.settingsService.currentUser?.id &&
+ !this.settingsService.currentUser?.is_superuser
+ ) {
+ return
+ }
+
let statusMessageGet = this.get(
statusMessage.task_id,
statusMessage.filename
"status": status,
"message": message,
"document_id": document_id,
+ "owner_id": self.override_owner_id if self.override_owner_id else None,
}
async_to_sync(self.channel_layer.group_send)(
"status_updates",
self.override_document_type_id = None
self.override_asn = None
self.task_id = None
- self.owner_id = None
+ self.override_owner_id = None
self.channel_layer = get_channel_layer()