Skip to content

Commit d1c56d3

Browse files
separated services + language crud
1 parent f56a6ac commit d1c56d3

File tree

10 files changed

+154
-26
lines changed

10 files changed

+154
-26
lines changed

src/app.module.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import { AppController } from './app.controller';
33
import { AppService } from './app.service';
44
import { ProjectsController } from './controllers/projects/projects.controller';
55
import { LanguagesController } from './controllers/languages/languages.controller';
6-
import { DatabaseService } from './services/database/database.service';
76
import { DatabaseModule } from './modules/database/database.module';
87
import { ConfigModule } from '@nestjs/config';
8+
import { ProjectService } from './services/project/project.service';
9+
import { LanguageService } from './services/language/language.service';
910
import config from './config';
1011
@Module({
1112
imports: [
@@ -18,6 +19,6 @@ import config from './config';
1819
DatabaseModule,
1920
],
2021
controllers: [AppController, ProjectsController, LanguagesController],
21-
providers: [AppService, DatabaseService],
22+
providers: [AppService, ProjectService, LanguageService],
2223
})
2324
export class AppModule { }
Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
1-
import { Controller, Get, Param, Query } from '@nestjs/common';
2-
3-
@Controller('languages')
1+
import { Controller, Get, Param, Query, Post, Put, Delete, HttpCode, HttpStatus, ParseIntPipe, UsePipes, Body } from '@nestjs/common';
2+
import { JoiValidationPipe } from '../../pipe/joi-validation.pipe'
3+
import { LanguageService } from './../../services/language/language.service';
4+
import { languageSchema } from './../../schemas/language.schema';
5+
@Controller('language')
46
export class LanguagesController {
5-
@Get("language/:languageID")
6-
getLanguage(@Param() params: any): object {
7-
return { data: "maintenance" };
7+
constructor(private languageService: LanguageService) { }
8+
@Get(":id")
9+
@HttpCode(HttpStatus.FOUND)
10+
async get(@Param("id", ParseIntPipe) id: number): Promise<object> {
11+
return { data: await this.languageService.get(id) }
12+
}
13+
@Get()
14+
@HttpCode(HttpStatus.FOUND)
15+
async list(@Query() params: any): Promise<object> {
16+
return { data: await this.languageService.list(params) }
17+
}
18+
@Post()
19+
@HttpCode(HttpStatus.CREATED)
20+
@UsePipes(new JoiValidationPipe(languageSchema))
21+
async create(@Body() payload: any): Promise<object> {
22+
const { name } = payload
23+
let newProduct = await this.languageService.create(name)
24+
25+
return { msg: "created", data: newProduct };
26+
}
27+
@Put(":id")
28+
@HttpCode(HttpStatus.ACCEPTED)
29+
async update(@Param("id", ParseIntPipe) id: number, @Body(new JoiValidationPipe(languageSchema)) payload: any): Promise<object> {
30+
return { msg: "updated", data: await this.languageService.update(id, payload) }
31+
}
32+
@Delete(":id")
33+
@HttpCode(HttpStatus.OK)
34+
async delete(@Param("id", ParseIntPipe) id: number): Promise<object> {
35+
let deleted = await this.languageService.delete(id)
36+
return { msg: "deleted" }
837
}
938
}

src/controllers/projects/projects.controller.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,40 @@ import {
44
} from '@nestjs/common';
55
//import { Response } from "express"
66
import { JoiValidationPipe } from '../../pipe/joi-validation.pipe'
7-
import { DatabaseService } from './../../services/database/database.service';
7+
import { ProjectService } from './../../services/project/project.service';
88
import { projectSchema } from './../../schemas/project.schema';
99

1010

1111
@Controller('project')
1212
export class ProjectsController {
13-
constructor(private databaseService: DatabaseService) { }
13+
constructor(private projectService: ProjectService) { }
1414
@Get(":projectID")
1515
@HttpCode(HttpStatus.FOUND)
1616
async get(@Param("projectID", ParseIntPipe) projectID: number): Promise<object> {
17-
return { data: await this.databaseService.getProject(projectID) }//AppService.getProject(projectID);
17+
return { data: await this.projectService.getProject(projectID) }//AppService.getProject(projectID);
1818
}
1919
@Get()
2020
@HttpCode(HttpStatus.FOUND)
2121
async list(@Query() params: any): Promise<object> {
22-
return { data: await this.databaseService.getProjects(params) }
22+
return { data: await this.projectService.getProjects(params) }
2323
}
2424
@Post()
2525
@HttpCode(HttpStatus.CREATED)
2626
@UsePipes(new JoiValidationPipe(projectSchema))
2727
async create(@Body() payload: any): Promise<object> {
2828
const { name, description, location } = payload
29-
let newProduct = await this.databaseService.createProject(name, description, location)
29+
let newProduct = await this.projectService.createProject(name, description, location)
3030

3131
return { msg: "created", data: newProduct };
3232
}
3333
@Put(":projectID")
3434
@HttpCode(HttpStatus.ACCEPTED)
3535
async update(@Param("projectID", ParseIntPipe) projectID: number, @Body(new JoiValidationPipe(projectSchema)) payload: any): Promise<object> {
36-
return { msg: "updated", data: await this.databaseService.updateProject(projectID, payload) }
36+
return { msg: "updated", data: await this.projectService.updateProject(projectID, payload) }
3737
}
3838
@Delete(":projectID")
3939
async delete(@Param("projectID", ParseIntPipe) projectID: number): Promise<object> {
40-
let deleted = await this.databaseService.deleteProject(projectID)
40+
let deleted = await this.projectService.deleteProject(projectID)
4141
return { msg: "deleted" }
4242
}
4343
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {MigrationInterface, QueryRunner} from "typeorm";
2+
3+
export class language1623674721064 implements MigrationInterface {
4+
name = 'language1623674721064'
5+
6+
public async up(queryRunner: QueryRunner): Promise<void> {
7+
await queryRunner.query(`CREATE TABLE "language" ("id" SERIAL NOT NULL, "name" character varying(50) NOT NULL, "creationDate" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "upadatenDate" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "UQ_7df7d1e250ea2a416f078a631fb" UNIQUE ("name"), CONSTRAINT "PK_cc0a99e710eb3733f6fb42b1d4c" PRIMARY KEY ("id"))`);
8+
await queryRunner.query(`CREATE TABLE "user" ("id" SERIAL NOT NULL, "username" character varying(50) NOT NULL, "email" character varying(50) NOT NULL, "creationDate" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "upadatenDate" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), CONSTRAINT "UQ_78a916df40e02a9deb1c4b75edb" UNIQUE ("username"), CONSTRAINT "UQ_e12875dfb3b1d92d7d7c5377e22" UNIQUE ("email"), CONSTRAINT "PK_cace4a159ff9f2512dd42373760" PRIMARY KEY ("id"))`);
9+
}
10+
11+
public async down(queryRunner: QueryRunner): Promise<void> {
12+
await queryRunner.query(`DROP TABLE "user"`);
13+
await queryRunner.query(`DROP TABLE "language"`);
14+
}
15+
16+
}

src/modules/database/database.module.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Module } from '@nestjs/common';
22
import { Client } from "pg";
33
import { TypeOrmModule } from '@nestjs/typeorm';
44
import { Project } from '../../entities/project.entity';
5+
import { Language } from '../../entities/language.entity';
56
import { ConfigType } from '@nestjs/config';
67
import config from '../../config';
78
/*const client = new Client(dbConfig);
@@ -25,7 +26,7 @@ client.connect();*/
2526
}
2627
}
2728
}),
28-
TypeOrmModule.forFeature([Project])
29+
TypeOrmModule.forFeature([Project, Language])
2930
],
3031
providers: [
3132
/*{

src/schemas/language.schema.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const Joi = require('joi');
2+
3+
export const languageSchema = Joi.object({
4+
name: Joi.string()
5+
.regex(/^\w+(?:\s+\w+)*$/)
6+
.min(3)
7+
.max(30)
8+
.required(),
9+
10+
})

src/services/database/database.service.spec.ts renamed to src/services/language/language.service.spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import { Test, TestingModule } from '@nestjs/testing';
2-
import { DatabaseService } from './database.service';
2+
import { LanguageService } from './language.service';
33

4-
describe('DatabaseService', () => {
5-
let service: DatabaseService;
4+
describe('LanguageService', () => {
5+
let service: LanguageService;
66

77
beforeEach(async () => {
88
const module: TestingModule = await Test.createTestingModule({
9-
providers: [DatabaseService],
9+
providers: [LanguageService],
1010
}).compile();
1111

12-
service = module.get<DatabaseService>(DatabaseService);
12+
service = module.get<LanguageService>(LanguageService);
1313
});
1414

1515
it('should be defined', () => {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { Injectable, Inject, NotFoundException } from '@nestjs/common';
2+
//import { Client } from 'pg';
3+
import { InjectRepository } from '@nestjs/typeorm';
4+
import { Repository } from 'typeorm';
5+
6+
import { Language } from '../../entities/language.entity';
7+
8+
@Injectable()
9+
export class LanguageService {
10+
plural = "languages";
11+
singular = "language";
12+
constructor(
13+
@InjectRepository(Language) private languageRepo: Repository<Language>,
14+
) {
15+
}
16+
async create(name: string): Promise<object> {
17+
let element = this.languageRepo.create({ name })
18+
await this.languageRepo.save(element)
19+
return { id: element.id };
20+
}
21+
async get(id: number): Promise<object> {
22+
const language = await this.languageRepo.findOne(id);
23+
if (!language) {
24+
throw new NotFoundException(`${this.singular} with id ${id} not found`);
25+
}
26+
return language;
27+
}
28+
async list(params): Promise<object> {
29+
const languages = await this.languageRepo.find();
30+
if (!languages) {
31+
throw new NotFoundException(`no ${this.plural} found`);
32+
}
33+
return languages;
34+
}
35+
async update(id: number, payload: object): Promise<object> {
36+
const element = await this.languageRepo.findOne(id);
37+
if (!element) {
38+
throw new NotFoundException(`${this.singular} with id ${id} not found`);
39+
}
40+
this.languageRepo.merge(element, payload);
41+
return await this.languageRepo.save(element);
42+
}
43+
async delete(id: number): Promise<boolean> {
44+
let deleted = await this.languageRepo.delete(id)
45+
if (deleted.affected != 1) {
46+
throw new NotFoundException(`${this.singular} with id ${id} not found`);
47+
}
48+
return true
49+
}
50+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Test, TestingModule } from '@nestjs/testing';
2+
import { ProjectService } from './project.service';
3+
4+
describe('ProjectService', () => {
5+
let service: ProjectService;
6+
7+
beforeEach(async () => {
8+
const module: TestingModule = await Test.createTestingModule({
9+
providers: [ProjectService],
10+
}).compile();
11+
12+
service = module.get<ProjectService>(ProjectService);
13+
});
14+
15+
it('should be defined', () => {
16+
expect(service).toBeDefined();
17+
});
18+
});

src/services/database/database.service.ts renamed to src/services/project/project.service.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@ import { InjectRepository } from '@nestjs/typeorm';
44
import { Repository } from 'typeorm';
55

66
import { Project } from '../../entities/project.entity';
7+
78
@Injectable()
8-
export class DatabaseService {
9+
export class ProjectService {
10+
plural = "projects";
11+
singular = "project";
912
constructor(
1013
//@Inject('PG') private clientPg: Client,
1114
@InjectRepository(Project) private projectRepo: Repository<Project>,
@@ -20,29 +23,29 @@ export class DatabaseService {
2023
async getProject(id: number): Promise<object> {
2124
const project = await this.projectRepo.findOne(id);
2225
if (!project) {
23-
throw new NotFoundException(`product with id ${id} not found`);
26+
throw new NotFoundException(`${this.singular} with id ${id} not found`);
2427
}
2528
return project;
2629
}
2730
async getProjects(params): Promise<object> {
2831
const projects = await this.projectRepo.find();
2932
if (!projects) {
30-
throw new NotFoundException(`no products found`);
33+
throw new NotFoundException(`no ${this.plural} found`);
3134
}
3235
return projects;
3336
}
3437
async updateProject(id: number, payload: object): Promise<object> {
3538
const project = await this.projectRepo.findOne(id);
3639
if (!project) {
37-
throw new NotFoundException(`product with id ${id} not found`);
40+
throw new NotFoundException(`${this.singular} with id ${id} not found`);
3841
}
3942
this.projectRepo.merge(project, payload);
4043
return await this.projectRepo.save(project);
4144
}
4245
async deleteProject(id: number): Promise<boolean> {
4346
let deleted = await this.projectRepo.delete(id)
4447
if (deleted.affected != 1) {
45-
throw new NotFoundException(`product with id ${id} not found`);
48+
throw new NotFoundException(`${this.singular} with id ${id} not found`);
4649
}
4750
return true
4851
}

0 commit comments

Comments
 (0)