mirror of
https://github.com/CaramelFur/Picsur.git
synced 2025-11-12 14:55:39 +01:00
add image derivative db
This commit is contained in:
@@ -1,12 +1,19 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { EImageDerivativeBackend } from '../../models/entities/image-derivative.entity';
|
||||
import { EImageFileBackend } from '../../models/entities/image-file.entity';
|
||||
import { EImageBackend } from '../../models/entities/image.entity';
|
||||
import { ImageDBService } from './image-db.service';
|
||||
import { ImageFileDBService } from './image-file-db.service';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([EImageBackend, EImageFileBackend])],
|
||||
imports: [
|
||||
TypeOrmModule.forFeature([
|
||||
EImageBackend,
|
||||
EImageFileBackend,
|
||||
EImageDerivativeBackend,
|
||||
]),
|
||||
],
|
||||
providers: [ImageDBService, ImageFileDBService],
|
||||
exports: [ImageDBService, ImageFileDBService],
|
||||
})
|
||||
|
||||
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { AsyncFailable, Fail } from 'picsur-shared/dist/types';
|
||||
import { Repository } from 'typeorm';
|
||||
import { EImageDerivativeBackend } from '../../models/entities/image-derivative.entity';
|
||||
import { EImageFileBackend } from '../../models/entities/image-file.entity';
|
||||
import { EImageBackend } from '../../models/entities/image.entity';
|
||||
|
||||
@@ -13,6 +14,9 @@ export class ImageDBService {
|
||||
|
||||
@InjectRepository(EImageFileBackend)
|
||||
private imageFileRepo: Repository<EImageFileBackend>,
|
||||
|
||||
@InjectRepository(EImageDerivativeBackend)
|
||||
private imageDerivativeRepo: Repository<EImageDerivativeBackend>,
|
||||
) {}
|
||||
|
||||
public async create(): AsyncFailable<EImageBackend> {
|
||||
@@ -62,12 +66,19 @@ export class ImageDBService {
|
||||
|
||||
public async delete(id: string): AsyncFailable<true> {
|
||||
try {
|
||||
const derivativesResult = await this.imageDerivativeRepo.delete({
|
||||
imageId: id,
|
||||
});
|
||||
const filesResult = await this.imageFileRepo.delete({
|
||||
imageId: id,
|
||||
});
|
||||
const result = await this.imageRepo.delete({ id });
|
||||
|
||||
if (result.affected === 0 && filesResult.affected === 0)
|
||||
|
||||
if (
|
||||
result.affected === 0 &&
|
||||
filesResult.affected === 0 &&
|
||||
derivativesResult.affected === 0
|
||||
)
|
||||
return Fail('Image not found');
|
||||
} catch (e) {
|
||||
return Fail(e);
|
||||
@@ -80,6 +91,7 @@ export class ImageDBService {
|
||||
return Fail('You must confirm that you want to delete all images');
|
||||
|
||||
try {
|
||||
await this.imageDerivativeRepo.delete({});
|
||||
await this.imageFileRepo.delete({});
|
||||
await this.imageRepo.delete({});
|
||||
} catch (e) {
|
||||
|
||||
@@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { AsyncFailable, Fail } from 'picsur-shared/dist/types';
|
||||
import { Repository } from 'typeorm';
|
||||
import { ImageFileType } from '../../models/constants/image-file-types.const';
|
||||
import { EImageDerivativeBackend } from '../../models/entities/image-derivative.entity';
|
||||
import { EImageFileBackend } from '../../models/entities/image-file.entity';
|
||||
|
||||
@Injectable()
|
||||
@@ -10,9 +11,12 @@ export class ImageFileDBService {
|
||||
constructor(
|
||||
@InjectRepository(EImageFileBackend)
|
||||
private imageFileRepo: Repository<EImageFileBackend>,
|
||||
|
||||
@InjectRepository(EImageDerivativeBackend)
|
||||
private imageDerivativeRepo: Repository<EImageDerivativeBackend>,
|
||||
) {}
|
||||
|
||||
public async setSingle(
|
||||
public async setFile(
|
||||
imageId: string,
|
||||
type: ImageFileType,
|
||||
file: Buffer,
|
||||
@@ -25,7 +29,9 @@ export class ImageFileDBService {
|
||||
imageFile.data = file;
|
||||
|
||||
try {
|
||||
await this.imageFileRepo.save(imageFile);
|
||||
await this.imageFileRepo.upsert(imageFile, {
|
||||
conflictPaths: ['imageId', 'type'],
|
||||
});
|
||||
} catch (e) {
|
||||
return Fail(e);
|
||||
}
|
||||
@@ -33,7 +39,7 @@ export class ImageFileDBService {
|
||||
return true;
|
||||
}
|
||||
|
||||
public async getSingle(
|
||||
public async getFile(
|
||||
imageId: string,
|
||||
type: ImageFileType,
|
||||
): AsyncFailable<EImageFileBackend> {
|
||||
@@ -49,7 +55,7 @@ export class ImageFileDBService {
|
||||
}
|
||||
}
|
||||
|
||||
public async getSingleMime(
|
||||
public async getFileMime(
|
||||
imageId: string,
|
||||
type: ImageFileType,
|
||||
): AsyncFailable<string> {
|
||||
@@ -65,4 +71,58 @@ export class ImageFileDBService {
|
||||
return Fail(e);
|
||||
}
|
||||
}
|
||||
|
||||
public async addDerivative(
|
||||
imageId: string,
|
||||
key: string,
|
||||
mime: string,
|
||||
file: Buffer,
|
||||
): AsyncFailable<true> {
|
||||
const imageDerivative = new EImageDerivativeBackend();
|
||||
imageDerivative.imageId = imageId;
|
||||
imageDerivative.key = key;
|
||||
imageDerivative.mime = mime;
|
||||
imageDerivative.data = file;
|
||||
|
||||
try {
|
||||
await this.imageDerivativeRepo.save(imageDerivative);
|
||||
} catch (e) {
|
||||
return Fail(e);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async getDerivative(
|
||||
imageId: string,
|
||||
key: string,
|
||||
): AsyncFailable<EImageDerivativeBackend> {
|
||||
try {
|
||||
const found = await this.imageDerivativeRepo.findOne({
|
||||
where: { imageId, key },
|
||||
});
|
||||
|
||||
if (!found) return Fail('Image not found');
|
||||
return found;
|
||||
} catch (e) {
|
||||
return Fail(e);
|
||||
}
|
||||
}
|
||||
|
||||
public async getDerivativeMime(
|
||||
imageId: string,
|
||||
key: string,
|
||||
): AsyncFailable<string> {
|
||||
try {
|
||||
const found = await this.imageDerivativeRepo.findOne({
|
||||
where: { imageId, key },
|
||||
select: ['mime'],
|
||||
});
|
||||
|
||||
if (!found) return Fail('Image not found');
|
||||
return found.mime;
|
||||
} catch (e) {
|
||||
return Fail(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,8 +66,6 @@ export class RolesService {
|
||||
[] as Permissions,
|
||||
);
|
||||
|
||||
console.log(permissions);
|
||||
|
||||
return makeUnique(permissions);
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ export class ImageManagerService {
|
||||
const imageEntity = await this.imagesService.create();
|
||||
if (HasFailed(imageEntity)) return imageEntity;
|
||||
|
||||
const imageFileEntity = await this.imageFilesService.setSingle(
|
||||
const imageFileEntity = await this.imageFilesService.setFile(
|
||||
imageEntity.id,
|
||||
ImageFileType.MASTER,
|
||||
processResult.image,
|
||||
@@ -74,11 +74,11 @@ export class ImageManagerService {
|
||||
// File getters ==============================================================
|
||||
|
||||
public async getMaster(imageId: string): AsyncFailable<EImageFileBackend> {
|
||||
return this.imageFilesService.getSingle(imageId, ImageFileType.MASTER);
|
||||
return this.imageFilesService.getFile(imageId, ImageFileType.MASTER);
|
||||
}
|
||||
|
||||
public async getMasterMime(imageId: string): AsyncFailable<FullMime> {
|
||||
const mime = await this.imageFilesService.getSingleMime(
|
||||
const mime = await this.imageFilesService.getFileMime(
|
||||
imageId,
|
||||
ImageFileType.MASTER,
|
||||
);
|
||||
@@ -88,11 +88,11 @@ export class ImageManagerService {
|
||||
}
|
||||
|
||||
public async getOriginal(imageId: string): AsyncFailable<EImageFileBackend> {
|
||||
return this.imageFilesService.getSingle(imageId, ImageFileType.ORIGINAL);
|
||||
return this.imageFilesService.getFile(imageId, ImageFileType.ORIGINAL);
|
||||
}
|
||||
|
||||
public async getOriginalMime(imageId: string): AsyncFailable<FullMime> {
|
||||
const mime = await this.imageFilesService.getSingleMime(
|
||||
const mime = await this.imageFilesService.getFileMime(
|
||||
imageId,
|
||||
ImageFileType.ORIGINAL,
|
||||
);
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
export enum ImageFileType {
|
||||
ORIGINAL = 'original',
|
||||
MASTER = 'master',
|
||||
DERIVED = 'derived',
|
||||
}
|
||||
|
||||
23
backend/src/models/entities/image-derivative.entity.ts
Normal file
23
backend/src/models/entities/image-derivative.entity.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { Column, Entity, Index, PrimaryGeneratedColumn, Unique } from 'typeorm';
|
||||
|
||||
@Entity()
|
||||
@Unique(['imageId', 'key'])
|
||||
export class EImageDerivativeBackend {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
private _id?: string;
|
||||
|
||||
@Index()
|
||||
@Column({ nullable: false })
|
||||
imageId: string;
|
||||
|
||||
@Index()
|
||||
@Column({ nullable: false })
|
||||
key: string;
|
||||
|
||||
@Column({ nullable: false })
|
||||
mime: string;
|
||||
|
||||
// Binary data
|
||||
@Column({ type: 'bytea', nullable: false })
|
||||
data: Buffer;
|
||||
}
|
||||
@@ -1,17 +1,18 @@
|
||||
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';
|
||||
import { Column, Entity, Index, PrimaryGeneratedColumn, Unique } from 'typeorm';
|
||||
import { ImageFileType } from '../constants/image-file-types.const';
|
||||
|
||||
@Entity()
|
||||
@Unique(['imageId', 'type'])
|
||||
export class EImageFileBackend {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
private _id?: string;
|
||||
|
||||
@Column({ nullable: false })
|
||||
@Index()
|
||||
@Column({ nullable: false })
|
||||
imageId: string;
|
||||
|
||||
@Column({ nullable: false, enum: ImageFileType })
|
||||
@Index()
|
||||
@Column({ nullable: false, enum: ImageFileType })
|
||||
type: ImageFileType;
|
||||
|
||||
@Column({ nullable: false })
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { EImageDerivativeBackend } from './image-derivative.entity';
|
||||
import { EImageFileBackend } from './image-file.entity';
|
||||
import { EImageBackend } from './image.entity';
|
||||
import { ERoleBackend } from './role.entity';
|
||||
@@ -8,6 +9,7 @@ import { EUsrPreferenceBackend } from './usr-preference.entity';
|
||||
export const EntityList = [
|
||||
EImageBackend,
|
||||
EImageFileBackend,
|
||||
EImageDerivativeBackend,
|
||||
EUserBackend,
|
||||
ERoleBackend,
|
||||
ESysPreferenceBackend,
|
||||
|
||||
Reference in New Issue
Block a user