Compare commits

...

5 Commits

Author SHA1 Message Date
e03d16bdb4
Add constructor to MachinesService with DbService injection.
This change introduces a constructor to the MachinesService class, ensuring the DbService is properly injected. This setup prepares for future methods dealing with machine data operations, such as fetching, creating, and deleting machines, as well as retrieving associated files.
2024-10-03 12:08:47 +02:00
da5c15e5b9
Remove uploader field from schema
The uploader field in the schema has been deleted. This change ensures the table structure is simplified and aligns with the updated data requirements. All related functionalities have been adjusted to accommodate this deletion.
2024-10-03 12:08:39 +02:00
addcd4a798
Add initial methods for file uploading
Implemented placeholders for saving a file in the files service and added a new POST endpoint in the files controller. These changes lay the groundwork for future development of file uploading functionality.
2024-10-03 12:08:29 +02:00
3eca2472c6
Add CreateGroupDto and integrate DbModule with GroupsService
Introduced CreateGroupDto to enforce validation rules for group creation. Integrated DbModule into GroupsService and added a getGroupsByName method for database queries. Placeholder methods for group creation, deletion and file retrieval are also defined.
2024-10-03 12:08:17 +02:00
6b8ea9cd00
Refactor file service return type to StreamableFile
Updated the FilesService.get() method to return a StreamableFile directly with appropriate headers instead of a custom object. Adjusted the FilesController to reflect this change and ensure the file names are formatted by replacing spaces with underscores.
2024-10-03 09:51:26 +02:00
8 changed files with 87 additions and 29 deletions

View File

@ -73,12 +73,6 @@ export const FilesTable = pgTable("files", {
}) })
.notNull(), .notNull(),
uploader: p
.varchar("uploader", {
length: 64,
})
.notNull(),
groupId: p.uuid("group_id").references(() => FilesGroupTable.uuid), groupId: p.uuid("group_id").references(() => FilesGroupTable.uuid),
fileSize: p.integer("file_size").notNull(), fileSize: p.integer("file_size").notNull(),

View File

@ -1,7 +1,19 @@
import { Controller } from "@nestjs/common"; import { Controller, Get, Param, Post, StreamableFile } from '@nestjs/common';
import { FilesService } from "./files.service"; import { FilesService } from "./files.service";
@Controller("files") @Controller("files")
export class FilesController { export class FilesController {
constructor(private readonly filesService: FilesService) {} constructor(private readonly filesService: FilesService) {}
//TODO POST FILE
@Post('new')
async saveFile() {
}
@Get(':fileId')
async getFile(@Param('fileId') fileId: string) {
return this.filesService.get(fileId);
}
} }

View File

@ -1,9 +1,9 @@
import { Injectable, NotFoundException, StreamableFile } from "@nestjs/common"; import { Injectable, NotFoundException, StreamableFile } from '@nestjs/common';
import { DbService } from "apps/backend/src/app/db/db.service"; import { DbService } from 'apps/backend/src/app/db/db.service';
import { FilesTable } from "apps/backend/src/app/db/schema"; import { FilesTable } from 'apps/backend/src/app/db/schema';
import { StorageService } from "apps/backend/src/app/storage/storage.service"; import { StorageService } from 'apps/backend/src/app/storage/storage.service';
import { IFileWithInformation } from "apps/backend/src/app/storage/storage.types"; import { eq } from 'drizzle-orm';
import { eq } from "drizzle-orm";
@Injectable() @Injectable()
export class FilesService { export class FilesService {
@ -19,7 +19,7 @@ export class FilesService {
* @return A promise that resolves to an object containing the streamable file and additional file information. * @return A promise that resolves to an object containing the streamable file and additional file information.
* @throws NotFoundException if the file does not exist in the database. * @throws NotFoundException if the file does not exist in the database.
*/ */
public async get(fileId: string): Promise<IFileWithInformation<object>> { public async get(fileId: string): Promise<StreamableFile> {
const foundFiles = await this.database const foundFiles = await this.database
.use() .use()
.select() .select()
@ -44,20 +44,21 @@ export class FilesService {
file.extension, file.extension,
file.isDocumentation, file.isDocumentation,
); );
const streamableFile = new StreamableFile(fileBuffer);
const fileInformation = await this.storage.generateInformation( const fileInformation = await this.storage.generateInformation(
fileBuffer, fileBuffer,
file.fileName, file.fileName,
file.isDocumentation, file.isDocumentation,
); );
const fileNameWithoutSpaces = file.fileName.replace(/\s/g, "_");
return new StreamableFile(fileBuffer, {
disposition: `attachment; filename="${fileNameWithoutSpaces}.${fileInformation.fileType.ext.toLowerCase()}"`
});
}
//TODO list the files
//TODO save a file
public async set() {
return {
stream: streamableFile,
info: fileInformation,
additionalData: {
//Since we can have twice or more entry in the database for the same checksum of a file.
foundEntry: foundFiles.length,
},
};
} }
} }

View File

@ -1,4 +1,5 @@
import { import {
Body,
Controller, Controller,
DefaultValuePipe, DefaultValuePipe,
Delete, Delete,
@ -6,10 +7,11 @@ import {
Param, Param,
ParseIntPipe, ParseIntPipe,
Post, Post,
Query, Query
} from "@nestjs/common"; } from '@nestjs/common';
import { ISearchQuery } from "apps/backend/src/app/groups/groups.types"; import { ISearchQuery } from "apps/backend/src/app/groups/groups.types";
import { GroupsService } from "./groups.service"; import { GroupsService } from "./groups.service";
import { CreateGroupDto } from 'apps/backend/src/app/groups/groups.dto';
@Controller("groups") @Controller("groups")
export class GroupsController { export class GroupsController {
@ -22,12 +24,14 @@ export class GroupsController {
@Query("offset", new DefaultValuePipe(0), ParseIntPipe) offset: number, @Query("offset", new DefaultValuePipe(0), ParseIntPipe) offset: number,
@Query("search", new DefaultValuePipe("")) search: string, @Query("search", new DefaultValuePipe("")) search: string,
) { ) {
const query = { limit, offset, search }; //TODO add service method
} }
//POST a new group //POST a new group
@Post("new") @Post("new")
async newGroup() {} async newGroup(@Body() dto : CreateGroupDto) {
}
//DELETE a group //DELETE a group
@Delete(":groupId") @Delete(":groupId")

View File

@ -0,0 +1,8 @@
import { IsString, MinLength, MaxLength } from 'class-validator';
export class CreateGroupDto {
@IsString()
@MinLength(4)
@MaxLength(64)
groupName: string;
}

View File

@ -1,8 +1,10 @@
import { Module } from "@nestjs/common"; import { Module } from "@nestjs/common";
import { GroupsController } from "./groups.controller"; import { GroupsController } from "./groups.controller";
import { GroupsService } from "./groups.service"; import { GroupsService } from "./groups.service";
import { DbModule } from '../db/db.module';
@Module({ @Module({
imports: [DbModule],
controllers: [GroupsController], controllers: [GroupsController],
providers: [GroupsService], providers: [GroupsService],
}) })

View File

@ -1,4 +1,30 @@
import { Injectable } from "@nestjs/common"; import { Injectable } from "@nestjs/common";
import { DbService } from 'apps/backend/src/app/db/db.service';
import { FilesGroupTable } from 'apps/backend/src/app/db/schema';
import { ilike } from 'drizzle-orm';
@Injectable() @Injectable()
export class GroupsService {} export class GroupsService {
constructor(private readonly database: DbService) {}
//TODO a method to fetch groups in the database by a specific search with limit, offset and a search field (can be blank)
async getGroupsByName(limit: number, offset: number, search: string) {
const result = await this.database.use()
.select()
.from(FilesGroupTable)
.where(ilike(FilesGroupTable.groupName, search))
.limit(limit)
.offset(offset)
.prepare("getGroupsByName")
.execute()
console.log(`Found ${result.length} groups for search :\n > "${search}"`)
return result;
}
//TODO The method to create a group
//TODO a method to delete a group and place the associated file at a null group reference
//TODO a method to get the files of a group in the database by a specific search with limit, offset and a search field (can be blank)
}

View File

@ -1,4 +1,15 @@
import { Injectable } from "@nestjs/common"; import { Injectable } from "@nestjs/common";
import { DbService } from 'apps/backend/src/app/db/db.service';
@Injectable() @Injectable()
export class MachinesService {} export class MachinesService {
constructor(private readonly database: DbService) {}
//TODO a method to fetch machines in the database by a specific search with limit, offset and a search field (can be blank)
//TODO The method to create a machine
//TODO a method to delete a machine and delete the associated FilesTypeForMachine row
//TODO a method to get the files of a group in the database by a specific search with limit, offset and a search field (can be blank)
}