Vmeda.Online/src/core/services/filepool.db.ts

368 lines
8.5 KiB
TypeScript
Raw Normal View History

// (C) Copyright 2015 Moodle Pty Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import { CoreAppSchema } from '@services/app';
import { CoreSiteSchema, registerSiteSchema } from '@services/sites';
/**
* Database variables for CoreFilepool service.
*/
export const QUEUE_TABLE_NAME = 'filepool_files_queue'; // Queue of files to download.
export const FILES_TABLE_NAME = 'filepool_files'; // Downloaded files.
export const LINKS_TABLE_NAME = 'filepool_files_links'; // Links between downloaded files and components.
export const PACKAGES_TABLE_NAME = 'filepool_packages'; // Downloaded packages (sets of files).
export const APP_SCHEMA: CoreAppSchema = {
name: 'CoreFilepoolProvider',
version: 1,
tables: [
{
name: QUEUE_TABLE_NAME,
columns: [
{
name: 'siteId',
type: 'TEXT',
},
{
name: 'fileId',
type: 'TEXT',
},
{
name: 'added',
type: 'INTEGER',
},
{
name: 'priority',
type: 'INTEGER',
},
{
name: 'url',
type: 'TEXT',
},
{
name: 'revision',
type: 'INTEGER',
},
{
name: 'timemodified',
type: 'INTEGER',
},
{
name: 'isexternalfile',
type: 'INTEGER',
},
{
name: 'repositorytype',
type: 'TEXT',
},
{
name: 'path',
type: 'TEXT',
},
{
name: 'links',
type: 'TEXT',
},
],
primaryKeys: ['siteId', 'fileId'],
},
],
};
export const SITE_SCHEMA: CoreSiteSchema = {
name: 'CoreFilepoolProvider',
version: 1,
tables: [
{
name: FILES_TABLE_NAME,
columns: [
{
name: 'fileId',
type: 'TEXT',
primaryKey: true,
},
{
name: 'url',
type: 'TEXT',
notNull: true,
},
{
name: 'revision',
type: 'INTEGER',
},
{
name: 'timemodified',
type: 'INTEGER',
},
{
name: 'stale',
type: 'INTEGER',
},
{
name: 'downloadTime',
type: 'INTEGER',
},
{
name: 'isexternalfile',
type: 'INTEGER',
},
{
name: 'repositorytype',
type: 'TEXT',
},
{
name: 'path',
type: 'TEXT',
},
{
name: 'extension',
type: 'TEXT',
},
],
},
{
name: LINKS_TABLE_NAME,
columns: [
{
name: 'fileId',
type: 'TEXT',
},
{
name: 'component',
type: 'TEXT',
},
{
name: 'componentId',
type: 'TEXT',
},
],
primaryKeys: ['fileId', 'component', 'componentId'],
},
{
name: PACKAGES_TABLE_NAME,
columns: [
{
name: 'id',
type: 'TEXT',
primaryKey: true,
},
{
name: 'component',
type: 'TEXT',
},
{
name: 'componentId',
type: 'TEXT',
},
{
name: 'status',
type: 'TEXT',
},
{
name: 'previous',
type: 'TEXT',
},
{
name: 'updated',
type: 'INTEGER',
},
{
name: 'downloadTime',
type: 'INTEGER',
},
{
name: 'previousDownloadTime',
type: 'INTEGER',
},
{
name: 'extra',
type: 'TEXT',
},
],
},
],
};
/**
* File options.
*/
export type CoreFilepoolFileOptions = {
revision?: number; // File's revision.
timemodified?: number; // File's timemodified.
isexternalfile?: number; // 1 if it's a external file (from an external repository), 0 otherwise.
repositorytype?: string; // Type of the repository this file belongs to.
};
/**
* Entry from filepool.
*/
export type CoreFilepoolFileEntry = CoreFilepoolFileOptions & {
/**
* The fileId to identify the file.
*/
fileId: string;
/**
* File's URL.
*/
url: string;
/**
* 1 if file is stale (needs to be updated), 0 otherwise.
*/
stale: number;
/**
* Timestamp when this file was downloaded.
*/
downloadTime: number;
/**
* File's path.
*/
path: string;
/**
* File's extension.
*/
extension: string;
};
/**
* DB data for entry from file's queue.
*/
export type CoreFilepoolQueueDBEntry = CoreFilepoolFileOptions & {
/**
* The site the file belongs to.
*/
siteId: string;
/**
* The fileId to identify the file.
*/
fileId: string;
/**
* Timestamp when the file was added to the queue.
*/
added: number;
/**
* The priority of the file.
*/
priority: number;
/**
* File's URL.
*/
url: string;
/**
* File's path.
*/
path?: string;
/**
* File links (to link the file to components and componentIds). Serialized to store on DB.
*/
links: string;
};
/**
* Entry from the file's queue.
*/
export type CoreFilepoolQueueEntry = CoreFilepoolQueueDBEntry & {
/**
* File links (to link the file to components and componentIds).
*/
linksUnserialized?: CoreFilepoolComponentLink[];
};
/**
* Entry from packages table.
*/
export type CoreFilepoolPackageEntry = {
/**
* Package id.
*/
id?: string;
/**
* The component to link the files to.
*/
component?: string;
/**
* An ID to use in conjunction with the component.
*/
componentId?: string | number;
/**
* Package status.
*/
status?: string;
/**
* Package previous status.
*/
previous?: string;
/**
* Timestamp when this package was updated.
*/
updated?: number;
/**
* Timestamp when this package was downloaded.
*/
downloadTime?: number;
/**
* Previous download time.
*/
previousDownloadTime?: number;
/**
* Extra data stored by the package.
*/
extra?: string;
};
/**
* A component link.
*/
export type CoreFilepoolComponentLink = {
/**
* Link's component.
*/
component: string;
/**
* Link's componentId.
*/
componentId?: string | number;
};
/**
* Links table record type.
*/
export type CoreFilepoolLinksRecord = {
fileId: string; // File Id.
component: string; // Component name.
componentId: number | string; // Component Id.
};
export const initCoreFilepoolDB = (): void => {
registerSiteSchema(SITE_SCHEMA);
};