diff --git a/backend/package-lock.json b/backend/package-lock.json index 564371e..141159c 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -12,7 +12,6 @@ "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", - "@nestjs/mapped-types": "^2.1.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/typeorm": "^10.0.0", "class-transformer": "^0.5.1", @@ -1687,25 +1686,6 @@ } } }, - "node_modules/@nestjs/mapped-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", - "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", - "peerDependencies": { - "@nestjs/common": "^10.0.0 || ^11.0.0", - "class-transformer": "^0.4.0 || ^0.5.0", - "class-validator": "^0.13.0 || ^0.14.0", - "reflect-metadata": "^0.1.12 || ^0.2.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, "node_modules/@nestjs/platform-express": { "version": "10.4.20", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.20.tgz", diff --git a/backend/package.json b/backend/package.json index 7270400..4459e27 100644 --- a/backend/package.json +++ b/backend/package.json @@ -23,7 +23,6 @@ "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.0.0", "@nestjs/core": "^10.0.0", - "@nestjs/mapped-types": "^2.1.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/typeorm": "^10.0.0", "class-transformer": "^0.5.1", diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index cccaa7d..0c2a507 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -7,8 +7,6 @@ import { AssetCategoriesModule } from './asset-categories/asset-categories.modul import { AssetCategory } from './asset-categories/asset-category.entity'; import { DepartmentsModule } from './departments/departments.module'; import { Department } from './departments/department.entity'; -import { AssetSubcategoriesModule } from './asset-subcategories/asset-subcategories.module'; -import { AssetSubcategory } from './asset-subcategories/entities/asset-subcategory.entity'; @Module({ imports: [ @@ -16,7 +14,23 @@ import { AssetSubcategory } from './asset-subcategories/entities/asset-subcatego isGlobal: true, }), TypeOrmModule.forRootAsync({ - imports: [ConfigModule], + imports: [ConfigModule, + // --- ADD THIS CONFIGURATION --- + I18nModule.forRoot({ + fallbackLanguage: 'en', + loaderOptions: { + path: path.join(__dirname, '/i18n/'), // Directory for translation files + watch: true, // Watch for changes in translation files + }, + resolvers: [ + // Order matters: checks query param, then header, then browser settings + new QueryResolver(['lang', 'l']), + new HeaderResolver(['x-custom-lang-header']), + AcceptLanguageResolver, // Standard 'Accept-Language' header + ], + }), + // --- END OF CONFIGURATION --- + ],], useFactory: (configService: ConfigService) => ({ type: 'postgres', host: configService.get('DB_HOST', 'localhost'), @@ -24,13 +38,12 @@ import { AssetSubcategory } from './asset-subcategories/entities/asset-subcatego username: configService.get('DB_USERNAME', 'postgres'), password: configService.get('DB_PASSWORD', 'password'), database: configService.get('DB_DATABASE', 'manage_assets'), - entities: [AssetCategory, AssetSubcategory, Department], + entities: [AssetCategory, Department], synchronize: configService.get('NODE_ENV') !== 'production', // Only for development }), inject: [ConfigService], }), AssetCategoriesModule, - AssetSubcategoriesModule, DepartmentsModule, ], controllers: [AppController], diff --git a/backend/src/asset-categories/asset-category.entity.ts b/backend/src/asset-categories/asset-category.entity.ts index 5908e9d..a6ff83d 100644 --- a/backend/src/asset-categories/asset-category.entity.ts +++ b/backend/src/asset-categories/asset-category.entity.ts @@ -1,5 +1,4 @@ import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; -import { AssetSubcategory } from '../asset-subcategories/entities/asset-subcategory.entity'; @Entity('asset_categories') export class AssetCategory { @@ -18,7 +17,8 @@ export class AssetCategory { @UpdateDateColumn() updatedAt: Date; - // Relationship with subcategories - @OneToMany(() => AssetSubcategory, subcategory => subcategory.parentCategory) - subcategories: AssetSubcategory[]; + // Relationship with assets (one-to-many) + // This will be uncommented when the Asset entity is created + // @OneToMany(() => Asset, asset => asset.category) + // assets: Asset[]; } diff --git a/backend/src/asset-subcategories/asset-subcategories.controller.ts b/backend/src/asset-subcategories/asset-subcategories.controller.ts deleted file mode 100644 index bcd7c3c..0000000 --- a/backend/src/asset-subcategories/asset-subcategories.controller.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Controller, Get, Post, Body, Param, Patch, Delete } from '@nestjs/common'; -import { AssetSubcategoriesService } from './asset-subcategories.service'; -import { CreateAssetSubcategoryDto } from './dto/create-asset-subcategory.dto'; -import { UpdateAssetSubcategoryDto } from './dto/update-asset-subcategory.dto'; - -@Controller('asset-subcategories') -export class AssetSubcategoriesController { - constructor(private readonly service: AssetSubcategoriesService) {} - - @Post() - create(@Body() dto: CreateAssetSubcategoryDto) { - return this.service.create(dto); - } - - @Get() - findAll() { - return this.service.findAll(); - } - - @Get(':id') - findOne(@Param('id') id: string) { - return this.service.findOne(Number(id)); - } - - @Patch(':id') - update(@Param('id') id: string, @Body() dto: UpdateAssetSubcategoryDto) { - return this.service.update(Number(id), dto); - } - - @Delete(':id') - remove(@Param('id') id: string) { - return this.service.remove(Number(id)); - } -} diff --git a/backend/src/asset-subcategories/asset-subcategories.module.ts b/backend/src/asset-subcategories/asset-subcategories.module.ts deleted file mode 100644 index 25a1599..0000000 --- a/backend/src/asset-subcategories/asset-subcategories.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { AssetSubcategory } from './entities/asset-subcategory.entity'; -import { AssetSubcategoriesService } from './asset-subcategories.service'; -import { AssetSubcategoriesController } from './asset-subcategories.controller'; - -@Module({ - imports: [TypeOrmModule.forFeature([AssetSubcategory])], - providers: [AssetSubcategoriesService], - controllers: [AssetSubcategoriesController], -}) -export class AssetSubcategoriesModule {} diff --git a/backend/src/asset-subcategories/asset-subcategories.service.ts b/backend/src/asset-subcategories/asset-subcategories.service.ts deleted file mode 100644 index 7c2ac2a..0000000 --- a/backend/src/asset-subcategories/asset-subcategories.service.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Injectable, NotFoundException } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { AssetSubcategory } from './entities/asset-subcategory.entity'; -import { CreateAssetSubcategoryDto } from './dto/create-asset-subcategory.dto'; -import { UpdateAssetSubcategoryDto } from './dto/update-asset-subcategory.dto'; -import { AssetCategory } from '../asset-categories/asset-category.entity'; - -@Injectable() -export class AssetSubcategoriesService { - constructor( - @InjectRepository(AssetSubcategory) - private readonly subcategoryRepo: Repository, - @InjectRepository(AssetCategory) - private readonly categoryRepo: Repository, - ) {} - - async create(dto: CreateAssetSubcategoryDto): Promise { - const parentCategory = await this.categoryRepo.findOne({ where: { id: dto.parentCategoryId } }); - if (!parentCategory) throw new NotFoundException('Parent category not found'); - const subcategory = this.subcategoryRepo.create({ ...dto, parentCategory }); - return this.subcategoryRepo.save(subcategory); - } - - findAll(): Promise { - return this.subcategoryRepo.find({ relations: ['parentCategory'] }); - } - - findOne(id: number): Promise { - return this.subcategoryRepo.findOne({ where: { id }, relations: ['parentCategory'] }); - } - - async update(id: number, dto: UpdateAssetSubcategoryDto): Promise { - const subcategory = await this.subcategoryRepo.findOne({ where: { id } }); - if (!subcategory) throw new NotFoundException('Subcategory not found'); - if (dto.parentCategoryId) { - const parentCategory = await this.categoryRepo.findOne({ where: { id: dto.parentCategoryId } }); - if (!parentCategory) throw new NotFoundException('Parent category not found'); - subcategory.parentCategory = parentCategory; - } - if (dto.name) subcategory.name = dto.name; - return this.subcategoryRepo.save(subcategory); - } - - async remove(id: number): Promise { - await this.subcategoryRepo.delete(id); - } -} diff --git a/backend/src/asset-subcategories/dto/create-asset-subcategory.dto.ts b/backend/src/asset-subcategories/dto/create-asset-subcategory.dto.ts deleted file mode 100644 index ae26bf0..0000000 --- a/backend/src/asset-subcategories/dto/create-asset-subcategory.dto.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IsInt, IsNotEmpty, IsString } from 'class-validator'; - -export class CreateAssetSubcategoryDto { - @IsNotEmpty() - @IsString() - name: string; - - @IsNotEmpty() - @IsInt() - parentCategoryId: number; -} diff --git a/backend/src/asset-subcategories/dto/update-asset-subcategory.dto.ts b/backend/src/asset-subcategories/dto/update-asset-subcategory.dto.ts deleted file mode 100644 index 806121f..0000000 --- a/backend/src/asset-subcategories/dto/update-asset-subcategory.dto.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { PartialType } from '@nestjs/mapped-types'; -import { CreateAssetSubcategoryDto } from './create-asset-subcategory.dto'; - -export class UpdateAssetSubcategoryDto extends PartialType(CreateAssetSubcategoryDto) { - name?: string; - parentCategoryId?: number; -} diff --git a/backend/src/asset-subcategories/entities/asset-subcategory.entity.ts b/backend/src/asset-subcategories/entities/asset-subcategory.entity.ts deleted file mode 100644 index 9931563..0000000 --- a/backend/src/asset-subcategories/entities/asset-subcategory.entity.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; -import { AssetCategory } from '../../asset-categories/asset-category.entity'; - -@Entity('asset_subcategories') -export class AssetSubcategory { - @PrimaryGeneratedColumn() - id: number; - - @Column() - name: string; - - @ManyToOne(() => AssetCategory, category => category.subcategories, { nullable: false }) - parentCategory: AssetCategory; -} diff --git a/backend/src/inventory/entities/inventory-item.entity.ts b/backend/src/inventory/entities/inventory-item.entity.ts index 6973891..79a4587 100644 --- a/backend/src/inventory/entities/inventory-item.entity.ts +++ b/backend/src/inventory/entities/inventory-item.entity.ts @@ -1,6 +1,4 @@ import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; -import { ManyToOne } from 'typeorm'; -import { AssetSubcategory } from '../../asset-subcategories/entities/asset-subcategory.entity'; @Entity() export class InventoryItem { @@ -19,7 +17,4 @@ export class InventoryItem { // --- ADD THIS NEW FIELD --- @Column({ type: 'int', default: 10 }) // Default threshold of 10 units threshold: number; - - @ManyToOne(() => AssetSubcategory, { nullable: true }) - subcategory: AssetSubcategory; } \ No newline at end of file