From 662ea8ba2fc7b7b5093683c1f00c055108043655 Mon Sep 17 00:00:00 2001 From: Axel Date: Fri, 27 Feb 2026 15:56:44 -0300 Subject: [PATCH] Repositorio movido --- .gitignore | 36 ++++ LICENSE | 18 ++ README.md | 154 ++++++++++++++++++ pom.xml | 75 +++++++++ .../AgendaDigitalEstudantesApplication.java | 12 ++ .../agendaestudantil/config/EnvConfig.java | 25 +++ .../controller/EstudanteController.java | 31 ++++ .../controller/TarefaController.java | 81 +++++++++ .../dto/CadastroRequestDTO.java | 16 ++ .../dto/EstudanteResponseDTO.java | 16 ++ .../agendaestudantil/dto/LoginRequestDTO.java | 13 ++ .../dto/TarefaRequestDTO.java | 28 ++++ .../agendaestudantil/entity/Disciplina.java | 30 ++++ .../agendaestudantil/entity/Estudante.java | 32 ++++ .../com/agendaestudantil/entity/Evento.java | 40 +++++ .../com/agendaestudantil/entity/Tarefa.java | 45 +++++ .../repository/DisciplinaRepository.java | 11 ++ .../repository/EstudanteRepository.java | 12 ++ .../repository/EventoRepository.java | 22 +++ .../repository/TarefaRepository.java | 27 +++ .../service/EstudanteService.java | 64 ++++++++ .../service/TarefaService.java | 98 +++++++++++ src/main/resources/application.properties | 8 + 23 files changed, 894 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 pom.xml create mode 100644 src/main/java/com/agendaestudantil/AgendaDigitalEstudantesApplication.java create mode 100644 src/main/java/com/agendaestudantil/config/EnvConfig.java create mode 100644 src/main/java/com/agendaestudantil/controller/EstudanteController.java create mode 100644 src/main/java/com/agendaestudantil/controller/TarefaController.java create mode 100644 src/main/java/com/agendaestudantil/dto/CadastroRequestDTO.java create mode 100644 src/main/java/com/agendaestudantil/dto/EstudanteResponseDTO.java create mode 100644 src/main/java/com/agendaestudantil/dto/LoginRequestDTO.java create mode 100644 src/main/java/com/agendaestudantil/dto/TarefaRequestDTO.java create mode 100644 src/main/java/com/agendaestudantil/entity/Disciplina.java create mode 100644 src/main/java/com/agendaestudantil/entity/Estudante.java create mode 100644 src/main/java/com/agendaestudantil/entity/Evento.java create mode 100644 src/main/java/com/agendaestudantil/entity/Tarefa.java create mode 100644 src/main/java/com/agendaestudantil/repository/DisciplinaRepository.java create mode 100644 src/main/java/com/agendaestudantil/repository/EstudanteRepository.java create mode 100644 src/main/java/com/agendaestudantil/repository/EventoRepository.java create mode 100644 src/main/java/com/agendaestudantil/repository/TarefaRepository.java create mode 100644 src/main/java/com/agendaestudantil/service/EstudanteService.java create mode 100644 src/main/java/com/agendaestudantil/service/TarefaService.java create mode 100644 src/main/resources/application.properties diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1c44b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar + +# Eclipse +.settings/ +.classpath +.project + +# IntelliJ IDEA +.idea/ +*.iws +*.iml +*.ipr +out/ + +# VS Code +.vscode/ + +# Environment variables +.env + +# Logs +*.log + +# OS +.DS_Store +Thumbs.db diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f09edea --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) 2026 axel + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b1d4a2d --- /dev/null +++ b/README.md @@ -0,0 +1,154 @@ +
+ +

FocusAgenda

+ +

Plataforma digital de organização de estudos para alunos do ensino médio e técnico

+ +

+ + + + + +

+ +

+ + +

+ +
+ +--- + +## Sobre o Projeto + +O **FocusAgenda** é uma plataforma digital desenvolvida como Trabalho de Conclusão de Curso (TCC) na **ETEC Pedro D'Arcádia Neto**, no curso Técnico em Desenvolvimento de Sistemas. + +A proposta nasce de um problema real: muitos estudantes do ensino médio e técnico passam horas na escola e, ao chegar em casa, ainda precisam lidar com inúmeras atividades — o que torna difícil manter uma rotina de estudos organizada e eficiente. + +O FocusAgenda oferece uma solução simples e prática para isso: um calendário interativo com notificações, lembretes e visualizações diárias, semanais e mensais, ajudando o aluno a gerenciar seu tempo com mais autonomia e produtividade. + +--- + +## Funcionalidades + +- **Calendário interativo** com visualizações diária, semanal e mensal +- **Criação e edição de eventos** e afazeres em datas específicas +- **Notificações e lembretes** de tarefas, provas e compromissos acadêmicos +- **Painel informativo (HUD)** com o dia atual, afazeres do dia e feriados do mês +- **Sistema de login e cadastro** de usuários +- **Design responsivo** — funciona bem em celulares e computadores + +--- + +## Tecnologias Utilizadas + +### Frontend +| Tecnologia | Uso | +|---|---| +| **HTML5** | Estrutura das páginas (campos, botões, calendário) | +| **CSS3** | Estilização visual, responsividade e identidade do projeto | +| **JavaScript** | Interatividade, navegação sem reload e comunicação com o backend | + +### Backend +| Tecnologia | Uso | +|---|---| +| **Java** | Linguagem principal do servidor, processa requisições do frontend | +| **MongoDB** | Banco de dados NoSQL, armazena eventos e dados dos alunos | + +--- + +## Telas do Sistema + +### Login +> Acesso seguro com e-mail e senha. Usuários sem conta podem se cadastrar diretamente pela tela. + +### Cadastro +> Criação de perfil com e-mail, nome de usuário e senha. + +### Calendário Mensal +> Visão geral do mês com todos os eventos cadastrados. Painel lateral em laranja exibe o dia atual, afazeres do dia e feriados. + +### Calendário Semanal +> Visualização dos afazeres da semana atual com navegação entre períodos. + +### Calendário Diário +> Detalhamento das atividades do dia selecionado com horários e feriados. + +--- + +## Como Executar o Projeto + +### Pré-requisitos + +- [Java 17+](https://www.oracle.com/java/technologies/downloads/) +- [Maven](https://maven.apache.org/) +- [MongoDB](https://www.mongodb.com/try/download/community) rodando localmente ou via Atlas + +### Passos + +```bash +# Clone o repositório +git clone https://git.morpheusnox.shop/morpheus/projeto.git + +# Entre na pasta do projeto +cd projeto + +# Instale as dependências e compile +mvn install + +# Execute o servidor +mvn spring-boot:run +``` + +> Após iniciar o servidor, acesse o frontend pelo navegador em `http://localhost:8080` + +--- + +## Estrutura do Projeto + +``` +projeto/ +├── src/ +│ └── main/ +│ ├── java/ # Código-fonte do backend (Java) +│ └── resources/ # Configurações da aplicação +├── pom.xml # Dependências Maven +├── .gitignore +└── README.md +``` + +--- + +## Equipe + +| Nome | Função | +|---|---| +| Gabriel H. M. Borges | Desenvolvimento | +| Fernando M. B. da Cruz | Desenvolvimento | +| Gustavo Ferreira Araujo | Desenvolvimento | +| Henry E. de Oliveira | Desenvolvimento | +| Nádia Sakae Habu | Professora Orientadora | + +--- + +## Instituição + +**ETEC Pedro D'Arcádia Neto** +Centro Estadual de Educação Tecnológica Paula Souza +Curso: Técnico em Desenvolvimento de Sistemas + +--- + +## Referencias + +- CETIC. [TIC Educação 2023](https://cetic.br/) +- MORAN, José. *Educação e tecnologias: mudar para valer.* 2007. +- PROESC. [Engajamento escolar com uma agenda digital.](https://proesc.com/blog/engajamento-escolar-com-uma-agenda-digital-beneficios-e-dicas-praticas/) 2024. + +--- + +
+ Desenvolvido na ETEC Pedro D'Arcádia Neto — 2025/2026 +
\ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7f076b8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 3.2.0 + + + + com.agendaestudantil + agenda-digital-estudantes + 1.0.0 + Agenda Digital para Estudantes + Backend para agenda digital destinado a estudantes com dificuldade de organização + + + 17 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + org.springframework.boot + spring-boot-starter-validation + + + + io.github.cdimascio + dotenv-java + 2.3.2 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + diff --git a/src/main/java/com/agendaestudantil/AgendaDigitalEstudantesApplication.java b/src/main/java/com/agendaestudantil/AgendaDigitalEstudantesApplication.java new file mode 100644 index 0000000..21b28a4 --- /dev/null +++ b/src/main/java/com/agendaestudantil/AgendaDigitalEstudantesApplication.java @@ -0,0 +1,12 @@ +package com.agendaestudantil; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AgendaDigitalEstudantesApplication { + + public static void main(String[] args) { + SpringApplication.run(AgendaDigitalEstudantesApplication.class, args); + } +} diff --git a/src/main/java/com/agendaestudantil/config/EnvConfig.java b/src/main/java/com/agendaestudantil/config/EnvConfig.java new file mode 100644 index 0000000..fd8830d --- /dev/null +++ b/src/main/java/com/agendaestudantil/config/EnvConfig.java @@ -0,0 +1,25 @@ +package com.agendaestudantil.config; + +import io.github.cdimascio.dotenv.Dotenv; +import org.springframework.context.annotation.Configuration; + +import jakarta.annotation.PostConstruct; +import java.util.Map; + +@Configuration +public class EnvConfig { + + @PostConstruct + public void init() { + Dotenv dotenv = Dotenv.configure() + .ignoreIfMissing() + .load(); + + if (dotenv != null) { + Map envVars = (Map) dotenv.entries(); + for (Map.Entry entry : envVars.entrySet()) { + System.setProperty(entry.getKey(), entry.getValue()); + } + } + } +} diff --git a/src/main/java/com/agendaestudantil/controller/EstudanteController.java b/src/main/java/com/agendaestudantil/controller/EstudanteController.java new file mode 100644 index 0000000..ec30fda --- /dev/null +++ b/src/main/java/com/agendaestudantil/controller/EstudanteController.java @@ -0,0 +1,31 @@ +package com.agendaestudantil.controller; + +import com.agendaestudantil.dto.CadastroRequestDTO; +import com.agendaestudantil.dto.EstudanteResponseDTO; +import com.agendaestudantil.dto.LoginRequestDTO; +import com.agendaestudantil.service.EstudanteService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api/estudantes") +@CrossOrigin(origins = "*") +public class EstudanteController { + + @Autowired + private EstudanteService estudanteService; + + @PostMapping("/cadastro") + public ResponseEntity cadastrar(@RequestBody CadastroRequestDTO dto) { + EstudanteResponseDTO resposta = estudanteService.cadastrar(dto); + return ResponseEntity.status(HttpStatus.CREATED).body(resposta); + } + + @PostMapping("/login") + public ResponseEntity login(@RequestBody LoginRequestDTO dto) { + EstudanteResponseDTO resposta = estudanteService.login(dto); + return ResponseEntity.ok(resposta); + } +} diff --git a/src/main/java/com/agendaestudantil/controller/TarefaController.java b/src/main/java/com/agendaestudantil/controller/TarefaController.java new file mode 100644 index 0000000..d9f4931 --- /dev/null +++ b/src/main/java/com/agendaestudantil/controller/TarefaController.java @@ -0,0 +1,81 @@ +package com.agendaestudantil.controller; + +import com.agendaestudantil.dto.TarefaRequestDTO; +import com.agendaestudantil.entity.Tarefa; +import com.agendaestudantil.service.TarefaService; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; +import java.util.List; + +@RestController +@RequestMapping("/api/tarefas") +@RequiredArgsConstructor +public class TarefaController { + + private final TarefaService tarefaService; + + @PostMapping + public ResponseEntity criarTarefa(@Valid @RequestBody TarefaRequestDTO dto) { + Tarefa tarefa = tarefaService.criarTarefa(dto); + return ResponseEntity.status(HttpStatus.CREATED).body(tarefa); + } + + @GetMapping("/estudante/{estudanteId}") + public ResponseEntity> listarTarefasPorEstudante(@PathVariable String estudanteId) { + List tarefas = tarefaService.listarTarefasPorEstudante(estudanteId); + return ResponseEntity.ok(tarefas); + } + + @GetMapping("/estudante/{estudanteId}/pendentes") + public ResponseEntity> listarTarefasPendentes(@PathVariable String estudanteId) { + List tarefas = tarefaService.listarTarefasPendentes(estudanteId); + return ResponseEntity.ok(tarefas); + } + + @GetMapping("/estudante/{estudanteId}/data") + public ResponseEntity> listarTarefasPorData( + @PathVariable String estudanteId, + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate data) { + List tarefas = tarefaService.listarTarefasPorData(estudanteId, data); + return ResponseEntity.ok(tarefas); + } + + @GetMapping("/estudante/{estudanteId}/periodo") + public ResponseEntity> listarTarefasPorPeriodo( + @PathVariable String estudanteId, + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate inicio, + @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fim) { + List tarefas = tarefaService.listarTarefasPorPeriodo(estudanteId, inicio, fim); + return ResponseEntity.ok(tarefas); + } + + @GetMapping("/{id}") + public ResponseEntity buscarTarefaPorId(@PathVariable String id) { + return tarefaService.buscarTarefaPorId(id) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } + + @PutMapping("/{id}") + public ResponseEntity atualizarTarefa(@PathVariable String id, @Valid @RequestBody TarefaRequestDTO dto) { + Tarefa tarefa = tarefaService.atualizarTarefa(id, dto); + return ResponseEntity.ok(tarefa); + } + + @DeleteMapping("/{id}") + public ResponseEntity excluirTarefa(@PathVariable String id) { + tarefaService.excluirTarefa(id); + return ResponseEntity.noContent().build(); + } + + @PatchMapping("/{id}/concluir") + public ResponseEntity marcarConcluida(@PathVariable String id) { + Tarefa tarefa = tarefaService.marcarConcluida(id); + return ResponseEntity.ok(tarefa); + } +} diff --git a/src/main/java/com/agendaestudantil/dto/CadastroRequestDTO.java b/src/main/java/com/agendaestudantil/dto/CadastroRequestDTO.java new file mode 100644 index 0000000..0b2728e --- /dev/null +++ b/src/main/java/com/agendaestudantil/dto/CadastroRequestDTO.java @@ -0,0 +1,16 @@ +package com.agendaestudantil.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class CadastroRequestDTO { + private String nome; + private String email; + private String senha; + private String curso; + private Integer periodo; +} diff --git a/src/main/java/com/agendaestudantil/dto/EstudanteResponseDTO.java b/src/main/java/com/agendaestudantil/dto/EstudanteResponseDTO.java new file mode 100644 index 0000000..4fc9552 --- /dev/null +++ b/src/main/java/com/agendaestudantil/dto/EstudanteResponseDTO.java @@ -0,0 +1,16 @@ +package com.agendaestudantil.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class EstudanteResponseDTO { + private String id; + private String nome; + private String email; + private String curso; + private Integer periodo; +} diff --git a/src/main/java/com/agendaestudantil/dto/LoginRequestDTO.java b/src/main/java/com/agendaestudantil/dto/LoginRequestDTO.java new file mode 100644 index 0000000..beb1d90 --- /dev/null +++ b/src/main/java/com/agendaestudantil/dto/LoginRequestDTO.java @@ -0,0 +1,13 @@ +package com.agendaestudantil.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class LoginRequestDTO { + private String email; + private String senha; +} diff --git a/src/main/java/com/agendaestudantil/dto/TarefaRequestDTO.java b/src/main/java/com/agendaestudantil/dto/TarefaRequestDTO.java new file mode 100644 index 0000000..bafe02c --- /dev/null +++ b/src/main/java/com/agendaestudantil/dto/TarefaRequestDTO.java @@ -0,0 +1,28 @@ +package com.agendaestudantil.dto; + +import com.agendaestudantil.entity.Tarefa; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import java.time.LocalDate; + +@Data +public class TarefaRequestDTO { + + @NotBlank(message = "Título é obrigatório") + private String titulo; + + private String descricao; + + private Tarefa.Prioridade prioridade; + + private Tarefa.StatusTarefa status; + + @NotNull(message = "Data de entrega é obrigatória") + private LocalDate dataEntrega; + + private String disciplinaId; + + @NotBlank(message = "ID do estudante é obrigatório") + private String estudanteId; +} diff --git a/src/main/java/com/agendaestudantil/entity/Disciplina.java b/src/main/java/com/agendaestudantil/entity/Disciplina.java new file mode 100644 index 0000000..6aecb29 --- /dev/null +++ b/src/main/java/com/agendaestudantil/entity/Disciplina.java @@ -0,0 +1,30 @@ +package com.agendaestudantil.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import java.time.LocalDateTime; + +@Document(collection = "disciplinas") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Disciplina { + + @Id + private String id; + + private String nome; + + private String professor; + + private String sala; + + private String cor; + + private String estudanteId; + + private LocalDateTime dataCriacao; +} diff --git a/src/main/java/com/agendaestudantil/entity/Estudante.java b/src/main/java/com/agendaestudantil/entity/Estudante.java new file mode 100644 index 0000000..489185d --- /dev/null +++ b/src/main/java/com/agendaestudantil/entity/Estudante.java @@ -0,0 +1,32 @@ +package com.agendaestudantil.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import java.time.LocalDateTime; + +@Document(collection = "estudantes") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Estudante { + + @Id + private String id; + + private String nome; + + private String email; + + private String senha; + + private String curso; + + private Integer periodo; + + private LocalDateTime dataCriacao; + + private LocalDateTime dataAtualizacao; +} diff --git a/src/main/java/com/agendaestudantil/entity/Evento.java b/src/main/java/com/agendaestudantil/entity/Evento.java new file mode 100644 index 0000000..e319745 --- /dev/null +++ b/src/main/java/com/agendaestudantil/entity/Evento.java @@ -0,0 +1,40 @@ +package com.agendaestudantil.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import java.time.LocalDateTime; + +@Document(collection = "eventos") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Evento { + + @Id + private String id; + + private String titulo; + + private String descricao; + + private TipoEvento tipo; + + private LocalDateTime dataInicio; + + private LocalDateTime dataFim; + + private String local; + + private String disciplinaId; + + private String estudanteId; + + private LocalDateTime dataCriacao; + + public enum TipoEvento { + AULA, PROVA, TRABALHO, ATIVIDADE, EVENTO, LEMBRETE + } +} diff --git a/src/main/java/com/agendaestudantil/entity/Tarefa.java b/src/main/java/com/agendaestudantil/entity/Tarefa.java new file mode 100644 index 0000000..1b61ed5 --- /dev/null +++ b/src/main/java/com/agendaestudantil/entity/Tarefa.java @@ -0,0 +1,45 @@ +package com.agendaestudantil.entity; + +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Document(collection = "tarefas") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Tarefa { + + @Id + private String id; + + private String titulo; + + private String descricao; + + private Prioridade prioridade; + + private StatusTarefa status; + + private LocalDate dataEntrega; + + private String disciplinaId; + + private String estudanteId; + + private LocalDateTime dataCriacao; + + private LocalDateTime dataAtualizacao; + + public enum Prioridade { + BAIXA, MEDIA, ALTA, URGENTE + } + + public enum StatusTarefa { + PENDENTE, EM_ANDAMENTO, CONCLUIDA, ATRASADA + } +} diff --git a/src/main/java/com/agendaestudantil/repository/DisciplinaRepository.java b/src/main/java/com/agendaestudantil/repository/DisciplinaRepository.java new file mode 100644 index 0000000..6aa614b --- /dev/null +++ b/src/main/java/com/agendaestudantil/repository/DisciplinaRepository.java @@ -0,0 +1,11 @@ +package com.agendaestudantil.repository; + +import com.agendaestudantil.entity.Disciplina; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; +import java.util.List; + +@Repository +public interface DisciplinaRepository extends MongoRepository { + List findByEstudanteId(String estudanteId); +} diff --git a/src/main/java/com/agendaestudantil/repository/EstudanteRepository.java b/src/main/java/com/agendaestudantil/repository/EstudanteRepository.java new file mode 100644 index 0000000..9381975 --- /dev/null +++ b/src/main/java/com/agendaestudantil/repository/EstudanteRepository.java @@ -0,0 +1,12 @@ +package com.agendaestudantil.repository; + +import com.agendaestudantil.entity.Estudante; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; +import java.util.Optional; + +@Repository +public interface EstudanteRepository extends MongoRepository { + Optional findByEmail(String email); + boolean existsByEmail(String email); +} diff --git a/src/main/java/com/agendaestudantil/repository/EventoRepository.java b/src/main/java/com/agendaestudantil/repository/EventoRepository.java new file mode 100644 index 0000000..d8e147b --- /dev/null +++ b/src/main/java/com/agendaestudantil/repository/EventoRepository.java @@ -0,0 +1,22 @@ +package com.agendaestudantil.repository; + +import com.agendaestudantil.entity.Evento; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; +import java.util.List; + +@Repository +public interface EventoRepository extends MongoRepository { + List findByEstudanteId(String estudanteId); + + List findByDisciplinaId(String disciplinaId); + + @Query("{'estudanteId': ?0, 'dataInicio': {$gte: ?1, $lte: ?2}}") + List findByEstudanteIdAndDataInicioBetween(String estudanteId, LocalDateTime inicio, LocalDateTime fim); + + @Query("{'estudanteId': ?0, 'dataInicio': {$gte: ?1}}") + List findProximosEventosByEstudanteId(String estudanteId, LocalDateTime data); +} diff --git a/src/main/java/com/agendaestudantil/repository/TarefaRepository.java b/src/main/java/com/agendaestudantil/repository/TarefaRepository.java new file mode 100644 index 0000000..02cc277 --- /dev/null +++ b/src/main/java/com/agendaestudantil/repository/TarefaRepository.java @@ -0,0 +1,27 @@ +package com.agendaestudantil.repository; + +import com.agendaestudantil.entity.Tarefa; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.List; + +@Repository +public interface TarefaRepository extends MongoRepository { + List findByEstudanteId(String estudanteId); + + List findByEstudanteIdAndStatus(String estudanteId, Tarefa.StatusTarefa status); + + List findByDisciplinaId(String disciplinaId); + + @Query("{'estudanteId': ?0, 'dataEntrega': ?1}") + List findByEstudanteIdAndDataEntrega(String estudanteId, LocalDate data); + + @Query("{'estudanteId': ?0, 'dataEntrega': {$gte: ?1, $lte: ?2}}") + List findByEstudanteIdAndDataEntregaBetween(String estudanteId, LocalDate inicio, LocalDate fim); + + @Query("{'estudanteId': ?0, 'status': {$ne: 'CONCLUIDA'}}") + List findTarefasPendentesByEstudanteId(String estudanteId); +} diff --git a/src/main/java/com/agendaestudantil/service/EstudanteService.java b/src/main/java/com/agendaestudantil/service/EstudanteService.java new file mode 100644 index 0000000..048953c --- /dev/null +++ b/src/main/java/com/agendaestudantil/service/EstudanteService.java @@ -0,0 +1,64 @@ +package com.agendaestudantil.service; + +import com.agendaestudantil.dto.CadastroRequestDTO; +import com.agendaestudantil.dto.EstudanteResponseDTO; +import com.agendaestudantil.dto.LoginRequestDTO; +import com.agendaestudantil.entity.Estudante; +import com.agendaestudantil.repository.EstudanteRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import java.time.LocalDateTime; +import java.util.Optional; + +@Service +public class EstudanteService { + + @Autowired + private EstudanteRepository estudanteRepository; + + public EstudanteResponseDTO cadastrar(CadastroRequestDTO dto) { + Optional existente = estudanteRepository.findByEmail(dto.getEmail()); + if (existente.isPresent()) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Email já cadastrado"); + } + + Estudante estudante = new Estudante(); + estudante.setNome(dto.getNome()); + estudante.setEmail(dto.getEmail()); + estudante.setSenha(dto.getSenha()); + estudante.setCurso(dto.getCurso()); + estudante.setPeriodo(dto.getPeriodo()); + estudante.setDataCriacao(LocalDateTime.now()); + estudante.setDataAtualizacao(LocalDateTime.now()); + + Estudante salvo = estudanteRepository.save(estudante); + return toResponse(salvo); + } + + public EstudanteResponseDTO login(LoginRequestDTO dto) { + Optional estudante = estudanteRepository.findByEmail(dto.getEmail()); + + if (estudante.isEmpty()) { + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Email ou senha incorretos"); + } + + if (!estudante.get().getSenha().equals(dto.getSenha())) { + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Email ou senha incorretos"); + } + + return toResponse(estudante.get()); + } + + private EstudanteResponseDTO toResponse(Estudante estudante) { + return new EstudanteResponseDTO( + estudante.getId(), + estudante.getNome(), + estudante.getEmail(), + estudante.getCurso(), + estudante.getPeriodo() + ); + } +} diff --git a/src/main/java/com/agendaestudantil/service/TarefaService.java b/src/main/java/com/agendaestudantil/service/TarefaService.java new file mode 100644 index 0000000..01a776c --- /dev/null +++ b/src/main/java/com/agendaestudantil/service/TarefaService.java @@ -0,0 +1,98 @@ +package com.agendaestudantil.service; + +import com.agendaestudantil.dto.TarefaRequestDTO; +import com.agendaestudantil.entity.Disciplina; +import com.agendaestudantil.entity.Tarefa; +import com.agendaestudantil.repository.DisciplinaRepository; +import com.agendaestudantil.repository.TarefaRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +@Service +@RequiredArgsConstructor +public class TarefaService { + + private final TarefaRepository tarefaRepository; + private final DisciplinaRepository disciplinaRepository; + + @Transactional + public Tarefa criarTarefa(TarefaRequestDTO dto) { + Tarefa tarefa = new Tarefa(); + tarefa.setTitulo(dto.getTitulo()); + tarefa.setDescricao(dto.getDescricao()); + tarefa.setPrioridade(dto.getPrioridade() != null ? dto.getPrioridade() : Tarefa.Prioridade.MEDIA); + tarefa.setStatus(dto.getStatus() != null ? dto.getStatus() : Tarefa.StatusTarefa.PENDENTE); + tarefa.setDataEntrega(dto.getDataEntrega()); + tarefa.setEstudanteId(dto.getEstudanteId()); + tarefa.setDataCriacao(LocalDateTime.now()); + tarefa.setDataAtualizacao(LocalDateTime.now()); + + if (dto.getDisciplinaId() != null) { + Disciplina disciplina = disciplinaRepository.findById(dto.getDisciplinaId()) + .orElseThrow(() -> new RuntimeException("Disciplina não encontrada")); + tarefa.setDisciplinaId(disciplina.getId()); + } + + return tarefaRepository.save(tarefa); + } + + public List listarTarefasPorEstudante(String estudanteId) { + return tarefaRepository.findByEstudanteId(estudanteId); + } + + public List listarTarefasPendentes(String estudanteId) { + return tarefaRepository.findTarefasPendentesByEstudanteId(estudanteId); + } + + public List listarTarefasPorData(String estudanteId, LocalDate data) { + return tarefaRepository.findByEstudanteIdAndDataEntrega(estudanteId, data); + } + + public List listarTarefasPorPeriodo(String estudanteId, LocalDate inicio, LocalDate fim) { + return tarefaRepository.findByEstudanteIdAndDataEntregaBetween(estudanteId, inicio, fim); + } + + public Optional buscarTarefaPorId(String id) { + return tarefaRepository.findById(id); + } + + @Transactional + public Tarefa atualizarTarefa(String id, TarefaRequestDTO dto) { + Tarefa tarefa = tarefaRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Tarefa não encontrada")); + + tarefa.setTitulo(dto.getTitulo()); + tarefa.setDescricao(dto.getDescricao()); + tarefa.setPrioridade(dto.getPrioridade()); + tarefa.setStatus(dto.getStatus()); + tarefa.setDataEntrega(dto.getDataEntrega()); + tarefa.setDataAtualizacao(LocalDateTime.now()); + + if (dto.getDisciplinaId() != null) { + Disciplina disciplina = disciplinaRepository.findById(dto.getDisciplinaId()) + .orElseThrow(() -> new RuntimeException("Disciplina não encontrada")); + tarefa.setDisciplinaId(disciplina.getId()); + } + + return tarefaRepository.save(tarefa); + } + + @Transactional + public void excluirTarefa(String id) { + tarefaRepository.deleteById(id); + } + + @Transactional + public Tarefa marcarConcluida(String id) { + Tarefa tarefa = tarefaRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Tarefa não encontrada")); + tarefa.setStatus(Tarefa.StatusTarefa.CONCLUIDA); + tarefa.setDataAtualizacao(LocalDateTime.now()); + return tarefaRepository.save(tarefa); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..86ead23 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.application.name=${APP_NAME:Agenda Digital para Estudantes} +server.port=${SERVER_PORT:8080} + +spring.data.mongodb.host=${MONGODB_HOST:localhost} +spring.data.mongodb.port=${MONGODB_PORT:27017} +spring.data.mongodb.database=${MONGODB_DATABASE:agenda_estudantil} + +logging.level.org.springframework.data.mongodb=DEBUG