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
3 changes: 2 additions & 1 deletion backend/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
build/
.idea/
.gradle/

**/node_modules
package-lock.json
106 changes: 0 additions & 106 deletions backend/individual-assignment/bootstrap.ts

This file was deleted.

58 changes: 58 additions & 0 deletions backend/individual-assignment/typescript/SolutionDescription.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
## Desafio para Backend Software Engineer

A primeira parte da solução foi organizar as classes em arquivos específicos, de forma a visualizar melhor o que existia e para que cada classe tenha seu objetivo único.

Para compreender melhor o código e garantir que seguisse funcionando corretamente, a segunda parte da minha solução foi aplicar testes de unidade. Nessa etapa, decidi implementar também testes para as novas funcionalidades a serem criadas após a compra de cada tipo de produto. Para testar esses novos casos, coloquei as condições encadeadas em if/else somente para dividir e ter mais clareza das condições.

Agora com os testes dos cenários de sucesso das novas condições, criei novas classes para cada tipo de processamento com base no tipo de produto, usei um mapeamento dos respectivos tipos e classes associadas para os produtos.

Movi os arquivos relacionados a produto para uma pasta específica para melhorar a organização, o que deve ser feito com os outros domínios para organização conforme eles forem crescendo.

Por fim, adicionei um formatador de código para seguir um padrão. Ainda existem várias melhorias que podem ser aplicadas, como por exemplo a aplicação de testes para demais cenários, a organização da classe de pagamento e organização do restante do projeto.


### Exemplo de Futura Organização:

```
/src
├── bootstrap.ts
├── /common
│ ├── /providers
│ │ └── /tests
│ │ └── emailProviderService.spec.ts
│ │ └── emailProviderService.ts
├── /address
│ ├── /tests
│ │ └── address.spec.ts
│ ├── address.ts
├── /customer
│ ├── /tests
│ │ └── customer.spec.ts
│ ├── customer.ts
├── /invoice
│ ├── /tests
│ │ └── invoice.spec.ts
│ ├── invoice.ts
├── /order
│ ├── /tests
│ │ └── order.spec.ts
│ │ └── orderItem.spec.ts
│ ├── order.ts
│ ├── orderItem.ts
├── /payment
│ ├── /tests
│ │ └── payment.spec.ts
│ │ └── paymentMethod**.spec.ts
│ ├── payment.ts
│ ├── paymentMethod**.ts
│ ├── paymentTypes.ts
├── /product
│ ├── /index.ts // Opcional
│ ├── /product.ts
│ ├── /processors
│ │ └── /tests
│ │ └── *...Processor.spec.ts
│ │ └── *...Processor.ts
│ ├── /tests
│ │ └── product.spec.ts
```
4 changes: 4 additions & 0 deletions backend/individual-assignment/typescript/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
};
12 changes: 12 additions & 0 deletions backend/individual-assignment/typescript/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"scripts": {
"test": "jest",
"format": "prettier --write src/**"
},
"devDependencies": {
"@types/jest": "^29.5.12",
"jest": "^29.7.0",
"prettier": "^3.3.3",
"ts-jest": "^29.2.4"
}
}
1 change: 1 addition & 0 deletions backend/individual-assignment/typescript/src/address.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export class Address {}
27 changes: 27 additions & 0 deletions backend/individual-assignment/typescript/src/bootstrap.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import order from "./bootstrap";
import { OrderItem } from "./orderItem";
import { CreditCard } from "./payment";

describe("bootstrap", () => {
it("should order be correctely defined", () => {
expect(order).toBeDefined();
expect(order.items).toHaveLength(4);
expect(order.totalAmount).toEqual(224.9);
expect(order.closedAt).toBeDefined();

order.items.forEach((item) => {
expect(item).toBeInstanceOf(OrderItem);
expect(item.total).toBeDefined();
expect(item.quantity).toBeDefined();
expect(item.product.name).toBeDefined();
expect(item.product.type).toBeDefined();
expect(item.product.price).toBeDefined();
});
});

it("should not allow duplicate payment to order", () => {
expect(() => order.pay(new CreditCard("43567890-987654367"))).toThrow(
"The order has already been paid!",
);
});
});
30 changes: 30 additions & 0 deletions backend/individual-assignment/typescript/src/bootstrap.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Address } from "./address";
import { Customer } from "./customer";
import { Order } from "./order";
import { CreditCard } from "./payment";
import { Product, ProductType } from "./product/product";

// Exemplo de uso
const shirt = new Product("Flowered t-shirt", ProductType.PHYSICAL, 35.0);
const netflix = new Product("Familiar plan", ProductType.MEMBERSHIP, 29.9);
const book = new Product(
"The Hitchhiker's Guide to the Galaxy",
ProductType.BOOK,
120.0,
);
const music = new Product("Stairway to Heaven", ProductType.DIGITAL, 5.0);

const order = new Order(
new Customer("Maria", "maria@gmail.com"),
new Address(),
);

order.addProduct(shirt, 2);
order.addProduct(netflix, 1);
order.addProduct(book, 1);
order.addProduct(music, 1);

order.pay(new CreditCard("43567890-987654367"));

export default order; // to test this case
// now, how to deal with shipping rules then?
6 changes: 6 additions & 0 deletions backend/individual-assignment/typescript/src/customer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export class Customer {
constructor(
public name: string,
public email: string,
) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export class EmailProviderService {
/**
* Method to be implemented
*/
public send(
recipient: string,
subject: string,
body: string,
from: string = "defaultEmail@gmail.com",
) {
console.log(
`Sendind email to ${recipient} from ${from}. Subject: ${subject}. Body: ${body}`,
);
}
}
12 changes: 12 additions & 0 deletions backend/individual-assignment/typescript/src/invoice.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { Address } from "./address";
import { Order } from "./order";

export class Invoice {
public billingAddress: Address;
public shippingAddress: Address;

constructor(public order: Order) {
this.billingAddress = order.address;
this.shippingAddress = order.address;
}
}
Loading