{"id":21366414,"url":"https://github.com/fabiosigf/admin_loja_uniformes","last_synced_at":"2026-05-19T00:37:54.241Z","repository":{"id":257953423,"uuid":"864079312","full_name":"FabioSigF/admin_loja_uniformes","owner":"FabioSigF","description":"API desenvolvida em Java para Painel Admin de Loja de Uniformes - Silvana Uniformes","archived":false,"fork":false,"pushed_at":"2024-11-05T23:26:17.000Z","size":87,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-22T20:11:59.798Z","etag":null,"topics":["api","clean-architecture","java","postgresql","springframework"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FabioSigF.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-27T13:03:26.000Z","updated_at":"2024-11-05T23:26:20.000Z","dependencies_parsed_at":"2024-10-22T05:56:26.267Z","dependency_job_id":null,"html_url":"https://github.com/FabioSigF/admin_loja_uniformes","commit_stats":null,"previous_names":["fabiosigf/admin_loja_uniformes"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioSigF%2Fadmin_loja_uniformes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioSigF%2Fadmin_loja_uniformes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioSigF%2Fadmin_loja_uniformes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FabioSigF%2Fadmin_loja_uniformes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FabioSigF","download_url":"https://codeload.github.com/FabioSigF/admin_loja_uniformes/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243841206,"owners_count":20356441,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","clean-architecture","java","postgresql","springframework"],"created_at":"2024-11-22T07:14:56.217Z","updated_at":"2026-05-19T00:37:54.204Z","avatar_url":"https://github.com/FabioSigF.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Painel Admin: Loja de Uniformes - Back-End\n\nEsse projeto foi desenvolvido para a empresa Silvana Uniformes, presente há quase 20 anos no mercado de uniformes. Se trata de um painel de administrador para gerenciamento da empresa, possibilitando registrar empresas parceiras, vendas, controle de estoque e tratamento de dados em relatórios de desempenho.\n\nO objetivo é dar total controle e visibilidade para o usuário sobre o ecossistema do seu negócio, de forma simples e rápida.\n\n## Funcionalidades\n- Cadastrar, editar e remover empresas parceiras;\n- Cadastrar, editar e remover vendas realizadas para as empresas;\n- Controle de estoque, atualização, edição e remoção de vestuário da empresa por categorias;\n- Gerar relatórios de vendas e estoque com diferentes parâmetros;\n- Autenticação e Autorização dos usuários, sistema de login e separação de usuários por role;\n## Instalação\n\n1. Clone o repositório na sua máquina local:\n\n`https://github.com/FabioSigF/admin_loja_uniformes`\n\n2. Faça alterações no arquivo resources/application.properties para incluir o seu banco de dados PostgreSQL, username e password:\n\n```java\nspring.application.name=admin_loja_uniformes\n\nspring.datasource.url= jdbc:postgresql://localhost:5432/loja_uniformes_admin\nspring.datasource.username=postgres\nspring.datasource.password=admin\nspring.jpa.hibernate.ddl-auto=update\n\nspring.jpa.properties.hibernate.jdbc.lab.non_contextual_creation=true\nspring.jpa.show-sql=true\n\napi.security.token.secret=${JWT_SECRET:my-secret-key}\n```\n\n3. Rode o projeto e aproveite!\n## Arquitetura e Planejamento\n\nO projeto foi desenvolvido com base na arquitetura RESTFull para a API. Além disso, foram implementadas algumas soluções de Domain Driven Design e Clean Architecture.\n\nO backend do projeto foi desenvolvido em Java, com a utilização do framework Spring para lidar com API, autenticação e segurança. Os testes são feitos com o JUnit.\n\nO banco de dados utilizado foi o PostgreSQL.\n\n### Diagrama Entidade Relacionamento da API\n![Admin Loja (1)](https://github.com/user-attachments/assets/9dd190e6-45fe-4073-ae14-d48a71939f88)\n\n### UML da API\n![Admin Loja](https://github.com/user-attachments/assets/8e761a7b-05d7-441c-bfc8-033ed4fda640)\n\n### Tecnologias utilizadas\n\n- Java 21\n- Spring Framework\n    - JPA\n    - Hibernate\n    - Lombok\n    - Validation\n    - Security\n- PostgreSQL (DB)\n- JUnit5 (Testes)\n- Mockito (Criar mocks para testes)\n- H2Database (Base de dados em memória para testar banco)\n- JWT (Autenticação por token)\n\n## Documentação da API\n\n### Company\n\n#### Cadastrar uma empresa\n\n```http\n  POST /companies\n```\n\nO único requesito desse método é o body. Ele deve ser algo como:\n\n```json\n{\n    \"name\": \"Escola\",\n    \"cnpj\": \"85883307000130\",\n    \"category\": \"EDUCACAO\",\n    \"phones\": [\n        {\n        \"number\": \"32233223\",\n        \"deleted\": false\n        },\n        {\n        \"number\": \"32233223\",\n        \"deleted\": false\n        }\n    ]\n}\n```\n\n**Observação**: O CNPJ possui um validator. Portanto, você deve inserir um CNPJ válido, ou será gerada uma Exception.\n\n#### Retornar todas as empresas do sistema\n\n```http\n  GET /companies\n```\n\n#### Retornar empresa por ID\n\n```http\n  GET /companies/{id}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID da empresa que você quer |\n\n\n#### Retornar lista de empresas por busca de nome\n\n```http\n  GET /companies/search/{nome}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `nome`      | `String` | **Obrigatório**. O nome da empresa que você busca |\n\n#### Retornar lista de empresas por busca de categoria\n\n```http\n  GET /companies/search-category/{categoria}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `categoria`      | `CategoryEnum` | **Obrigatório**. Categoria de empresa |\n\n#### Deleta uma empresa por ID\n\n```http\n  DELETE /companies/delete/{id}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID da empresa |\n\n### Produtos\n\n#### Cadastra produto de uma empresa\n\n```http\n  POST /product\n```\n\nO único requesito desse método é o body. Ele deve ser algo como:\n\n```json\n{\n    \"companyId\": \"3238cdf4-cb6d-42b7-be10-8e96e0b813cf\",\n    \"name\": \"Camiseta Padrão\",\n    \"description\": \"Camiseta Padrão\",\n    \"gender\": \"MASCULINO\",\n    \"features\": [\n        {\n            \"color\": \"Branco\",\n            \"size\": \"M\",\n            \"price\": 39.90,\n            \"stockQuantity\": 5\n        },\n        {\n            \"color\": \"Preto\",\n            \"size\": \"M\",\n            \"price\": 39.90,\n            \"stockQuantity\": 5\n        },\n        {\n            \"color\": \"Rosa\",\n            \"size\": \"M\",\n            \"price\": 39.90,\n            \"stockQuantity\": 5\n        }\n    ]\n}\n```\n\n#### Retorna todos os produtos de uma empresa\n\n```http\n  GET /product/company/{id}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. ID da Empresa |\n\n#### Retorna um produto por ID\n\n```http\n  GET /product/{id}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID do produto que você quer |\n\n#### Retornar pelo nome produtos de uma empresa\n\n```http\n  GET /product/company/{id}/?name={queryParam}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID da empresa |\n| `queryParam`      | `String` | Nome do(s) produto(s) |\n\n\n#### Deleta um produto por ID\n\n```http\n  DELETE /product/delete/{id}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID do produto |\n\n### Sale\n\n#### Cadastrar uma venda\n\n```http\n  POST /sale\n```\n\nO único requesito desse método é o body. Ele deve ser algo como:\n\n```json\n{\n    \"companyId\": \"3238cdf4-cb6d-42b7-be10-8e96e0b813cf\",\n    \"saleItems\": [\n        {\n            \"productFeatureId\": \"627d3771-dad6-4429-9315-b274fd085164\",\n            \"amount\": 2,\n            \"price\": 199.5\n        },\n        {\n            \"productFeatureId\": \"486d984d-0b40-46c6-8163-701934f0dc41\",\n            \"amount\": 5,\n            \"price\": 199.5\n        }\n    ]\n}\n```\n\n#### Retornar todas as vendas do sistema\n\n```http\n  GET /sale\n```\n\n#### Retornar venda por ID\n\n```http\n  GET /sale/{id}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID da venda que você quer |\n\n#### Retornar todas as vendas entre datas\n\n```http\n  GET sale/?startDate={startDate}\u0026endDate={endDate}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `startDate`      | `UUID` | **Obrigatório**. YYYY-MM-DD |\n| `endDate`      | `UUID` | **Obrigatório**. YYYY-MM-DD |\n\n#### Retornar todas as vendas de uma empresa entre datas\n\n```http\n  GET sale/company/{id}/by-date-range/?startDate={startDate}\u0026endDate={endDate}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `id`      | `UUID` | **Obrigatório**. O ID da empresa |\n| `startDate`      | `UUID` | **Obrigatório**. YYYY-MM-DD |\n| `endDate`      | `UUID` | **Obrigatório**. YYYY-MM-DD |\n\n#### Retornar todas as vendas de uma categoria entre datas\n\n```http\n  GET sale/category/?category={category}\u0026startDate={startDate}\u0026endDate={endDate}\n```\n\n| Parâmetro   | Tipo       | Descrição                                   |\n| :---------- | :--------- | :------------------------------------------ |\n| `category`      | `UUID` | **Obrigatório**. CategoryEnum |\n| `startDate`      | `UUID` | **Obrigatório**. YYYY-MM-DD |\n| `endDate`      | `UUID` | **Obrigatório**. YYYY-MM-DD |\n\n\n### User\n\n#### Criar usuário\n\n```http\n  POST auht/register\n```\n\nO único requesito desse método é o body. Ele deve ser algo como:\n```json\n{\n    \"login\": \"usuario\",\n    \"password\": \"123456789\",\n    \"role\": \"ADMIN\"\n}\n```\n\n#### Loin de usuário\n\n```http\n  POST auht/login\n```\n\nO único requesito desse método é o body. Ele deve ser algo como:\n```json\n{\n    \"login\": \"usuario\",\n    \"password\": \"123456789\",\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabiosigf%2Fadmin_loja_uniformes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabiosigf%2Fadmin_loja_uniformes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabiosigf%2Fadmin_loja_uniformes/lists"}