diff --git a/src/app.module.ts b/src/app.module.ts index 99710f3..8cdb8f8 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,19 +5,22 @@ import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm'; import { Merchant } from './merchants/entities/merchant.entity'; import { TagsModule } from './tags/tags.module'; import { Tag } from './tags/entities/tag.entity'; +import { CategoriesModule } from './categories/categories.module'; +import { Category } from './categories/entities/category.entity'; const sqliteConfig: TypeOrmModuleOptions = { synchronize: true, // typeorm -h (schema:sync) type: 'sqlite', database: 'common-cents.db', - entities: [Merchant, Tag] + entities: [Merchant, Tag, Category] } @Module({ imports: [ TypeOrmModule.forRoot(sqliteConfig), MerchantsModule, - TagsModule + TagsModule, + CategoriesModule ], controllers: [AppController], providers: [] diff --git a/src/categories/categories.controller.ts b/src/categories/categories.controller.ts new file mode 100644 index 0000000..2e56113 --- /dev/null +++ b/src/categories/categories.controller.ts @@ -0,0 +1,75 @@ +import { + Controller, + Get, + Post, + Put, + Delete, + Body, + Param, + HttpCode, + HttpStatus, + BadRequestException, + NotFoundException, + InternalServerErrorException +} from '@nestjs/common'; +import { CategoriesService } from './categories.service'; +import { CreateCategoryDto } from './dto/create-category.dto'; +import { UpdateCategoryDto } from './dto/update-category.dto'; +import { Category } from './entities/category.entity'; + +@Controller('categories') +export class CategoriesController { + constructor(private readonly categoriesService: CategoriesService) { } + + @Get() + @HttpCode(HttpStatus.OK) + public async findAll(): Promise { + return await this.categoriesService.findAll(); + } + + @Get(':id') + @HttpCode(HttpStatus.OK) + public async findOne(@Param('id') id: string): Promise { + if (!id) { + throw new BadRequestException('No ID provided.'); + } + + try { + return await this.categoriesService.findById(id); + } + catch (error) { + throw new NotFoundException(error); + } + } + + @Post() + @HttpCode(HttpStatus.CREATED) + public async create(@Body() category: CreateCategoryDto): Promise { + if (!category.name) { + throw new BadRequestException('Category name cannot be empty.'); + } + + try { + return this.categoriesService.create(category); + } + catch (error) { + throw new InternalServerErrorException(error); + } + } + + @Put() + @HttpCode(HttpStatus.OK) + public async update(@Body() category: UpdateCategoryDto): Promise { + if (!category.id) { + throw new BadRequestException('Category ID cannot be empty.'); + } + + return await this.categoriesService.update(category); + } + + @Delete(':id') + @HttpCode(HttpStatus.NO_CONTENT) + public async remove(@Param('id') id: string): Promise { + return await this.categoriesService.remove(id); + } +} diff --git a/src/categories/categories.module.ts b/src/categories/categories.module.ts new file mode 100644 index 0000000..13c65db --- /dev/null +++ b/src/categories/categories.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { CategoriesService } from './categories.service'; +import { CategoriesController } from './categories.controller'; +import { CategoryDataService } from './category-data.service'; + +@Module({ + controllers: [CategoriesController], + providers: [CategoriesService, CategoryDataService] +}) +export class CategoriesModule { } diff --git a/src/categories/categories.service.ts b/src/categories/categories.service.ts new file mode 100644 index 0000000..8753b43 --- /dev/null +++ b/src/categories/categories.service.ts @@ -0,0 +1,35 @@ +import { Injectable } from '@nestjs/common'; +import { CreateCategoryDto } from './dto/create-category.dto'; +import { UpdateCategoryDto } from './dto/update-category.dto'; +import { CategoryDataService } from './category-data.service'; +import { Category } from './entities/category.entity'; + +@Injectable() +export class CategoriesService { + public constructor(private categoryDataService: CategoryDataService) { } + + public async findAll(): Promise { + return await this.categoryDataService.getAll(); + } + + public async findById(id: string): Promise { + const category = await this.categoryDataService.getById(id); + if (!category) { + throw new Error('No category found'); + } + + return category; + } + + public async create(category: CreateCategoryDto): Promise { + return await this.categoryDataService.create(category.name); + } + + public async update(category: UpdateCategoryDto): Promise { + return await this.categoryDataService.update(category); + } + + public async remove(id: string): Promise { + await this.categoryDataService.delete(id); + } +} diff --git a/src/categories/category-data.service.ts b/src/categories/category-data.service.ts new file mode 100644 index 0000000..455bac4 --- /dev/null +++ b/src/categories/category-data.service.ts @@ -0,0 +1,33 @@ +import { Injectable } from '@nestjs/common'; +import { DataSource, Repository } from 'typeorm'; +import { Category } from './entities/category.entity'; +import { UpdateCategoryDto } from './dto/update-category.dto'; + +@Injectable() +export class CategoryDataService { + private categories: Repository; + + public constructor(private dataSource: DataSource) { + this.categories = this.dataSource.getRepository(Category); + } + + public async getAll(): Promise { + return await this.categories.find(); + } + + public async getById(id: string): Promise { + return await this.categories.findOneBy({ id }); + } + + public async create(name: string): Promise { + return await this.categories.save({ name }); + } + + public async update(category: UpdateCategoryDto): Promise { + return await this.categories.save(category); + } + + public async delete(id: string): Promise { + await this.categories.delete({ id }); + } +} diff --git a/src/categories/dto/create-category.dto.ts b/src/categories/dto/create-category.dto.ts new file mode 100644 index 0000000..2222672 --- /dev/null +++ b/src/categories/dto/create-category.dto.ts @@ -0,0 +1,3 @@ +export class CreateCategoryDto { + name: string; +} diff --git a/src/categories/dto/update-category.dto.ts b/src/categories/dto/update-category.dto.ts new file mode 100644 index 0000000..6657a69 --- /dev/null +++ b/src/categories/dto/update-category.dto.ts @@ -0,0 +1,4 @@ +export class UpdateCategoryDto { + id: string; + name: string; +} diff --git a/src/categories/entities/category.entity.ts b/src/categories/entities/category.entity.ts new file mode 100644 index 0000000..6f4fd52 --- /dev/null +++ b/src/categories/entities/category.entity.ts @@ -0,0 +1 @@ +export class Category {}