mirror of
https://github.com/bpatrik/pigallery2.git
synced 2025-03-31 22:05:20 +02:00
improving linting
This commit is contained in:
parent
19aa1a0e90
commit
81068b6d66
@ -1,5 +1,5 @@
|
||||
import { Config } from '../common/config/private/Config';
|
||||
import { LogLevel } from '../common/config/private/PrivateConfig';
|
||||
import {Config} from '../common/config/private/Config';
|
||||
import {LogLevel} from '../common/config/private/PrivateConfig';
|
||||
|
||||
export type logFN = (...args: (string | number)[]) => void;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import * as path from 'path';
|
||||
import * as fs from 'fs';
|
||||
import { Config } from '../common/config/private/Config';
|
||||
import {Config} from '../common/config/private/Config';
|
||||
|
||||
class ProjectPathClass {
|
||||
public Root: string;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import { UserRoles } from '../../common/entities/UserDTO';
|
||||
import { NotificationManager } from '../model/NotifocationManager';
|
||||
import {NextFunction, Request, Response} from 'express';
|
||||
import {UserRoles} from '../../common/entities/UserDTO';
|
||||
import {NotificationManager} from '../model/NotifocationManager';
|
||||
|
||||
export class NotificationMWs {
|
||||
public static list(req: Request, res: Response, next: NextFunction): void {
|
||||
|
@ -1,10 +1,8 @@
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import { ErrorCodes, ErrorDTO } from '../../common/entities/Error';
|
||||
import { ObjectManagers } from '../model/ObjectManagers';
|
||||
import {
|
||||
PersonDTO,
|
||||
} from '../../common/entities/PersonDTO';
|
||||
import { Utils } from '../../common/Utils';
|
||||
import {NextFunction, Request, Response} from 'express';
|
||||
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
|
||||
import {ObjectManagers} from '../model/ObjectManagers';
|
||||
import {PersonDTO,} from '../../common/entities/PersonDTO';
|
||||
import {Utils} from '../../common/Utils';
|
||||
import {PersonEntry} from '../model/database/enitites/PersonEntry';
|
||||
|
||||
export class PersonMWs {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import { ObjectManagers } from '../model/ObjectManagers';
|
||||
import { ErrorCodes, ErrorDTO } from '../../common/entities/Error';
|
||||
import { CustomHeaders } from '../../common/CustomHeaders';
|
||||
import {NextFunction, Request, Response} from 'express';
|
||||
import {ObjectManagers} from '../model/ObjectManagers';
|
||||
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
|
||||
import {CustomHeaders} from '../../common/CustomHeaders';
|
||||
|
||||
export class VersionMWs {
|
||||
/**
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import { ErrorCodes, ErrorDTO } from '../../../common/entities/Error';
|
||||
import { ObjectManagers } from '../../model/ObjectManagers';
|
||||
import { StatisticDTO } from '../../../common/entities/settings/StatisticDTO';
|
||||
import {NextFunction, Request, Response} from 'express';
|
||||
import {ErrorCodes, ErrorDTO} from '../../../common/entities/Error';
|
||||
import {ObjectManagers} from '../../model/ObjectManagers';
|
||||
import {StatisticDTO} from '../../../common/entities/settings/StatisticDTO';
|
||||
|
||||
export class AdminMWs {
|
||||
public static async loadStatistic(
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import {NextFunction, Request, Response} from 'express';
|
||||
import * as fs from 'fs';
|
||||
import { PhotoProcessing } from '../../model/fileprocessing/PhotoProcessing';
|
||||
import { Config } from '../../../common/config/private/Config';
|
||||
import {PhotoProcessing} from '../../model/fileprocessing/PhotoProcessing';
|
||||
import {Config} from '../../../common/config/private/Config';
|
||||
import {ErrorCodes, ErrorDTO} from '../../../common/entities/Error';
|
||||
|
||||
export class PhotoConverterMWs {
|
||||
@ -33,7 +33,7 @@ export class PhotoConverterMWs {
|
||||
if (Config.Media.Photo.Converting.onTheFly === true) {
|
||||
try {
|
||||
req.resultPipe = await PhotoProcessing.convertPhoto(fullMediaPath);
|
||||
}catch (err){
|
||||
} catch (err) {
|
||||
return next(new ErrorDTO(ErrorCodes.PHOTO_GENERATION_ERROR, err.message));
|
||||
}
|
||||
return next();
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { NextFunction, Request, Response } from 'express';
|
||||
import { MoreThanOrEqual } from 'typeorm';
|
||||
import { ErrorCodes, ErrorDTO } from '../../../common/entities/Error';
|
||||
import { UserRoles } from '../../../common/entities/UserDTO';
|
||||
import { ObjectManagers } from '../../model/ObjectManagers';
|
||||
import {NextFunction, Request, Response} from 'express';
|
||||
import {MoreThanOrEqual} from 'typeorm';
|
||||
import {ErrorCodes, ErrorDTO} from '../../../common/entities/Error';
|
||||
import {UserRoles} from '../../../common/entities/UserDTO';
|
||||
import {ObjectManagers} from '../../model/ObjectManagers';
|
||||
|
||||
export class UserRequestConstrainsMWs {
|
||||
public static forceSelfRequest(
|
||||
|
@ -1,13 +1,8 @@
|
||||
import {
|
||||
ParentDirectoryDTO,
|
||||
} from '../../common/entities/DirectoryDTO';
|
||||
import {ParentDirectoryDTO,} from '../../common/entities/DirectoryDTO';
|
||||
import {Logger} from '../Logger';
|
||||
import {Config} from '../../common/config/private/Config';
|
||||
import {DiskManagerTH} from './threading/ThreadPool';
|
||||
import {
|
||||
DirectoryScanSettings,
|
||||
DiskMangerWorker,
|
||||
} from './threading/DiskMangerWorker';
|
||||
import {DirectoryScanSettings, DiskMangerWorker,} from './threading/DiskMangerWorker';
|
||||
import {FileDTO} from '../../common/entities/FileDTO';
|
||||
|
||||
const LOG_TAG = '[DiskManager]';
|
||||
|
@ -1,8 +1,5 @@
|
||||
import {
|
||||
NotificationDTO,
|
||||
NotificationType,
|
||||
} from '../../common/entities/NotificationDTO';
|
||||
import { Request } from 'express';
|
||||
import {NotificationDTO, NotificationType,} from '../../common/entities/NotificationDTO';
|
||||
import {Request} from 'express';
|
||||
|
||||
export class NotificationManager {
|
||||
public static notifications: NotificationDTO[] = [];
|
||||
|
@ -13,7 +13,8 @@ export class PasswordHelper {
|
||||
try {
|
||||
return bcrypt.compareSync(password, encryptedPassword);
|
||||
// eslint-disable-next-line no-empty
|
||||
} catch (e) {}
|
||||
} catch (e) {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { ParentDirectoryDTO } from '../../../common/entities/DirectoryDTO';
|
||||
import {ParentDirectoryDTO} from '../../../common/entities/DirectoryDTO';
|
||||
|
||||
export interface IObjectManager {
|
||||
onNewDataVersion?: (changedDir?: ParentDirectoryDTO) => Promise<void>;
|
||||
|
@ -5,7 +5,7 @@ import {DiskManager} from '../DiskManger';
|
||||
import {PhotoEntity, PhotoMetadataEntity} from './enitites/PhotoEntity';
|
||||
import {Utils} from '../../../common/Utils';
|
||||
import {PhotoMetadata,} from '../../../common/entities/PhotoDTO';
|
||||
import {Connection, Repository} from 'typeorm';
|
||||
import {Connection, ObjectLiteral, Repository} from 'typeorm';
|
||||
import {MediaEntity} from './enitites/MediaEntity';
|
||||
import {MediaDTO, MediaDTOUtils} from '../../../common/entities/MediaDTO';
|
||||
import {VideoEntity} from './enitites/VideoEntity';
|
||||
@ -240,7 +240,7 @@ export class IndexingManager {
|
||||
await directoryRepository
|
||||
.createQueryBuilder()
|
||||
.update(DirectoryEntity)
|
||||
.set({parent: currentDirId as any})
|
||||
.set({parent: currentDirId as unknown})
|
||||
.where('path = :path', {
|
||||
path: DiskMangerWorker.pathFromParent(scannedDirectory),
|
||||
})
|
||||
@ -499,8 +499,8 @@ export class IndexingManager {
|
||||
});
|
||||
}
|
||||
|
||||
private async saveChunk<T>(
|
||||
repository: Repository<any>,
|
||||
private async saveChunk<T extends ObjectLiteral>(
|
||||
repository: Repository<T>,
|
||||
entities: T[],
|
||||
size: number
|
||||
): Promise<T[]> {
|
||||
@ -519,8 +519,8 @@ export class IndexingManager {
|
||||
return list;
|
||||
}
|
||||
|
||||
private async insertChunk<T>(
|
||||
repository: Repository<any>,
|
||||
private async insertChunk<T extends ObjectLiteral>(
|
||||
repository: Repository<T>,
|
||||
entities: T[],
|
||||
size: number
|
||||
): Promise<number[]> {
|
||||
@ -529,7 +529,7 @@ export class IndexingManager {
|
||||
}
|
||||
if (entities.length < size) {
|
||||
return (await repository.insert(entities)).identifiers.map(
|
||||
(i: any) => i.id
|
||||
(i: { id: number }) => i.id
|
||||
);
|
||||
}
|
||||
let list: number[] = [];
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { GPSMetadata } from '../../../common/entities/PhotoDTO';
|
||||
import {GPSMetadata} from '../../../common/entities/PhotoDTO';
|
||||
import * as NodeGeocoder from 'node-geocoder';
|
||||
import { LocationLookupException } from '../../exceptions/LocationLookupException';
|
||||
import { LRU } from '../../../common/Utils';
|
||||
import { IObjectManager } from './IObjectManager';
|
||||
import { ParentDirectoryDTO } from '../../../common/entities/DirectoryDTO';
|
||||
import {LocationLookupException} from '../../exceptions/LocationLookupException';
|
||||
import {LRU} from '../../../common/Utils';
|
||||
import {IObjectManager} from './IObjectManager';
|
||||
import {ParentDirectoryDTO} from '../../../common/entities/DirectoryDTO';
|
||||
|
||||
export class LocationManager implements IObjectManager {
|
||||
// onNewDataVersion only need for TypeScript, otherwise the interface is not implemented.
|
||||
@ -12,7 +12,7 @@ export class LocationManager implements IObjectManager {
|
||||
cache = new LRU<GPSMetadata>(100);
|
||||
|
||||
constructor() {
|
||||
this.geocoder = NodeGeocoder({ provider: 'openstreetmap' });
|
||||
this.geocoder = NodeGeocoder({provider: 'openstreetmap'});
|
||||
}
|
||||
|
||||
async getGPSData(text: string): Promise<GPSMetadata> {
|
||||
|
@ -8,7 +8,7 @@ import {IObjectManager} from './IObjectManager';
|
||||
|
||||
const LOG_TAG = '[PersonManager]';
|
||||
|
||||
export class PersonManager implements IObjectManager{
|
||||
export class PersonManager implements IObjectManager {
|
||||
persons: PersonEntry[] = null;
|
||||
/**
|
||||
* Person table contains denormalized data that needs to update when isDBValid = false
|
||||
|
@ -1,5 +1,5 @@
|
||||
import 'reflect-metadata';
|
||||
import {Connection, createConnection, DataSourceOptions, getConnection,} from 'typeorm';
|
||||
import {Connection, createConnection, DataSourceOptions, getConnection, LoggerOptions,} from 'typeorm';
|
||||
import {UserEntity} from './enitites/UserEntity';
|
||||
import {UserRoles} from '../../../common/entities/UserDTO';
|
||||
import {PhotoEntity} from './enitites/PhotoEntity';
|
||||
@ -26,33 +26,16 @@ import {MDFileEntity} from './enitites/MDFileEntity';
|
||||
|
||||
const LOG_TAG = '[SQLConnection]';
|
||||
|
||||
type Writeable<T> = { -readonly [P in keyof T]: T[P] };
|
||||
|
||||
export class SQLConnection {
|
||||
private static connection: Connection = null;
|
||||
|
||||
|
||||
public static async getConnection(): Promise<Connection> {
|
||||
if (this.connection == null) {
|
||||
const options: any = this.getDriver(Config.Database);
|
||||
// options.name = 'main';
|
||||
options.entities = [
|
||||
UserEntity,
|
||||
FileEntity,
|
||||
MDFileEntity,
|
||||
PersonJunctionTable,
|
||||
PersonEntry,
|
||||
MediaEntity,
|
||||
PhotoEntity,
|
||||
VideoEntity,
|
||||
DirectoryEntity,
|
||||
SharingEntity,
|
||||
AlbumBaseEntity,
|
||||
SavedSearchEntity,
|
||||
VersionEntity,
|
||||
];
|
||||
options.synchronize = false;
|
||||
if (Config.Server.Log.sqlLevel !== SQLLogLevel.none) {
|
||||
options.logging = SQLLogLevel[Config.Server.Log.sqlLevel];
|
||||
}
|
||||
const options = this.getDriver(Config.Database);
|
||||
|
||||
Logger.debug(
|
||||
LOG_TAG,
|
||||
'Creating connection: ' + DatabaseType[Config.Database.type],
|
||||
@ -73,27 +56,8 @@ export class SQLConnection {
|
||||
// eslint-disable-next-line no-empty
|
||||
} catch (err) {
|
||||
}
|
||||
const options: any = this.getDriver(config);
|
||||
const options = this.getDriver(config);
|
||||
options.name = 'test';
|
||||
options.entities = [
|
||||
UserEntity,
|
||||
FileEntity,
|
||||
MDFileEntity,
|
||||
PersonJunctionTable,
|
||||
PersonEntry,
|
||||
MediaEntity,
|
||||
PhotoEntity,
|
||||
VideoEntity,
|
||||
DirectoryEntity,
|
||||
SharingEntity,
|
||||
AlbumBaseEntity,
|
||||
SavedSearchEntity,
|
||||
VersionEntity,
|
||||
];
|
||||
options.synchronize = false;
|
||||
if (Config.Server.Log.sqlLevel !== SQLLogLevel.none) {
|
||||
options.logging = SQLLogLevel[Config.Server.Log.sqlLevel];
|
||||
}
|
||||
const conn = await this.createConnection(options);
|
||||
await SQLConnection.schemeSync(conn);
|
||||
await conn.close();
|
||||
@ -164,7 +128,7 @@ export class SQLConnection {
|
||||
}
|
||||
}
|
||||
|
||||
public static getSQLiteDB(config: ServerDataBaseConfig): any {
|
||||
public static getSQLiteDB(config: ServerDataBaseConfig): string {
|
||||
return path.join(ProjectPath.getAbsolutePath(config.dbFolder), 'sqlite.db');
|
||||
}
|
||||
|
||||
@ -236,8 +200,9 @@ export class SQLConnection {
|
||||
}
|
||||
}
|
||||
|
||||
private static getDriver(config: ServerDataBaseConfig): DataSourceOptions {
|
||||
let driver: DataSourceOptions = null;
|
||||
|
||||
private static getDriver(config: ServerDataBaseConfig): Writeable<DataSourceOptions> {
|
||||
let driver: Writeable<DataSourceOptions>;
|
||||
if (config.type === DatabaseType.mysql) {
|
||||
driver = {
|
||||
type: 'mysql',
|
||||
@ -257,6 +222,25 @@ export class SQLConnection {
|
||||
),
|
||||
};
|
||||
}
|
||||
driver.entities = [
|
||||
UserEntity,
|
||||
FileEntity,
|
||||
MDFileEntity,
|
||||
PersonJunctionTable,
|
||||
PersonEntry,
|
||||
MediaEntity,
|
||||
PhotoEntity,
|
||||
VideoEntity,
|
||||
DirectoryEntity,
|
||||
SharingEntity,
|
||||
AlbumBaseEntity,
|
||||
SavedSearchEntity,
|
||||
VersionEntity,
|
||||
];
|
||||
driver.synchronize = false;
|
||||
if (Config.Server.Log.sqlLevel !== SQLLogLevel.none) {
|
||||
driver.logging = SQLLogLevel[Config.Server.Log.sqlLevel] as LoggerOptions;
|
||||
}
|
||||
return driver;
|
||||
}
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ export class SharingManager {
|
||||
|
||||
const sharing = await connection.getRepository(SharingEntity).findOneBy({
|
||||
id: inSharing.id,
|
||||
creator: inSharing.creator.id as any,
|
||||
creator: inSharing.creator.id as unknown,
|
||||
path: inSharing.path,
|
||||
});
|
||||
|
||||
|
@ -1,28 +1,16 @@
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
Index,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
Unique,
|
||||
} from 'typeorm';
|
||||
import {
|
||||
ParentDirectoryDTO,
|
||||
SubDirectoryDTO,
|
||||
} from '../../../../common/entities/DirectoryDTO';
|
||||
import { MediaEntity } from './MediaEntity';
|
||||
import { FileEntity } from './FileEntity';
|
||||
import { columnCharsetCS } from './EntityUtils';
|
||||
import { MediaDTO } from '../../../../common/entities/MediaDTO';
|
||||
import {Column, Entity, Index, ManyToOne, OneToMany, PrimaryGeneratedColumn, Unique,} from 'typeorm';
|
||||
import {ParentDirectoryDTO, SubDirectoryDTO,} from '../../../../common/entities/DirectoryDTO';
|
||||
import {MediaEntity} from './MediaEntity';
|
||||
import {FileEntity} from './FileEntity';
|
||||
import {columnCharsetCS} from './EntityUtils';
|
||||
import {MediaDTO} from '../../../../common/entities/MediaDTO';
|
||||
|
||||
@Entity()
|
||||
@Unique(['name', 'path'])
|
||||
export class DirectoryEntity
|
||||
implements ParentDirectoryDTO<MediaDTO>, SubDirectoryDTO<MediaDTO>
|
||||
{
|
||||
implements ParentDirectoryDTO<MediaDTO>, SubDirectoryDTO<MediaDTO> {
|
||||
@Index()
|
||||
@PrimaryGeneratedColumn({ unsigned: true })
|
||||
@PrimaryGeneratedColumn({unsigned: true})
|
||||
id: number;
|
||||
|
||||
@Index()
|
||||
@ -61,7 +49,7 @@ export class DirectoryEntity
|
||||
|
||||
isPartial?: boolean;
|
||||
|
||||
@Column('mediumint', { unsigned: true })
|
||||
@Column('mediumint', {unsigned: true})
|
||||
mediaCount: number;
|
||||
|
||||
@Column('bigint', {
|
||||
@ -83,20 +71,20 @@ export class DirectoryEntity
|
||||
youngestMedia: number;
|
||||
|
||||
@Index()
|
||||
@ManyToOne((type) => DirectoryEntity, (directory) => directory.directories, {
|
||||
@ManyToOne(() => DirectoryEntity, (directory) => directory.directories, {
|
||||
onDelete: 'CASCADE',
|
||||
})
|
||||
public parent: DirectoryEntity;
|
||||
|
||||
@OneToMany((type) => DirectoryEntity, (dir) => dir.parent)
|
||||
@OneToMany(() => DirectoryEntity, (dir) => dir.parent)
|
||||
public directories: DirectoryEntity[];
|
||||
|
||||
// not saving to database, it is only assigned when querying the DB
|
||||
@ManyToOne((type) => MediaEntity, { onDelete: 'SET NULL' })
|
||||
@ManyToOne(() => MediaEntity, {onDelete: 'SET NULL'})
|
||||
public cover: MediaEntity;
|
||||
|
||||
// On galley change, cover will be invalid
|
||||
@Column({ type: 'boolean', default: false })
|
||||
@Column({type: 'boolean', default: false})
|
||||
validCover: boolean;
|
||||
|
||||
@OneToMany((type) => MediaEntity, (media) => media.directory)
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Config } from '../../../../common/config/private/Config';
|
||||
import { ColumnOptions } from 'typeorm/decorator/options/ColumnOptions';
|
||||
import { DatabaseType } from '../../../../common/config/private/PrivateConfig';
|
||||
import {Config} from '../../../../common/config/private/Config';
|
||||
import {ColumnOptions} from 'typeorm/decorator/options/ColumnOptions';
|
||||
import {DatabaseType} from '../../../../common/config/private/PrivateConfig';
|
||||
|
||||
export class ColumnCharsetCS implements ColumnOptions {
|
||||
public get charset(): string {
|
||||
|
@ -14,7 +14,7 @@ export class FileEntity implements FileDTO {
|
||||
name: string;
|
||||
|
||||
@Index()
|
||||
@ManyToOne((type) => DirectoryEntity, (directory) => directory.metaFile, {
|
||||
@ManyToOne(() => DirectoryEntity, (directory) => directory.metaFile, {
|
||||
onDelete: 'CASCADE',
|
||||
nullable: false,
|
||||
})
|
||||
|
@ -54,7 +54,7 @@ export class GPSMetadataEntity implements GPSMetadata {
|
||||
}
|
||||
|
||||
export class PositionMetaDataEntity implements PositionMetaData {
|
||||
@Column((type) => GPSMetadataEntity)
|
||||
@Column(() => GPSMetadataEntity)
|
||||
GPSData: GPSMetadataEntity;
|
||||
|
||||
@Column({
|
||||
@ -86,7 +86,7 @@ export class MediaMetadataEntity implements MediaMetadata {
|
||||
@Column('text')
|
||||
caption: string;
|
||||
|
||||
@Column((type) => MediaDimensionEntity)
|
||||
@Column(() => MediaDimensionEntity)
|
||||
size: MediaDimensionEntity;
|
||||
|
||||
/**
|
||||
@ -113,17 +113,17 @@ export class MediaMetadataEntity implements MediaMetadata {
|
||||
})
|
||||
keywords: string[];
|
||||
|
||||
@Column((type) => CameraMetadataEntity)
|
||||
@Column(() => CameraMetadataEntity)
|
||||
cameraData: CameraMetadataEntity;
|
||||
|
||||
@Column((type) => PositionMetaDataEntity)
|
||||
@Column(() => PositionMetaDataEntity)
|
||||
positionData: PositionMetaDataEntity;
|
||||
|
||||
@Column('tinyint', {unsigned: true})
|
||||
@Index()
|
||||
rating: 0 | 1 | 2 | 3 | 4 | 5;
|
||||
|
||||
@OneToMany((type) => PersonJunctionTable, (junctionTable) => junctionTable.media)
|
||||
@OneToMany(() => PersonJunctionTable, (junctionTable) => junctionTable.media)
|
||||
personJunction: PersonJunctionTable[];
|
||||
|
||||
@Column({
|
||||
@ -178,13 +178,13 @@ export abstract class MediaEntity implements MediaDTO {
|
||||
name: string;
|
||||
|
||||
@Index()
|
||||
@ManyToOne((type) => DirectoryEntity, (directory) => directory.media, {
|
||||
@ManyToOne(() => DirectoryEntity, (directory) => directory.media, {
|
||||
onDelete: 'CASCADE',
|
||||
nullable: false,
|
||||
})
|
||||
directory: DirectoryEntity;
|
||||
|
||||
@Column((type) => MediaMetadataEntity)
|
||||
@Column(() => MediaMetadataEntity)
|
||||
metadata: MediaMetadataEntity;
|
||||
|
||||
missingThumbnails: number;
|
||||
|
@ -1,15 +1,7 @@
|
||||
import {
|
||||
Column,
|
||||
Entity,
|
||||
Index,
|
||||
ManyToOne,
|
||||
OneToMany,
|
||||
PrimaryGeneratedColumn,
|
||||
Unique,
|
||||
} from 'typeorm';
|
||||
import {Column, Entity, Index, ManyToOne, OneToMany, PrimaryGeneratedColumn, Unique,} from 'typeorm';
|
||||
import {PersonJunctionTable} from './PersonJunctionTable';
|
||||
import {columnCharsetCS} from './EntityUtils';
|
||||
import { PersonDTO } from '../../../../common/entities/PersonDTO';
|
||||
import {PersonDTO} from '../../../../common/entities/PersonDTO';
|
||||
|
||||
@Entity()
|
||||
@Unique(['name'])
|
||||
@ -27,10 +19,10 @@ export class PersonEntry implements PersonDTO {
|
||||
@Column({default: false})
|
||||
isFavourite: boolean;
|
||||
|
||||
@OneToMany((type) => PersonJunctionTable, (junctionTable) => junctionTable.person)
|
||||
@OneToMany(() => PersonJunctionTable, (junctionTable) => junctionTable.person)
|
||||
public faces: PersonJunctionTable[];
|
||||
|
||||
@ManyToOne((type) => PersonJunctionTable, {
|
||||
@ManyToOne(() => PersonJunctionTable, {
|
||||
onDelete: 'SET NULL',
|
||||
nullable: true,
|
||||
})
|
||||
|
@ -13,14 +13,14 @@ export class PersonJunctionTable {
|
||||
id: number;
|
||||
|
||||
@Index()
|
||||
@ManyToOne((type) => MediaEntity, (media) => media.metadata.faces, {
|
||||
@ManyToOne(() => MediaEntity, (media) => media.metadata.faces, {
|
||||
onDelete: 'CASCADE',
|
||||
nullable: false,
|
||||
})
|
||||
media: MediaEntity;
|
||||
|
||||
@Index()
|
||||
@ManyToOne((type) => PersonEntry, (person) => person.faces, {
|
||||
@ManyToOne(() => PersonEntry, (person) => person.faces, {
|
||||
onDelete: 'CASCADE',
|
||||
nullable: false,
|
||||
})
|
||||
|
@ -1,9 +1,6 @@
|
||||
import { ChildEntity, Column } from 'typeorm';
|
||||
import {
|
||||
PhotoDTO,
|
||||
PhotoMetadata,
|
||||
} from '../../../../common/entities/PhotoDTO';
|
||||
import { MediaEntity, MediaMetadataEntity } from './MediaEntity';
|
||||
import {ChildEntity, Column} from 'typeorm';
|
||||
import {PhotoDTO, PhotoMetadata,} from '../../../../common/entities/PhotoDTO';
|
||||
import {MediaEntity, MediaMetadataEntity} from './MediaEntity';
|
||||
|
||||
export class PhotoMetadataEntity
|
||||
extends MediaMetadataEntity
|
||||
@ -25,6 +22,6 @@ export class PhotoMetadataEntity
|
||||
|
||||
@ChildEntity()
|
||||
export class PhotoEntity extends MediaEntity implements PhotoDTO {
|
||||
@Column((type) => PhotoMetadataEntity)
|
||||
@Column(() => PhotoMetadataEntity)
|
||||
metadata: PhotoMetadataEntity;
|
||||
}
|
||||
|
@ -1,11 +1,11 @@
|
||||
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
|
||||
import { SharingDTO } from '../../../../common/entities/SharingDTO';
|
||||
import { UserEntity } from './UserEntity';
|
||||
import { UserDTO } from '../../../../common/entities/UserDTO';
|
||||
import {Column, Entity, ManyToOne, PrimaryGeneratedColumn} from 'typeorm';
|
||||
import {SharingDTO} from '../../../../common/entities/SharingDTO';
|
||||
import {UserEntity} from './UserEntity';
|
||||
import {UserDTO} from '../../../../common/entities/UserDTO';
|
||||
|
||||
@Entity()
|
||||
export class SharingEntity implements SharingDTO {
|
||||
@PrimaryGeneratedColumn({ unsigned: true })
|
||||
@PrimaryGeneratedColumn({unsigned: true})
|
||||
id: number;
|
||||
|
||||
@Column()
|
||||
@ -14,7 +14,7 @@ export class SharingEntity implements SharingDTO {
|
||||
@Column()
|
||||
path: string;
|
||||
|
||||
@Column({ type: 'text', nullable: true })
|
||||
@Column({type: 'text', nullable: true})
|
||||
password: string;
|
||||
|
||||
@Column('bigint', {
|
||||
@ -38,6 +38,6 @@ export class SharingEntity implements SharingDTO {
|
||||
@Column()
|
||||
includeSubfolders: boolean;
|
||||
|
||||
@ManyToOne((type) => UserEntity, { onDelete: 'CASCADE', nullable: false })
|
||||
@ManyToOne(() => UserEntity, {onDelete: 'CASCADE', nullable: false})
|
||||
creator: UserDTO;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
|
||||
import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm';
|
||||
|
||||
@Entity()
|
||||
export class VersionEntity {
|
||||
|
@ -1,14 +1,10 @@
|
||||
import { ChildEntity, Column } from 'typeorm';
|
||||
import { MediaEntity, MediaMetadataEntity } from './MediaEntity';
|
||||
import {
|
||||
VideoDTO,
|
||||
VideoMetadata,
|
||||
} from '../../../../common/entities/VideoDTO';
|
||||
import {ChildEntity, Column} from 'typeorm';
|
||||
import {MediaEntity, MediaMetadataEntity} from './MediaEntity';
|
||||
import {VideoDTO, VideoMetadata,} from '../../../../common/entities/VideoDTO';
|
||||
|
||||
export class VideoMetadataEntity
|
||||
extends MediaMetadataEntity
|
||||
implements VideoMetadata
|
||||
{
|
||||
implements VideoMetadata {
|
||||
@Column('int')
|
||||
bitRate: number;
|
||||
|
||||
@ -28,6 +24,6 @@ export class VideoMetadataEntity
|
||||
|
||||
@ChildEntity()
|
||||
export class VideoEntity extends MediaEntity implements VideoDTO {
|
||||
@Column((type) => VideoMetadataEntity)
|
||||
@Column(() => VideoMetadataEntity)
|
||||
metadata: VideoMetadataEntity;
|
||||
}
|
||||
|
@ -23,6 +23,6 @@ export class AlbumBaseEntity implements AlbumBaseDTO {
|
||||
@Column('int', {unsigned: true, default: 0})
|
||||
count: number;
|
||||
|
||||
@ManyToOne((type) => MediaEntity, {onDelete: 'SET NULL', nullable: true})
|
||||
@ManyToOne(() => MediaEntity, {onDelete: 'SET NULL', nullable: true})
|
||||
public cover: MediaEntity;
|
||||
}
|
||||
|
@ -1,13 +1,12 @@
|
||||
import { ChildEntity, Column } from 'typeorm';
|
||||
import { AlbumBaseEntity } from './AlbumBaseEntity';
|
||||
import { SavedSearchDTO } from '../../../../../common/entities/album/SavedSearchDTO';
|
||||
import { SearchQueryDTO } from '../../../../../common/entities/SearchQueryDTO';
|
||||
import {ChildEntity, Column} from 'typeorm';
|
||||
import {AlbumBaseEntity} from './AlbumBaseEntity';
|
||||
import {SavedSearchDTO} from '../../../../../common/entities/album/SavedSearchDTO';
|
||||
import {SearchQueryDTO} from '../../../../../common/entities/SearchQueryDTO';
|
||||
|
||||
@ChildEntity()
|
||||
export class SavedSearchEntity
|
||||
extends AlbumBaseEntity
|
||||
implements SavedSearchDTO
|
||||
{
|
||||
implements SavedSearchDTO {
|
||||
@Column({
|
||||
type: 'text',
|
||||
nullable: false,
|
||||
|
@ -31,7 +31,9 @@ const LOG_TAG = '[ConfigDiagnostics]';
|
||||
|
||||
export class ConfigDiagnostics {
|
||||
static testAlbumsConfig(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
albumConfig: ClientAlbumConfig,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
original: PrivateConfigClass
|
||||
): void {
|
||||
Logger.debug(LOG_TAG, 'Testing album config');
|
||||
@ -182,7 +184,9 @@ export class ConfigDiagnostics {
|
||||
}
|
||||
|
||||
static async testTasksConfig(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
task: ServerJobConfig,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
config: PrivateConfigClass
|
||||
): Promise<void> {
|
||||
Logger.debug(LOG_TAG, 'Testing tasks config');
|
||||
@ -202,7 +206,9 @@ export class ConfigDiagnostics {
|
||||
}
|
||||
|
||||
static async testSearchConfig(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
search: ClientSearchConfig,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
config: PrivateConfigClass
|
||||
): Promise<void> {
|
||||
Logger.debug(LOG_TAG, 'Testing search config');
|
||||
@ -223,7 +229,9 @@ export class ConfigDiagnostics {
|
||||
}
|
||||
|
||||
static async testRandomPhotoConfig(
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
sharing: ClientRandomPhotoConfig,
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
config: PrivateConfigClass
|
||||
): Promise<void> {
|
||||
Logger.debug(LOG_TAG, 'Testing random photo config');
|
||||
|
@ -76,7 +76,7 @@ export class JobManager implements IJobListener {
|
||||
};
|
||||
|
||||
onJobFinished = async (
|
||||
job: IJob<any>,
|
||||
job: IJob<unknown>,
|
||||
state: JobProgressStates,
|
||||
soloRun: boolean
|
||||
): Promise<void> => {
|
||||
@ -111,7 +111,7 @@ export class JobManager implements IJobListener {
|
||||
}
|
||||
};
|
||||
|
||||
getAvailableJobs(): IJob<any>[] {
|
||||
getAvailableJobs(): IJob<unknown>[] {
|
||||
return JobRepository.Instance.getAvailableJobs();
|
||||
}
|
||||
|
||||
@ -129,7 +129,7 @@ export class JobManager implements IJobListener {
|
||||
Config.Jobs.scheduled.forEach((s): void => this.runSchedule(s));
|
||||
}
|
||||
|
||||
protected findJob<T = any>(jobName: string): IJob<T> {
|
||||
protected findJob<T = unknown>(jobName: string): IJob<T> {
|
||||
return this.getAvailableJobs().find((t): boolean => t.Name === jobName);
|
||||
}
|
||||
|
||||
|
@ -1,11 +1,8 @@
|
||||
import { promises as fsp } from 'fs';
|
||||
import {promises as fsp} from 'fs';
|
||||
import * as path from 'path';
|
||||
import { ProjectPath } from '../../ProjectPath';
|
||||
import { Config } from '../../../common/config/private/Config';
|
||||
import {
|
||||
JobProgressDTO,
|
||||
JobProgressStates,
|
||||
} from '../../../common/entities/job/JobProgressDTO';
|
||||
import {ProjectPath} from '../../ProjectPath';
|
||||
import {Config} from '../../../common/config/private/Config';
|
||||
import {JobProgressDTO, JobProgressStates,} from '../../../common/entities/job/JobProgressDTO';
|
||||
|
||||
export class JobProgressManager {
|
||||
private static readonly VERSION = 3;
|
||||
@ -40,7 +37,7 @@ export class JobProgressManager {
|
||||
}
|
||||
|
||||
onJobProgressUpdate(progress: JobProgressDTO): void {
|
||||
this.db.progresses[progress.HashName] = { progress, timestamp: Date.now() };
|
||||
this.db.progresses[progress.HashName] = {progress, timestamp: Date.now()};
|
||||
this.delayedSave();
|
||||
}
|
||||
|
||||
|
@ -14,7 +14,7 @@ import {AlbumCoverRestJob} from './jobs/AlbumCoverResetJob';
|
||||
|
||||
export class JobRepository {
|
||||
private static instance: JobRepository = null;
|
||||
availableJobs: { [key: string]: IJob<any> } = {};
|
||||
availableJobs: { [key: string]: IJob<unknown> } = {};
|
||||
|
||||
public static get Instance(): JobRepository {
|
||||
if (JobRepository.instance == null) {
|
||||
@ -23,11 +23,11 @@ export class JobRepository {
|
||||
return JobRepository.instance;
|
||||
}
|
||||
|
||||
getAvailableJobs(): IJob<any>[] {
|
||||
getAvailableJobs(): IJob<unknown>[] {
|
||||
return Object.values(this.availableJobs).filter((t) => t.Supported);
|
||||
}
|
||||
|
||||
register(job: IJob<any>): void {
|
||||
register(job: IJob<unknown>): void {
|
||||
if (typeof this.availableJobs[job.Name] !== 'undefined') {
|
||||
throw new Error('Job already exist:' + job.Name);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { JobDTO } from '../../../../common/entities/job/JobDTO';
|
||||
import { JobProgress } from './JobProgress';
|
||||
import { IJobListener } from './IJobListener';
|
||||
import {JobDTO} from '../../../../common/entities/job/JobDTO';
|
||||
import {JobProgress} from './JobProgress';
|
||||
import {IJobListener} from './IJobListener';
|
||||
|
||||
export interface IJob<T> extends JobDTO {
|
||||
Name: string;
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { JobProgress } from './JobProgress';
|
||||
import { IJob } from './IJob';
|
||||
import { JobProgressStates } from '../../../../common/entities/job/JobProgressDTO';
|
||||
import {JobProgress} from './JobProgress';
|
||||
import {IJob} from './IJob';
|
||||
import {JobProgressStates} from '../../../../common/entities/job/JobProgressDTO';
|
||||
|
||||
export interface IJobListener {
|
||||
onJobFinished(
|
||||
job: IJob<any>,
|
||||
job: IJob<unknown>,
|
||||
state: JobProgressStates,
|
||||
soloRun: boolean
|
||||
): void;
|
||||
|
@ -10,7 +10,7 @@ declare const global: any;
|
||||
|
||||
const LOG_TAG = '[JOB]';
|
||||
|
||||
export abstract class Job<T extends Record<string, any> = Record<string, any>> implements IJob<T> {
|
||||
export abstract class Job<T extends Record<string, unknown> = Record<string, unknown>> implements IJob<T> {
|
||||
public allowParallelRun: boolean = null;
|
||||
protected progress: JobProgress = null;
|
||||
protected config: T;
|
||||
@ -55,11 +55,11 @@ export abstract class Job<T extends Record<string, any> = Record<string, any>> i
|
||||
this.allowParallelRun = allowParallelRun;
|
||||
this.config = {} as T;
|
||||
if (this.ConfigTemplate) {
|
||||
this.ConfigTemplate.forEach(ct => (this.config as any)[ct.id] = ct.defaultValue);
|
||||
this.ConfigTemplate.forEach(ct => (this.config as Record<string, unknown>)[ct.id] = ct.defaultValue);
|
||||
}
|
||||
if (config) {
|
||||
for (const key of Object.keys(config)) {
|
||||
(this.config as any)[key] = config[key];
|
||||
(this.config as Record<string, unknown>)[key] = config[key];
|
||||
}
|
||||
}
|
||||
this.progress = new JobProgress(
|
||||
|
@ -1,8 +1,4 @@
|
||||
import {
|
||||
JobProgressDTO,
|
||||
JobProgressLogDTO,
|
||||
JobProgressStates,
|
||||
} from '../../../../common/entities/job/JobProgressDTO';
|
||||
import {JobProgressDTO, JobProgressLogDTO, JobProgressStates,} from '../../../../common/entities/job/JobProgressDTO';
|
||||
import {Config} from '../../../../common/config/private/Config';
|
||||
|
||||
export class JobProgress {
|
||||
@ -22,7 +18,8 @@ export class JobProgress {
|
||||
constructor(
|
||||
public readonly jobName: string,
|
||||
public readonly HashName: string
|
||||
) {}
|
||||
) {
|
||||
}
|
||||
|
||||
set OnChange(val: (progress: JobProgress) => void) {
|
||||
this.onChange = val;
|
||||
|
@ -1,13 +1,13 @@
|
||||
import { Config } from '../../../../common/config/private/Config';
|
||||
import { DefaultsJobs } from '../../../../common/entities/job/JobDTO';
|
||||
import { FileJob } from './FileJob';
|
||||
import { PhotoProcessing } from '../../fileprocessing/PhotoProcessing';
|
||||
import {Config} from '../../../../common/config/private/Config';
|
||||
import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
|
||||
import {FileJob} from './FileJob';
|
||||
import {PhotoProcessing} from '../../fileprocessing/PhotoProcessing';
|
||||
|
||||
export class PhotoConvertingJob extends FileJob {
|
||||
public readonly Name = DefaultsJobs[DefaultsJobs['Photo Converting']];
|
||||
|
||||
constructor() {
|
||||
super({ noVideo: true, noMetaFile: true });
|
||||
super({noVideo: true, noMetaFile: true});
|
||||
}
|
||||
|
||||
public get Supported(): boolean {
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Config } from '../../../../common/config/private/Config';
|
||||
import { DefaultsJobs } from '../../../../common/entities/job/JobDTO';
|
||||
import { FileJob } from './FileJob';
|
||||
import { VideoProcessing } from '../../fileprocessing/VideoProcessing';
|
||||
import {Config} from '../../../../common/config/private/Config';
|
||||
import {DefaultsJobs} from '../../../../common/entities/job/JobDTO';
|
||||
import {FileJob} from './FileJob';
|
||||
import {VideoProcessing} from '../../fileprocessing/VideoProcessing';
|
||||
|
||||
declare const global: any;
|
||||
|
||||
@ -9,7 +9,7 @@ export class VideoConvertingJob extends FileJob {
|
||||
public readonly Name = DefaultsJobs[DefaultsJobs['Video Converting']];
|
||||
|
||||
constructor() {
|
||||
super({ noPhoto: true, noMetaFile: true });
|
||||
super({noPhoto: true, noMetaFile: true});
|
||||
}
|
||||
|
||||
public get Supported(): boolean {
|
||||
|
@ -142,7 +142,7 @@ export class ImageRendererFactory {
|
||||
image = sharp((input as MediaRendererInput).mediaPath, {failOnError: false});
|
||||
} else {
|
||||
const svg_buffer = Buffer.from((input as SvgRendererInput).svgString);
|
||||
image = sharp(svg_buffer, { density: 450 });
|
||||
image = sharp(svg_buffer, {density: 450});
|
||||
}
|
||||
image.rotate();
|
||||
const metadata: Metadata = await image.metadata();
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { TaskQue } from './TaskQue';
|
||||
import {TaskQue} from './TaskQue';
|
||||
|
||||
export interface ITaskExecuter<I, O> {
|
||||
execute(input: I): Promise<O>;
|
||||
@ -23,7 +23,8 @@ export class TaskExecuter<I, O> implements ITaskExecuter<I, O> {
|
||||
process.nextTick(this.run);
|
||||
};
|
||||
|
||||
constructor(private size: number, private worker: (input: I) => Promise<O>) {}
|
||||
constructor(private size: number, private worker: (input: I) => Promise<O>) {
|
||||
}
|
||||
|
||||
execute(input: I): Promise<O> {
|
||||
const promise = this.taskQue.add(input).promise.obj;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Utils } from '../../../common/Utils';
|
||||
import {Utils} from '../../../common/Utils';
|
||||
|
||||
export interface TaskQueEntry<I, O> {
|
||||
data: I;
|
||||
|
@ -53,7 +53,7 @@ export class VideoConverterWorker {
|
||||
.on('error', (e: any) => {
|
||||
reject('[FFmpeg] ' + e.toString() + ' executed: ' + executedCmd);
|
||||
})
|
||||
.on('stderr', function (line: string) {
|
||||
.on('stderr', function(line: string) {
|
||||
// Although this is under `stderr` event, all of ffmpeg output come here.
|
||||
Logger.debug('[FFmpeg] ' + line);
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { RenderingMWs } from '../middlewares/RenderingMWs';
|
||||
import { ErrorCodes, ErrorDTO } from '../../common/entities/Error';
|
||||
import { Logger } from '../Logger';
|
||||
import { Express, NextFunction, Request, Response } from 'express';
|
||||
import {RenderingMWs} from '../middlewares/RenderingMWs';
|
||||
import {ErrorCodes, ErrorDTO} from '../../common/entities/Error';
|
||||
import {Logger} from '../Logger';
|
||||
import {Express, NextFunction, Request, Response} from 'express';
|
||||
import {Config} from '../../common/config/private/Config';
|
||||
|
||||
export class ErrorRouter {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Express, NextFunction, Request, Response } from 'express';
|
||||
import { logFN, Logger } from '../Logger';
|
||||
import {Express, NextFunction, Request, Response} from 'express';
|
||||
import {logFN, Logger} from '../Logger';
|
||||
import {Config} from '../../common/config/private/Config';
|
||||
|
||||
declare global {
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { UserRoles } from '../../common/entities/UserDTO';
|
||||
import { AuthenticationMWs } from '../middlewares/user/AuthenticationMWs';
|
||||
import { RenderingMWs } from '../middlewares/RenderingMWs';
|
||||
import { NotificationMWs } from '../middlewares/NotificationMWs';
|
||||
import { Express } from 'express';
|
||||
import { VersionMWs } from '../middlewares/VersionMWs';
|
||||
import { ServerTimingMWs } from '../middlewares/ServerTimingMWs';
|
||||
import {UserRoles} from '../../common/entities/UserDTO';
|
||||
import {AuthenticationMWs} from '../middlewares/user/AuthenticationMWs';
|
||||
import {RenderingMWs} from '../middlewares/RenderingMWs';
|
||||
import {NotificationMWs} from '../middlewares/NotificationMWs';
|
||||
import {Express} from 'express';
|
||||
import {VersionMWs} from '../middlewares/VersionMWs';
|
||||
import {ServerTimingMWs} from '../middlewares/ServerTimingMWs';
|
||||
import {Config} from '../../common/config/private/Config';
|
||||
|
||||
export class NotificationRouter {
|
||||
|
@ -1,12 +1,12 @@
|
||||
import { AuthenticationMWs } from '../middlewares/user/AuthenticationMWs';
|
||||
import { Express } from 'express';
|
||||
import { RenderingMWs } from '../middlewares/RenderingMWs';
|
||||
import { UserRoles } from '../../common/entities/UserDTO';
|
||||
import { PersonMWs } from '../middlewares/PersonMWs';
|
||||
import { ThumbnailGeneratorMWs } from '../middlewares/thumbnail/ThumbnailGeneratorMWs';
|
||||
import { VersionMWs } from '../middlewares/VersionMWs';
|
||||
import { Config } from '../../common/config/private/Config';
|
||||
import { ServerTimingMWs } from '../middlewares/ServerTimingMWs';
|
||||
import {AuthenticationMWs} from '../middlewares/user/AuthenticationMWs';
|
||||
import {Express} from 'express';
|
||||
import {RenderingMWs} from '../middlewares/RenderingMWs';
|
||||
import {UserRoles} from '../../common/entities/UserDTO';
|
||||
import {PersonMWs} from '../middlewares/PersonMWs';
|
||||
import {ThumbnailGeneratorMWs} from '../middlewares/thumbnail/ThumbnailGeneratorMWs';
|
||||
import {VersionMWs} from '../middlewares/VersionMWs';
|
||||
import {Config} from '../../common/config/private/Config';
|
||||
import {ServerTimingMWs} from '../middlewares/ServerTimingMWs';
|
||||
|
||||
export class PersonRouter {
|
||||
public static route(app: Express): void {
|
||||
|
@ -1,14 +1,14 @@
|
||||
import { Express } from 'express';
|
||||
import { PublicRouter } from './PublicRouter';
|
||||
import { UserRouter } from './UserRouter';
|
||||
import { GalleryRouter } from './GalleryRouter';
|
||||
import { PersonRouter } from './PersonRouter';
|
||||
import { SharingRouter } from './SharingRouter';
|
||||
import { AdminRouter } from './admin/AdminRouter';
|
||||
import { SettingsRouter } from './admin/SettingsRouter';
|
||||
import { NotificationRouter } from './NotificationRouter';
|
||||
import { ErrorRouter } from './ErrorRouter';
|
||||
import { AlbumRouter } from './AlbumRouter';
|
||||
import {Express} from 'express';
|
||||
import {PublicRouter} from './PublicRouter';
|
||||
import {UserRouter} from './UserRouter';
|
||||
import {GalleryRouter} from './GalleryRouter';
|
||||
import {PersonRouter} from './PersonRouter';
|
||||
import {SharingRouter} from './SharingRouter';
|
||||
import {AdminRouter} from './admin/AdminRouter';
|
||||
import {SettingsRouter} from './admin/SettingsRouter';
|
||||
import {NotificationRouter} from './NotificationRouter';
|
||||
import {ErrorRouter} from './ErrorRouter';
|
||||
import {AlbumRouter} from './AlbumRouter';
|
||||
|
||||
export class Router {
|
||||
public static route(app: Express): void {
|
||||
|
@ -1,11 +1,11 @@
|
||||
import { UserMWs } from '../middlewares/user/UserMWs';
|
||||
import { Express } from 'express';
|
||||
import { UserRoles } from '../../common/entities/UserDTO';
|
||||
import { AuthenticationMWs } from '../middlewares/user/AuthenticationMWs';
|
||||
import { UserRequestConstrainsMWs } from '../middlewares/user/UserRequestConstrainsMWs';
|
||||
import { RenderingMWs } from '../middlewares/RenderingMWs';
|
||||
import { ServerTimingMWs } from '../middlewares/ServerTimingMWs';
|
||||
import { Config } from '../../common/config/private/Config';
|
||||
import {UserMWs} from '../middlewares/user/UserMWs';
|
||||
import {Express} from 'express';
|
||||
import {UserRoles} from '../../common/entities/UserDTO';
|
||||
import {AuthenticationMWs} from '../middlewares/user/AuthenticationMWs';
|
||||
import {UserRequestConstrainsMWs} from '../middlewares/user/UserRequestConstrainsMWs';
|
||||
import {RenderingMWs} from '../middlewares/RenderingMWs';
|
||||
import {ServerTimingMWs} from '../middlewares/ServerTimingMWs';
|
||||
import {Config} from '../../common/config/private/Config';
|
||||
|
||||
export class UserRouter {
|
||||
public static route(app: Express): void {
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { AuthenticationMWs } from '../../middlewares/user/AuthenticationMWs';
|
||||
import { UserRoles } from '../../../common/entities/UserDTO';
|
||||
import { RenderingMWs } from '../../middlewares/RenderingMWs';
|
||||
import { AdminMWs } from '../../middlewares/admin/AdminMWs';
|
||||
import { Express } from 'express';
|
||||
import { Config } from '../../../common/config/private/Config';
|
||||
import {AuthenticationMWs} from '../../middlewares/user/AuthenticationMWs';
|
||||
import {UserRoles} from '../../../common/entities/UserDTO';
|
||||
import {RenderingMWs} from '../../middlewares/RenderingMWs';
|
||||
import {AdminMWs} from '../../middlewares/admin/AdminMWs';
|
||||
import {Express} from 'express';
|
||||
import {Config} from '../../../common/config/private/Config';
|
||||
|
||||
export class AdminRouter {
|
||||
public static route(app: Express): void {
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { AuthenticationMWs } from '../../middlewares/user/AuthenticationMWs';
|
||||
import { UserRoles } from '../../../common/entities/UserDTO';
|
||||
import { RenderingMWs } from '../../middlewares/RenderingMWs';
|
||||
import { Express } from 'express';
|
||||
import { SettingsMWs } from '../../middlewares/admin/SettingsMWs';
|
||||
import { Config } from '../../../common/config/private/Config';
|
||||
import {AuthenticationMWs} from '../../middlewares/user/AuthenticationMWs';
|
||||
import {UserRoles} from '../../../common/entities/UserDTO';
|
||||
import {RenderingMWs} from '../../middlewares/RenderingMWs';
|
||||
import {Express} from 'express';
|
||||
import {SettingsMWs} from '../../middlewares/admin/SettingsMWs';
|
||||
import {Config} from '../../../common/config/private/Config';
|
||||
|
||||
export class SettingsRouter {
|
||||
public static route(app: Express): void {
|
||||
|
@ -21,7 +21,7 @@ import {Event} from '../common/event/Event';
|
||||
import {QueryParams} from '../common/QueryParams';
|
||||
import {ConfigClassBuilder} from 'typeconfig/node';
|
||||
import {ConfigClassOptions} from 'typeconfig/src/decorators/class/IConfigClass';
|
||||
import {DatabaseType, ServerConfig} from '../common/config/private/PrivateConfig';
|
||||
import {ServerConfig} from '../common/config/private/PrivateConfig';
|
||||
import {unless} from 'express-unless';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||
|
@ -89,7 +89,7 @@ export class PrivateConfigClass extends ServerConfig {
|
||||
const pc = ConfigClassBuilder.attachPrivateInterface(new PrivateConfigClass());
|
||||
try {
|
||||
await pc.load();
|
||||
}catch (e){
|
||||
} catch (e) {
|
||||
console.error('Error during loading original config. Reverting to defaults.');
|
||||
console.error(e);
|
||||
}
|
||||
|
@ -2,7 +2,6 @@
|
||||
import {SubConfigClass} from '../../../../node_modules/typeconfig/src/decorators/class/SubConfigClass';
|
||||
import {ConfigPriority, TAGS} from '../public/ClientConfig';
|
||||
import {ConfigProperty} from '../../../../node_modules/typeconfig/src/decorators/property/ConfigPropoerty';
|
||||
import {ServerConfig} from './PrivateConfig';
|
||||
|
||||
declare let $localize: (s: TemplateStringsArray) => string;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { SearchQueryTypes } from './SearchQueryDTO';
|
||||
import {SearchQueryTypes} from './SearchQueryDTO';
|
||||
|
||||
export interface IAutoCompleteItem {
|
||||
text: string;
|
||||
@ -6,7 +6,8 @@ export interface IAutoCompleteItem {
|
||||
}
|
||||
|
||||
export class AutoCompleteItem implements IAutoCompleteItem {
|
||||
constructor(public text: string, public type: SearchQueryTypes = null) {}
|
||||
constructor(public text: string, public type: SearchQueryTypes = null) {
|
||||
}
|
||||
|
||||
equals(other: AutoCompleteItem): boolean {
|
||||
return this.text === other.text && this.type === other.type;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { MediaDTO, MediaDTOUtils } from './MediaDTO';
|
||||
import { FileDTO } from './FileDTO';
|
||||
import { PhotoDTO, CoverPhotoDTO } from './PhotoDTO';
|
||||
import { Utils } from '../Utils';
|
||||
import {MediaDTO} from './MediaDTO';
|
||||
import {FileDTO} from './FileDTO';
|
||||
import {CoverPhotoDTO} from './PhotoDTO';
|
||||
import {Utils} from '../Utils';
|
||||
|
||||
export interface DirectoryPathDTO {
|
||||
name: string;
|
||||
@ -9,7 +9,6 @@ export interface DirectoryPathDTO {
|
||||
}
|
||||
|
||||
|
||||
|
||||
export interface DirectoryBaseDTO<S extends FileDTO = MediaDTO>
|
||||
extends DirectoryPathDTO {
|
||||
id: number;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { MediaDTO } from './MediaDTO';
|
||||
import {MediaDTO} from './MediaDTO';
|
||||
|
||||
export interface DuplicatesDTO {
|
||||
media: MediaDTO[];
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Request } from 'express';
|
||||
import {Request} from 'express';
|
||||
|
||||
export enum ErrorCodes {
|
||||
NOT_AUTHENTICATED = 1,
|
||||
@ -33,7 +33,7 @@ export class ErrorDTO {
|
||||
public request: {
|
||||
method: string;
|
||||
url: string;
|
||||
} = { method: '', url: '' };
|
||||
} = {method: '', url: ''};
|
||||
|
||||
constructor(
|
||||
public code: ErrorCodes,
|
||||
|
@ -3,5 +3,6 @@ export class LoginCredential {
|
||||
public username: string = '',
|
||||
public password: string = '',
|
||||
public rememberMe: boolean = true
|
||||
) {}
|
||||
) {
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { ErrorDTO } from './Error';
|
||||
import {ErrorDTO} from './Error';
|
||||
|
||||
export class Message<T> {
|
||||
public error: ErrorDTO = null;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { UserModificationRequest } from './UserModificationRequest';
|
||||
import {UserModificationRequest} from './UserModificationRequest';
|
||||
|
||||
export class PasswordChangeRequest extends UserModificationRequest {
|
||||
constructor(
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { DirectoryPathDTO } from './DirectoryDTO';
|
||||
import { MediaDimension, MediaDTO, MediaMetadata } from './MediaDTO';
|
||||
import {DirectoryPathDTO} from './DirectoryDTO';
|
||||
import {MediaDimension, MediaDTO, MediaMetadata} from './MediaDTO';
|
||||
|
||||
export interface CoverPhotoDTO extends MediaDTO {
|
||||
name: string;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { SubDirectoryDTO } from './DirectoryDTO';
|
||||
import { FileDTO } from './FileDTO';
|
||||
import { MediaDTO } from './MediaDTO';
|
||||
import { SearchQueryDTO } from './SearchQueryDTO';
|
||||
import {SubDirectoryDTO} from './DirectoryDTO';
|
||||
import {FileDTO} from './FileDTO';
|
||||
import {MediaDTO} from './MediaDTO';
|
||||
import {SearchQueryDTO} from './SearchQueryDTO';
|
||||
|
||||
export interface SearchResultDTO {
|
||||
searchQuery: SearchQueryDTO;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { UserDTO } from './UserDTO';
|
||||
import {UserDTO} from './UserDTO';
|
||||
|
||||
export interface SharingDTO {
|
||||
id: number;
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { DirectoryPathDTO } from './DirectoryDTO';
|
||||
import { Utils } from '../Utils';
|
||||
import {DirectoryPathDTO} from './DirectoryDTO';
|
||||
import {Utils} from '../Utils';
|
||||
|
||||
export enum UserRoles {
|
||||
LimitedGuest = 1,
|
||||
|
@ -1,3 +1,4 @@
|
||||
export class UserModificationRequest {
|
||||
constructor(public id: number) {}
|
||||
constructor(public id: number) {
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { DirectoryPathDTO } from './DirectoryDTO';
|
||||
import { MediaDimension, MediaDTO, MediaMetadata } from './MediaDTO';
|
||||
import {DirectoryPathDTO} from './DirectoryDTO';
|
||||
import {MediaDimension, MediaDTO, MediaMetadata} from './MediaDTO';
|
||||
|
||||
export interface VideoDTO extends MediaDTO {
|
||||
id: number;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { CoverPhotoDTO } from '../PhotoDTO';
|
||||
import {CoverPhotoDTO} from '../PhotoDTO';
|
||||
|
||||
export interface AlbumBaseDTO {
|
||||
id: number;
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { AlbumBaseDTO } from './AlbumBaseDTO';
|
||||
import { CoverPhotoDTO } from '../PhotoDTO';
|
||||
import { SearchQueryDTO } from '../SearchQueryDTO';
|
||||
import {AlbumBaseDTO} from './AlbumBaseDTO';
|
||||
import {CoverPhotoDTO} from '../PhotoDTO';
|
||||
import {SearchQueryDTO} from '../SearchQueryDTO';
|
||||
|
||||
export interface SavedSearchDTO extends AlbumBaseDTO {
|
||||
id: number;
|
||||
|
@ -47,7 +47,8 @@ export class EventLimit<T> {
|
||||
class EventLimitHandler<T> {
|
||||
public lastTriggerValue: T = null;
|
||||
|
||||
constructor(public limit: T, public handler: (data?: T) => void) {}
|
||||
constructor(public limit: T, public handler: (data?: T) => void) {
|
||||
}
|
||||
|
||||
public fire(data?: T): void {
|
||||
this.handler(data);
|
||||
|
@ -18,7 +18,7 @@ describe('BackendTextService', () => {
|
||||
getTexts(obj[key]);
|
||||
continue;
|
||||
}
|
||||
expect(backendTextService.get(obj[key])).not.toEqual(null, 'Error for key: ' + obj[key] +', ' + key);
|
||||
expect(backendTextService.get(obj[key])).not.toEqual(null, 'Error for key: ' + obj[key] + ', ' + key);
|
||||
}
|
||||
};
|
||||
getTexts(backendTexts);
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { backendText, backendTexts } from '../../../common/BackendTexts';
|
||||
import { DefaultsJobs } from '../../../common/entities/job/JobDTO';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {backendText, backendTexts} from '../../../common/BackendTexts';
|
||||
import {DefaultsJobs} from '../../../common/entities/job/JobDTO';
|
||||
|
||||
@Injectable()
|
||||
export class BackendtextService {
|
||||
|
@ -1,16 +1,16 @@
|
||||
import { inject, TestBed } from '@angular/core/testing';
|
||||
import { UserService } from './user.service';
|
||||
import { UserDTO } from '../../../../common/entities/UserDTO';
|
||||
import { LoginCredential } from '../../../../common/entities/LoginCredential';
|
||||
import { AuthenticationService } from './authentication.service';
|
||||
import { NetworkService } from './network.service';
|
||||
import { ErrorDTO } from '../../../../common/entities/Error';
|
||||
import { VersionService } from '../version.service';
|
||||
import { ShareService } from '../../ui/gallery/share.service';
|
||||
import {inject, TestBed} from '@angular/core/testing';
|
||||
import {UserService} from './user.service';
|
||||
import {UserDTO} from '../../../../common/entities/UserDTO';
|
||||
import {LoginCredential} from '../../../../common/entities/LoginCredential';
|
||||
import {AuthenticationService} from './authentication.service';
|
||||
import {NetworkService} from './network.service';
|
||||
import {ErrorDTO} from '../../../../common/entities/Error';
|
||||
import {VersionService} from '../version.service';
|
||||
import {ShareService} from '../../ui/gallery/share.service';
|
||||
|
||||
class MockUserService {
|
||||
public login(credential: LoginCredential): Promise<UserDTO> {
|
||||
return Promise.resolve({ name: 'testUserName' } as UserDTO);
|
||||
return Promise.resolve({name: 'testUserName'} as UserDTO);
|
||||
}
|
||||
|
||||
public async getSessionUser(): Promise<UserDTO> {
|
||||
@ -36,9 +36,9 @@ describe('AuthenticationService', () => {
|
||||
TestBed.configureTestingModule({
|
||||
providers: [
|
||||
VersionService,
|
||||
{ provide: NetworkService, useClass: MockNetworkService },
|
||||
{ provide: UserService, useClass: MockUserService },
|
||||
{ provide: ShareService, useClass: MockShareService },
|
||||
{provide: NetworkService, useClass: MockNetworkService},
|
||||
{provide: UserService, useClass: MockUserService},
|
||||
{provide: ShareService, useClass: MockShareService},
|
||||
AuthenticationService,
|
||||
],
|
||||
});
|
||||
|
@ -16,7 +16,7 @@ declare module ServerInject {
|
||||
export let user: UserDTO;
|
||||
}
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AuthenticationService {
|
||||
public readonly user: BehaviorSubject<UserDTO>;
|
||||
|
||||
|
@ -1,18 +1,15 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {
|
||||
ActivatedRouteSnapshot,
|
||||
CanActivate,
|
||||
RouterStateSnapshot,
|
||||
} from '@angular/router';
|
||||
import { AuthenticationService } from '../authentication.service';
|
||||
import { NavigationService } from '../../navigation.service';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot,} from '@angular/router';
|
||||
import {AuthenticationService} from '../authentication.service';
|
||||
import {NavigationService} from '../../navigation.service';
|
||||
|
||||
@Injectable({ providedIn: 'root' })
|
||||
@Injectable({providedIn: 'root'})
|
||||
export class AuthGuard implements CanActivate {
|
||||
constructor(
|
||||
private authenticationService: AuthenticationService,
|
||||
private navigationService: NavigationService
|
||||
) {}
|
||||
) {
|
||||
}
|
||||
|
||||
canActivate(
|
||||
route: ActivatedRouteSnapshot,
|
||||
|
@ -1,16 +1,12 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {
|
||||
HttpEvent,
|
||||
HttpHandler,
|
||||
HttpInterceptor,
|
||||
HttpRequest,
|
||||
} from '@angular/common/http';
|
||||
import { Observable } from 'rxjs';
|
||||
import { AuthenticationService } from '../authentication.service';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest,} from '@angular/common/http';
|
||||
import {Observable} from 'rxjs';
|
||||
import {AuthenticationService} from '../authentication.service';
|
||||
|
||||
@Injectable()
|
||||
export class CSRFInterceptor implements HttpInterceptor {
|
||||
constructor(private authenticationService: AuthenticationService) {}
|
||||
constructor(private authenticationService: AuthenticationService) {
|
||||
}
|
||||
|
||||
intercept(
|
||||
request: HttpRequest<any>,
|
||||
|
@ -1,17 +1,13 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {
|
||||
HttpEvent,
|
||||
HttpHandler,
|
||||
HttpInterceptor,
|
||||
HttpRequest,
|
||||
} from '@angular/common/http';
|
||||
import { Observable, throwError } from 'rxjs';
|
||||
import { catchError } from 'rxjs/operators';
|
||||
import { AuthenticationService } from '../authentication.service';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest,} from '@angular/common/http';
|
||||
import {Observable, throwError} from 'rxjs';
|
||||
import {catchError} from 'rxjs/operators';
|
||||
import {AuthenticationService} from '../authentication.service';
|
||||
|
||||
@Injectable()
|
||||
export class ErrorInterceptor implements HttpInterceptor {
|
||||
constructor(private authenticationService: AuthenticationService) {}
|
||||
constructor(private authenticationService: AuthenticationService) {
|
||||
}
|
||||
|
||||
intercept(
|
||||
request: HttpRequest<any>,
|
||||
|
@ -1,8 +1,5 @@
|
||||
import {getTestBed, inject, TestBed} from '@angular/core/testing';
|
||||
import {
|
||||
HttpClientTestingModule,
|
||||
HttpTestingController,
|
||||
} from '@angular/common/http/testing';
|
||||
import {HttpClientTestingModule, HttpTestingController,} from '@angular/common/http/testing';
|
||||
import {NetworkService} from './network.service';
|
||||
import {Message} from '../../../../common/entities/Message';
|
||||
import {LoadingBarService} from '@ngx-loading-bar/core';
|
||||
|
@ -1,12 +1,9 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ToastrService } from 'ngx-toastr';
|
||||
import { NetworkService } from './network/network.service';
|
||||
import { AuthenticationService } from './network/authentication.service';
|
||||
import {
|
||||
NotificationDTO,
|
||||
NotificationType,
|
||||
} from '../../../common/entities/NotificationDTO';
|
||||
import { UserDTO, UserRoles } from '../../../common/entities/UserDTO';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {ToastrService} from 'ngx-toastr';
|
||||
import {NetworkService} from './network/network.service';
|
||||
import {AuthenticationService} from './network/authentication.service';
|
||||
import {NotificationDTO, NotificationType,} from '../../../common/entities/NotificationDTO';
|
||||
import {UserDTO, UserRoles} from '../../../common/entities/UserDTO';
|
||||
|
||||
export interface CountedNotificationDTO extends NotificationDTO {
|
||||
count: number;
|
||||
@ -53,7 +50,7 @@ export class NotificationService {
|
||||
if (n.details) {
|
||||
key += JSON.stringify(n.details);
|
||||
}
|
||||
groups[key] = groups[key] || { notification: n, count: 0 };
|
||||
groups[key] = groups[key] || {notification: n, count: 0};
|
||||
groups[key].count++;
|
||||
});
|
||||
this.numberOfNotifications = notifications.length;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import {Injectable} from '@angular/core';
|
||||
|
||||
@Injectable()
|
||||
export class SeededRandomService {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {BehaviorSubject} from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
export class VersionService {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
|
||||
@Pipe({ name: 'duration' })
|
||||
@Pipe({name: 'duration'})
|
||||
export class DurationPipe implements PipeTransform {
|
||||
|
||||
transform(time: number, separator: ':' | 'string' = 'string'): string {
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { FileDTO } from '../../../common/entities/FileDTO';
|
||||
import { Utils } from '../../../common/Utils';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {FileDTO} from '../../../common/entities/FileDTO';
|
||||
import {Utils} from '../../../common/Utils';
|
||||
|
||||
@Pipe({ name: 'toPath' })
|
||||
@Pipe({name: 'toPath'})
|
||||
export class FileDTOToPathPipe implements PipeTransform {
|
||||
transform(metaFile: FileDTO): string | null {
|
||||
if (!metaFile) {
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { FileDTO } from '../../../common/entities/FileDTO';
|
||||
import { Utils } from '../../../common/Utils';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {FileDTO} from '../../../common/entities/FileDTO';
|
||||
import {Utils} from '../../../common/Utils';
|
||||
|
||||
@Pipe({ name: 'toRelativePath' })
|
||||
@Pipe({name: 'toRelativePath'})
|
||||
export class FileDTOToRelativePathPipe implements PipeTransform {
|
||||
transform(metaFile: FileDTO): string | null {
|
||||
if (!metaFile) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
|
||||
@Pipe({ name: 'fileSize' })
|
||||
@Pipe({name: 'fileSize'})
|
||||
export class FileSizePipe implements PipeTransform {
|
||||
transform(size: number): string {
|
||||
const postFixes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { FileDTO } from '../../../common/entities/FileDTO';
|
||||
import { Config } from '../../../common/config/public/Config';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {FileDTO} from '../../../common/entities/FileDTO';
|
||||
import {Config} from '../../../common/config/public/Config';
|
||||
|
||||
@Pipe({ name: 'gpxFiles' })
|
||||
@Pipe({name: 'gpxFiles'})
|
||||
export class GPXFilesFilterPipe implements PipeTransform {
|
||||
transform(metaFiles: FileDTO[]): FileDTO[] | null {
|
||||
if (!Config.MetaFile.gpx) {
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { FileDTO } from '../../../common/entities/FileDTO';
|
||||
import { MDFileDTO } from '../../../common/entities/MDFileDTO';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {FileDTO} from '../../../common/entities/FileDTO';
|
||||
import {MDFileDTO} from '../../../common/entities/MDFileDTO';
|
||||
|
||||
@Pipe({ name: 'mdFiles' })
|
||||
@Pipe({name: 'mdFiles'})
|
||||
export class MDFilesFilterPipe implements PipeTransform {
|
||||
transform(metaFiles: FileDTO[]): MDFileDTO[] | null {
|
||||
if (!metaFiles) {
|
||||
|
@ -1,19 +1,19 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { MediaDTO, MediaDTOUtils } from '../../../common/entities/MediaDTO';
|
||||
import { PhotoDTO } from '../../../common/entities/PhotoDTO';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {MediaDTO, MediaDTOUtils} from '../../../common/entities/MediaDTO';
|
||||
import {PhotoDTO} from '../../../common/entities/PhotoDTO';
|
||||
import {MediaGroup} from '../ui/gallery/navigator/sorting.service';
|
||||
|
||||
@Pipe({ name: 'photosOnly' })
|
||||
@Pipe({name: 'photosOnly'})
|
||||
export class PhotoFilterPipe implements PipeTransform {
|
||||
transform(mediaGroups: MediaGroup[]): PhotoDTO[] | null {
|
||||
if (!mediaGroups) {
|
||||
return null;
|
||||
}
|
||||
const ret = [];
|
||||
for(let i = 0; i < mediaGroups.length; ++i){
|
||||
for (let i = 0; i < mediaGroups.length; ++i) {
|
||||
ret.push(...mediaGroups[i].media.filter((m: MediaDTO): boolean =>
|
||||
MediaDTOUtils.isPhoto(m)
|
||||
) as PhotoDTO[])
|
||||
) as PhotoDTO[]);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import {Pipe, PipeTransform, SecurityContext} from '@angular/core';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {DomSanitizer} from '@angular/platform-browser';
|
||||
|
||||
@Pipe({name: 'safeHtml'})
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { UserRoles } from '../../../common/entities/UserDTO';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {UserRoles} from '../../../common/entities/UserDTO';
|
||||
|
||||
@Pipe({ name: 'stringifyRole' })
|
||||
@Pipe({name: 'stringifyRole'})
|
||||
export class StringifyRole implements PipeTransform {
|
||||
transform(role: number): string {
|
||||
return UserRoles[role];
|
||||
|
@ -1,10 +1,11 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import { SearchQueryDTO } from '../../../common/entities/SearchQueryDTO';
|
||||
import { SearchQueryParserService } from '../ui/gallery/search/search-query-parser.service';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {SearchQueryDTO} from '../../../common/entities/SearchQueryDTO';
|
||||
import {SearchQueryParserService} from '../ui/gallery/search/search-query-parser.service';
|
||||
|
||||
@Pipe({ name: 'searchQuery' })
|
||||
@Pipe({name: 'searchQuery'})
|
||||
export class StringifySearchQuery implements PipeTransform {
|
||||
constructor(private searchQueryParserService: SearchQueryParserService) {}
|
||||
constructor(private searchQueryParserService: SearchQueryParserService) {
|
||||
}
|
||||
|
||||
transform(query: SearchQueryDTO): string {
|
||||
return this.searchQueryParserService.stringify(query);
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Pipe, PipeTransform } from '@angular/core';
|
||||
import {Pipe, PipeTransform} from '@angular/core';
|
||||
import {EnumTranslations} from '../ui/EnumTranslations';
|
||||
import {SearchQueryTypes} from '../../../common/entities/SearchQueryDTO';
|
||||
|
||||
@Pipe({ name: 'stringifySearchType' })
|
||||
@Pipe({name: 'stringifySearchType'})
|
||||
export class StringifySearchType implements PipeTransform {
|
||||
|
||||
transform(type: SearchQueryTypes): string {
|
||||
|
@ -3,7 +3,7 @@ import {ConfigPriority, MapProviders, NavigationLinkTypes, ScrollUpModes} from '
|
||||
import {ReIndexingSensitivity} from '../../../common/config/private/PrivateConfig';
|
||||
import {SearchQueryTypes} from '../../../common/entities/SearchQueryDTO';
|
||||
import {ConfigStyle} from './settings/settings.service';
|
||||
import {SortByTypes,GroupByTypes} from '../../../common/entities/SortingMethods';
|
||||
import {GroupByTypes, SortByTypes} from '../../../common/entities/SortingMethods';
|
||||
import {GridSizes} from '../../../common/entities/GridSizes';
|
||||
|
||||
export const EnumTranslations: Record<string, string> = {};
|
||||
|
@ -1,16 +1,13 @@
|
||||
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { RouterLink } from '@angular/router';
|
||||
import { DomSanitizer, SafeStyle } from '@angular/platform-browser';
|
||||
import {
|
||||
Thumbnail,
|
||||
ThumbnailManagerService,
|
||||
} from '../../gallery/thumbnailManager.service';
|
||||
import { AuthenticationService } from '../../../model/network/authentication.service';
|
||||
import { AlbumsService } from '../albums.service';
|
||||
import { AlbumBaseDTO } from '../../../../../common/entities/album/AlbumBaseDTO';
|
||||
import { Media } from '../../gallery/Media';
|
||||
import { SavedSearchDTO } from '../../../../../common/entities/album/SavedSearchDTO';
|
||||
import { UserRoles } from '../../../../../common/entities/UserDTO';
|
||||
import {Component, Input, OnDestroy, OnInit} from '@angular/core';
|
||||
import {RouterLink} from '@angular/router';
|
||||
import {DomSanitizer, SafeStyle} from '@angular/platform-browser';
|
||||
import {Thumbnail, ThumbnailManagerService,} from '../../gallery/thumbnailManager.service';
|
||||
import {AuthenticationService} from '../../../model/network/authentication.service';
|
||||
import {AlbumsService} from '../albums.service';
|
||||
import {AlbumBaseDTO} from '../../../../../common/entities/album/AlbumBaseDTO';
|
||||
import {Media} from '../../gallery/Media';
|
||||
import {SavedSearchDTO} from '../../../../../common/entities/album/SavedSearchDTO';
|
||||
import {UserRoles} from '../../../../../common/entities/UserDTO';
|
||||
import {Config} from '../../../../../common/config/public/Config';
|
||||
|
||||
@Component({
|
||||
@ -31,7 +28,8 @@ export class AlbumComponent implements OnInit, OnDestroy {
|
||||
private sanitizer: DomSanitizer,
|
||||
private albumService: AlbumsService,
|
||||
public authenticationService: AuthenticationService
|
||||
) {}
|
||||
) {
|
||||
}
|
||||
|
||||
get IsSavedSearch(): boolean {
|
||||
return this.album && !!this.AsSavedSearch.searchQuery;
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Component, Input, TemplateRef } from '@angular/core';
|
||||
import { BsModalService } from 'ngx-bootstrap/modal';
|
||||
import { BsModalRef } from 'ngx-bootstrap/modal/bs-modal-ref.service';
|
||||
import { SearchQueryDTO } from '../../../../../common/entities/SearchQueryDTO';
|
||||
import {Component, Input, TemplateRef} from '@angular/core';
|
||||
import {BsModalService} from 'ngx-bootstrap/modal';
|
||||
import {BsModalRef} from 'ngx-bootstrap/modal/bs-modal-ref.service';
|
||||
import {SearchQueryDTO} from '../../../../../common/entities/SearchQueryDTO';
|
||||
|
||||
@Component({
|
||||
selector: 'app-saved-search-popup-btn',
|
||||
@ -13,10 +13,11 @@ export class SavedSearchPopupComponent {
|
||||
@Input() savedSearchDTO: { name: string; searchQuery: SearchQueryDTO };
|
||||
private modalRef: BsModalRef;
|
||||
|
||||
constructor(private modalService: BsModalService) {}
|
||||
constructor(private modalService: BsModalService) {
|
||||
}
|
||||
|
||||
public async openModal(template: TemplateRef<any>): Promise<void> {
|
||||
this.modalRef = this.modalService.show(template, { class: 'modal-lg' });
|
||||
this.modalRef = this.modalService.show(template, {class: 'modal-lg'});
|
||||
document.body.style.paddingRight = '0px';
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { NetworkService } from '../../model/network/network.service';
|
||||
import { DuplicatesDTO } from '../../../../common/entities/DuplicatesDTO';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import {Injectable} from '@angular/core';
|
||||
import {NetworkService} from '../../model/network/network.service';
|
||||
import {DuplicatesDTO} from '../../../../common/entities/DuplicatesDTO';
|
||||
import {BehaviorSubject} from 'rxjs';
|
||||
|
||||
@Injectable()
|
||||
export class DuplicateService {
|
||||
|
@ -1,10 +1,7 @@
|
||||
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { MediaDTO } from '../../../../../common/entities/MediaDTO';
|
||||
import {
|
||||
IconThumbnail,
|
||||
ThumbnailManagerService,
|
||||
} from '../../gallery/thumbnailManager.service';
|
||||
import { MediaIcon } from '../../gallery/MediaIcon';
|
||||
import {Component, Input, OnDestroy, OnInit} from '@angular/core';
|
||||
import {MediaDTO} from '../../../../../common/entities/MediaDTO';
|
||||
import {IconThumbnail, ThumbnailManagerService,} from '../../gallery/thumbnailManager.service';
|
||||
import {MediaIcon} from '../../gallery/MediaIcon';
|
||||
|
||||
@Component({
|
||||
selector: 'app-duplicates-photo',
|
||||
@ -16,7 +13,8 @@ export class DuplicatesPhotoComponent implements OnInit, OnDestroy {
|
||||
|
||||
thumbnail: IconThumbnail;
|
||||
|
||||
constructor(private thumbnailService: ThumbnailManagerService) {}
|
||||
constructor(private thumbnailService: ThumbnailManagerService) {
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.thumbnail = this.thumbnailService.getIcon(new MediaIcon(this.media));
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { PersonDTO } from '../../../../common/entities/PersonDTO';
|
||||
import { Config } from '../../../../common/config/public/Config';
|
||||
import { Utils } from '../../../../common/Utils';
|
||||
import {PersonDTO} from '../../../../common/entities/PersonDTO';
|
||||
import {Config} from '../../../../common/config/public/Config';
|
||||
import {Utils} from '../../../../common/Utils';
|
||||
|
||||
export class Person implements PersonDTO {
|
||||
isFavourite: boolean;
|
||||
|
@ -1,19 +1,12 @@
|
||||
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { RouterLink } from '@angular/router';
|
||||
import { PersonDTO } from '../../../../../common/entities/PersonDTO';
|
||||
import { DomSanitizer, SafeStyle } from '@angular/platform-browser';
|
||||
import {
|
||||
PersonThumbnail,
|
||||
ThumbnailManagerService,
|
||||
} from '../../gallery/thumbnailManager.service';
|
||||
import { FacesService } from '../faces.service';
|
||||
import { AuthenticationService } from '../../../model/network/authentication.service';
|
||||
import { Config } from '../../../../../common/config/public/Config';
|
||||
import {
|
||||
SearchQueryTypes,
|
||||
TextSearch,
|
||||
TextSearchQueryMatchTypes,
|
||||
} from '../../../../../common/entities/SearchQueryDTO';
|
||||
import {Component, Input, OnDestroy, OnInit} from '@angular/core';
|
||||
import {RouterLink} from '@angular/router';
|
||||
import {PersonDTO} from '../../../../../common/entities/PersonDTO';
|
||||
import {DomSanitizer, SafeStyle} from '@angular/platform-browser';
|
||||
import {PersonThumbnail, ThumbnailManagerService,} from '../../gallery/thumbnailManager.service';
|
||||
import {FacesService} from '../faces.service';
|
||||
import {AuthenticationService} from '../../../model/network/authentication.service';
|
||||
import {Config} from '../../../../../common/config/public/Config';
|
||||
import {SearchQueryTypes, TextSearch, TextSearchQueryMatchTypes,} from '../../../../../common/entities/SearchQueryDTO';
|
||||
|
||||
@Component({
|
||||
selector: 'app-face',
|
||||
@ -33,7 +26,8 @@ export class FaceComponent implements OnInit, OnDestroy {
|
||||
private sanitizer: DomSanitizer,
|
||||
private faceService: FacesService,
|
||||
public authenticationService: AuthenticationService
|
||||
) {}
|
||||
) {
|
||||
}
|
||||
|
||||
get CanUpdate(): boolean {
|
||||
return (
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
|
||||
import { FacesService } from './faces.service';
|
||||
import { QueryService } from '../../model/query.service';
|
||||
import { map } from 'rxjs/operators';
|
||||
import { PersonDTO } from '../../../../common/entities/PersonDTO';
|
||||
import { Observable } from 'rxjs';
|
||||
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
|
||||
import {FacesService} from './faces.service';
|
||||
import {QueryService} from '../../model/query.service';
|
||||
import {map} from 'rxjs/operators';
|
||||
import {PersonDTO} from '../../../../common/entities/PersonDTO';
|
||||
import {Observable} from 'rxjs';
|
||||
import {PiTitleService} from '../../model/pi-title.service';
|
||||
|
||||
@Component({
|
||||
@ -12,7 +12,7 @@ import {PiTitleService} from '../../model/pi-title.service';
|
||||
styleUrls: ['./faces.component.css'],
|
||||
})
|
||||
export class FacesComponent implements OnInit {
|
||||
@ViewChild('container', { static: true }) container: ElementRef;
|
||||
@ViewChild('container', {static: true}) container: ElementRef;
|
||||
public size: number;
|
||||
favourites: Observable<PersonDTO[]>;
|
||||
nonFavourites: Observable<PersonDTO[]>;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user