{"id":20013577,"url":"https://github.com/sancruz-dev/dsmovie","last_synced_at":"2025-07-24T09:38:18.385Z","repository":{"id":128514056,"uuid":"447091943","full_name":"sancruz-dev/dsmovie","owner":"sancruz-dev","description":" Aplicação FULLSTACK da Semana Spring React, escola DevSuperior ","archived":false,"fork":false,"pushed_at":"2023-12-12T16:59:50.000Z","size":902,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-02T02:33:05.653Z","etag":null,"topics":["devsuperior","reactjs","spring"],"latest_commit_sha":null,"homepage":"https://sandsmovie.netlify.app","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sancruz-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2022-01-12T05:44:42.000Z","updated_at":"2023-12-11T13:06:38.000Z","dependencies_parsed_at":"2023-12-12T18:31:09.039Z","dependency_job_id":"de284da3-bf0d-49af-b173-5266e8158540","html_url":"https://github.com/sancruz-dev/dsmovie","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sancruz-dev/dsmovie","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sancruz-dev%2Fdsmovie","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sancruz-dev%2Fdsmovie/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sancruz-dev%2Fdsmovie/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sancruz-dev%2Fdsmovie/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sancruz-dev","download_url":"https://codeload.github.com/sancruz-dev/dsmovie/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sancruz-dev%2Fdsmovie/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266822379,"owners_count":23989825,"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","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["devsuperior","reactjs","spring"],"created_at":"2024-11-13T07:37:02.029Z","updated_at":"2025-07-24T09:38:17.325Z","avatar_url":"https://github.com/sancruz-dev.png","language":"Java","readme":"# ![DevSuperior logo](https://raw.githubusercontent.com/devsuperior/bds-assets/main/ds/devsuperior-logo-small.png) Semana Spring React\n\u003e  *Um app completo com as tecnologias mais demandadas do mercado*\n\n## Certificado\n\u003cimg height=\"350px\" src=\"https://user-images.githubusercontent.com/83969467/151854689-976ebabf-a766-482d-99dd-393b42beadd7.png\"\u003e\n\n\n## Referência\n- [DevSuperior - Escola de programação](https://devsuperior.com.br)\n\n- [@devsuperior](https://github.com/devsuperior)\n\n- [![DevSuperior no Instagram](https://raw.githubusercontent.com/devsuperior/bds-assets/main/ds/ig-icon.png)](https://instagram.com/devsuperior.ig) [![DevSuperior no Youtube](https://raw.githubusercontent.com/devsuperior/bds-assets/main/ds/yt-icon.png)](https://youtube.com/devsuperior)\n\n\u003cp align=\"center\"\u003e\n\t______ OBSERVAÇÕES PESSOAIS ______\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\t\u003cimg width=\"180px\" height=\"123px\" src=\"https://user-images.githubusercontent.com/83969467/149059281-a2550df8-dd9b-4118-988c-10b431adb8b1.gif\" /\u003e \n\u003c/p\u003e\n\n#### Espisódio 1\n\n- **baseUrl**: É uma formatação no uso de importações dentro da arquitetura do projeto, dando a possibilidade de importar qualquer arquivo sem precisar sair da pasta usando `../` e, a linha de código seguinte configura a função, que deve ser inserida no arquivo tsconfig.json. `\"baseUrl\": \"./src\"`.\n\n###### Rotas com React Router DOM\n\n- **BrowserRouter**: inicia a configuração das rotas.\n\n###### Componente MovieCard\n\n- **Bootstrap Columns**: O bootstrap por padrão configura todo o campo da página com 12 colunas, portanto, se for definido que um elemento ocupe metade da página, será inserido à classe, o número 6 compondo a coluna, desta forma: `col-6`. Caso queira que o elemento ocupe essa quantidade de colunas a partir de 576px de largura da tela - por exemplo - então a escrita fica assim: `col-sm-6`.\n\n#### Espisódio 2\n\n###### Configuração de Segurança (Liberar acesso de sistemas em locais dinstintos)\n\n- **Classe SecurityConfig**: o código da classe libera o acesso do backend (hospedado no servidor) para que ele possa ser acessado pelo frontend, que se econtra em outro lugar. Cria-se a partir do pacote dsmovie, um subpacote chamado config, e lá criado a classe e seus métodos.\n\n###### Domínio, ORM, Seed\n\n- **Classe de associação**: quando houver um duas tabelas com o relacionamento de _muitos para muitos_ deverá exisitir outra entre ambas, fazendo a associação. No caso da tabela de associação do nosso projeto, haverá um dado extra para fazer a ponte entre a tabela Movie e User.\n\n- **Chave primária composta**: é a chave primária da classe de associação, que é composta pela chave primária da classe Movie e User, logo, é preciso criar uma classe auxiliar (ScorePK) para guardar essas **duas chaves**, tranformando-se numa composição.\n\n- **Associar `Score` com `Movie`**: o código seguinte forma um filme e associa-o ao objeto Score: `public void setMovie(Movie movie){id.setMovie(movie);}`. (A linha foi escrita na classe Score).\n\n- **Serializable**: interface do java que indica que o objeto especificado pode ser convertido para bytes (importante para trafegar na rede e ser salvado em arquivos), e a CHAVE COMPOSTA exige o serializable\n\n###### Busca de Filmes \n\n- **MovieRepository**: Responsável pelo CRUD e acesso ao BD.\n\n- **@Autowired**: instacia a classe automaticamente.\n\n###### Salvar Avaliação\n\n- **PUT é idempotente**: chamá-lo uma ou várias vezes sucessivamente terá o mesmo efeito. Diferentemente de POST, que pode ter efeitos adicionais.\n\n- **@RequestBody**: configura que o corpo receba a requisição do JSON e seja convertido no objeto indicado, que no caso, é o ScoreDTO.\n\n- **saveAndFlush**: as alterações serão liberadas para o DB imediatamente neste comando. Porém, com o `save`, isso não é necessariamente verdade e pode permanecer na memória até que os comandos flush ou commit sejam emitidos.\n\n- `HashSet\u003c\u003e()`: é uma classe que implementa a interface. Ou seja, o atributo `Set` associado ao Score (`Set\u003cScore\u003e`), o `Set` em si é essa interface, e não um classe. Por isso que na sua instância não é chamado por new Set(), pois essa classe é implementada na classe HashSet.\n\n- `Set\u003cScore\u003e`: por que não usar `List\u003cScore\u003e`? já que referencia uma lista/conjunto/coleção? Porque em Java, numa situação de _muitos pra muitos_ - que é o caso da entidade Score - o que garante a NÃO repetição de dados é o Set.\n\n- **@OneToMany**: One(A entidade atual) To(para) Many(muitos). Ou seja, Um movie pode ter muitos scores. **Portanto, `One` será a classe atual onde essa `annotation` está sendo escrita**.\n\n- **@OneToMany(mappedById = \"id.movie\")**: o `id` é o nome da chave primária do score (ScorePK), e o `movie` é o nome do atributo existente na classe também do ScorePK. Essa linha de código permite acessar todas as avaliações de umm certo filme, a partir de um objeto de filme (a classe Movie). E todo esse processo é feito com o user também.\n\n\n###### Validação do Postgres local\n\n- Os três perfis de projeto:\n\t- **test**: no momento, a propriedade da aplicação está com o perfil ativado como test, configurado lá no arquivo application.properties. Com isso, será criado alguns arquivos de configuração para configurar outros perfis de projeto\n\t- **dev**: vai ser um perfil de uma homologação (confirmação), para testar o projeto no BD do Postgres localmente.\n\t- **prod**: é o perfil que vai rodar quando instalado na nuvem Heroku.\n\n###### Back-end no Heroku\n\n- Estrutura da url do BD do Postgres da Heroku:\n```\npostgres://\nvwjgmxbputdshi\n:\n236a2d02aa6262de723ba23647bd277bd5698sd4fe463a949d7bde3acb400efa\n@\nec2-3-225-41-234.compute-1.amazonaws.com\n:\n5432\n/\ndauuv9j80p0sgj\n\n# Substituindo por explicação a variável de ambiente:\n# postgres://\n# (Nome do usuário)\n# :\n# (Senha do usuário)\n# @\n# (Host onde está hospedado o banco de dados)\n# :\n# (Porta)\n# /\n# (Nome da base de dados)\n```\n\n#### Espisódio 3\n\n###### Parâmetro de rota: userParams\n\n- **movieId**: o movieId que chega como argumento ao Props, PRECISA ser colocado como dependência do useEffect - _da function FormCard_ - caso contrário a requisição entrará em loop repetido, pois seu valor foi usado (${movieId}), portanto é essecial usar esse valor como parâmetro, guiando para uma nova requisição apenas quando este valor for mudado.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsancruz-dev%2Fdsmovie","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsancruz-dev%2Fdsmovie","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsancruz-dev%2Fdsmovie/lists"}