Skip to content

Commit

Permalink
fix: adjusting some import and methods call
Browse files Browse the repository at this point in the history
  • Loading branch information
lucsimao committed Oct 4, 2021
1 parent 5c2f4e5 commit d5694da
Show file tree
Hide file tree
Showing 12 changed files with 80 additions and 48 deletions.
6 changes: 3 additions & 3 deletions src/Main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ export enum ExitStatus {
export default class Main {
public static async start(): Promise<void> {
try {
this.initServices();
await this.initServices();
} catch (error) {
Logger.error({ msg: `App exited with error: ${error}` });
process.exit(ExitStatus.Failure);
}
}

private static initServices() {
private static async initServices() {
const app = new App(Number(Env.app.port));
app.setup();
await app.setup();
app.start();
this.setupUncaughtExceptions();
this.setupUnhandledRejection();
Expand Down
2 changes: 1 addition & 1 deletion src/__dependencies__/logger/pino/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ describe('Pino Tests', () => {
it('should call pino when constructor is called by the first time', () => {
(PinoLogger as any).pinoLogger = undefined;
PinoLogger.getInstance();
expect(pino).toBeCalledWith({ enabled: true });
expect(pino).toBeCalledWith({ enabled: false });
expect(pino).toBeCalledTimes(1);
});
});
Expand Down
32 changes: 21 additions & 11 deletions src/__dependencies__/webFramework/ExpressWebFramework.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,41 @@
import {
IMiddleware,
IWebFramework,
} from '../../util/webFramework/framework/WebFramework';
import express, { Application, Request, Response, Router } from 'express';

import { IController } from '../../interfaces/IController';
import { BaseController } from '../../abstracts/BaseController';
import { IHttpRequest } from '../../interfaces/IHttpRequest';
import { IWebFramework } from '../../util/webFramework/framework/WebFramework';
import { Server } from 'http';

export default class ExpressWebFramework
implements IWebFramework<(req: Request, res: Response) => Promise<void>>
{
private application: Application;
private server?: Server;

constructor() {
this.application = express();
this.application.use(express.json());
}

public startServer(port: number, callback: () => void): void {
this.application.listen(port, callback);
this.server = this.application.listen(port, callback);
}

public addMiddleware(
middleware: (req: Request, res: Response) => Promise<void>
): void {
this.application.use(middleware);
public addMiddleware(middleware: IMiddleware): void {
const expressMiddleware = async (
req: Request,
res: Response
): Promise<void> => {
const result = await middleware.executeMiddleware(req);
await res.status(result.statusCode).json(result.body);
};
this.application.use(expressMiddleware);
}

public closeServer(): void {
throw new Error('Method not implemented.');
public async closeServer(): Promise<void> {
await this.server?.close();
}

public get(
Expand All @@ -47,12 +57,12 @@ export default class ExpressWebFramework
}

public execController(
controller: IController
controller: BaseController
): (req: Request, res: Response) => Promise<void> {
return async (req: Request, res: Response) => {
const httpRequest = this.getHttpRequest(req);

const httpResponse = await controller.executeRoute(httpRequest);
const httpResponse = await controller.execute(httpRequest);

res.status(httpResponse.statusCode).json(httpResponse.body);
};
Expand Down
2 changes: 1 addition & 1 deletion src/config/Env.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class Envs {
return {
port: Number(process.env.APP_PORT) || 3333,
logger: {
enabled: Boolean(process.env.LOGGER_ENABLED) || true,
enabled: Boolean(process.env.LOGGER_ENABLED) || false,
},
database: {
address: process.env.DATABASE_ADDRESS || 'localhost',
Expand Down
2 changes: 1 addition & 1 deletion src/config/RoutesEnum.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export enum RoutesEnum {
SIGN_IN = '/signin',
SIGN_UP = '/signup',
USERS = '/users',
USERS = '/users/:id',
}
6 changes: 0 additions & 6 deletions src/interfaces/IController.ts

This file was deleted.

10 changes: 8 additions & 2 deletions src/interfaces/IHttpRequest.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
export interface IHttpRequest {
headers?: unknown;
params?: unknown;
headers?: {
authorization?: string;
[key: string]: unknown;
};
params?: {
id?: string;
[key: string]: unknown;
};
body: unknown;
}
4 changes: 2 additions & 2 deletions src/repositories/IRepository.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
export interface IRepository<T> {
create(model: T): Promise<T>;
delete?(model: T): Promise<T>;
update(property: Partial<T>): Promise<T>;
findOne(property: Partial<T>): Promise<T>;
update(property: Partial<T>, model: Partial<T>): Promise<T>;
findOne(property: Partial<T>): Promise<T | undefined>;
findAll?(property: Partial<T>): Promise<T[]>;
}
2 changes: 2 additions & 0 deletions src/repositories/repositoryModel/IRepositoryModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@ export interface IRepositoryModel<T> {
save(model: T): Promise<T>;
findOne(properties: Partial<T>): Promise<T | undefined>;
updateOne(properties: Partial<T>, model: Partial<T>): Promise<T | undefined>;
findOneByIdAndToken(userId: string, token: string): Promise<T | undefined>;
deleteAll(): Promise<void>;
}
49 changes: 32 additions & 17 deletions src/repositories/users/UserRepository.ts
Original file line number Diff line number Diff line change
@@ -1,37 +1,52 @@
import { DatabaseError } from '../../util/errors/DatabaseError';
import { IRepository } from '../IRepository';
import { IRepositoryModel } from '../repositoryModel/IRepositoryModel';
import { IUser } from '../../models/user/IUser';

import httpStatus from 'http-status-codes';
export class UserRepository implements IRepository<IUser> {
constructor(private readonly UserRepositoryModel: IRepositoryModel<IUser>) {}

public async create(model: IUser): Promise<IUser> {
const user = await this.UserRepositoryModel.save(model);
return user;
}

public async update(user: Partial<IUser>): Promise<IUser> {
const result = await this.UserRepositoryModel.updateOne(
{ email: user.email },
{ ...user }
);
public async create(user: IUser): Promise<IUser> {
const result = await this.UserRepositoryModel.save(user);

if (!result) {
throw new Error('');
throw new DatabaseError(
`Could not save user ${user.email} in database`,
httpStatus.BAD_REQUEST
);
}

return result;
}

public async findOne(user: Partial<IUser>): Promise<IUser> {
const result = await this.UserRepositoryModel.findOne({
email: user.email,
});
public async update(
property: Partial<IUser>,
user: Partial<IUser>
): Promise<IUser> {
const result = await this.UserRepositoryModel.updateOne(property, user);

if (!result) {
throw new Error('');
throw new DatabaseError(
`User ${user.email} not found in database`,
httpStatus.BAD_REQUEST
);
}

return result;
}

public async findOne(user: Partial<IUser>): Promise<IUser | undefined> {
return await this.UserRepositoryModel.findOne(user);
}

public async deleteAll(): Promise<void> {
await this.UserRepositoryModel.deleteAll();
}

public async findOneByIdAndToken(
userId: string,
token: string
): Promise<IUser | undefined> {
return this.UserRepositoryModel.findOneByIdAndToken(userId, token);
}
}
1 change: 1 addition & 0 deletions src/util/logger/ILogger.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export interface ILoggerParams {
msg: string;
[key: string]: unknown;
}
export interface ILogger {
info(message: ILoggerParams): void;
Expand Down
12 changes: 8 additions & 4 deletions src/util/webFramework/framework/WebFramework.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import { IController } from '../../../interfaces/IController';

import { BaseController } from '../../../abstracts/BaseController';
import { IHttpRequest } from '../../../interfaces/IHttpRequest';
import { IHttpResponse } from '../../../interfaces/IHttpResponse';
export interface IMiddleware {
executeMiddleware(httpRequest: IHttpRequest): Promise<IHttpResponse>;
}
export interface IWebFramework<T> {
addMiddleware(middleware: T): void;
addMiddleware(middleware: IMiddleware): void;

startServer(port: number, callback: () => void): void;

Expand All @@ -11,5 +15,5 @@ export interface IWebFramework<T> {

closeServer(): void;

execController(controller: IController): T;
execController(controller: BaseController): T;
}

0 comments on commit d5694da

Please sign in to comment.