@ -46,4 +46,11 @@ export class QueueController {
public async deleteJob(@Param('id') id: string): Promise<void> {
return this.queueService.deleteJob(id);
}
@Get('job/:id/execute')
@HasPermission(permissions.accessAdminControl)
@UseGuards(AuthGuard('jwt'), HasPermissionGuard)
public async executeJob(@Param('id') id: string): Promise<void> {
return this.queueService.executeJob(id);
@ -32,6 +32,10 @@ export class QueueService {
public async executeJob(aId: string) {
return (await this.dataGatheringQueue.getJob(aId))?.promote();
public async getJobs({
limit = 1000,
status = QUEUE_JOB_STATUS_LIST
@ -98,6 +98,15 @@ export class AdminJobsComponent implements OnDestroy, OnInit {
});
public onExecuteJob(aId: string) {
this.adminService
.executeJob(aId)
.pipe(takeUntil(this.unsubscribeSubject))
.subscribe(() => {
this.fetchJobs();
public onViewData(aData: AdminJobs['jobs'][0]['data']) {
alert(JSON.stringify(aData, null, ' '));
@ -147,6 +147,9 @@
>
<ng-container i18n>View Stacktrace</ng-container>
</button>
<button mat-menu-item (click)="onExecuteJob(element.id)">
<ng-container i18n>Execute Job</ng-container>
<button mat-menu-item (click)="onDeleteJob(element.id)">
<ng-container i18n>Delete Job</ng-container>
@ -72,6 +72,10 @@ export class AdminService {
return this.http.delete<void>(`/api/v1/tag/${aId}`);
public executeJob(aId: string) {
return this.http.get<void>(`/api/v1/admin/queue/job/${aId}/execute`);
public fetchAdminData() {
return this.http.get<AdminData>('/api/v1/admin');