Sem muitas exigencias, somente Docker com docker-compose ja resolve
tudo retorna http 200, nao é restfull ainda, temos um padrao de resposta que dever ser seguido para facilitar a o gerenciamento no front, seja app, site ou painel
Para nao ter mais um painel, tanto para parceiro quanto para os restaurantes, vamos usar algo no sentido de um login mais unificado, ja temos algo nesse sentido, ainda rudimentar.
Ate por que muito provavelmente sera preciso consumir mais da nosssa api restrita a parceiros
IResponse
{
"error": false,
"response": {
"qualquer": "coisa"
}
}
{
"error": true,
"response": [
"erro 1",
"erro 2",
"erro 3"
]
}
- Add itens no carrinho/sacola
- Ver sumario da compra
- pratos escolhidos
- valor da entrega (delivery)
- endereco do restaurante (take_away)
- total da compra
- etc.....
- Pagamento
- obter valores dos itens via API
- validar endereco
incluir reservation_type
que pode ser:
in_place
: compra normal que ja temos hojetake_away
retirar no estabelecimentodelivery
deixar datetime
e peoples
nullable, por que no caso de delivery nao sera usado, e assim nao atrapalha outras possivis metricas
id
: int unsignedid_restaurant
: int unsignedid_menu_category
: int unsigned nullablename
: stringprice
: double - valor real, sem os 50% aplicadoprice_discount
: double- valor com 50% de desconto, caso de bebida vai ser o mesmo valor de
price
. - Ideal e que na hora do cadastro ele seja preenchioo automaticamente com baso no
price
eis_drink
- assim na hora de calcular o total do carrinho e so somar esse campo.
- valor com 50% de desconto, caso de bebida vai ser o mesmo valor de
is_drink
: boolean - se é bebida, logo o valor do desconto nao e aplicado, e tambem vai ser usado para criar a secao de bebidas no frontdescription
: textmedia
: string - imagem do prato acredito que da pra seguir ifood numa boa que tem so 1 imagem
id
: int unsignedname
: stringorder
: tinyint unsigned
id
: int unsignedname
: stringid_menu_item
: int unsignedmultiple
: boolean - 0=somente uma opcao | 1=varias opcoesrequired
: boolean - 0=opcional | 1=obrigatorio
id
: int unsignedid_option_group
: int unsignedname
: stringdefault
: boolean - 0=opcional | 1=obrigatorio indica que este e o item paadrao/pre-selecionado
id_booking
: int unsignedid_menu
: int unsigned
Alem dos itens abaixo vai ser necessario um CRUD basico para os dados das tabelas acima. Principalmente as referentes ao menu
.
Respeitando os padroes de resposta nao vamos microgerenciar a esse nivel, nome de endpoints, paylodas de envio e resposta fica a criterio de voce.
Os nomes de endpoints que usei abaixo estao mais para exemplos, pode haver alteracao da sua parte sem problemas
Retorna o cardapio do restaurante
categories:ICategory[]
Expandir
{
"categories":[
{
"id": 1,
"name": "Entrada",
"items": [
{
"id": 1,
"name": "Saladinha do chef",
"price": 50,
"price_discount": 25,
"is_drink": false,
"media": "foto_legal.jpg",
"description": "varios tons de verde",
"options_group": []
}
]
},
{
"id": 1,
"name": "Bebidas",
"items": [
{
"id": 2,
"name": "Refrigerante",
"price": 6.50,
"price_discount": 6.50,
"is_drink": true,
"media": "latinha1.jpg",
"description": "",
"options_group": [
{
"id": 1,
"name": "Lata 350",
"multiple": false,
"required": true,
"options": [
{
"name": "Coca Cola",
"default": false
},
{
"name": "Sprite",
"default": false
},
{
"name": "Guarana antartica",
"default": false
}
]
}
]
},
{
"id": 3,
"name": "Suco Laranja",
"price": 9,
"price_discount": 9,
"is_drink": true,
"media": "suco1.jpg",
"description": "",
"options_group": [
{
"id": 1,
"name": "Acucar",
"multiple": false,
"required": true,
"options": [
{
"name": "Adocante",
"default": false
},
{
"name": "Sem acucar",
"default": false
},
{
"name": "Pouco acucar",
"default": false
},
{
"name": "Muito acucar",
"default": false
},
{
"name": "Muuuuito mesmo",
"default": false
}
]
}
]
},
{
"id": 4,
"name": "Cerveja 1",
"price": 8,
"price_discount": 8,
"is_drink": true,
"media": "breja1.jpg",
"description": "",
"options_group": []
},
{
"id": 5,
"name": "Cerveja 2",
"price": 12,
"price_discount": 12,
"is_drink": true,
"media": "breja1.jpg",
"description": "",
"options_group": []
}
]
}
]
}
Retorna a lista de itens, basicamente vamos usar isso para validacao do pagamento e calculo de preco
ids
:number[]
IMenuItem[]
Expandir
[
{
"id": 1,
"name": "Saladinha do chef",
"price": 50,
"price_discount": 25,
"is_drink": false,
"media": "foto_legal.jpg",
"description": "varios tons de verde"
},
{
"id": 4,
"name": "Cerveja 1",
"price": 8,
"price_discount": 8,
"is_drink": true,
"media": "breja1.jpg",
"description": "",
"options_group": []
}
]
Listagem dos pedidos, tem que ter possibilidade de filtrar/ordenar por varios campos, data, regiao(esse e imprencindivel), valor, restaurante, usuario, email, etc....
Ordenacao sempre com o mais recente primeiro como padrao
IOrder[]
id
:intname
:stringitems
: IMenuItem[]
id
:intid_restaurant
:intname
:stringprice
: numberprice_discount
: numberis_drink
: booleanmedia
: stringdescription
: text- [
options_group
: IOptionGroup[]] - opcional em alguns casos
id
:intname
: stringmultiple
:booleanrequired
:booleanoptions
: IOption[]
name
: stringdefault
: boolean
id
:numberid_region
:numberid_booking
:numberamount
: numberregion_name
: stringstatus
: stringpaid
canceled
failed
- por algum motivo qualquer que nao seja o gateway de pagamentorefused
- recusado por algum motivo, saldo insulficiente etc...refunded
- estornadain_transit
(caso delivery) a caminho do enderecodone
(caso take_away) pronto para retiradafinished
- caso ja tenha sido entregue ou retirado, nao sei como forcar isso, mas e bom ja lidar com ele
failed_reson
: string - motivo da falhaitems
: IMenuItem[] - aqui pode vir sem ooptions_group
user
: IUserrestaurant
: IRestaurantcreated_at
: date
id
: numbername
:stringemail
:string.......
id
: numbername
: stringlogo
: string.......
error
:booleanresponse
:object | any[] | string[]
somente em caso de erro o response
deve ser obrigatoriamente um array de string com os erros
Altercao, sugestoes e tudo mais sao muito bem vindos, fiquem a vontade para propor suas consideracoes.
Duvidas estamos a disposicao.