Skip to content

Commit

Permalink
[init] Implement Projects microservice
Browse files Browse the repository at this point in the history
  • Loading branch information
antonpegov committed Nov 27, 2022
1 parent 5edca9e commit 3e261e9
Show file tree
Hide file tree
Showing 15 changed files with 200 additions and 65 deletions.
22 changes: 9 additions & 13 deletions apps/auditors/src/auditors.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
import { Test, TestingModule } from '@nestjs/testing';
import { AuditorsController } from './auditors.controller';
import { AuditorsService } from './auditors.service';
import { Test, TestingModule } from '@nestjs/testing'

import { AuditorsController } from '@auditors/auditors.controller'
import { AuditorsService } from '@auditors/auditors.service'

describe('AuditorsController', () => {
let auditorsController: AuditorsController;
let auditorsController: AuditorsController

beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
controllers: [AuditorsController],
providers: [AuditorsService],
}).compile();
}).compile()

auditorsController = app.get<AuditorsController>(AuditorsController);
});
auditorsController = app.get<AuditorsController>(AuditorsController)
})
})

describe('root', () => {
it('should return "Hello World!"', () => {
expect(auditorsController.getHello()).toBe('Hello World!');
});
});
});
6 changes: 3 additions & 3 deletions apps/auditors/src/auditors.controller.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { Controller, Post, Body, Logger, Get } from '@nestjs/common'
import { Controller, Post, Body, Get } from '@nestjs/common'
import { ApiCreatedResponse } from '@nestjs/swagger'

import { Auditor } from '@auditors/schemas/auditor.schema'
import { CreateAuditor } from '@auditors/dto/create-auditor.dto'
import { AuditorsService } from '@auditors/auditors.service'
import { CreateAuditorRequest } from '@auditors/dto/create-auditor.dto'

@Controller('auditors')
export class AuditorsController {
Expand All @@ -14,7 +14,7 @@ export class AuditorsController {
description: 'The record has been successfully created.',
type: Auditor,
})
create(@Body() request: CreateAuditorRequest) {
create(@Body() request: CreateAuditor) {
return this.auditorsService.createAuditor(request)
}

Expand Down
8 changes: 4 additions & 4 deletions apps/auditors/src/auditors.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { ConfigModule } from '@nestjs/config'
import { Module } from '@nestjs/common'
import * as Joi from 'joi'

import { AuditorsService } from './auditors.service'
import { AuditorsController } from './auditors.controller'
import { AuditorsRepository } from './auditors.repository'
import { Auditor, AuditorSchema } from './schemas/auditor.schema'
import { AuditorsService } from '@auditors/auditors.service'
import { AuditorsController } from '@auditors/auditors.controller'
import { AuditorsRepository } from '@auditors/auditors.repository'
import { Auditor, AuditorSchema } from '@auditors/schemas/auditor.schema'
import { DatabaseModule, RmqModule } from '@app/common'

@Module({
Expand Down
8 changes: 4 additions & 4 deletions apps/auditors/src/auditors.service.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { Injectable, Logger } from '@nestjs/common'
import { Injectable } from '@nestjs/common'

import { Auditor } from '@auditors/schemas/auditor.schema'
import { CreateAuditor } from '@auditors/dto/create-auditor.dto'
import { AuditorsRepository } from '@auditors/auditors.repository'
import { CreateAuditorRequest } from '@auditors/dto/create-auditor.dto'
import { Auditor } from './schemas/auditor.schema'

@Injectable()
export class AuditorsService {
constructor(private readonly auditorsRepository: AuditorsRepository) {}

createAuditor(request: CreateAuditorRequest): Promise<Omit<Auditor, 'password'>> {
createAuditor(request: CreateAuditor): Promise<Omit<Auditor, 'password'>> {
return this.auditorsRepository.create(request).then((auditor) => {
delete auditor.password

Expand Down
7 changes: 2 additions & 5 deletions apps/auditors/src/dto/create-auditor.dto.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import { IsEmail, IsNotEmpty, IsPhoneNumber, IsString, Validate } from 'class-validator'
import { IsEmail, IsNotEmpty, IsString } from 'class-validator'
import { ApiProperty } from '@nestjs/swagger'
import { Transform } from 'class-transformer'

import { ApiResponse } from '@auditors/dto/response.dto'
import { Auditor } from '@auditors/schemas/auditor.schema'

export class CreateAuditorRequest {
export class CreateAuditor {
@ApiProperty()
@IsString()
@IsNotEmpty()
Expand Down
12 changes: 0 additions & 12 deletions apps/auditors/src/dto/response.dto.ts

This file was deleted.

3 changes: 2 additions & 1 deletion apps/auditors/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'
import { Logger, ValidationPipe } from '@nestjs/common'
import { ValidationPipe } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { NestFactory } from '@nestjs/core'

Expand Down Expand Up @@ -28,6 +28,7 @@ async function bootstrap() {
SwaggerModule.setup('api', app, document)

await app.startAllMicroservices()
await app.listen(port)
}

bootstrap()
Expand Down
28 changes: 28 additions & 0 deletions apps/projects/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
FROM node:alpine As development

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM node:alpine as production

ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install --only=production

COPY . .

COPY --from=development /usr/src/app/dist ./dist

CMD ["node", "dist/apps/projects/main"]
24 changes: 24 additions & 0 deletions apps/projects/src/dto/create-project.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { IsEmail, IsNotEmpty, IsString } from 'class-validator'
import { ApiProperty } from '@nestjs/swagger'
import { Transform } from 'class-transformer'

export class CreateProject {
@ApiProperty()
@IsString()
@IsNotEmpty()
name: string

@ApiProperty({ example: 'test1@example.com' })
@Transform(({ value }) => value?.toLowerCase().trim())
@IsNotEmpty()
// @Validate(IsNotExist, ['Project'], {
// message: 'emailAlreadyExists',
// })
@IsEmail()
email: string

@ApiProperty({ example: 'myPass1' })
@IsNotEmpty()
password: string
}

37 changes: 32 additions & 5 deletions apps/projects/src/main.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,35 @@
import { NestFactory } from '@nestjs/core';
import { ProjectsModule } from './projects.module';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'
import { ValidationPipe } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { NestFactory } from '@nestjs/core'

import { RmqService } from '@app/common'
import { ProjectsModule } from '@projects/projects.module'

async function bootstrap() {
const app = await NestFactory.create(ProjectsModule);
await app.listen(3000);
const app = await NestFactory.create(ProjectsModule)
const configService = app.get(ConfigService)
const rmqService = app.get<RmqService>(RmqService)
const globalPrefix = 'api'
const port = configService.get('PORT')
const config = new DocumentBuilder()
.setTitle('Projects')
.setDescription('Projects API')
.setVersion('0.1')
.addTag('projects')
.build()

app.setGlobalPrefix(globalPrefix)
app.useGlobalPipes(new ValidationPipe())
app.connectMicroservice(rmqService.getOptions('PROJECTS'))

const document = SwaggerModule.createDocument(app, config)

SwaggerModule.setup('api', app, document)

await app.startAllMicroservices()
await app.listen(port)
}
bootstrap();

bootstrap()

21 changes: 8 additions & 13 deletions apps/projects/src/projects.controller.spec.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
import { Test, TestingModule } from '@nestjs/testing';
import { ProjectsController } from './projects.controller';
import { ProjectsService } from './projects.service';
import { Test, TestingModule } from '@nestjs/testing'
import { ProjectsController } from './projects.controller'
import { ProjectsService } from './projects.service'

describe('ProjectsController', () => {
let projectsController: ProjectsController;
let projectsController: ProjectsController

beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
controllers: [ProjectsController],
providers: [ProjectsService],
}).compile();
}).compile()

projectsController = app.get<ProjectsController>(ProjectsController);
});
projectsController = app.get<ProjectsController>(ProjectsController)
})
})

describe('root', () => {
it('should return "Hello World!"', () => {
expect(projectsController.getHello()).toBe('Hello World!');
});
});
});
32 changes: 27 additions & 5 deletions apps/projects/src/projects.module.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,32 @@
import { Module } from '@nestjs/common';
import { ProjectsController } from './projects.controller';
import { ProjectsService } from './projects.service';
import { MongooseModule } from '@nestjs/mongoose'
import { ConfigModule } from '@nestjs/config'
import { Module } from '@nestjs/common'
import * as Joi from 'joi'

import { ProjectsService } from '@projects/projects.service'
import { ProjectsController } from '@projects/projects.controller'
import { ProjectsRepository } from '@projects/projects.repository'
import { Project, ProjectSchema } from '@projects/schemas/project.schema'
import { DatabaseModule, RmqModule } from '@app/common'

@Module({
imports: [],
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema: Joi.object({
MONGODB_URI: Joi.string().required(),
PORT: Joi.number().required(),
RABBIT_MQ_URI: Joi.string().required(),
RABBIT_MQ_PROJECTS_QUEUE: Joi.string().required(),
}),
envFilePath: './apps/projects/.env',
}),
RmqModule,
DatabaseModule,
MongooseModule.forFeature([{ name: Project.name, schema: ProjectSchema }]),
],
controllers: [ProjectsController],
providers: [ProjectsService],
providers: [ProjectsService, ProjectsRepository],
})
export class ProjectsModule {}

20 changes: 20 additions & 0 deletions apps/projects/src/projects.repository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { InjectConnection, InjectModel } from '@nestjs/mongoose'
import { Injectable, Logger } from '@nestjs/common'
import { Connection, Model } from 'mongoose'

import { AbstractRepository } from '@app/common'

import { Project } from '@projects/schemas/project.schema'

@Injectable()
export class ProjectsRepository extends AbstractRepository<Project> {
protected readonly logger = new Logger(ProjectsRepository.name)

constructor(
@InjectModel(Project.name) model: Model<Project>,
@InjectConnection() connection: Connection,
) {
super(model, connection)
}
}

18 changes: 18 additions & 0 deletions apps/projects/src/schemas/project.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'

import { AbstractDocument } from '@app/common'

@Schema({ versionKey: false })
export class Project extends AbstractDocument {
@Prop({ required: true })
name: string

@Prop({ required: true })
email: string

@Prop({ required: true })
password: string
}

export const ProjectSchema = SchemaFactory.createForClass(Project)

19 changes: 19 additions & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,25 @@ services:
ports:
- '3000:3000'

projects:
build:
context: .
dockerfile: ./apps/projects/Dockerfile
target: development
command: npm run start:dev projects
env_file:
- ./apps/projects/.env
depends_on:
- rabbitmq
- mongodb-primary
- mongodb-secondary
- mongodb-arbiter
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
ports:
- '3001:3000'

rabbitmq:
image: rabbitmq
ports:
Expand Down

0 comments on commit 3e261e9

Please sign in to comment.