Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/decorators/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from './log-controller-decorator'
export * from './server-error-controller-decorator'
17 changes: 0 additions & 17 deletions src/main/decorators/log-controller-decorator.ts

This file was deleted.

27 changes: 27 additions & 0 deletions src/main/decorators/server-error-controller-decorator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Controller, HttpResponse } from '@/presentation/protocols'
import { LogErrorRepository } from '@/data/protocols'
import { serverError } from '../../presentation/helpers'
import { ServerError } from '../../presentation/errors'

export class ServerErrorControllerDecorator implements Controller {
constructor (
private readonly controller: Controller,
private readonly logErrorRepository: LogErrorRepository
) {}

async handle (request: any): Promise<HttpResponse> {
let httpResponse: HttpResponse
try {
httpResponse = await this.controller.handle(request)
} catch (controllerError) {
const finalError = [controllerError]
try {
await this.logErrorRepository.logError(controllerError.stack)
} catch (logError) {
finalError.push(logError)
}
return serverError(new ServerError(...finalError))
}
return httpResponse
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeAddSurveyValidation, makeLogControllerDecorator, makeDbAddSurvey } from '@/main/factories'
import { makeAddSurveyValidation, makeServerErrorControllerDecorator, makeDbAddSurvey } from '@/main/factories'
import { Controller } from '@/presentation/protocols'
import { AddSurveyController } from '@/presentation/controllers'

export const makeAddSurveyController = (): Controller => {
const controller = new AddSurveyController(makeAddSurveyValidation(), makeDbAddSurvey())
return makeLogControllerDecorator(controller)
return makeServerErrorControllerDecorator(controller)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeLogControllerDecorator, makeDbCheckSurveyById, makeDbLoadSurveyResult } from '@/main/factories'
import { makeServerErrorControllerDecorator, makeDbCheckSurveyById, makeDbLoadSurveyResult } from '@/main/factories'
import { Controller } from '@/presentation/protocols'
import { LoadSurveyResultController } from '@/presentation/controllers'

export const makeLoadSurveyResultController = (): Controller => {
const controller = new LoadSurveyResultController(makeDbCheckSurveyById(), makeDbLoadSurveyResult())
return makeLogControllerDecorator(controller)
return makeServerErrorControllerDecorator(controller)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeLogControllerDecorator, makeDbLoadSurveys } from '@/main/factories'
import { makeServerErrorControllerDecorator, makeDbLoadSurveys } from '@/main/factories'
import { Controller } from '@/presentation/protocols'
import { LoadSurveysController } from '@/presentation/controllers'

export const makeLoadSurveysController = (): Controller => {
const controller = new LoadSurveysController(makeDbLoadSurveys())
return makeLogControllerDecorator(controller)
return makeServerErrorControllerDecorator(controller)
}
4 changes: 2 additions & 2 deletions src/main/factories/controllers/login-controller-factory.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeDbAuthentication, makeLoginValidation, makeLogControllerDecorator } from '@/main/factories'
import { makeDbAuthentication, makeLoginValidation, makeServerErrorControllerDecorator } from '@/main/factories'
import { Controller } from '@/presentation/protocols'
import { LoginController } from '@/presentation/controllers'

export const makeLoginController = (): Controller => {
const controller = new LoginController(makeDbAuthentication(), makeLoginValidation())
return makeLogControllerDecorator(controller)
return makeServerErrorControllerDecorator(controller)
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeLogControllerDecorator, makeDbLoadAnswersBySurvey, makeDbSaveSurveyResult } from '@/main/factories'
import { makeServerErrorControllerDecorator, makeDbLoadAnswersBySurvey, makeDbSaveSurveyResult } from '@/main/factories'
import { Controller } from '@/presentation/protocols'
import { SaveSurveyResultController } from '@/presentation/controllers'

export const makeSaveSurveyResultController = (): Controller => {
const controller = new SaveSurveyResultController(makeDbLoadAnswersBySurvey(), makeDbSaveSurveyResult())
return makeLogControllerDecorator(controller)
return makeServerErrorControllerDecorator(controller)
}
4 changes: 2 additions & 2 deletions src/main/factories/controllers/signup-controller-factory.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { makeDbAuthentication, makeSignUpValidation, makeLogControllerDecorator, makeDbAddAccount } from '@/main/factories'
import { makeDbAuthentication, makeSignUpValidation, makeServerErrorControllerDecorator, makeDbAddAccount } from '@/main/factories'
import { SignUpController } from '@/presentation/controllers'
import { Controller } from '@/presentation/protocols'

export const makeSignUpController = (): Controller => {
const controller = new SignUpController(makeDbAddAccount(), makeSignUpValidation(), makeDbAuthentication())
return makeLogControllerDecorator(controller)
return makeServerErrorControllerDecorator(controller)
}
2 changes: 1 addition & 1 deletion src/main/factories/decorators/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1 @@
export * from './log-controller-decorator-factory'
export * from './server-error-controller-decorator-factory'

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { LogMongoRepository } from '@/infra/db'
import { ServerErrorControllerDecorator } from '@/main/decorators'
import { Controller } from '@/presentation/protocols'

export const makeServerErrorControllerDecorator = (controller: Controller): Controller => {
const logMongoRepository = new LogMongoRepository()
return new ServerErrorControllerDecorator(controller, logMongoRepository)
}
24 changes: 10 additions & 14 deletions src/presentation/controllers/add-survey-controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Controller, HttpResponse, Validation } from '@/presentation/protocols'
import { badRequest, serverError, noContent } from '@/presentation/helpers'
import { AddSurvey } from '@/domain/usecases'
import { badRequest, noContent } from '@/presentation/helpers'
import { Controller, HttpResponse, Validation } from '@/presentation/protocols'

export class AddSurveyController implements Controller {
constructor (
Expand All @@ -9,19 +9,15 @@ export class AddSurveyController implements Controller {
) {}

async handle (request: AddSurveyController.Request): Promise<HttpResponse> {
try {
const error = this.validation.validate(request)
if (error) {
return badRequest(error)
}
await this.addSurvey.add({
...request,
date: new Date()
})
return noContent()
} catch (error) {
return serverError(error)
const error = this.validation.validate(request)
if (error) {
return badRequest(error)
}
await this.addSurvey.add({
...request,
date: new Date()
})
return noContent()
}
}

Expand Down
22 changes: 9 additions & 13 deletions src/presentation/controllers/load-survey-result-controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Controller, HttpResponse } from '@/presentation/protocols'
import { forbidden, serverError, ok } from '@/presentation/helpers'
import { InvalidParamError } from '@/presentation/errors'
import { CheckSurveyById, LoadSurveyResult } from '@/domain/usecases'
import { InvalidParamError } from '@/presentation/errors'
import { forbidden, ok } from '@/presentation/helpers'
import { Controller, HttpResponse } from '@/presentation/protocols'

export class LoadSurveyResultController implements Controller {
constructor (
Expand All @@ -10,17 +10,13 @@ export class LoadSurveyResultController implements Controller {
) {}

async handle (request: LoadSurveyResultController.Request): Promise<HttpResponse> {
try {
const { surveyId, accountId } = request
const exists = await this.checkSurveyById.checkById(surveyId)
if (!exists) {
return forbidden(new InvalidParamError('surveyId'))
}
const surveyResult = await this.loadSurveyResult.load(surveyId, accountId)
return ok(surveyResult)
} catch (error) {
return serverError(error)
const { surveyId, accountId } = request
const exists = await this.checkSurveyById.checkById(surveyId)
if (!exists) {
return forbidden(new InvalidParamError('surveyId'))
}
const surveyResult = await this.loadSurveyResult.load(surveyId, accountId)
return ok(surveyResult)
}
}

Expand Down
12 changes: 4 additions & 8 deletions src/presentation/controllers/load-surveys-controller.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
import { Controller, HttpResponse } from '@/presentation/protocols'
import { noContent, serverError, ok } from '@/presentation/helpers'
import { LoadSurveys } from '@/domain/usecases'
import { noContent, ok } from '@/presentation/helpers'
import { Controller, HttpResponse } from '@/presentation/protocols'

export class LoadSurveysController implements Controller {
constructor (private readonly loadSurveys: LoadSurveys) {}

async handle (request: LoadSurveysController.Request): Promise<HttpResponse> {
try {
const surveys = await this.loadSurveys.load(request.accountId)
return surveys.length ? ok(surveys) : noContent()
} catch (error) {
return serverError(error)
}
const surveys = await this.loadSurveys.load(request.accountId)
return surveys.length ? ok(surveys) : noContent()
}
}

Expand Down
24 changes: 10 additions & 14 deletions src/presentation/controllers/login-controller.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Controller, HttpResponse, Validation } from '@/presentation/protocols'
import { badRequest, serverError, unauthorized, ok } from '@/presentation/helpers'
import { Authentication } from '@/domain/usecases'
import { badRequest, ok, unauthorized } from '@/presentation/helpers'
import { Controller, HttpResponse, Validation } from '@/presentation/protocols'

export class LoginController implements Controller {
constructor (
Expand All @@ -9,19 +9,15 @@ export class LoginController implements Controller {
) {}

async handle (request: LoginController.Request): Promise<HttpResponse> {
try {
const error = this.validation.validate(request)
if (error) {
return badRequest(error)
}
const authenticationModel = await this.authentication.auth(request)
if (!authenticationModel) {
return unauthorized()
}
return ok(authenticationModel)
} catch (error) {
return serverError(error)
const error = this.validation.validate(request)
if (error) {
return badRequest(error)
}
const authenticationModel = await this.authentication.auth(request)
if (!authenticationModel) {
return unauthorized()
}
return ok(authenticationModel)
}
}

Expand Down
32 changes: 14 additions & 18 deletions src/presentation/controllers/save-survey-result-controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Controller, HttpResponse } from '@/presentation/protocols'
import { forbidden, serverError, ok } from '@/presentation/helpers'
import { InvalidParamError } from '@/presentation/errors'
import { LoadAnswersBySurvey, SaveSurveyResult } from '@/domain/usecases'
import { InvalidParamError } from '@/presentation/errors'
import { forbidden, ok } from '@/presentation/helpers'
import { Controller, HttpResponse } from '@/presentation/protocols'

export class SaveSurveyResultController implements Controller {
constructor (
Expand All @@ -10,22 +10,18 @@ export class SaveSurveyResultController implements Controller {
) {}

async handle (request: SaveSurveyResultController.Request): Promise<HttpResponse> {
try {
const { surveyId, answer } = request
const answers = await this.loadAnswersBySurvey.loadAnswers(surveyId)
if (!answers.length) {
return forbidden(new InvalidParamError('surveyId'))
} else if (!answers.includes(answer)) {
return forbidden(new InvalidParamError('answer'))
}
const surveyResult = await this.saveSurveyResult.save({
...request,
date: new Date()
})
return ok(surveyResult)
} catch (error) {
return serverError(error)
const { surveyId, answer } = request
const answers = await this.loadAnswersBySurvey.loadAnswers(surveyId)
if (!answers.length) {
return forbidden(new InvalidParamError('surveyId'))
} else if (!answers.includes(answer)) {
return forbidden(new InvalidParamError('answer'))
}
const surveyResult = await this.saveSurveyResult.save({
...request,
date: new Date()
})
return ok(surveyResult)
}
}

Expand Down
44 changes: 20 additions & 24 deletions src/presentation/controllers/signup-controller.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Controller, HttpResponse, Validation } from '@/presentation/protocols'
import { badRequest, serverError, ok, forbidden } from '@/presentation/helpers'
import { EmailInUseError } from '@/presentation/errors'
import { AddAccount, Authentication } from '@/domain/usecases'
import { EmailInUseError } from '@/presentation/errors'
import { badRequest, forbidden, ok } from '@/presentation/helpers'
import { Controller, HttpResponse, Validation } from '@/presentation/protocols'

export class SignUpController implements Controller {
constructor (
Expand All @@ -11,28 +11,24 @@ export class SignUpController implements Controller {
) {}

async handle (request: SignUpController.Request): Promise<HttpResponse> {
try {
const error = this.validation.validate(request)
if (error) {
return badRequest(error)
}
const { name, email, password } = request
const isValid = await this.addAccount.add({
name,
email,
password
})
if (!isValid) {
return forbidden(new EmailInUseError())
}
const authenticationModel = await this.authentication.auth({
email,
password
})
return ok(authenticationModel)
} catch (error) {
return serverError(error)
const error = this.validation.validate(request)
if (error) {
return badRequest(error)
}
const { name, email, password } = request
const isValid = await this.addAccount.add({
name,
email,
password
})
if (!isValid) {
return forbidden(new EmailInUseError())
}
const authenticationModel = await this.authentication.auth({
email,
password
})
return ok(authenticationModel)
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/presentation/errors/server-error.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export class ServerError extends Error {
constructor (stack: string) {
super('Internal server error')
export class ServerError extends AggregateError {
constructor (...errors: Error[]) {
super(errors, 'Internal server error')
this.name = 'ServerError'
this.stack = stack
this.stack = errors.map(error => error.stack).join('\n')
}
}
4 changes: 2 additions & 2 deletions src/presentation/helpers/http-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ export const unauthorized = (): HttpResponse => ({
body: new UnauthorizedError()
})

export const serverError = (error: Error): HttpResponse => ({
export const serverError = (...errors: Error[]): HttpResponse => ({
statusCode: 500,
body: new ServerError(error.stack)
body: new ServerError(...errors)
})

export const ok = (data: any): HttpResponse => ({
Expand Down
Loading