Skip to content

Repositório para o Tech Challenge Fase 4 - Grupo 30

Notifications You must be signed in to change notification settings

rcsim/tech-challenge-fase4

Repository files navigation

Tech-challenge-fase4

Repositório para o Tech Challenge Fase 4 - Grupo 30

Este repositório contém o código-fonte e a documentação para o Tech Challenge - Fase 4, desenvolvido pelo Grupo 30.

O projeto consiste em uma aplicação web para exibição de videos utilizando Spring Framework, Spring WebFlux, Spring Boot e Sping Data. A API permite gerenciamento de videos, usuários e principalmnente o streaming the videos utilizando endpoints reativos.

1- Relatório Técnico

Tecnologias e ferramentas utilizadas

  • Linguagem de programação:

    • Java 17
  • Framework:

    • Spring Boot 3.2.0
  • Bibliotecas:

    • Spring Web
    • Spring WebFlux
    • OpenAPI
    • Lombok
    • AWS Java SDK
  • Tests:

    • JUnit
    • JMockit
  • Banco de dados:

    • MongoDB
  • Outras ferramentas:

    • Docker

Configurações da solução

Banco de Dados

Configuração de produção utilizando o MongoDB

spring.data.mongodb.uri=mongodb://4movies:yU1T55xcVR@localhost:27017/4movies?authSource=admin

O schema e os dados iniciais do banco de dados são criados através do arquivo schema.js:

db = db.getSiblingDB('4movies');
db.createCollection("categories");
db.createCollection("users");
db.createCollection("videos");
// Insert data into the categories collection
var category1 = db.categories.insertOne({ "name": "Action", "description": "Action movies involve instances of physical action such as fights, stunts, car chases, etc." }).insertedId;
var category2 = db.categories.insertOne({ "name": "Comedy", "description": "Comedy movies are designed to elicit laughter." }).insertedId;
var category3 = db.categories.insertOne({ "name": "Romance", "description": "Romance movies are centered around the theme of love and relationships."}).insertedId;
var category4 = db.categories.insertOne({ "name": "Horror", "description": "Horror movies are designed to elicit fear and suspense."}).insertedId;
// Insert data into the users collection
var user1 = db.users.insertOne({ "name": "John Doe", "email": "[email protected]", "favorites": [] }).insertedId;
var user2 = db.users.insertOne({ "name": "Jane Doe", "email": "[email protected]", "favorites": [] }).insertedId;
// Insert data into the videos collection
var video1 = db.videos.insertOne({
"title": "The Dark Knight",
"description": "When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, Batman must accept one of the greatest psychological and physical tests of his ability to fight injustice.",
"url": "https://video-techchallenge.s3.amazonaws.com/video1.mp4",
"publishDate": "2008-07-18",
"category": category1,
"views": 100,
"favoritedBy": [user1]
}).insertedId;
var video2 = db.videos.insertOne({
"title": "The Hangover",
"description": "Three buddies wake up from a bachelor party in Las Vegas, with no memory of the previous night and the bachelor missing. They make their way around the city in order to find their friend before his wedding.",
"url": "https://video-techchallenge.s3.amazonaws.com/video2.mp4",
"publishDate": "2009-06-05",
"category": category2,
"views": 50,
"favoritedBy": [user2]
}).insertedId;
var video3 = db.videos.insertOne({
"title": "Inception",
"description": "A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into the mind of a C.E.O.",
"url": "https://video-techchallenge.s3.amazonaws.com/video3.mp4",
"publishDate": "2010-07-16",
"category": category1,
"views": 150,
"favoritedBy": null
}).insertedId;
var video4 = db.videos.insertOne({
"title": "The Shawshank Redemption",
"description": "Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.",
"url": "https://video-techchallenge.s3.amazonaws.com/video4.mp4",
"publishDate": "1994-09-22",
"category": category1,
"views": 200,
"favoritedBy": [user1, user2]
}).insertedId;
// Update the users documents with the _id fields of the videos documents
db.users.updateOne({ "_id": user1 }, { "$set": { "favorites": [video1, video4] } });
db.users.updateOne({ "_id": user2 }, { "$set": { "favorites": [video2, video4] } });

Container

Criamos um container para aplicação e outro para o banco de dados e uma rede no modo bridge para ter acesso ao containers via localhost:

Também adicionamos o arquivo Dockerfile que gerencia o processo de build da aplicação através do Maven e JDK, já inicializando a aplicação:

FROM maven:3.9.1 AS MAVEN_BUILD
COPY . /build
WORKDIR /build
RUN mvn clean package
# Use AdoptOpenJDK 17 as the base image
FROM openjdk:17-alpine
# Set the working directory
WORKDIR /app
# Copy the JAR file from the MAVEN_BUILD stage
COPY --from=MAVEN_BUILD /build/target/*.jar /app/application.jar
# Expose the default Spring Boot port
EXPOSE 8080
# Entry point to run the application
ENTRYPOINT ["java", "-jar", "/app/application.jar"]

Para criação dos container, compilar e rodar a applicação é necessário apenas o comando:

version: "3"
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: 4movies
MONGO_INITDB_ROOT_PASSWORD: yU1T55xcVR
ports:
- "27017:27017"
volumes:
- ./schema.js:/docker-entrypoint-initdb.d/schema.js
app:
depends_on:
- mongo
build: .
environment:
- spring.data.mongodb.uri=mongodb://4movies:yU1T55xcVR@mongo:27017/4movies?authSource=admin
- SPRING_PROFILES_ACTIVE=test
ports:
- "8080:8080"
networks:
my-networks:
driver: bridge

docker-compose up -d

image

Documentação das APIS

Adicionamos a geração automática da documentação através da biblioteca SpringDoc OpenAPI, a documentação pode ser acessada enquanto a aplicação estiver rodando em http://localhost:8080/swagger-ui/index.html#/:

image image image

Arquivo POSTMAN

Disponibilizamos um conjunto de arquivos JSON com todas as requisições Postman para testar a API, os arquivos estão disponíveis nos seguintes links:

https://github.com/rcsim/tech-challenge-fase4/blob/main/src/main/resources/postman/Category.postman_collection.json https://github.com/rcsim/tech-challenge-fase4/blob/main/src/main/resources/postman/Statistics.postman_collection.json https://github.com/rcsim/tech-challenge-fase4/blob/main/src/main/resources/postman/Users.postman_collection.json https://github.com/rcsim/tech-challenge-fase4/blob/main/src/main/resources/postman/Videos.postman_collection.json https://github.com/rcsim/tech-challenge-fase4/blob/main/src/main/resources/postman/Stream.postman_collection.json

Testes de Unidade e Integração

Utilizando as bibliotecas JUnit e JMockit, implementamos os testes de unidade, chegando a 93% de cobertura das classes do sistema:

image

Para testes de integração utilizamos o Postman:

image

Streaming the Videos com Deploy AWS S3

Para gerenciar vídeos de forma eficiente, utilizamos o Amazon S3 para armazenamento e o AWS Java SDK para facilitar a interação com o S3. Os vídeos são enviados e organizados em buckets no S3, aproveitando sua escalabilidade e durabilidade. O AWS Java SDK simplifica a integração, proporcionando uma maneira fácil e segura de baixar vídeos para transmissão. A combinação dessas tecnologias garante uma recuperação eficiente dos vídeos armazenados, permitindo uma experiência de transmissão suave e confiável. A segurança é mantida por meio de políticas de controle de acesso, garantindo a proteção dos vídeos armazenados no S3.

image

Conclusões

O projeto foi concluído com êxito, atendendo integralmente aos requisitos propostos no desafio. A escolha criteriosa das tecnologias e ferramentas desempenhou um papel fundamental, proporcionando um ambiente propício para o desenvolvimento eficiente e robusto do sistema. Destaca-se o enfoque dedicado à implementação de endpoints reativos com Spring WebFlux, constituindo o principal ponto de aprendizado nesta etapa. Vale ressaltar que, devido à novidade desse paradigma para alguns membros do grupo, foram necessários esforços adicionais para assimilação e aplicação efetiva.

As principais dificuldades encontradas estão relacionadas à incorporação do protocolo HLS para o streaming de vídeos e à hospedagem destes na AWS S3. Conforme mencionado anteriormente, o paradigma de programação reativa também se configurou como um ponto de atenção, dada sua novidade para parte dos integrantes. Essas questões exigiram uma abordagem cuidadosa e estratégica para superação, demonstrando a capacidade do grupo em lidar com desafios complexos.

About

Repositório para o Tech Challenge Fase 4 - Grupo 30

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •