aboutsummaryrefslogtreecommitdiffstats
path: root/src/storage
diff options
context:
space:
mode:
Diffstat (limited to 'src/storage')
-rw-r--r--src/storage/entity/stored-file.entity.ts18
-rw-r--r--src/storage/service/storage-cron.service.ts34
-rw-r--r--src/storage/service/storage.service.ts21
-rw-r--r--src/storage/storage.module.ts13
4 files changed, 86 insertions, 0 deletions
diff --git a/src/storage/entity/stored-file.entity.ts b/src/storage/entity/stored-file.entity.ts
new file mode 100644
index 0000000..e4b4931
--- /dev/null
+++ b/src/storage/entity/stored-file.entity.ts
@@ -0,0 +1,18 @@
+import { FileMetadata } from 'src/file/entity/file.entity';
+import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, OneToOne, JoinColumn } from 'typeorm';
+
+@Entity()
+export class StoredFile {
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @CreateDateColumn()
+ creationDate: Date;
+
+ @Column({ nullable: false })
+ b64Contents: string;
+
+ @OneToOne(() => FileMetadata, (metadata) => metadata.id, { nullable: false })
+ @JoinColumn()
+ fileMetadata: FileMetadata;
+}
diff --git a/src/storage/service/storage-cron.service.ts b/src/storage/service/storage-cron.service.ts
new file mode 100644
index 0000000..ede6ce9
--- /dev/null
+++ b/src/storage/service/storage-cron.service.ts
@@ -0,0 +1,34 @@
+import { Injectable, Logger } from '@nestjs/common';
+import { StoredFile } from '../entity/stored-file.entity';
+import { LessThan, Repository } from 'typeorm';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Cron } from '@nestjs/schedule';
+
+@Injectable()
+export class StorageCronService {
+ private readonly logger = new Logger(StorageCronService.name);
+
+ constructor(
+ @InjectRepository(StoredFile)
+ private storedFileRepository: Repository<StoredFile>,
+ ) {}
+
+ @Cron('0 30 * * * *')
+ async deleteExpired() {
+ const filesToDelete = await this.storedFileRepository.find({
+ relations: {
+ fileMetadata: true,
+ },
+ where: {
+ fileMetadata: {
+ validUntil: LessThan(new Date(Date.now())),
+ },
+ },
+ });
+
+ if (filesToDelete.length > 0) {
+ await this.storedFileRepository.remove(filesToDelete);
+ this.logger.log(`Deleted ${filesToDelete.length} expired files`);
+ }
+ }
+}
diff --git a/src/storage/service/storage.service.ts b/src/storage/service/storage.service.ts
new file mode 100644
index 0000000..6bc6b11
--- /dev/null
+++ b/src/storage/service/storage.service.ts
@@ -0,0 +1,21 @@
+import { Injectable } from '@nestjs/common';
+import { FileMetadata } from 'src/file/entity/file.entity';
+import { StoredFile } from '../entity/stored-file.entity';
+import { Repository } from 'typeorm';
+import { InjectRepository } from '@nestjs/typeorm';
+
+@Injectable()
+export class StorageService {
+ constructor(
+ @InjectRepository(StoredFile)
+ private storedFileRepository: Repository<StoredFile>,
+ ) {}
+
+ async createFile(b64Contents: string, fileMetadata: FileMetadata): Promise<StoredFile> {
+ const newFile = new StoredFile();
+ newFile.b64Contents = b64Contents;
+ newFile.fileMetadata = fileMetadata;
+
+ return this.storedFileRepository.save(newFile);
+ }
+}
diff --git a/src/storage/storage.module.ts b/src/storage/storage.module.ts
new file mode 100644
index 0000000..689aa28
--- /dev/null
+++ b/src/storage/storage.module.ts
@@ -0,0 +1,13 @@
+import { Module } from '@nestjs/common';
+import { StorageService } from './service/storage.service';
+import { StoredFile } from './entity/stored-file.entity';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { StorageCronService } from './service/storage-cron.service';
+import { FileMetadata } from 'src/file/entity/file.entity';
+
+@Module({
+ imports: [TypeOrmModule.forFeature([StoredFile]), FileMetadata],
+ providers: [StorageService, StorageCronService],
+ exports: [StorageService],
+})
+export class StorageModule {}