Rebuild database task (#900)

* Improved tests for multi-user mode
* Adds task to rebuild database
* Updated subscriptions.js export syntax
* Subscription metadata is now backed up
* Added typing to task key
* Updated api models
* Tasks actions styling update
This commit is contained in:
Tzahi12345
2023-05-23 22:37:25 -04:00
committed by GitHub
parent 441131e930
commit c207e56855
26 changed files with 304 additions and 145 deletions

View File

@@ -104,6 +104,7 @@ export type { SubscriptionRequestData } from './models/SubscriptionRequestData';
export type { SuccessObject } from './models/SuccessObject';
export type { TableInfo } from './models/TableInfo';
export type { Task } from './models/Task';
export { TaskType } from './models/TaskType';
export type { TestConnectionStringRequest } from './models/TestConnectionStringRequest';
export type { TestConnectionStringResponse } from './models/TestConnectionStringResponse';
export type { TransferDBRequest } from './models/TransferDBRequest';

View File

@@ -3,5 +3,5 @@
/* eslint-disable */
export type Config = {
YoutubeDLMaterial: Record<string, any>;
YoutubeDLMaterial: any;
};

View File

@@ -26,5 +26,5 @@ export type Download = {
user_uid?: string;
sub_id?: string;
sub_name?: string;
prefetched_info?: Record<string, any>;
prefetched_info?: any;
};

View File

@@ -5,6 +5,6 @@
export type GetFileFormatsResponse = {
success: boolean;
result: {
formats?: Array<Record<string, any>>;
formats?: Array<any>;
};
};

View File

@@ -6,5 +6,5 @@ import type { Subscription } from './Subscription';
export type GetSubscriptionResponse = {
subscription: Subscription;
files: Array<Record<string, any>>;
files: Array<any>;
};

View File

@@ -2,6 +2,8 @@
/* tslint:disable */
/* eslint-disable */
import type { TaskType } from './TaskType';
export type GetTaskRequest = {
task_key: string;
task_key: TaskType;
};

View File

@@ -11,6 +11,6 @@ export type Notification = {
user_uid?: string;
action?: Array<NotificationAction>;
read: boolean;
data?: Record<string, any>;
data?: any;
timestamp: number;
};

View File

@@ -15,5 +15,5 @@ export type Subscription = {
timerange?: string;
custom_args?: string;
custom_output?: string;
videos: Array<Record<string, any>>;
videos: Array<any>;
};

View File

@@ -3,16 +3,17 @@
/* eslint-disable */
import type { Schedule } from './Schedule';
import type { TaskType } from './TaskType';
export type Task = {
key: string;
key: TaskType;
title?: string;
last_ran: number;
last_confirmed: number;
running: boolean;
confirming: boolean;
data: Record<string, any>;
data: any;
error: string;
schedule: Schedule;
options?: Record<string, any>;
options?: any;
};

View File

@@ -0,0 +1,14 @@
/* istanbul ignore file */
/* tslint:disable */
/* eslint-disable */
export enum TaskType {
BACKUP_LOCAL_DB = 'backup_local_db',
MISSING_FILES_CHECK = 'missing_files_check',
MISSING_DB_RECORDS = 'missing_db_records',
DUPLICATE_FILES_CHECK = 'duplicate_files_check',
YOUTUBEDL_UPDATE_CHECK = 'youtubedl_update_check',
DELETE_OLD_FILES = 'delete_old_files',
IMPORT_LEGACY_ARCHIVES = 'import_legacy_archives',
REBUILD_DATABASE = 'rebuild_database',
}

View File

@@ -10,5 +10,5 @@ export type UpdateFileRequest = {
/**
* Object with fields to update as keys and their new values
*/
change_obj: Record<string, any>;
change_obj: any;
};

View File

@@ -2,7 +2,9 @@
/* tslint:disable */
/* eslint-disable */
import type { TaskType } from './TaskType';
export type UpdateTaskDataRequest = {
task_key: string;
new_data: Record<string, any>;
task_key: TaskType;
new_data: any;
};

View File

@@ -2,7 +2,9 @@
/* tslint:disable */
/* eslint-disable */
import type { TaskType } from './TaskType';
export type UpdateTaskOptionsRequest = {
task_key: string;
new_options: Record<string, any>;
task_key: TaskType;
new_options: any;
};

View File

@@ -3,8 +3,9 @@
/* eslint-disable */
import type { Schedule } from './Schedule';
import type { TaskType } from './TaskType';
export type UpdateTaskScheduleRequest = {
task_key: string;
task_key: TaskType;
new_schedule: Schedule;
};

View File

@@ -1,6 +1,6 @@
import { Component, Inject } from '@angular/core';
import { MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Task } from 'api-types';
import { Task, TaskType } from 'api-types';
import { PostsService } from 'app/posts.services';
@Component({
@@ -9,7 +9,7 @@ import { PostsService } from 'app/posts.services';
styleUrls: ['./task-settings.component.scss']
})
export class TaskSettingsComponent {
task_key: string;
task_key: TaskType;
new_options = {};
task: Task = null;

View File

@@ -49,7 +49,7 @@
<mat-header-cell *matHeaderCellDef> <ng-container i18n="Actions">Actions</ng-container> </mat-header-cell>
<mat-cell *matCellDef="let element">
<div class="container">
<div class="row justify-content-center">
<div class="row justify-content-start">
<div *ngIf="element.data?.uids?.length > 0 || (!element.data?.uids && element.data)" class="col-12 mt-2" style="display: flex; justify-content: center;">
<ng-container>
<button (click)="confirmTask(element.key)" [disabled]="element.running || element.confirming" mat-stroked-button>

View File

@@ -7,7 +7,7 @@ import { ConfirmDialogComponent } from 'app/dialogs/confirm-dialog/confirm-dialo
import { RestoreDbDialogComponent } from 'app/dialogs/restore-db-dialog/restore-db-dialog.component';
import { UpdateTaskScheduleDialogComponent } from 'app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component';
import { PostsService } from 'app/posts.services';
import { Task } from 'api-types';
import { Task, TaskType } from 'api-types';
import { TaskSettingsComponent } from '../task-settings/task-settings.component';
import { Clipboard } from '@angular/cdk/clipboard';
@@ -28,6 +28,15 @@ export class TasksComponent implements OnInit {
db_backups = [];
TASKS_TO_REQUIRE_DIALOG: { [key in TaskType]? : {dialogTitle: string, dialogText: string, submitText: string, warnSubmitColor: boolean}} = {
[TaskType.REBUILD_DATABASE]: {
dialogTitle: $localize`Rebuild database`,
dialogText: $localize`Are you sure you want to rebuild the database? All missing users, subscriptions, and files will be reimported. Note that if missing users are detected, they will be created with the password: 'password'. A backup of your current database will be created.`,
submitText: $localize`Rebuild database`,
warnSubmitColor: false
}
}
@ViewChild(MatPaginator) paginator: MatPaginator;
@ViewChild(MatSort) sort: MatSort;
@@ -79,7 +88,29 @@ export class TasksComponent implements OnInit {
});
}
runTask(task_key: string): void {
runTask(task_key: TaskType): void {
const taskToRequireDialog = this.TASKS_TO_REQUIRE_DIALOG[task_key];
if (taskToRequireDialog) {
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
data: {
dialogTitle: taskToRequireDialog['dialogTitle'],
dialogText: taskToRequireDialog['dialogText'],
submitText: taskToRequireDialog['submitText'],
warnSubmitColor: taskToRequireDialog['warnSubmitColor']
}
});
dialogRef.afterClosed().subscribe(confirmed => {
if (confirmed) {
this._runTask(task_key);
}
});
return;
}
this._runTask(task_key);
}
_runTask(task_key: TaskType): void {
this.postsService.runTask(task_key).subscribe(res => {
this.getTasks();
this.getDBBackups();
@@ -91,7 +122,7 @@ export class TasksComponent implements OnInit {
});
}
confirmTask(task_key: string): void {
confirmTask(task_key: TaskType): void {
this.postsService.confirmTask(task_key).subscribe(res => {
this.getTasks();
if (res['success']) this.postsService.openSnackBar($localize`Successfully confirmed task!`);

View File

@@ -112,7 +112,8 @@ import {
ImportArchiveRequest,
Archive,
Subscription,
RestartDownloadResponse
RestartDownloadResponse,
TaskType
} from '../api-types';
import { isoLangs } from './settings/locales_list';
import { Title } from '@angular/platform-browser';
@@ -640,32 +641,32 @@ export class PostsService implements CanActivate {
return this.http.post<SuccessObject>(this.path + 'resetTasks', {}, this.httpOptions);
}
getTask(task_key: string) {
getTask(task_key: TaskType) {
const body: GetTaskRequest = {task_key: task_key};
return this.http.post<GetTaskResponse>(this.path + 'getTask', body, this.httpOptions);
}
runTask(task_key: string) {
runTask(task_key: TaskType) {
const body: GetTaskRequest = {task_key: task_key};
return this.http.post<SuccessObject>(this.path + 'runTask', body, this.httpOptions);
}
confirmTask(task_key: string) {
confirmTask(task_key: TaskType) {
const body: GetTaskRequest = {task_key: task_key};
return this.http.post<SuccessObject>(this.path + 'confirmTask', body, this.httpOptions);
}
updateTaskSchedule(task_key: string, schedule: Schedule) {
updateTaskSchedule(task_key: TaskType, schedule: Schedule) {
const body: UpdateTaskScheduleRequest = {task_key: task_key, new_schedule: schedule};
return this.http.post<SuccessObject>(this.path + 'updateTaskSchedule', body, this.httpOptions);
}
updateTaskData(task_key: string, data: any) {
updateTaskData(task_key: TaskType, data: any) {
const body: UpdateTaskDataRequest = {task_key: task_key, new_data: data};
return this.http.post<SuccessObject>(this.path + 'updateTaskData', body, this.httpOptions);
}
updateTaskOptions(task_key: string, options: any) {
updateTaskOptions(task_key: TaskType, options: any) {
const body: UpdateTaskOptionsRequest = {task_key: task_key, new_options: options};
return this.http.post<SuccessObject>(this.path + 'updateTaskOptions', body, this.httpOptions);
}