aboutsummaryrefslogtreecommitdiffstats
path: root/src/session
diff options
context:
space:
mode:
Diffstat (limited to 'src/session')
-rw-r--r--src/session/controller/session.controller.ts20
-rw-r--r--src/session/entity/session.entity.ts30
-rw-r--r--src/session/service/session.service.ts70
-rw-r--r--src/session/session.module.ts13
4 files changed, 133 insertions, 0 deletions
diff --git a/src/session/controller/session.controller.ts b/src/session/controller/session.controller.ts
new file mode 100644
index 0000000..23508bb
--- /dev/null
+++ b/src/session/controller/session.controller.ts
@@ -0,0 +1,20 @@
+import { Controller, Post } from '@nestjs/common';
+import { SessionService } from '../service/session.service';
+
+@Controller('session')
+export class SessionController {
+ constructor(private readonly sessionService: SessionService) {}
+
+ @Post('create')
+ async create() {
+ const validTo = new Date(Date.now() + 1000 * 60 * 15);
+
+ const session = await this.sessionService.createSession(validTo);
+
+ return {
+ token: session.token,
+ creationDate: session.creationDate,
+ validUntil: session.validUntil,
+ };
+ }
+}
diff --git a/src/session/entity/session.entity.ts b/src/session/entity/session.entity.ts
new file mode 100644
index 0000000..a4f13ae
--- /dev/null
+++ b/src/session/entity/session.entity.ts
@@ -0,0 +1,30 @@
+import { FileMetadata } from '../../file/entity/file.entity';
+import { Entity, Column, BeforeInsert, CreateDateColumn, PrimaryGeneratedColumn, Index, OneToMany } from 'typeorm';
+import { nanoid } from 'nanoid';
+
+@Entity()
+export class Session {
+ @PrimaryGeneratedColumn()
+ id: number;
+
+ @Index('sessiontoken-idx')
+ @Column({ unique: true })
+ token: string;
+
+ @CreateDateColumn()
+ creationDate: Date;
+
+ @Column()
+ validUntil: Date;
+
+ @Column({ default: false })
+ used: boolean;
+
+ @OneToMany(() => FileMetadata, (file) => file.session)
+ files: FileMetadata[];
+
+ @BeforeInsert()
+ private beforeInsert() {
+ this.token = nanoid();
+ }
+}
diff --git a/src/session/service/session.service.ts b/src/session/service/session.service.ts
new file mode 100644
index 0000000..0712fb0
--- /dev/null
+++ b/src/session/service/session.service.ts
@@ -0,0 +1,70 @@
+import { Injectable } from '@nestjs/common';
+import { InjectRepository } from '@nestjs/typeorm';
+import { Session } from '../entity/session.entity';
+import { Repository } from 'typeorm';
+
+@Injectable()
+export class SessionService {
+ constructor(
+ @InjectRepository(Session)
+ private sessionRepository: Repository<Session>,
+ ) {}
+
+ async findOne(key: string): Promise<Session | null> {
+ return await this.sessionRepository.findOneBy({ token: key });
+ }
+
+ async findValid(token: string): Promise<Session | null> {
+ return await this.sessionRepository
+ .createQueryBuilder('session')
+ .where('session.validUntil > :date', {
+ date: new Date(Date.now()),
+ })
+ .andWhere({
+ token: token,
+ used: false,
+ })
+ .getOne();
+ }
+
+ async createSession(validTo: Date): Promise<Session | null> {
+ const session = new Session();
+ session.validUntil = validTo;
+
+ await this.sessionRepository.save(session);
+ return session;
+ }
+
+ async isValidSession(token: string) {
+ return (
+ (await this.sessionRepository
+ .createQueryBuilder('session')
+ .where('session.validUntil > :date', {
+ date: new Date(Date.now()),
+ })
+ .andWhere({
+ token: token,
+ used: false,
+ })
+ .getCount()) > 0
+ );
+ }
+
+ async markSessionAsUsed(token: string): Promise<boolean> {
+ const update = await this.sessionRepository
+ .createQueryBuilder()
+ .update({
+ used: true,
+ })
+ .where('validUntil > :date', {
+ date: new Date(Date.now()),
+ })
+ .andWhere({
+ token: token,
+ used: false,
+ })
+ .execute();
+
+ return update.affected > 0;
+ }
+}
diff --git a/src/session/session.module.ts b/src/session/session.module.ts
new file mode 100644
index 0000000..1f25786
--- /dev/null
+++ b/src/session/session.module.ts
@@ -0,0 +1,13 @@
+import { Module } from '@nestjs/common';
+import { SessionController } from './controller/session.controller';
+import { SessionService } from './service/session.service';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { Session } from './entity/session.entity';
+
+@Module({
+ imports: [TypeOrmModule.forFeature([Session])],
+ controllers: [SessionController],
+ providers: [SessionService],
+ exports: [SessionService],
+})
+export class SessionModule {}