Projects upload with docker working
This commit is contained in:
commit
77bbe52f7a
|
|
@ -0,0 +1,5 @@
|
|||
FROM eclipse-temurin:21-jdk-alpine
|
||||
WORKDIR /app
|
||||
COPY target/memberflow-api-1.0-SNAPSHOT.jar app.jar
|
||||
EXPOSE 8080
|
||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Etapa 1: build React
|
||||
FROM node:18-alpine as build
|
||||
WORKDIR /app
|
||||
|
||||
COPY memberflow-frontend/package*.json ./
|
||||
RUN npm install
|
||||
|
||||
COPY memberflow-frontend/ .
|
||||
RUN npm run build
|
||||
|
||||
# Etapa 2: servir con nginx
|
||||
FROM nginx:alpine
|
||||
WORKDIR /usr/share/nginx/html
|
||||
|
||||
COPY --from=build /app/build .
|
||||
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
|
||||
|
||||
EXPOSE 80
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
version: '3.8'
|
||||
|
||||
services:
|
||||
|
||||
mysql:
|
||||
image: mysql:8.0
|
||||
container_name: mysql-db
|
||||
restart: always
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: 1234
|
||||
MYSQL_DATABASE: mf_db
|
||||
ports:
|
||||
- "3307:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p1234"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
|
||||
backend:
|
||||
build:
|
||||
context: ../memberflow-api
|
||||
dockerfile: ../docker/Dockerfile-api
|
||||
container_name: memberflow-backend
|
||||
depends_on:
|
||||
- mysql
|
||||
ports:
|
||||
- "8080:8080"
|
||||
environment:
|
||||
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mf_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
|
||||
SPRING_DATASOURCE_USERNAME: root
|
||||
SPRING_DATASOURCE_PASSWORD: 1234
|
||||
JWT_SECRET: c2VjdXJlc2VjdXJlc2VjdXJlc2VjdXJlMTIzNDU2
|
||||
JWT_EXPIRATION: 7200000
|
||||
|
||||
|
||||
frontend:
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: docker/Dockerfile-front
|
||||
container_name: memberflow-frontend
|
||||
depends_on:
|
||||
- backend
|
||||
ports:
|
||||
- "3000:80"
|
||||
|
||||
volumes:
|
||||
mysql_data:
|
||||
|
|
@ -0,0 +1,975 @@
|
|||
CREATE DATABASE IF NOT EXISTS `mf_db` /*!40100 DEFAULT CHARACTER SET utf8mb3 */ /*!80016 DEFAULT ENCRYPTION='N' */;
|
||||
USE `mf_db`;
|
||||
-- MySQL dump 10.13 Distrib 8.0.41, for Win64 (x86_64)
|
||||
--
|
||||
-- Host: localhost Database: mf_db
|
||||
-- ------------------------------------------------------
|
||||
-- Server version 8.0.41
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!50503 SET NAMES utf8 */;
|
||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
|
||||
--
|
||||
-- Table structure for table `admins`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `admins`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `admins` (
|
||||
`fk_user` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `UKhp41pq62xgvtc2ybhg0ogn9k2` (`fk_user`),
|
||||
CONSTRAINT `FK7atylq0pwosys9nu9m6i615yf` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `admins`
|
||||
--
|
||||
|
||||
LOCK TABLES `admins` WRITE;
|
||||
/*!40000 ALTER TABLE `admins` DISABLE KEYS */;
|
||||
INSERT INTO `admins` VALUES (3,1),(52,2);
|
||||
/*!40000 ALTER TABLE `admins` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `admins_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `admins_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `admins_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `admins_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `admins_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `admins_seq` DISABLE KEYS */;
|
||||
INSERT INTO `admins_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `admins_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `assistance`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `assistance`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `assistance` (
|
||||
`fk_student` int NOT NULL,
|
||||
`fk_training_session` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`date_time` datetime(6) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FKhrljnnasyhhy0wacovapkhgll` (`fk_student`),
|
||||
KEY `FKr5gxvfqh4k1jws31ymlw80nin` (`fk_training_session`),
|
||||
CONSTRAINT `FKhrljnnasyhhy0wacovapkhgll` FOREIGN KEY (`fk_student`) REFERENCES `students` (`id`),
|
||||
CONSTRAINT `FKr5gxvfqh4k1jws31ymlw80nin` FOREIGN KEY (`fk_training_session`) REFERENCES `training_sessions` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `assistance`
|
||||
--
|
||||
|
||||
LOCK TABLES `assistance` WRITE;
|
||||
/*!40000 ALTER TABLE `assistance` DISABLE KEYS */;
|
||||
INSERT INTO `assistance` VALUES (2,302,352,'2025-05-11 14:19:43.234000');
|
||||
/*!40000 ALTER TABLE `assistance` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `assistance_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `assistance_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `assistance_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `assistance_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `assistance_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `assistance_seq` DISABLE KEYS */;
|
||||
INSERT INTO `assistance_seq` VALUES (451);
|
||||
/*!40000 ALTER TABLE `assistance_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `invoice_lines`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `invoice_lines`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `invoice_lines` (
|
||||
`fk_invoice` int NOT NULL,
|
||||
`fk_product_service` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`quantity` int NOT NULL,
|
||||
`subtotal` decimal(38,2) NOT NULL,
|
||||
`unit_price` decimal(38,2) NOT NULL,
|
||||
`description` text,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FK16v42x9o42cpvobfprperyat1` (`fk_invoice`),
|
||||
KEY `FKt49wl938ncng8h5i3ivhw2851` (`fk_product_service`),
|
||||
CONSTRAINT `FK16v42x9o42cpvobfprperyat1` FOREIGN KEY (`fk_invoice`) REFERENCES `invoices` (`id`),
|
||||
CONSTRAINT `FKt49wl938ncng8h5i3ivhw2851` FOREIGN KEY (`fk_product_service`) REFERENCES `products_services` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `invoice_lines`
|
||||
--
|
||||
|
||||
LOCK TABLES `invoice_lines` WRITE;
|
||||
/*!40000 ALTER TABLE `invoice_lines` DISABLE KEYS */;
|
||||
INSERT INTO `invoice_lines` VALUES (1,1,1,1,50.00,50.00,NULL),(1,1,2,1,50.00,50.00,NULL);
|
||||
/*!40000 ALTER TABLE `invoice_lines` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `invoice_lines_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `invoice_lines_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `invoice_lines_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `invoice_lines_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `invoice_lines_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `invoice_lines_seq` DISABLE KEYS */;
|
||||
INSERT INTO `invoice_lines_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `invoice_lines_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `invoices`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `invoices`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `invoices` (
|
||||
`fk_user` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`total` decimal(38,2) NOT NULL,
|
||||
`date` datetime(6) NOT NULL,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FKdhc51ih4oqto9ng00e4ioso7w` (`fk_user`),
|
||||
CONSTRAINT `FKdhc51ih4oqto9ng00e4ioso7w` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `invoices`
|
||||
--
|
||||
|
||||
LOCK TABLES `invoices` WRITE;
|
||||
/*!40000 ALTER TABLE `invoices` DISABLE KEYS */;
|
||||
INSERT INTO `invoices` VALUES (1,1,50.00,'2025-05-08 16:22:31.643179','PAID');
|
||||
/*!40000 ALTER TABLE `invoices` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `invoices_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `invoices_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `invoices_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `invoices_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `invoices_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `invoices_seq` DISABLE KEYS */;
|
||||
INSERT INTO `invoices_seq` VALUES (51);
|
||||
/*!40000 ALTER TABLE `invoices_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `iva_type`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `iva_type`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `iva_type` (
|
||||
`id` int NOT NULL,
|
||||
`percentage` decimal(38,2) NOT NULL,
|
||||
`description` varchar(50) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `iva_type`
|
||||
--
|
||||
|
||||
LOCK TABLES `iva_type` WRITE;
|
||||
/*!40000 ALTER TABLE `iva_type` DISABLE KEYS */;
|
||||
INSERT INTO `iva_type` VALUES (1,21.00,'IVA General');
|
||||
/*!40000 ALTER TABLE `iva_type` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `iva_type_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `iva_type_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `iva_type_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `iva_type_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `iva_type_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `iva_type_seq` DISABLE KEYS */;
|
||||
INSERT INTO `iva_type_seq` VALUES (51);
|
||||
/*!40000 ALTER TABLE `iva_type_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `memberships`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `memberships`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `memberships` (
|
||||
`end_date` date NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`start_date` date NOT NULL,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL,
|
||||
`type` enum('ADVANCED','BASIC','NO_LIMIT','PREMIUM','TRIAL') NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `memberships`
|
||||
--
|
||||
|
||||
LOCK TABLES `memberships` WRITE;
|
||||
/*!40000 ALTER TABLE `memberships` DISABLE KEYS */;
|
||||
INSERT INTO `memberships` VALUES ('2025-06-09',1,'2025-05-09','ACTIVE','BASIC'),('2025-08-09',2,'2025-05-09','ACTIVE','ADVANCED'),('2025-11-09',3,'2025-05-09','ACTIVE','PREMIUM'),('2026-05-09',4,'2025-05-09','ACTIVE','NO_LIMIT'),('2025-05-31',52,'2025-05-14','ACTIVE','TRIAL');
|
||||
/*!40000 ALTER TABLE `memberships` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `memberships_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `memberships_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `memberships_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `memberships_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `memberships_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `memberships_seq` DISABLE KEYS */;
|
||||
INSERT INTO `memberships_seq` VALUES (151);
|
||||
/*!40000 ALTER TABLE `memberships_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `notifications`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `notifications`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `notifications` (
|
||||
`id` int NOT NULL,
|
||||
`shipping_date` datetime(6) NOT NULL,
|
||||
`type` varchar(100) DEFAULT NULL,
|
||||
`title` varchar(200) NOT NULL,
|
||||
`message` text,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `notifications`
|
||||
--
|
||||
|
||||
LOCK TABLES `notifications` WRITE;
|
||||
/*!40000 ALTER TABLE `notifications` DISABLE KEYS */;
|
||||
INSERT INTO `notifications` VALUES (1,'2025-05-09 16:22:31.581882','Bienvenida','Bienvenido a MemberFlow','Gracias por registrarte','ACTIVE'),(2,'2025-05-09 22:00:00.000000','','Hola','Hola','ACTIVE');
|
||||
/*!40000 ALTER TABLE `notifications` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `notifications_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `notifications_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `notifications_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `notifications_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `notifications_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `notifications_seq` DISABLE KEYS */;
|
||||
INSERT INTO `notifications_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `notifications_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `payments`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `payments`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `payments` (
|
||||
`amount` decimal(38,2) NOT NULL,
|
||||
`fk_invoice` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`payment_date` datetime(6) NOT NULL,
|
||||
`payment_method` enum('BANK_TRANSFER','CASH','CREDIT_CARD') NOT NULL,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `UK3ktj4gndg7wyqu8wqoyqlxonw` (`fk_invoice`),
|
||||
CONSTRAINT `FKdryjs8tgr3kyuopc9aiwn1a62` FOREIGN KEY (`fk_invoice`) REFERENCES `invoices` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `payments`
|
||||
--
|
||||
|
||||
LOCK TABLES `payments` WRITE;
|
||||
/*!40000 ALTER TABLE `payments` DISABLE KEYS */;
|
||||
INSERT INTO `payments` VALUES (50.00,1,1,'2025-05-09 16:22:31.697527','CREDIT_CARD','PAID');
|
||||
/*!40000 ALTER TABLE `payments` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `payments_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `payments_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `payments_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `payments_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `payments_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `payments_seq` DISABLE KEYS */;
|
||||
INSERT INTO `payments_seq` VALUES (51);
|
||||
/*!40000 ALTER TABLE `payments_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `permissions`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `permissions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `permissions` (
|
||||
`id` int NOT NULL,
|
||||
`name` enum('FULL_ACCESS','MANAGE_STUDENTS','VIEW_OWN_DATA') NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `permissions`
|
||||
--
|
||||
|
||||
LOCK TABLES `permissions` WRITE;
|
||||
/*!40000 ALTER TABLE `permissions` DISABLE KEYS */;
|
||||
INSERT INTO `permissions` VALUES (1,'FULL_ACCESS'),(2,'MANAGE_STUDENTS'),(3,'VIEW_OWN_DATA');
|
||||
/*!40000 ALTER TABLE `permissions` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `permissions_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `permissions_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `permissions_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `permissions_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `permissions_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `permissions_seq` DISABLE KEYS */;
|
||||
INSERT INTO `permissions_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `permissions_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `products_services`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `products_services`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `products_services` (
|
||||
`fk_iva_type` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`price` decimal(38,2) NOT NULL,
|
||||
`type` varchar(45) NOT NULL,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`description` varchar(250) DEFAULT NULL,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FKr8m24u7qbyvbd8sjiq7g3jik0` (`fk_iva_type`),
|
||||
CONSTRAINT `FKr8m24u7qbyvbd8sjiq7g3jik0` FOREIGN KEY (`fk_iva_type`) REFERENCES `iva_type` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `products_services`
|
||||
--
|
||||
|
||||
LOCK TABLES `products_services` WRITE;
|
||||
/*!40000 ALTER TABLE `products_services` DISABLE KEYS */;
|
||||
INSERT INTO `products_services` VALUES (1,1,50.00,'Servicio','Clase de JiuJitsu',NULL,'ACTIVE');
|
||||
/*!40000 ALTER TABLE `products_services` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `products_services_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `products_services_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `products_services_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `products_services_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `products_services_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `products_services_seq` DISABLE KEYS */;
|
||||
INSERT INTO `products_services_seq` VALUES (51);
|
||||
/*!40000 ALTER TABLE `products_services_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `roles`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `roles`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `roles` (
|
||||
`id` int NOT NULL,
|
||||
`name` varchar(45) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `roles`
|
||||
--
|
||||
|
||||
LOCK TABLES `roles` WRITE;
|
||||
/*!40000 ALTER TABLE `roles` DISABLE KEYS */;
|
||||
INSERT INTO `roles` VALUES (1,'ROLE_STUDENT'),(2,'ROLE_TEACHER'),(3,'ROLE_ADMIN');
|
||||
/*!40000 ALTER TABLE `roles` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `roles_permissions`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `roles_permissions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `roles_permissions` (
|
||||
`fk_permission` int NOT NULL,
|
||||
`fk_role` int NOT NULL,
|
||||
PRIMARY KEY (`fk_role`,`fk_permission`),
|
||||
KEY `FKlboaow7qn1m64rwjr8ifl6w2d` (`fk_permission`),
|
||||
CONSTRAINT `FKlboaow7qn1m64rwjr8ifl6w2d` FOREIGN KEY (`fk_permission`) REFERENCES `permissions` (`id`),
|
||||
CONSTRAINT `FKo60viy4q37nhjd2xyl242anba` FOREIGN KEY (`fk_role`) REFERENCES `roles` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `roles_permissions`
|
||||
--
|
||||
|
||||
LOCK TABLES `roles_permissions` WRITE;
|
||||
/*!40000 ALTER TABLE `roles_permissions` DISABLE KEYS */;
|
||||
INSERT INTO `roles_permissions` VALUES (1,3),(2,2),(3,1),(3,2);
|
||||
/*!40000 ALTER TABLE `roles_permissions` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `roles_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `roles_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `roles_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `roles_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `roles_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `roles_seq` DISABLE KEYS */;
|
||||
INSERT INTO `roles_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `roles_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `student_history`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `student_history`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `student_history` (
|
||||
`event_date` date DEFAULT NULL,
|
||||
`fk_student` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`description` varchar(255) DEFAULT NULL,
|
||||
`event_type` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FKfifyby18m8fetblwf5nfg33gx` (`fk_student`),
|
||||
CONSTRAINT `FKfifyby18m8fetblwf5nfg33gx` FOREIGN KEY (`fk_student`) REFERENCES `students` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `student_history`
|
||||
--
|
||||
|
||||
LOCK TABLES `student_history` WRITE;
|
||||
/*!40000 ALTER TABLE `student_history` DISABLE KEYS */;
|
||||
INSERT INTO `student_history` VALUES ('2025-05-09',1,1,'Primera clase','Clase de prueba');
|
||||
/*!40000 ALTER TABLE `student_history` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `student_history_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `student_history_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `student_history_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `student_history_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `student_history_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `student_history_seq` DISABLE KEYS */;
|
||||
INSERT INTO `student_history_seq` VALUES (51);
|
||||
/*!40000 ALTER TABLE `student_history_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `students`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `students`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `students` (
|
||||
`birthdate` date NOT NULL,
|
||||
`fk_membership` int DEFAULT NULL,
|
||||
`fk_user` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`dni` varchar(10) NOT NULL,
|
||||
`belt` varchar(20) DEFAULT NULL,
|
||||
`parent_name` varchar(50) DEFAULT NULL,
|
||||
`medical_report` varchar(500) DEFAULT NULL,
|
||||
`progress` text,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `UK3ci8o1dbwgn49fx4tkhk579fk` (`fk_user`),
|
||||
UNIQUE KEY `UKoljr3bj7rsof5ys5e9v932g9l` (`dni`),
|
||||
UNIQUE KEY `UKgjomxh7uemp64sjo69mkefqbh` (`fk_membership`),
|
||||
CONSTRAINT `FKj3wyb55uh73yti619x84pfe7s` FOREIGN KEY (`fk_membership`) REFERENCES `memberships` (`id`),
|
||||
CONSTRAINT `FKkqp52wo7o073loxihnbf133wq` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `students`
|
||||
--
|
||||
|
||||
LOCK TABLES `students` WRITE;
|
||||
/*!40000 ALTER TABLE `students` DISABLE KEYS */;
|
||||
INSERT INTO `students` VALUES ('2005-05-20',1,1,1,'12345678A','Blanco','Padre Estudiante','Apto','Buena evolución'),('2025-05-10',3,103,2,'123456789','Blanco','','',NULL);
|
||||
/*!40000 ALTER TABLE `students` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `students_groups`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `students_groups`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `students_groups` (
|
||||
`fk_group` int NOT NULL,
|
||||
`fk_student` int NOT NULL,
|
||||
PRIMARY KEY (`fk_group`,`fk_student`),
|
||||
KEY `FKqibb3ps0nfj4kkx6kd1qn7mkd` (`fk_student`),
|
||||
CONSTRAINT `FKp6ck2q2xcptfj526ipa1ki56g` FOREIGN KEY (`fk_group`) REFERENCES `training_groups` (`id`),
|
||||
CONSTRAINT `FKqibb3ps0nfj4kkx6kd1qn7mkd` FOREIGN KEY (`fk_student`) REFERENCES `students` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `students_groups`
|
||||
--
|
||||
|
||||
LOCK TABLES `students_groups` WRITE;
|
||||
/*!40000 ALTER TABLE `students_groups` DISABLE KEYS */;
|
||||
INSERT INTO `students_groups` VALUES (452,2);
|
||||
/*!40000 ALTER TABLE `students_groups` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `students_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `students_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `students_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `students_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `students_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `students_seq` DISABLE KEYS */;
|
||||
INSERT INTO `students_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `students_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `teachers`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `teachers`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `teachers` (
|
||||
`fk_user` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`discipline` varchar(50) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `UK352b5808rcgb1un47hwig1gq2` (`fk_user`),
|
||||
CONSTRAINT `FKeujs3kyjh75c0u93b731i9rua` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `teachers`
|
||||
--
|
||||
|
||||
LOCK TABLES `teachers` WRITE;
|
||||
/*!40000 ALTER TABLE `teachers` DISABLE KEYS */;
|
||||
INSERT INTO `teachers` VALUES (2,1,'Jiu-Jitsu'),(102,2,'Jiujitsu');
|
||||
/*!40000 ALTER TABLE `teachers` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `teachers_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `teachers_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `teachers_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `teachers_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `teachers_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `teachers_seq` DISABLE KEYS */;
|
||||
INSERT INTO `teachers_seq` VALUES (101);
|
||||
/*!40000 ALTER TABLE `teachers_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `training_groups`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `training_groups`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `training_groups` (
|
||||
`fk_teacher` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`schedule` datetime(6) NOT NULL,
|
||||
`level` varchar(45) DEFAULT NULL,
|
||||
`name` varchar(45) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FKhgbvfsm24yptkm76cbhtbv4s4` (`fk_teacher`),
|
||||
CONSTRAINT `FKhgbvfsm24yptkm76cbhtbv4s4` FOREIGN KEY (`fk_teacher`) REFERENCES `teachers` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `training_groups`
|
||||
--
|
||||
|
||||
LOCK TABLES `training_groups` WRITE;
|
||||
/*!40000 ALTER TABLE `training_groups` DISABLE KEYS */;
|
||||
INSERT INTO `training_groups` VALUES (2,452,'2025-10-22 12:35:00.000000','Avanzado','JiuJitsu');
|
||||
/*!40000 ALTER TABLE `training_groups` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `training_groups_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `training_groups_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `training_groups_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `training_groups_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `training_groups_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `training_groups_seq` DISABLE KEYS */;
|
||||
INSERT INTO `training_groups_seq` VALUES (551);
|
||||
/*!40000 ALTER TABLE `training_groups_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `training_sessions`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `training_sessions`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `training_sessions` (
|
||||
`fk_group` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`date_time` datetime(6) NOT NULL,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `FKkjj30gdo7uua9ycvlriax2vep` (`fk_group`),
|
||||
CONSTRAINT `FKkjj30gdo7uua9ycvlriax2vep` FOREIGN KEY (`fk_group`) REFERENCES `training_groups` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `training_sessions`
|
||||
--
|
||||
|
||||
LOCK TABLES `training_sessions` WRITE;
|
||||
/*!40000 ALTER TABLE `training_sessions` DISABLE KEYS */;
|
||||
INSERT INTO `training_sessions` VALUES (452,302,'2025-10-22 12:35:00.000000','ACTIVE');
|
||||
/*!40000 ALTER TABLE `training_sessions` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `training_sessions_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `training_sessions_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `training_sessions_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `training_sessions_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `training_sessions_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `training_sessions_seq` DISABLE KEYS */;
|
||||
INSERT INTO `training_sessions_seq` VALUES (401);
|
||||
/*!40000 ALTER TABLE `training_sessions_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `users`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `users`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `users` (
|
||||
`fk_role` int NOT NULL,
|
||||
`id` int NOT NULL,
|
||||
`register_date` datetime(6) NOT NULL,
|
||||
`phone_number` varchar(30) NOT NULL,
|
||||
`name` varchar(50) NOT NULL,
|
||||
`surname` varchar(50) NOT NULL,
|
||||
`address` varchar(100) NOT NULL,
|
||||
`email` varchar(100) NOT NULL,
|
||||
`password` varchar(255) NOT NULL,
|
||||
`status` enum('ACTIVE','DELETED','INACTIVE','NOT_PAID','NOT_SENT','PAID','PENDING','SENT','SUSPENDED') NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `UKavh1b2ec82audum2lyjx2p1ws` (`email`),
|
||||
KEY `FK5k6cr6ejda3jhunshjbx4nhai` (`fk_role`),
|
||||
CONSTRAINT `FK5k6cr6ejda3jhunshjbx4nhai` FOREIGN KEY (`fk_role`) REFERENCES `roles` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `users`
|
||||
--
|
||||
|
||||
LOCK TABLES `users` WRITE;
|
||||
/*!40000 ALTER TABLE `users` DISABLE KEYS */;
|
||||
INSERT INTO `users` VALUES (1,1,'2025-05-09 16:22:31.399041','600123456','Student','One','Calle Estudiante 123','student@example.com','$2a$10$G13aVWunAMLwQNDdca0BGuXeYxfH65TFriKHzpwU3OGZvR/6O.poO','ACTIVE'),(2,2,'2025-05-09 16:22:31.501044','611123456','Teacher','Uno','Calle Maestro 1','teacher@example.com','$2a$10$.0KMijc2nwqwJgUDiosN1.vzXHqiy9Ge6gzOiOKLwmOmiLa9yC85a','ACTIVE'),(3,3,'2025-05-09 16:22:31.568593','622123456','Admin','Root','Central','admin@example.com','$2a$10$u9k50gWu3eMG.KF1brVeC.O6UPob0DQgAdNxc.Y63AE1ZPkcwRVNy','ACTIVE'),(3,52,'2025-05-09 16:24:48.404428','675529497','Dennis','Eckerskorn','Carrer d\'Azorín, 30 Bajo','deckerskorn@mf.com','$2a$10$sg1Cy1AvimKBWEaZvGG3Ue.qdwclJre7VBvAHKrPTtY5dD9R4ZWqO','ACTIVE'),(2,102,'2025-05-10 19:07:22.957486','1234567','Steve','Newman','Pedreguer','steve@mm.com','$2a$10$iNJiV73bUopf0iiQvouqM.SWLPOnzCjRFPbilWLbHiRR7l6IivrAu','ACTIVE'),(1,103,'2025-05-10 19:09:09.423529','1234567','Miriam','Valiña','Carrer d\'Azorín, 30 Bajo','miriam@mf.com','$2a$10$ghObW0nZdg8qo.RRNgEZd.OrUC0vlebRjuaKeX5uEvH/6nwgqqtCa','ACTIVE');
|
||||
/*!40000 ALTER TABLE `users` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `users_notifications`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `users_notifications`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `users_notifications` (
|
||||
`fk_notification` int NOT NULL,
|
||||
`fk_user` int NOT NULL,
|
||||
PRIMARY KEY (`fk_notification`,`fk_user`),
|
||||
KEY `FKr4iwf238qbl6oa8x16gj17jud` (`fk_user`),
|
||||
CONSTRAINT `FK3sbul72qkfqxu2vgqk5fw2u` FOREIGN KEY (`fk_notification`) REFERENCES `notifications` (`id`),
|
||||
CONSTRAINT `FKr4iwf238qbl6oa8x16gj17jud` FOREIGN KEY (`fk_user`) REFERENCES `users` (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `users_notifications`
|
||||
--
|
||||
|
||||
LOCK TABLES `users_notifications` WRITE;
|
||||
/*!40000 ALTER TABLE `users_notifications` DISABLE KEYS */;
|
||||
INSERT INTO `users_notifications` VALUES (1,1),(1,2),(1,3),(2,52);
|
||||
/*!40000 ALTER TABLE `users_notifications` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
|
||||
--
|
||||
-- Table structure for table `users_seq`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `users_seq`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!50503 SET character_set_client = utf8mb4 */;
|
||||
CREATE TABLE `users_seq` (
|
||||
`next_val` bigint DEFAULT NULL
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `users_seq`
|
||||
--
|
||||
|
||||
LOCK TABLES `users_seq` WRITE;
|
||||
/*!40000 ALTER TABLE `users_seq` DISABLE KEYS */;
|
||||
INSERT INTO `users_seq` VALUES (201);
|
||||
/*!40000 ALTER TABLE `users_seq` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
-- Dump completed on 2025-05-12 21:57:25
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html;
|
||||
try_files $uri /index.html;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="openjdk-21" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,60 @@
|
|||
# MemberFlow-API
|
||||
|
||||
## Descripción del Proyecto
|
||||
|
||||
**MemberFlow-API** es el módulo de interfaz de usuario y controladores de la aplicación **MemberFlow**, diseñado para gestionar membresías, usuarios, clases y finanzas en un entorno organizacional. Este proyecto actúa como la capa de presentación y comunicación, exponiendo servicios RESTful que interactúan con el módulo de datos **MemberFlow-Data**.
|
||||
|
||||
El objetivo principal de **MemberFlow-API** es proporcionar una interfaz segura y eficiente para que los clientes (como aplicaciones web o móviles) puedan interactuar con la lógica de negocio y la base de datos subyacente.
|
||||
|
||||
---
|
||||
|
||||
## Características Principales
|
||||
|
||||
- **Controladores REST**: Exposición de endpoints para gestionar usuarios, roles, notificaciones, clases y finanzas.
|
||||
- **Seguridad**: Implementación de autenticación basada en JWT (JSON Web Tokens).
|
||||
- **Integración con MemberFlow-Data**: Uso del módulo de datos para acceder a la lógica de negocio y la persistencia.
|
||||
- **Configuración Centralizada**: Uso de `application.properties` para gestionar parámetros clave como JWT y otros ajustes.
|
||||
- **Ejecución con Spring Boot**: Aplicación basada en el framework Spring Boot para facilitar el desarrollo y despliegue.
|
||||
- **Modularidad**: Integración con el módulo **MemberFlow-Data** para mantener una separación clara entre la lógica de negocio y la capa de presentación.
|
||||
|
||||
---
|
||||
|
||||
## Estructura del Proyecto
|
||||
|
||||
El proyecto está organizado en los siguientes paquetes y archivos principales:
|
||||
|
||||
### 1. **Configuración**
|
||||
- **`application.properties`**: Archivo de configuración que incluye parámetros clave como JWT y ajustes de la aplicación.
|
||||
- **`MemberFlowApplication`**: Clase principal para iniciar la aplicación Spring Boot.
|
||||
|
||||
### 2. **Controladores**
|
||||
- **`AdminController`**: Gestiona las operaciones relacionadas con los administradores, como la creación y gestión de usuarios administrativos.
|
||||
- **`AuthController`**: Maneja la autenticación y generación de tokens JWT para garantizar la seguridad de los endpoints.
|
||||
- **`StudentController`**: Proporciona endpoints para gestionar estudiantes, incluyendo inscripción, actualización de datos y consultas.
|
||||
- **`TeacherController`**: Gestiona las operaciones relacionadas con los profesores, como la asignación de grupos y la gestión de clases.
|
||||
- **`UserController`**: Controlador genérico para operaciones relacionadas con usuarios, como la gestión de perfiles y roles.
|
||||
|
||||
### 3. **Seguridad**
|
||||
- **`SecurityConfig`**: Configuración de seguridad para proteger los endpoints mediante autenticación JWT.
|
||||
- **`JwtAuthFilter`**: Filtro para validar los tokens JWT en cada solicitud, asegurando que solo usuarios autenticados puedan acceder a los recursos protegidos.
|
||||
- **`JwtUtil`**: Utilidad para generar y validar tokens JWT, incluyendo la configuración de tiempos de expiración y claves secretas.
|
||||
|
||||
### 4. **Recursos**
|
||||
- **`application.properties`**: Archivo de configuración centralizado para parámetros clave de la aplicación.
|
||||
|
||||
---
|
||||
|
||||
## Configuración del Proyecto
|
||||
|
||||
### Requisitos Previos
|
||||
|
||||
1. **Java 17 o superior**
|
||||
2. **Maven**
|
||||
3. **Dependencia del módulo MemberFlow-Data**
|
||||
|
||||
### Ejecución del Proyecto
|
||||
|
||||
1. Clona el repositorio:
|
||||
```bash
|
||||
git clone https://github.com/tu-usuario/memberflow-api.git
|
||||
cd memberflow-api
|
||||
Binary file not shown.
|
|
@ -0,0 +1,137 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.denniseckerskorn</groupId>
|
||||
<artifactId>memberflow-api</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.denniseckerskorn</groupId>
|
||||
<artifactId>memberflow-data</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Boot Starter Security -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<!-- API principal -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.11.5</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Implementación -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.11.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- Soporte para Jackson -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.11.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.15.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>2.15.3</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-core</artifactId>
|
||||
<version>2.15.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.33</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springdoc</groupId>
|
||||
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
|
||||
<version>2.8.6</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.hibernate.validator</groupId>
|
||||
<artifactId>hibernate-validator</artifactId>
|
||||
<version>8.0.1.Final</version>
|
||||
</dependency>
|
||||
|
||||
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.11.0</version>
|
||||
<configuration>
|
||||
<source>21</source>
|
||||
<target>21</target>
|
||||
<compilerArgs>
|
||||
<arg>-parameters</arg>
|
||||
</compilerArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<version>3.4.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>repackage</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package com.denniseckerskorn;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
public class MemberFlowApplication {
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(MemberFlowApplication.class, args);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
package com.denniseckerskorn.config;
|
||||
|
||||
import com.denniseckerskorn.security.CustomUserDetailsService;
|
||||
import com.denniseckerskorn.security.JwtAuthFilter;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
|
||||
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.web.SecurityFilterChain;
|
||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
|
||||
|
||||
@EnableMethodSecurity
|
||||
@Configuration
|
||||
public class SecurityConfig {
|
||||
private final JwtAuthFilter jwtAuthFilter;
|
||||
private final CustomUserDetailsService customUserDetailsService;
|
||||
|
||||
public SecurityConfig(JwtAuthFilter jwtAuthFilter, CustomUserDetailsService customUserDetailsService) {
|
||||
this.jwtAuthFilter = jwtAuthFilter;
|
||||
this.customUserDetailsService = customUserDetailsService;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
return new BCryptPasswordEncoder();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception {
|
||||
return config.getAuthenticationManager();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||
return http
|
||||
.cors(cors -> cors.configure(http))
|
||||
.csrf(csrf -> csrf.disable())
|
||||
.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers(
|
||||
"/api/v1/auth/**",
|
||||
"/v3/api-docs/**",
|
||||
"/swagger-ui/**",
|
||||
"/swagger-ui.html"
|
||||
).permitAll()
|
||||
.requestMatchers("/api/v1/users/me").permitAll()
|
||||
.requestMatchers("/api/v1/admins/**").hasAuthority("FULL_ACCESS")
|
||||
.requestMatchers("/api/v1/teachers/**").hasAnyAuthority("FULL_ACCESS", "VIEW_OWN_DATA")
|
||||
.requestMatchers("/api/v1/students/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS", "VIEW_OWN_DATA")
|
||||
.requestMatchers("/api/v1/users/**").hasAuthority("FULL_ACCESS")
|
||||
.requestMatchers("/api/v1/notifications/**").hasAuthority("FULL_ACCESS")
|
||||
.requestMatchers("/api/v1/studentHistories/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS", "VIEW_OWN_DATA")
|
||||
.requestMatchers("/api/v1/roles/**").hasAuthority("FULL_ACCESS")
|
||||
.requestMatchers("/api/v1/permissions/**").hasAuthority("FULL_ACCESS")
|
||||
.requestMatchers("/api/v1/memberships/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS")
|
||||
.requestMatchers("/api/v1/assistances/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS")
|
||||
.requestMatchers("/api/v1/training-sessions/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS")
|
||||
.requestMatchers("/api/v1/training-groups/**").hasAnyAuthority("FULL_ACCESS", "MANAGE_STUDENTS")
|
||||
.anyRequest().authenticated()
|
||||
)
|
||||
.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
package com.denniseckerskorn.config;
|
||||
|
||||
import io.swagger.v3.oas.models.Components;
|
||||
import io.swagger.v3.oas.models.info.Info;
|
||||
import io.swagger.v3.oas.models.OpenAPI;
|
||||
import io.swagger.v3.oas.models.security.SecurityRequirement;
|
||||
import io.swagger.v3.oas.models.security.SecurityScheme;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class SwaggerConfig {
|
||||
|
||||
@Bean
|
||||
public OpenAPI customOpenAPI() {
|
||||
final String securitySchemeName = "bearerAuth";
|
||||
|
||||
return new OpenAPI()
|
||||
.info(new Info()
|
||||
.title("MemberFlow API")
|
||||
.version("1.0.0")
|
||||
.description("""
|
||||
Documentación de la API de MemberFlow.
|
||||
**Usuarios de prueba:**
|
||||
- Admin: admin@example.com / admin123
|
||||
- Teacher: teacher@example.com / 123456789
|
||||
- Student: student@example.com / 12345678
|
||||
""")
|
||||
)
|
||||
.addSecurityItem(new SecurityRequirement().addList(securitySchemeName))
|
||||
.components(new Components()
|
||||
.addSecuritySchemes(securitySchemeName,
|
||||
new SecurityScheme()
|
||||
.name(securitySchemeName)
|
||||
.type(SecurityScheme.Type.HTTP)
|
||||
.scheme("bearer")
|
||||
.bearerFormat("JWT")
|
||||
.in(SecurityScheme.In.HEADER)
|
||||
));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
package com.denniseckerskorn.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
registry.addMapping("/**")
|
||||
.allowedOrigins("http://localhost:3000")
|
||||
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
|
||||
.allowedHeaders("*")
|
||||
.allowCredentials(true);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
package com.denniseckerskorn.controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.LoginRequest;
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.security.JwtUtil;
|
||||
import com.denniseckerskorn.services.user_managment_services.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.authentication.AuthenticationManager;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/auth")
|
||||
@Tag(name = "Authentication", description = "Operations related to user authentication")
|
||||
public class AuthController {
|
||||
|
||||
private final AuthenticationManager authenticationManager;
|
||||
private final JwtUtil jwtUtil;
|
||||
private final UserService userService;
|
||||
|
||||
public AuthController(AuthenticationManager authenticationManager, JwtUtil jwtUtil, UserService userService) {
|
||||
this.authenticationManager = authenticationManager;
|
||||
this.jwtUtil = jwtUtil;
|
||||
this.userService = userService;
|
||||
}
|
||||
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(responseCode = "200", description = "Successful login"),
|
||||
@ApiResponse(responseCode = "401", description = "Unauthorized"),
|
||||
@ApiResponse(responseCode = "500", description = "Internal server error")
|
||||
})
|
||||
|
||||
@Operation(summary = "User login", description = "Authenticate a user and return a JWT token")
|
||||
@PostMapping("/login")
|
||||
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
|
||||
authenticationManager.authenticate(
|
||||
new UsernamePasswordAuthenticationToken(
|
||||
loginRequest.getEmail(), loginRequest.getPassword()
|
||||
)
|
||||
);
|
||||
|
||||
User user = userService.findByEmail(loginRequest.getEmail());
|
||||
|
||||
String authority = user.getRole().getPermissions().stream()
|
||||
.map(p -> p.getPermissionName().name())
|
||||
.findFirst()
|
||||
.orElse("VIEW_OWN_DATA");
|
||||
|
||||
String token = jwtUtil.generateToken(user.getEmail(), authority);
|
||||
|
||||
return ResponseEntity.ok().body("{\"token\": \"" + token + "\"}");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
package com.denniseckerskorn.controllers.class_management_controllers;
|
||||
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.AssistanceDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.Assistance;
|
||||
import com.denniseckerskorn.services.class_managment_services.AssistanceService;
|
||||
import com.denniseckerskorn.services.class_managment_services.TrainingSessionService;
|
||||
import com.denniseckerskorn.services.user_managment_services.StudentService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/assistances")
|
||||
@Tag(name = "Assistance Management", description = "Operations related to assistance management")
|
||||
public class AssistanceController {
|
||||
|
||||
private final AssistanceService assistanceService;
|
||||
private final StudentService studentService;
|
||||
private final TrainingSessionService trainingSessionService;
|
||||
|
||||
public AssistanceController(
|
||||
AssistanceService assistanceService,
|
||||
StudentService studentService,
|
||||
TrainingSessionService trainingSessionService
|
||||
) {
|
||||
this.assistanceService = assistanceService;
|
||||
this.studentService = studentService;
|
||||
this.trainingSessionService = trainingSessionService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new assistance record")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<AssistanceDTO> create(@RequestBody AssistanceDTO dto) {
|
||||
Assistance assistance = dto.toEntity(
|
||||
studentService.findById(dto.getStudentId()),
|
||||
trainingSessionService.findById(dto.getSessionId())
|
||||
);
|
||||
Assistance saved = assistanceService.save(assistance);
|
||||
return ResponseEntity.ok(AssistanceDTO.fromEntity(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update an existing assistance record", description = "Update an existing assistance record")
|
||||
@PutMapping("/update")
|
||||
public ResponseEntity<AssistanceDTO> update(@RequestBody AssistanceDTO dto) {
|
||||
Assistance existing = assistanceService.findById(dto.getId());
|
||||
existing.setDate(dto.getDate());
|
||||
existing.setStudent(studentService.findById(dto.getStudentId()));
|
||||
existing.setTrainingSession(trainingSessionService.findById(dto.getSessionId()));
|
||||
Assistance updated = assistanceService.save(existing);
|
||||
return ResponseEntity.ok(AssistanceDTO.fromEntity(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all assistance records", description = "Retrieve a list of all assistance records")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<AssistanceDTO>> getAll() {
|
||||
List<AssistanceDTO> list = assistanceService.findAll()
|
||||
.stream()
|
||||
.map(AssistanceDTO::fromEntity)
|
||||
.collect(Collectors.toList());
|
||||
return ResponseEntity.ok(list);
|
||||
}
|
||||
|
||||
@Operation(summary = "Get assistance records by student ID", description = "Retrieve assistance records for a specific student")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<AssistanceDTO> getAssistanceById(@PathVariable Integer id) {
|
||||
Assistance assistance = assistanceService.findById(id);
|
||||
return ResponseEntity.ok(AssistanceDTO.fromEntity(assistance));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete an assistance record by ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<Void> delete(@PathVariable Integer id) {
|
||||
assistanceService.deleteById(id);
|
||||
return ResponseEntity.noContent().build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
package com.denniseckerskorn.controllers.class_management_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.MembershipDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.Membership;
|
||||
import com.denniseckerskorn.services.class_managment_services.MembershipService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.transaction.Transactional;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* MembershipController handles requests related to membership management.
|
||||
* It provides endpoints for creating, retrieving, updating, and deleting memberships.
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/memberships")
|
||||
@Tag(name = "Memberships", description = "Operations related to membership management")
|
||||
public class MembershipController {
|
||||
|
||||
private final MembershipService membershipService;
|
||||
|
||||
public MembershipController(MembershipService membershipService) {
|
||||
this.membershipService = membershipService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new membership")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<MembershipDTO> createMembership(@RequestBody MembershipDTO membershipDTO) {
|
||||
Membership membership = membershipDTO.toEntity();
|
||||
Membership savedMembership = membershipService.save(membership);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(MembershipDTO.fromEntity(savedMembership));
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all memberships", description = "Retrieve a list of all memberships")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<MembershipDTO>> getAllMemberships() {
|
||||
List<Membership> memberships = membershipService.findAll();
|
||||
if (memberships.isEmpty()) return ResponseEntity.noContent().build();
|
||||
|
||||
List<MembershipDTO> dtos = memberships.stream()
|
||||
.map(MembershipDTO::fromEntity)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Get a membership by ID", description = "Retrieve a membership by its ID")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<MembershipDTO> getMembershipById(@PathVariable Integer id) {
|
||||
Membership membership = membershipService.findById(id);
|
||||
return ResponseEntity.ok(MembershipDTO.fromEntity(membership));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update a membership", description = "Update an existing membership")
|
||||
@Transactional
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<MembershipDTO> updateMembership(@PathVariable Integer id, @RequestBody MembershipDTO dto) {
|
||||
dto.setId(id);
|
||||
Membership updated = membershipService.update(dto.toEntity());
|
||||
return ResponseEntity.ok(MembershipDTO.fromEntity(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a membership", description = "Delete a membership by its ID")
|
||||
@Transactional
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> deleteMembership(@PathVariable Integer id) {
|
||||
membershipService.deleteById(id);
|
||||
return ResponseEntity.ok("Membership deleted successfully");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,161 @@
|
|||
package com.denniseckerskorn.controllers.class_management_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.TrainingGroupDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Teacher;
|
||||
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import com.denniseckerskorn.exceptions.EntityNotFoundException;
|
||||
import com.denniseckerskorn.exceptions.InvalidDataException;
|
||||
import com.denniseckerskorn.services.class_managment_services.TrainingGroupService;
|
||||
import com.denniseckerskorn.services.class_managment_services.TrainingSessionService;
|
||||
import com.denniseckerskorn.services.user_managment_services.StudentService;
|
||||
import com.denniseckerskorn.services.user_managment_services.TeacherService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.transaction.Transactional;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Controller for managing training groups.
|
||||
* Provides endpoints for creating, updating, retrieving, and deleting training groups.
|
||||
*/
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/training-groups")
|
||||
@Tag(name = "Training Group Management", description = "Operations related to training group management")
|
||||
public class TrainingGroupController {
|
||||
|
||||
private final TrainingGroupService trainingGroupService;
|
||||
private final TeacherService teacherService;
|
||||
private final StudentService studentService;
|
||||
private final TrainingSessionService trainingSessionService;
|
||||
|
||||
|
||||
public TrainingGroupController(TrainingGroupService trainingGroupService, TeacherService teacherService, StudentService studentService, TrainingSessionService trainingSessionService) {
|
||||
this.trainingGroupService = trainingGroupService;
|
||||
this.teacherService = teacherService;
|
||||
this.studentService = studentService;
|
||||
this.trainingSessionService = trainingSessionService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a training group with a teacher")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<TrainingGroupDTO> createGroup(@RequestBody TrainingGroupDTO dto) {
|
||||
Teacher teacher = teacherService.findById(dto.getTeacherId());
|
||||
|
||||
TrainingGroup group = new TrainingGroup();
|
||||
group.setName(dto.getName());
|
||||
group.setLevel(dto.getLevel());
|
||||
group.setSchedule(dto.getSchedule());
|
||||
group.setTeacher(teacher);
|
||||
TrainingGroup createdGroup = trainingGroupService.save(group);
|
||||
|
||||
TrainingSession trainingSession = new TrainingSession();
|
||||
trainingSession.setTrainingGroup(createdGroup);
|
||||
trainingSession.setDate(createdGroup.getSchedule());
|
||||
trainingSession.setStatus(StatusValues.ACTIVE);
|
||||
trainingSessionService.save(trainingSession);
|
||||
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(new TrainingGroupDTO(createdGroup));
|
||||
|
||||
}
|
||||
|
||||
@Operation(summary = "Assign a student to a group")
|
||||
@PutMapping("/assign-student")
|
||||
public ResponseEntity<Void> assignStudent(@RequestParam Integer groupId, @RequestParam Integer studentId) {
|
||||
TrainingGroup group = trainingGroupService.findById(groupId);
|
||||
Student student = studentService.findById(studentId);
|
||||
|
||||
trainingGroupService.addStudentToGroup(group, student);
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
@Operation(summary = "Remove a student from a group")
|
||||
@PutMapping("/remove-student")
|
||||
public ResponseEntity<Void> removeStudent(@RequestParam Integer groupId, @RequestParam Integer studentId) {
|
||||
TrainingGroup group = trainingGroupService.findById(groupId);
|
||||
Student student = studentService.findById(studentId);
|
||||
|
||||
trainingGroupService.removeStudentFromGroup(group, student);
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
@Operation(summary = "Update an existing training group", description = "Update an existing training group with the specified ID")
|
||||
@Transactional
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<TrainingGroupDTO> update(@PathVariable Integer id, @RequestBody TrainingGroupDTO dto) {
|
||||
dto.setId(id);
|
||||
Teacher teacher = teacherService.findById(dto.getTeacherId());
|
||||
Set<Student> students = dto.getStudentIds().stream()
|
||||
.map(studentService::findById)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
TrainingGroup updated = trainingGroupService.update(dto.toEntity(teacher, students));
|
||||
|
||||
List<TrainingSession> sessions = updated.getTrainingSessions().stream().toList();
|
||||
if (!sessions.isEmpty()) {
|
||||
TrainingSession session = sessions.get(0);
|
||||
session.setDate(updated.getSchedule());
|
||||
trainingSessionService.save(session);
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(new TrainingGroupDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Find a training group by ID", description = "Retrieve a training group with the specified ID")
|
||||
@GetMapping("findById/{id}")
|
||||
public ResponseEntity<TrainingGroupDTO> findGroupById(@PathVariable Integer id) {
|
||||
return ResponseEntity.ok(new TrainingGroupDTO(trainingGroupService.findById(id)));
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all training groups", description = "Retrieve a list of all training groups")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<TrainingGroupDTO>> getAll() {
|
||||
return ResponseEntity.ok(
|
||||
trainingGroupService.findAll().stream()
|
||||
.map(TrainingGroupDTO::new)
|
||||
.collect(Collectors.toList())
|
||||
);
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a training group by ID", description = "Delete a training group with the specified ID")
|
||||
@Transactional
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<Void> delete(@PathVariable Integer id) {
|
||||
TrainingGroup group = trainingGroupService.findById(id);
|
||||
if (group == null) {
|
||||
throw new EntityNotFoundException("Group not found");
|
||||
}
|
||||
|
||||
for (TrainingSession session : group.getTrainingSessions()) {
|
||||
trainingSessionService.deleteAllAssistancesBySession(session.getId());
|
||||
}
|
||||
|
||||
for (TrainingSession session : group.getTrainingSessions()) {
|
||||
trainingSessionService.deleteById(session.getId());
|
||||
}
|
||||
|
||||
Set<Student> students = group.getStudents();
|
||||
if (students != null) {
|
||||
for (Student student : students) {
|
||||
student.getTrainingGroups().remove(group);
|
||||
}
|
||||
group.getStudents().clear();
|
||||
}
|
||||
|
||||
trainingGroupService.update(group);
|
||||
|
||||
trainingGroupService.deleteById(id);
|
||||
|
||||
return ResponseEntity.noContent().build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
package com.denniseckerskorn.controllers.class_management_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.TrainingSessionDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
|
||||
import com.denniseckerskorn.services.class_managment_services.TrainingGroupService;
|
||||
import com.denniseckerskorn.services.class_managment_services.TrainingSessionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/training-sessions")
|
||||
@Tag(name = "Training Session Management", description = "Operations related to training session management")
|
||||
public class TrainingSessionController {
|
||||
private final TrainingSessionService trainingSessionService;
|
||||
private final TrainingGroupService trainingGroupService;
|
||||
|
||||
public TrainingSessionController(TrainingSessionService trainingSessionService, TrainingGroupService trainingGroupService) {
|
||||
this.trainingSessionService = trainingSessionService;
|
||||
this.trainingGroupService = trainingGroupService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Find a training session by ID", description = "Retrieve a training session by its ID")
|
||||
@GetMapping("findById/{id}")
|
||||
public TrainingSessionDTO findTrainingSessionById(@PathVariable Integer id) {
|
||||
return TrainingSessionDTO.fromEntity(trainingSessionService.findById(id));
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all training sessions", description = "Retrieve a list of all training sessions")
|
||||
@GetMapping("/getAll")
|
||||
public List<TrainingSessionDTO> getAll() {
|
||||
return trainingSessionService.findAll()
|
||||
.stream()
|
||||
.map(TrainingSessionDTO::fromEntity)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all training sessions by group ID", description = "Retrieve a list of all training sessions by group ID")
|
||||
@DeleteMapping("delete/{id}")
|
||||
public void delete(@PathVariable Integer id) {
|
||||
trainingSessionService.deleteById(id);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.AdminDTO;
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.UserDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Admin;
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.exceptions.InvalidDataException;
|
||||
import com.denniseckerskorn.services.user_managment_services.AdminService;
|
||||
import com.denniseckerskorn.services.user_managment_services.RoleService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/admins")
|
||||
@Tag(name = "Administrator Management", description = "Operations related to administrator management")
|
||||
public class AdminController {
|
||||
|
||||
private final AdminService adminService;
|
||||
private final RoleService roleService;
|
||||
|
||||
@Autowired
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
public AdminController(AdminService adminService, RoleService roleService) {
|
||||
this.adminService = adminService;
|
||||
this.roleService = roleService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all administrators")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<AdminDTO>> getAllAdmins() {
|
||||
List<Admin> admins = adminService.findAll();
|
||||
List<AdminDTO> dtos = admins.stream()
|
||||
.map(this::convertToDTO)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return dtos.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Get administrator by ID")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<AdminDTO> getById(@PathVariable Integer id) {
|
||||
Admin admin = adminService.findById(id);
|
||||
return ResponseEntity.ok(convertToDTO(admin));
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new administrator")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<AdminDTO> create(@RequestBody AdminDTO dto) {
|
||||
Admin admin = convertToEntity(dto, true);
|
||||
Admin saved = adminService.save(admin);
|
||||
return ResponseEntity.status(201).body(convertToDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update an existing administrator")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<AdminDTO> update(@PathVariable Integer id, @RequestBody AdminDTO dto) {
|
||||
dto.setId(id);
|
||||
Admin admin = convertToEntity(dto, false);
|
||||
Admin updated = adminService.update(admin);
|
||||
return ResponseEntity.ok(convertToDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete an administrator by ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> delete(@PathVariable Integer id) {
|
||||
adminService.deleteById(id);
|
||||
return ResponseEntity.ok("Admin deleted");
|
||||
}
|
||||
|
||||
// -------------------- Utils --------------------
|
||||
|
||||
private AdminDTO convertToDTO(Admin admin) {
|
||||
return AdminDTO.fromEntity(admin);
|
||||
}
|
||||
|
||||
private Admin convertToEntity(AdminDTO dto, boolean isCreate) {
|
||||
if (dto == null || dto.getUser() == null) {
|
||||
throw new InvalidDataException("Admin and User data are required");
|
||||
}
|
||||
|
||||
Admin admin;
|
||||
|
||||
if (isCreate) {
|
||||
admin = new Admin();
|
||||
} else {
|
||||
admin = adminService.findById(dto.getId());
|
||||
if (admin == null) {
|
||||
throw new InvalidDataException("Admin not found for update");
|
||||
}
|
||||
}
|
||||
|
||||
User user = dto.getUser().toEntity();
|
||||
if (isCreate) {
|
||||
if (dto.getUser().getPassword() == null || dto.getUser().getPassword().isBlank()) {
|
||||
throw new InvalidDataException("Password is required for new admin");
|
||||
}
|
||||
user.setPassword(passwordEncoder.encode(dto.getUser().getPassword()));
|
||||
user.setRegisterDate(user.getRegisterDate() != null ? user.getRegisterDate() : LocalDateTime.now());
|
||||
} else {
|
||||
if (dto.getUser().getPassword() != null && !dto.getUser().getPassword().isBlank()) {
|
||||
user.setPassword(passwordEncoder.encode(dto.getUser().getPassword()));
|
||||
}
|
||||
}
|
||||
|
||||
if (dto.getUser().getRoleName() != null) {
|
||||
user.setRole(roleService.findRoleByName(dto.getUser().getRoleName()));
|
||||
}
|
||||
|
||||
admin.setUser(user);
|
||||
return admin;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.NotificationDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.Notification;
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.services.user_managment_services.NotificationService;
|
||||
import com.denniseckerskorn.services.user_managment_services.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/notifications")
|
||||
@Tag(name = "Notification Management", description = "Operations related to notifications")
|
||||
public class NotificationController {
|
||||
|
||||
private final NotificationService notificationService;
|
||||
private final UserService userService;
|
||||
|
||||
public NotificationController(NotificationService notificationService, UserService userService) {
|
||||
this.notificationService = notificationService;
|
||||
this.userService = userService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all notifications", description = "Retrieve a list of all notifications")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<NotificationDTO>> getAll() {
|
||||
List<Notification> notifications = notificationService.findAll();
|
||||
if (notifications.isEmpty()) return ResponseEntity.noContent().build();
|
||||
|
||||
List<NotificationDTO> dtos = notifications.stream().map(this::toDTO).collect(Collectors.toList());
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Get a notification by ID", description = "Retrieve a notification by its ID")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<NotificationDTO> getById(@PathVariable Integer id) {
|
||||
Notification notification = notificationService.findById(id);
|
||||
return ResponseEntity.ok(toDTO(notification));
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new notification", description = "Create a new notification")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<NotificationDTO> create(@RequestBody NotificationDTO dto) {
|
||||
Notification notification = toEntity(dto, false);
|
||||
Notification saved = notificationService.save(notification);
|
||||
|
||||
if (dto.getUserIds() != null) {
|
||||
for (Integer userId : dto.getUserIds()) {
|
||||
User user = userService.findById(userId);
|
||||
notificationService.addNotificationToUser(saved, user);
|
||||
}
|
||||
}
|
||||
|
||||
return ResponseEntity.status(201).body(toDTO(saved));
|
||||
}
|
||||
|
||||
|
||||
@Operation(summary = "Update a notification by ID", description = "Update a notification by its ID")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<NotificationDTO> update(@PathVariable Integer id, @RequestBody NotificationDTO dto) {
|
||||
dto.setId(id);
|
||||
Notification notification = toEntity(dto, false);
|
||||
Notification updated = notificationService.update(notification);
|
||||
|
||||
Set<User> existingUsers = updated.getUsers();
|
||||
if (existingUsers != null) {
|
||||
for (User user : existingUsers) {
|
||||
notificationService.removeNotificationFromUser(updated, user);
|
||||
}
|
||||
}
|
||||
|
||||
if (dto.getUserIds() != null) {
|
||||
for (Integer userId : dto.getUserIds()) {
|
||||
User user = userService.findById(userId);
|
||||
notificationService.addNotificationToUser(updated, user);
|
||||
}
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(toDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a notification by ID", description = "Delete a notification by its ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> delete(@PathVariable Integer id) {
|
||||
notificationService.deleteById(id);
|
||||
return ResponseEntity.ok("Notification deleted successfully.");
|
||||
}
|
||||
|
||||
// -------------------- Mapping --------------------
|
||||
|
||||
private NotificationDTO toDTO(Notification notification) {
|
||||
Set<Integer> userIds = notification.getUsers() != null
|
||||
? notification.getUsers().stream().map(User::getId).collect(Collectors.toSet())
|
||||
: null;
|
||||
|
||||
return new NotificationDTO(
|
||||
notification.getId(),
|
||||
notification.getTitle(),
|
||||
notification.getMessage(),
|
||||
notification.getShippingDate(),
|
||||
notification.getType(),
|
||||
notification.getStatus(),
|
||||
userIds
|
||||
);
|
||||
}
|
||||
|
||||
private Notification toEntity(NotificationDTO dto, boolean includeUsers) {
|
||||
Notification notification = (dto.getId() != null)
|
||||
? notificationService.findById(dto.getId())
|
||||
: new Notification();
|
||||
|
||||
notification.setTitle(dto.getTitle());
|
||||
notification.setMessage(dto.getMessage());
|
||||
notification.setShippingDate(dto.getShippingDate());
|
||||
notification.setType(dto.getType());
|
||||
notification.setStatus(dto.getStatus());
|
||||
|
||||
return notification;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.PermissionDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.Permission;
|
||||
import com.denniseckerskorn.services.user_managment_services.PermissionService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/permissions")
|
||||
@Tag(name = "Permission Management", description = "Operations related to permissions")
|
||||
public class PermissionController {
|
||||
|
||||
private final PermissionService permissionService;
|
||||
|
||||
public PermissionController(PermissionService permissionService) {
|
||||
this.permissionService = permissionService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all permissions", description = "Retrieve a list of all permissions")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<PermissionDTO>> getAll() {
|
||||
List<Permission> permissions = permissionService.findAll();
|
||||
if (permissions.isEmpty()) return ResponseEntity.noContent().build();
|
||||
|
||||
List<PermissionDTO> dtos = permissions.stream()
|
||||
.map(this::toDTO)
|
||||
.collect(Collectors.toList());
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Get permission by ID", description = "Retrieve a permission by its ID")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<PermissionDTO> getById(@PathVariable Integer id) {
|
||||
Permission permission = permissionService.findById(id);
|
||||
return ResponseEntity.ok(toDTO(permission));
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new permission", description = "Create a new permission")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<PermissionDTO> create(@RequestBody PermissionDTO dto) {
|
||||
Permission permission = toEntity(dto);
|
||||
Permission saved = permissionService.save(permission);
|
||||
return ResponseEntity.status(201).body(toDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update an existing permission", description = "Update an existing permission")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<PermissionDTO> update(@PathVariable Integer id, @RequestBody PermissionDTO dto) {
|
||||
dto.setId(id);
|
||||
Permission updated = permissionService.update(toEntity(dto));
|
||||
return ResponseEntity.ok(toDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a permission", description = "Delete a permission by its ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> delete(@PathVariable Integer id) {
|
||||
permissionService.deleteById(id);
|
||||
return ResponseEntity.ok("Permission deleted successfully.");
|
||||
}
|
||||
|
||||
// -------------------- Mapping --------------------
|
||||
|
||||
private PermissionDTO toDTO(Permission permission) {
|
||||
return new PermissionDTO(permission.getId(), permission.getPermissionName());
|
||||
}
|
||||
|
||||
private Permission toEntity(PermissionDTO dto) {
|
||||
Permission permission = (dto.getId() != null)
|
||||
? permissionService.findById(dto.getId())
|
||||
: new Permission();
|
||||
|
||||
permission.setPermissionName(dto.getPermissionName());
|
||||
return permission;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,116 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.RoleDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.Permission;
|
||||
import com.denniseckerskorn.entities.user_managment.Role;
|
||||
import com.denniseckerskorn.services.user_managment_services.PermissionService;
|
||||
import com.denniseckerskorn.services.user_managment_services.RoleService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/roles")
|
||||
@Tag(name = "Role Management", description = "Operations related to roles")
|
||||
public class RoleController {
|
||||
|
||||
private final RoleService roleService;
|
||||
private final PermissionService permissionService;
|
||||
|
||||
public RoleController(RoleService roleService, PermissionService permissionService) {
|
||||
this.roleService = roleService;
|
||||
this.permissionService = permissionService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all roles", description = "Retrieve a list of all roles")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<RoleDTO>> getAll() {
|
||||
List<Role> roles = roleService.findAll();
|
||||
if (roles.isEmpty()) return ResponseEntity.noContent().build();
|
||||
|
||||
List<RoleDTO> dtos = roles.stream().map(this::toDTO).collect(Collectors.toList());
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Get role by ID", description = "Retrieve a role by its ID")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<RoleDTO> getById(@PathVariable Integer id) {
|
||||
Role role = roleService.findById(id);
|
||||
return ResponseEntity.ok(toDTO(role));
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new role", description = "Create a new role")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<RoleDTO> create(@RequestBody RoleDTO dto) {
|
||||
Role role = new Role();
|
||||
role.setName(dto.getName());
|
||||
Role saved = roleService.save(role);
|
||||
|
||||
if (dto.getPermissionIds() != null) {
|
||||
for (Integer pid : dto.getPermissionIds()) {
|
||||
Permission perm = permissionService.findById(pid);
|
||||
roleService.addPermissionToRole(saved, perm);
|
||||
}
|
||||
}
|
||||
|
||||
return ResponseEntity.status(201).body(toDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update a role", description = "Update an existing role")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<RoleDTO> update(@PathVariable Integer id, @RequestBody RoleDTO dto) {
|
||||
dto.setId(id);
|
||||
Role role = roleService.findById(id);
|
||||
role.setName(dto.getName());
|
||||
Role updated = roleService.update(role);
|
||||
|
||||
if (dto.getPermissionIds() != null) {
|
||||
for (Integer pid : dto.getPermissionIds()) {
|
||||
Permission perm = permissionService.findById(pid);
|
||||
roleService.addPermissionToRole(updated, perm);
|
||||
}
|
||||
}
|
||||
|
||||
return ResponseEntity.ok(toDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a role", description = "Delete a role by its ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> delete(@PathVariable Integer id) {
|
||||
roleService.deleteById(id);
|
||||
return ResponseEntity.ok("Role deleted successfully.");
|
||||
}
|
||||
|
||||
@Operation(summary = "Add permission to role", description = "Add a permission to a role")
|
||||
@PostMapping("/permissions/add/{roleId}/{permissionId}")
|
||||
public ResponseEntity<String> addPermissionToRole(@PathVariable Integer roleId, @PathVariable Integer permissionId) {
|
||||
Role role = roleService.findById(roleId);
|
||||
Permission permission = permissionService.findById(permissionId);
|
||||
roleService.addPermissionToRole(role, permission);
|
||||
return ResponseEntity.ok("Permission added to role.");
|
||||
}
|
||||
|
||||
@Operation(summary = "Remove permission from role", description = "Remove a permission from a role")
|
||||
@DeleteMapping("/permissions/remove/{permissionId}/{roleId}")
|
||||
public ResponseEntity<String> removePermissionFromRole(@PathVariable Integer roleId, @PathVariable Integer permissionId) {
|
||||
Role role = roleService.findById(roleId);
|
||||
Permission permission = permissionService.findById(permissionId);
|
||||
roleService.removePermissionFromRole(role, permission);
|
||||
return ResponseEntity.ok("Permission removed from role.");
|
||||
}
|
||||
|
||||
// -------------------- Mapping --------------------
|
||||
|
||||
private RoleDTO toDTO(Role role) {
|
||||
Set<Integer> permissionIds = role.getPermissions().stream()
|
||||
.map(Permission::getId)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
return new RoleDTO(role.getId(), role.getName(), permissionIds);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,275 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.AssistanceDTO;
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.StudentDTO;
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.StudentRegisterDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.Assistance;
|
||||
import com.denniseckerskorn.entities.class_managment.Membership;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
import com.denniseckerskorn.entities.user_managment.Role;
|
||||
import com.denniseckerskorn.entities.user_managment.StudentHistory;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import com.denniseckerskorn.exceptions.InvalidDataException;
|
||||
import com.denniseckerskorn.services.class_managment_services.MembershipService;
|
||||
import com.denniseckerskorn.services.class_managment_services.TrainingSessionService;
|
||||
import com.denniseckerskorn.services.user_managment_services.RoleService;
|
||||
import com.denniseckerskorn.services.user_managment_services.StudentService;
|
||||
import com.denniseckerskorn.services.user_managment_services.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/students")
|
||||
@Tag(name = "Student Management", description = "Operations related to student management")
|
||||
public class StudentController {
|
||||
|
||||
private final StudentService studentService;
|
||||
private final RoleService roleService;
|
||||
private final UserService userService;
|
||||
private final MembershipService membershipService;
|
||||
private final TrainingSessionService trainingSessionService;
|
||||
|
||||
@Autowired
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
public StudentController(StudentService studentService, RoleService roleService, UserService userService, MembershipService membershipService, TrainingSessionService trainingSessionService) {
|
||||
this.studentService = studentService;
|
||||
this.roleService = roleService;
|
||||
this.userService = userService;
|
||||
this.membershipService = membershipService;
|
||||
this.trainingSessionService = trainingSessionService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Register a new Student", description = "Registers a new student with the provided details.")
|
||||
@PostMapping("/register")
|
||||
public ResponseEntity<StudentDTO> registerStudent(@RequestBody @Valid StudentRegisterDTO studentRegisterDTO) {
|
||||
|
||||
User user = new User();
|
||||
user.setName(studentRegisterDTO.getName());
|
||||
user.setSurname(studentRegisterDTO.getSurname());
|
||||
user.setEmail(studentRegisterDTO.getEmail());
|
||||
user.setPassword(passwordEncoder.encode(studentRegisterDTO.getPassword())); // Encriptar
|
||||
user.setPhoneNumber(studentRegisterDTO.getPhoneNumber());
|
||||
user.setAddress(studentRegisterDTO.getAddress());
|
||||
user.setStatus(StatusValues.valueOf(studentRegisterDTO.getStatus()));
|
||||
user.setRegisterDate(LocalDateTime.now());
|
||||
|
||||
Role role = roleService.findRoleByName(studentRegisterDTO.getRoleName());
|
||||
user.setRole(role);
|
||||
|
||||
User createdUser = userService.save(user);
|
||||
|
||||
Student student = new Student();
|
||||
student.setUser(createdUser);
|
||||
student.setDni(studentRegisterDTO.getDni());
|
||||
student.setBirthdate(studentRegisterDTO.getBirthdate());
|
||||
student.setBelt(studentRegisterDTO.getBelt());
|
||||
student.setProgress(studentRegisterDTO.getProgress());
|
||||
student.setMedicalReport(studentRegisterDTO.getMedicalReport());
|
||||
student.setParentName(studentRegisterDTO.getParentName());
|
||||
|
||||
if (studentService.existsByDni(student.getDni())) {
|
||||
throw new InvalidDataException("A student with this DNI already exists");
|
||||
}
|
||||
|
||||
if (studentRegisterDTO.getMembershipId() != null) {
|
||||
Membership membership = membershipService.findById(studentRegisterDTO.getMembershipId());
|
||||
|
||||
if (membership == null) {
|
||||
throw new InvalidDataException("Membership not found with id: " + studentRegisterDTO.getMembershipId());
|
||||
}
|
||||
|
||||
student.setMembership(membership);
|
||||
}
|
||||
Student createdStudent = studentService.save(student);
|
||||
|
||||
StudentDTO response = StudentDTO.fromEntity(studentService.findById(createdStudent.getId()));
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(response);
|
||||
}
|
||||
|
||||
|
||||
@Operation(summary = "Get all Students", description = "Retrieves a list of all students.")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<StudentDTO>> getAllStudents() {
|
||||
List<Student> students = studentService.findAll();
|
||||
if (students.isEmpty()) return ResponseEntity.noContent().build();
|
||||
|
||||
List<StudentDTO> dtos = students.stream()
|
||||
.map(this::convertToDTO)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new Student", description = "Creates a new student with the provided details.")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<StudentDTO> createStudent(@RequestBody StudentDTO dto) {
|
||||
Student student = convertToEntity(dto, true);
|
||||
Student saved = studentService.save(student);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update an existing Student", description = "Updates the details of an existing student.")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<StudentDTO> updateStudent(@PathVariable Integer id, @RequestBody StudentDTO dto) {
|
||||
dto.setId(id);
|
||||
Student student = convertToEntity(dto, false);
|
||||
Student updated = studentService.update(student);
|
||||
return ResponseEntity.ok(convertToDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Find a Student by ID", description = "Retrieves a student by their ID.")
|
||||
@GetMapping("/findById/{id}")
|
||||
public ResponseEntity<StudentDTO> getStudentById(@PathVariable Integer id) {
|
||||
Student student = studentService.findById(id);
|
||||
return ResponseEntity.ok(convertToDTO(student));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a Student", description = "Deletes a student by their ID.")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> deleteStudent(@PathVariable Integer id) {
|
||||
studentService.deleteById(id);
|
||||
return ResponseEntity.ok("Student deleted successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Add a Student History", description = "Adds a history record to a student by their ID.")
|
||||
@PostMapping("/addStudentHistory/{id}")
|
||||
public ResponseEntity<String> addStudentHistory(@PathVariable Integer id, @RequestBody StudentHistory history) {
|
||||
Student student = studentService.findById(id);
|
||||
studentService.addStudentHistoryToStudent(student, history);
|
||||
return ResponseEntity.ok("Student history added successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Remove a Student History", description = "Removes a history record from a student.")
|
||||
@DeleteMapping("/removeStudentHistory/{id}")
|
||||
public ResponseEntity<String> removeStudentHistory(@PathVariable Integer id) {
|
||||
studentService.deleteStudentHistory(id);
|
||||
return ResponseEntity.ok("Student history removed successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Add a Membership to a Student", description = "Adds a membership to a student by their ID.")
|
||||
@PostMapping("/addMembershipToStudent/{id}")
|
||||
public ResponseEntity<String> addMembershipToStudent(@PathVariable Integer id, @RequestBody Membership membership) {
|
||||
Student student = studentService.findById(id);
|
||||
studentService.addStudentToMembership(student, membership);
|
||||
return ResponseEntity.ok("Membership added to student successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Remove a Membership from a Student", description = "Removes a membership from a student by their ID.")
|
||||
@DeleteMapping("/removeMembershipFromStudent/{id}")
|
||||
public ResponseEntity<String> removeMembershipFromStudent(@PathVariable Integer id) {
|
||||
studentService.deleteStudentMembership(id);
|
||||
return ResponseEntity.ok("Membership removed from student successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Add an Assistance to a Student", description = "Adds an assistance record to a student by their ID.")
|
||||
@PostMapping("/addAssistanceToStudent/{id}")
|
||||
public ResponseEntity<String> addAssistanceToStudent(@PathVariable Integer id, @RequestBody AssistanceDTO assistanceDTO) {
|
||||
Student student = studentService.findById(id);
|
||||
TrainingSession session = trainingSessionService.findById(assistanceDTO.getSessionId());
|
||||
Assistance assistance = assistanceDTO.toEntity(student, session);
|
||||
studentService.addAssistanceToStudent(student, assistance);
|
||||
return ResponseEntity.ok("Assistance added to student successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Remove an Assistance from a Student", description = "Removes an assistance record from a student by their ID.")
|
||||
@DeleteMapping("/deleteAssistanceFromStudent/{id}")
|
||||
public ResponseEntity<String> deleteAssistanceFromStudent(@PathVariable Integer studentId, @PathVariable Integer assistanceId) {
|
||||
studentService.deleteSingleAssistanceFromStudent(studentId, assistanceId);
|
||||
return ResponseEntity.ok("Assistance removed from student successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Add a Training Group to a Student", description = "Adds a training group to a student by their ID.")
|
||||
@PostMapping("/addGroupToStudent/{id}")
|
||||
public ResponseEntity<String> addGroupToStudent(@PathVariable Integer id, @RequestBody TrainingGroup group) {
|
||||
studentService.addGroupToStudent(id, group);
|
||||
return ResponseEntity.ok("Training group added to student successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Update a student's membership")
|
||||
@PutMapping("/updateMembership/{studentId}")
|
||||
public ResponseEntity<Void> updateMembership(
|
||||
@PathVariable Integer studentId,
|
||||
@RequestParam Integer membershipId) {
|
||||
|
||||
Student student = studentService.findById(studentId);
|
||||
Membership membership = membershipService.findById(membershipId);
|
||||
|
||||
student.setMembership(membership);
|
||||
studentService.update(student);
|
||||
|
||||
return ResponseEntity.ok().build();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ----------------- Mapping Methods ------------------ */
|
||||
|
||||
private StudentDTO convertToDTO(Student student) {
|
||||
return StudentDTO.fromEntity(student);
|
||||
}
|
||||
|
||||
|
||||
private Student convertToEntity(StudentDTO dto, boolean isCreate) {
|
||||
if (dto == null || dto.getUser() == null) {
|
||||
throw new InvalidDataException("User data is required");
|
||||
}
|
||||
|
||||
User user;
|
||||
|
||||
if (isCreate) {
|
||||
user = new User();
|
||||
user.setRegisterDate(dto.getUser().getRegisterDate() != null ? dto.getUser().getRegisterDate() : LocalDateTime.now());
|
||||
} else {
|
||||
Student existing = studentService.findById(dto.getId());
|
||||
user = existing.getUser();
|
||||
}
|
||||
|
||||
user.setName(dto.getUser().getName());
|
||||
user.setSurname(dto.getUser().getSurname());
|
||||
user.setEmail(dto.getUser().getEmail());
|
||||
user.setPhoneNumber(dto.getUser().getPhoneNumber());
|
||||
user.setAddress(dto.getUser().getAddress());
|
||||
user.setStatus(dto.getUser().getStatus());
|
||||
|
||||
if (dto.getUser().getRoleName() != null) {
|
||||
user.setRole(roleService.findRoleByName(dto.getUser().getRoleName()));
|
||||
}
|
||||
|
||||
if (isCreate) {
|
||||
if (dto.getUser().getPassword() == null || dto.getUser().getPassword().isBlank()) {
|
||||
throw new InvalidDataException("Password is required for new student");
|
||||
}
|
||||
user.setPassword(passwordEncoder.encode(dto.getUser().getPassword()));
|
||||
} else {
|
||||
if (dto.getUser().getPassword() != null && !dto.getUser().getPassword().isBlank()) {
|
||||
user.setPassword(passwordEncoder.encode(dto.getUser().getPassword()));
|
||||
}
|
||||
}
|
||||
|
||||
Student student = isCreate ? new Student() : studentService.findById(dto.getId());
|
||||
student.setUser(user);
|
||||
student.setDni(dto.getDni());
|
||||
student.setBirthdate(dto.getBirthdate());
|
||||
student.setBelt(dto.getBelt());
|
||||
student.setProgress(dto.getProgress());
|
||||
student.setMedicalReport(dto.getMedicalReport());
|
||||
student.setParentName(dto.getParentName());
|
||||
|
||||
return student;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.StudentHistoryDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.StudentHistory;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.services.user_managment_services.StudentHistoryService;
|
||||
import com.denniseckerskorn.services.user_managment_services.StudentService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/student-history")
|
||||
@Tag(name = "Student History Management", description = "Operations related to student history")
|
||||
public class StudentHistoryController {
|
||||
|
||||
private final StudentHistoryService studentHistoryService;
|
||||
private final StudentService studentService;
|
||||
|
||||
public StudentHistoryController(StudentHistoryService studentHistoryService, StudentService studentService) {
|
||||
this.studentHistoryService = studentHistoryService;
|
||||
this.studentService = studentService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all student histories", description = "Retrieve a list of all student histories")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<StudentHistoryDTO>> getAll() {
|
||||
List<StudentHistory> histories = studentHistoryService.findAll();
|
||||
if (histories.isEmpty()) return ResponseEntity.noContent().build();
|
||||
|
||||
List<StudentHistoryDTO> dtos = histories.stream().map(this::toDTO).collect(Collectors.toList());
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "find student history by ID", description = "Retrieve a student history by its ID")
|
||||
@GetMapping("/findById/{id}")
|
||||
public ResponseEntity<StudentHistoryDTO> findById(@PathVariable Integer id) {
|
||||
StudentHistory history = studentHistoryService.findById(id);
|
||||
return ResponseEntity.ok(toDTO(history));
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new student history", description = "Create a new student history")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<StudentHistoryDTO> create(@RequestBody StudentHistoryDTO dto) {
|
||||
StudentHistory history = toEntity(dto, false);
|
||||
StudentHistory saved = studentHistoryService.save(history);
|
||||
return ResponseEntity.status(201).body(toDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update an existing student history", description = "Update an existing student history")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<StudentHistoryDTO> update(@PathVariable Integer id, @RequestBody StudentHistoryDTO dto) {
|
||||
dto.setId(id);
|
||||
StudentHistory history = toEntity(dto, true);
|
||||
StudentHistory updated = studentHistoryService.update(history);
|
||||
return ResponseEntity.ok(toDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Delete a student history", description = "Delete a student history by its ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> delete(@PathVariable Integer id) {
|
||||
studentHistoryService.deleteById(id);
|
||||
return ResponseEntity.ok("Student history deleted successfully.");
|
||||
}
|
||||
|
||||
// -------------------- Mapping --------------------
|
||||
|
||||
private StudentHistoryDTO toDTO(StudentHistory history) {
|
||||
return new StudentHistoryDTO(
|
||||
history.getId(),
|
||||
history.getStudent() != null ? history.getStudent().getId() : null,
|
||||
history.getEventDate(),
|
||||
history.getEventType(),
|
||||
history.getDescription()
|
||||
);
|
||||
}
|
||||
|
||||
private StudentHistory toEntity(StudentHistoryDTO dto, boolean includeExistingStudent) {
|
||||
StudentHistory history = (dto.getId() != null)
|
||||
? studentHistoryService.findById(dto.getId())
|
||||
: new StudentHistory();
|
||||
|
||||
history.setEventDate(dto.getEventDate());
|
||||
history.setEventType(dto.getEventType());
|
||||
history.setDescription(dto.getDescription());
|
||||
|
||||
if (!includeExistingStudent && dto.getStudentId() != null) {
|
||||
Student student = studentService.findById(dto.getStudentId());
|
||||
history.setStudent(student);
|
||||
}
|
||||
|
||||
return history;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,137 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.TeacherDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Teacher;
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.exceptions.InvalidDataException;
|
||||
import com.denniseckerskorn.services.user_managment_services.RoleService;
|
||||
import com.denniseckerskorn.services.user_managment_services.TeacherService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/teachers")
|
||||
@Tag(name = "Teacher Management", description = "Operations related to teachers")
|
||||
public class TeacherController {
|
||||
|
||||
private final TeacherService teacherService;
|
||||
private final RoleService roleService;
|
||||
|
||||
@Autowired
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
public TeacherController(TeacherService teacherService, RoleService roleService) {
|
||||
this.teacherService = teacherService;
|
||||
this.roleService = roleService;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all teachers", description = "Retrieve a list of all teachers")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<TeacherDTO>> getAllTeachers() {
|
||||
List<Teacher> teachers = teacherService.findAll();
|
||||
if (teachers.isEmpty()) {
|
||||
return ResponseEntity.noContent().build();
|
||||
}
|
||||
|
||||
List<TeacherDTO> dtos = teachers.stream()
|
||||
.map(this::convertToDTO)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return ResponseEntity.ok(dtos);
|
||||
}
|
||||
|
||||
@Operation(summary = "Create a new teacher", description = "Create a new teacher")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<TeacherDTO> createTeacher(@RequestBody TeacherDTO dto) {
|
||||
Teacher teacher = convertToEntity(dto, true);
|
||||
Teacher saved = teacherService.save(teacher);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Find a teacher by ID", description = "Retrieve a teacher by their ID")
|
||||
@GetMapping("/findById/{id}")
|
||||
public ResponseEntity<TeacherDTO> findById(@PathVariable Integer id) {
|
||||
Teacher teacher = teacherService.findById(id);
|
||||
if (teacher == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
return ResponseEntity.ok(convertToDTO(teacher));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update a teacher", description = "Update an existing teacher")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<TeacherDTO> updateTeacher(@PathVariable Integer id, @RequestBody TeacherDTO dto) {
|
||||
dto.setId(id);
|
||||
Teacher teacher = convertToEntity(dto, false);
|
||||
Teacher updated = teacherService.update(teacher);
|
||||
return ResponseEntity.ok(convertToDTO(updated));
|
||||
}
|
||||
|
||||
|
||||
@Operation(summary = "Delete a teacher", description = "Delete a teacher by their ID")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> deleteTeacher(@PathVariable Integer id) {
|
||||
teacherService.deleteById(id);
|
||||
return ResponseEntity.ok("Teacher deleted successfully");
|
||||
}
|
||||
|
||||
// ----------------- Mapping ------------------
|
||||
|
||||
private TeacherDTO convertToDTO(Teacher teacher) {
|
||||
return TeacherDTO.fromEntity(teacher);
|
||||
}
|
||||
|
||||
private Teacher convertToEntity(TeacherDTO dto, boolean isCreate) {
|
||||
if (dto == null || dto.getUser() == null) {
|
||||
throw new InvalidDataException("User data is required");
|
||||
}
|
||||
|
||||
User user;
|
||||
|
||||
if (isCreate) {
|
||||
user = new User();
|
||||
user.setRegisterDate(dto.getUser().getRegisterDate() != null ? dto.getUser().getRegisterDate() : LocalDateTime.now());
|
||||
} else {
|
||||
Teacher existing = teacherService.findById(dto.getId());
|
||||
user = existing.getUser();
|
||||
}
|
||||
|
||||
user.setName(dto.getUser().getName());
|
||||
user.setSurname(dto.getUser().getSurname());
|
||||
user.setEmail(dto.getUser().getEmail());
|
||||
user.setPhoneNumber(dto.getUser().getPhoneNumber());
|
||||
user.setAddress(dto.getUser().getAddress());
|
||||
user.setStatus(dto.getUser().getStatus());
|
||||
|
||||
if (dto.getUser().getRoleName() != null) {
|
||||
user.setRole(roleService.findRoleByName(dto.getUser().getRoleName()));
|
||||
}
|
||||
|
||||
if (isCreate) {
|
||||
if (dto.getUser().getPassword() == null || dto.getUser().getPassword().isBlank()) {
|
||||
throw new InvalidDataException("Password is required for new teacher");
|
||||
}
|
||||
user.setPassword(passwordEncoder.encode(dto.getUser().getPassword()));
|
||||
} else {
|
||||
if (dto.getUser().getPassword() != null && !dto.getUser().getPassword().isBlank()) {
|
||||
user.setPassword(passwordEncoder.encode(dto.getUser().getPassword()));
|
||||
}
|
||||
}
|
||||
|
||||
Teacher teacher = isCreate ? new Teacher() : teacherService.findById(dto.getId());
|
||||
teacher.setUser(user);
|
||||
teacher.setDiscipline(dto.getDiscipline());
|
||||
|
||||
return teacher;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,203 @@
|
|||
package com.denniseckerskorn.controllers.user_managment_controllers;
|
||||
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.NotificationMiniDTO;
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.StudentMiniDTO;
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.StudentHistoryMiniDTO;
|
||||
import com.denniseckerskorn.dtos.user_managment_dtos.UserDTO;
|
||||
import com.denniseckerskorn.entities.user_managment.Notification;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.exceptions.InvalidDataException;
|
||||
import com.denniseckerskorn.security.JwtUtil;
|
||||
import com.denniseckerskorn.services.user_managment_services.RoleService;
|
||||
import com.denniseckerskorn.services.user_managment_services.UserService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* UserController is responsible for handling user-related operations such as creating, updating,
|
||||
* deleting, and retrieving user information.
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/api/v1/users")
|
||||
@Tag(name = "Users", description = "Operations related to user management")
|
||||
public class UserController {
|
||||
|
||||
private final UserService userService;
|
||||
private final RoleService roleService;
|
||||
private final JwtUtil jwtUtil;
|
||||
|
||||
@Autowired
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
public UserController(UserService userService, RoleService roleService, JwtUtil jwtUtil) {
|
||||
this.userService = userService;
|
||||
this.roleService = roleService;
|
||||
this.jwtUtil = jwtUtil;
|
||||
}
|
||||
|
||||
@Operation(summary = "Get all users", description = "Retrieve a list of all users")
|
||||
@GetMapping("/getAll")
|
||||
public ResponseEntity<List<UserDTO>> getAllUsers() {
|
||||
List<User> users = userService.findAll();
|
||||
if (users.isEmpty()) {
|
||||
return ResponseEntity.noContent().build();
|
||||
}
|
||||
|
||||
List<UserDTO> userDTOs = users.stream()
|
||||
.map(this::convertToDTO)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return ResponseEntity.ok(userDTOs);
|
||||
}
|
||||
|
||||
@Operation(summary = "Find a User by ID", description = "Retrieve a user by their ID")
|
||||
@GetMapping("/getById/{id}")
|
||||
public ResponseEntity<UserDTO> getUserById(@PathVariable Integer id) {
|
||||
User user = userService.findById(id);
|
||||
return ResponseEntity.ok(convertToDTO(user));
|
||||
}
|
||||
|
||||
@Operation( summary = "Find a User by email", description = "Retrieve a user by their email")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<UserDTO> createUser(@RequestBody UserDTO userDTO) {
|
||||
User user = convertToEntity(userDTO, true);
|
||||
User saved = userService.save(user);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update a user by ID", description = "Update an existing user")
|
||||
@PutMapping("/update/{id}")
|
||||
public ResponseEntity<UserDTO> updateUser(@PathVariable Integer id, @RequestBody UserDTO userDTO) {
|
||||
userDTO.setId(id);
|
||||
User user = convertToEntity(userDTO, false);
|
||||
User updated = userService.update(user);
|
||||
return ResponseEntity.ok(convertToDTO(updated));
|
||||
}
|
||||
|
||||
@Operation(summary = "Update a user by email", description = "Update an existing user")
|
||||
@DeleteMapping("/delete/{id}")
|
||||
public ResponseEntity<String> deleteUser(@PathVariable Integer id) {
|
||||
userService.deleteById(id);
|
||||
return ResponseEntity.ok("User deleted successfully");
|
||||
}
|
||||
|
||||
@Operation(summary = "Get current user", description = "Retrieve the currently authenticated user")
|
||||
@GetMapping("/me")
|
||||
public ResponseEntity<UserDTO> getCurrentUser(HttpServletRequest request) {
|
||||
String token = extractTokenFromRequest(request);
|
||||
String email = jwtUtil.extractUsername(token);
|
||||
|
||||
User user = userService.findByEmail(email);
|
||||
return ResponseEntity.ok(convertToDTO(user));
|
||||
}
|
||||
|
||||
// ------------------ UTILS ------------------
|
||||
|
||||
private String extractTokenFromRequest(HttpServletRequest request) {
|
||||
String authHeader = request.getHeader("Authorization");
|
||||
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
|
||||
throw new InvalidDataException("Missing or invalid Authorization header");
|
||||
}
|
||||
return authHeader.substring(7); // Remove "Bearer "
|
||||
}
|
||||
|
||||
private UserDTO convertToDTO(User user) {
|
||||
UserDTO dto = new UserDTO(
|
||||
user.getId(),
|
||||
user.getName(),
|
||||
user.getSurname(),
|
||||
user.getEmail(),
|
||||
null,
|
||||
user.getPhoneNumber(),
|
||||
user.getAddress(),
|
||||
user.getRegisterDate(),
|
||||
user.getRole() != null ? user.getRole().getName() : null,
|
||||
user.getStatus()
|
||||
);
|
||||
|
||||
if (user.getNotifications() != null && !user.getNotifications().isEmpty()) {
|
||||
Set<NotificationMiniDTO> notificationDTOs = user.getNotifications().stream()
|
||||
.map(this::convertNotificationToMiniDTO)
|
||||
.collect(Collectors.toSet());
|
||||
dto.setNotifications(notificationDTOs);
|
||||
}
|
||||
|
||||
if (user.getStudent() != null) {
|
||||
Student student = user.getStudent();
|
||||
StudentMiniDTO studentMiniDTO = new StudentMiniDTO();
|
||||
studentMiniDTO.setId(student.getId());
|
||||
|
||||
if (student.getHistories() != null && !student.getHistories().isEmpty()) {
|
||||
Set<StudentHistoryMiniDTO> historyDTOs = student.getHistories().stream()
|
||||
.map(h -> new StudentHistoryMiniDTO(
|
||||
h.getId(),
|
||||
h.getEventDate(),
|
||||
h.getEventType(),
|
||||
h.getDescription()
|
||||
))
|
||||
.collect(Collectors.toSet());
|
||||
studentMiniDTO.setHistories(historyDTOs);
|
||||
}
|
||||
dto.setStudent(studentMiniDTO);
|
||||
}
|
||||
|
||||
return dto;
|
||||
}
|
||||
|
||||
private NotificationMiniDTO convertNotificationToMiniDTO(Notification notification) {
|
||||
return new NotificationMiniDTO(
|
||||
notification.getId(),
|
||||
notification.getTitle(),
|
||||
notification.getMessage(),
|
||||
notification.getShippingDate(),
|
||||
notification.getType()
|
||||
);
|
||||
}
|
||||
|
||||
private User convertToEntity(UserDTO dto, boolean isCreate) {
|
||||
User user;
|
||||
|
||||
if (isCreate) {
|
||||
user = new User();
|
||||
user.setRegisterDate(dto.getRegisterDate() != null ? dto.getRegisterDate() : LocalDateTime.now());
|
||||
} else {
|
||||
user = userService.findById(dto.getId());
|
||||
}
|
||||
|
||||
user.setName(dto.getName());
|
||||
user.setSurname(dto.getSurname());
|
||||
user.setEmail(dto.getEmail());
|
||||
user.setPhoneNumber(dto.getPhoneNumber());
|
||||
user.setAddress(dto.getAddress());
|
||||
user.setStatus(dto.getStatus());
|
||||
|
||||
if (dto.getRoleName() != null) {
|
||||
user.setRole(roleService.findRoleByName(dto.getRoleName()));
|
||||
}
|
||||
|
||||
if (isCreate) {
|
||||
if (dto.getPassword() == null || dto.getPassword().isBlank()) {
|
||||
throw new InvalidDataException("Password is required when creating a user.");
|
||||
}
|
||||
user.setPassword(passwordEncoder.encode(dto.getPassword()));
|
||||
} else {
|
||||
if (dto.getPassword() != null && !dto.getPassword().isBlank()) {
|
||||
user.setPassword(passwordEncoder.encode(dto.getPassword()));
|
||||
}
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
package com.denniseckerskorn.dtos;
|
||||
|
||||
public class LoginRequest {
|
||||
private String email;
|
||||
private String password;
|
||||
|
||||
public LoginRequest() {
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
package com.denniseckerskorn.dtos.class_managment_dtos;
|
||||
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.Assistance;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class AssistanceDTO {
|
||||
|
||||
private Integer id;
|
||||
private Integer studentId;
|
||||
private Integer sessionId;
|
||||
private LocalDateTime date;
|
||||
|
||||
public AssistanceDTO() {
|
||||
}
|
||||
|
||||
public AssistanceDTO(Integer id, Integer studentId, Integer sessionId, LocalDateTime date) {
|
||||
this.id = id;
|
||||
this.studentId = studentId;
|
||||
this.sessionId = sessionId;
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public static AssistanceDTO fromEntity(Assistance assistance) {
|
||||
return new AssistanceDTO(
|
||||
assistance.getId(),
|
||||
assistance.getStudent() != null ? assistance.getStudent().getId() : null,
|
||||
assistance.getTrainingSession() != null ? assistance.getTrainingSession().getId() : null,
|
||||
assistance.getDate()
|
||||
);
|
||||
}
|
||||
|
||||
public Assistance toEntity(Student student, TrainingSession session) {
|
||||
Assistance assistance = new Assistance();
|
||||
assistance.setId(this.id);
|
||||
assistance.setStudent(student);
|
||||
assistance.setTrainingSession(session);
|
||||
assistance.setDate(this.date);
|
||||
return assistance;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Integer getStudentId() {
|
||||
return studentId;
|
||||
}
|
||||
|
||||
public void setStudentId(Integer studentId) {
|
||||
this.studentId = studentId;
|
||||
}
|
||||
|
||||
public Integer getSessionId() {
|
||||
return sessionId;
|
||||
}
|
||||
|
||||
public void setSessionId(Integer sessionId) {
|
||||
this.sessionId = sessionId;
|
||||
}
|
||||
|
||||
public LocalDateTime getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public void setDate(LocalDateTime date) {
|
||||
this.date = date;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
package com.denniseckerskorn.dtos.class_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.Membership;
|
||||
import com.denniseckerskorn.enums.MembershipTypeValues;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
|
||||
public class MembershipDTO {
|
||||
|
||||
private Integer id;
|
||||
private LocalDate startDate;
|
||||
private LocalDate endDate;
|
||||
private MembershipTypeValues type;
|
||||
private StatusValues status;
|
||||
|
||||
public MembershipDTO() {
|
||||
}
|
||||
|
||||
public MembershipDTO(Integer id, LocalDate startDate, LocalDate endDate, MembershipTypeValues type, StatusValues status) {
|
||||
this.id = id;
|
||||
this.startDate = startDate;
|
||||
this.endDate = endDate;
|
||||
this.type = type;
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public void setStartDate(LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public MembershipTypeValues getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(MembershipTypeValues type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public static MembershipDTO fromEntity(Membership membership) {
|
||||
MembershipDTO dto = new MembershipDTO();
|
||||
dto.setId(membership.getId());
|
||||
dto.setStartDate(membership.getStartDate());
|
||||
dto.setEndDate(membership.getEndDate());
|
||||
dto.setType(membership.getType());
|
||||
dto.setStatus(membership.getStatus());
|
||||
return dto;
|
||||
}
|
||||
|
||||
public Membership toEntity() {
|
||||
Membership membership = new Membership();
|
||||
membership.setId(this.id);
|
||||
membership.setStartDate(this.startDate);
|
||||
membership.setEndDate(this.endDate);
|
||||
membership.setType(this.type);
|
||||
membership.setStatus(this.status);
|
||||
return membership;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,109 @@
|
|||
package com.denniseckerskorn.dtos.class_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Teacher;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class TrainingGroupDTO {
|
||||
|
||||
private Integer id;
|
||||
private String name;
|
||||
private String level;
|
||||
private LocalDateTime schedule;
|
||||
private Integer teacherId;
|
||||
private Set<Integer> studentIds;
|
||||
|
||||
public TrainingGroupDTO() {
|
||||
}
|
||||
|
||||
public TrainingGroupDTO(TrainingGroup group) {
|
||||
this.id = group.getId();
|
||||
this.name = group.getName();
|
||||
this.level = group.getLevel();
|
||||
this.schedule = group.getSchedule();
|
||||
this.teacherId = group.getTeacher() != null ? group.getTeacher().getId() : null;
|
||||
this.studentIds = group.getStudents().stream().map(Student::getId).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
public TrainingGroup toEntity(Teacher teacher, Set<Student> students) {
|
||||
TrainingGroup group = new TrainingGroup();
|
||||
group.setId(this.id);
|
||||
group.setName(this.name);
|
||||
group.setLevel(this.level);
|
||||
group.setSchedule(this.schedule);
|
||||
group.setTeacher(teacher);
|
||||
group.setStudents(students);
|
||||
return group;
|
||||
}
|
||||
|
||||
public static TrainingGroupDTO fromEntity(TrainingGroup group) {
|
||||
if (group == null) return null;
|
||||
|
||||
TrainingGroupDTO dto = new TrainingGroupDTO();
|
||||
dto.setId(group.getId());
|
||||
dto.setName(group.getName());
|
||||
dto.setLevel(group.getLevel());
|
||||
dto.setSchedule(group.getSchedule());
|
||||
dto.setTeacherId(group.getTeacher() != null ? group.getTeacher().getId() : null);
|
||||
dto.setStudentIds(group.getStudents() != null
|
||||
? group.getStudents().stream().map(Student::getId).collect(Collectors.toSet())
|
||||
: null);
|
||||
return dto;
|
||||
}
|
||||
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getLevel() {
|
||||
return level;
|
||||
}
|
||||
|
||||
public void setLevel(String level) {
|
||||
this.level = level;
|
||||
}
|
||||
|
||||
public LocalDateTime getSchedule() {
|
||||
return schedule;
|
||||
}
|
||||
|
||||
public void setSchedule(LocalDateTime schedule) {
|
||||
this.schedule = schedule;
|
||||
}
|
||||
|
||||
public Integer getTeacherId() {
|
||||
return teacherId;
|
||||
}
|
||||
|
||||
public void setTeacherId(Integer teacherId) {
|
||||
this.teacherId = teacherId;
|
||||
}
|
||||
|
||||
public Set<Integer> getStudentIds() {
|
||||
return studentIds;
|
||||
}
|
||||
|
||||
public void setStudentIds(Set<Integer> studentIds) {
|
||||
this.studentIds = studentIds;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
package com.denniseckerskorn.dtos.class_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.TrainingGroupDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class TrainingSessionDTO {
|
||||
|
||||
private Integer id;
|
||||
|
||||
@NotNull
|
||||
private Integer trainingGroupId;
|
||||
|
||||
private LocalDateTime date;
|
||||
|
||||
@NotNull
|
||||
private StatusValues status;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Integer getTrainingGroupId() {
|
||||
return trainingGroupId;
|
||||
}
|
||||
|
||||
public LocalDateTime getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setTrainingGroupId(Integer trainingGroupId) {
|
||||
this.trainingGroupId = trainingGroupId;
|
||||
}
|
||||
|
||||
public void setDate(LocalDateTime date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public static TrainingSessionDTO fromEntity(TrainingSession session) {
|
||||
TrainingSessionDTO dto = new TrainingSessionDTO();
|
||||
dto.setId(session.getId());
|
||||
dto.setTrainingGroupId(session.getTrainingGroup().getId());
|
||||
dto.setDate(session.getDate());
|
||||
dto.setStatus(session.getStatus());
|
||||
return dto;
|
||||
}
|
||||
|
||||
public TrainingSession toEntity() {
|
||||
TrainingSession session = new TrainingSession();
|
||||
session.setId(this.id);
|
||||
session.setDate(this.date);
|
||||
session.setStatus(this.status);
|
||||
return session;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,54 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Admin;
|
||||
|
||||
public class AdminDTO {
|
||||
private Integer id;
|
||||
private UserDTO user;
|
||||
|
||||
public AdminDTO() {
|
||||
}
|
||||
|
||||
public AdminDTO(Integer id, UserDTO user) {
|
||||
this.id = id;
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public UserDTO getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUser(UserDTO user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
// ------------ Métodos de conversión ------------
|
||||
|
||||
public static AdminDTO fromEntity(Admin admin) {
|
||||
if (admin == null || admin.getUser() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new AdminDTO(
|
||||
admin.getId(),
|
||||
UserDTO.fromEntity(admin.getUser())
|
||||
);
|
||||
}
|
||||
|
||||
public Admin toEntity() {
|
||||
Admin admin = new Admin();
|
||||
admin.setId(this.id);
|
||||
if (this.user != null) {
|
||||
admin.setUser(this.user.toEntity());
|
||||
}
|
||||
return admin;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Set;
|
||||
|
||||
public class NotificationDTO {
|
||||
private Integer id;
|
||||
private String title;
|
||||
private String message;
|
||||
private LocalDateTime shippingDate;
|
||||
private String type;
|
||||
private StatusValues status;
|
||||
private Set<Integer> userIds;
|
||||
|
||||
public NotificationDTO() {}
|
||||
|
||||
public NotificationDTO(Integer id, String title, String message, LocalDateTime shippingDate, String type, StatusValues status, Set<Integer> userIds) {
|
||||
this.id = id;
|
||||
this.title = title;
|
||||
this.message = message;
|
||||
this.shippingDate = shippingDate;
|
||||
this.type = type;
|
||||
this.status = status;
|
||||
this.userIds = userIds;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public LocalDateTime getShippingDate() {
|
||||
return shippingDate;
|
||||
}
|
||||
|
||||
public void setShippingDate(LocalDateTime shippingDate) {
|
||||
this.shippingDate = shippingDate;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Set<Integer> getUserIds() {
|
||||
return userIds;
|
||||
}
|
||||
|
||||
public void setUserIds(Set<Integer> userIds) {
|
||||
this.userIds = userIds;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class NotificationMiniDTO {
|
||||
private Integer id;
|
||||
private String title;
|
||||
private String message;
|
||||
private LocalDateTime shippingDate;
|
||||
private String type;
|
||||
|
||||
public NotificationMiniDTO() {
|
||||
}
|
||||
|
||||
public NotificationMiniDTO(Integer id, String title, String message, LocalDateTime shippingDate, String type) {
|
||||
this.id = id;
|
||||
this.title = title;
|
||||
this.message = message;
|
||||
this.shippingDate = shippingDate;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
// Getters y setters
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public LocalDateTime getShippingDate() {
|
||||
return shippingDate;
|
||||
}
|
||||
|
||||
public void setShippingDate(LocalDateTime shippingDate) {
|
||||
this.shippingDate = shippingDate;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.enums.PermissionValues;
|
||||
|
||||
public class PermissionDTO {
|
||||
private Integer id;
|
||||
private PermissionValues permissionName;
|
||||
|
||||
public PermissionDTO() {
|
||||
}
|
||||
|
||||
public PermissionDTO(Integer id, PermissionValues permissionName) {
|
||||
this.id = id;
|
||||
this.permissionName = permissionName;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public PermissionValues getPermissionName() {
|
||||
return permissionName;
|
||||
}
|
||||
|
||||
public void setPermissionName(PermissionValues permissionName) {
|
||||
this.permissionName = permissionName;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class RoleDTO {
|
||||
private Integer id;
|
||||
private String name;
|
||||
private Set<Integer> permissionIds;
|
||||
|
||||
public RoleDTO() {
|
||||
}
|
||||
|
||||
public RoleDTO(Integer id, String name, Set<Integer> permissionIds) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.permissionIds = permissionIds;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Set<Integer> getPermissionIds() {
|
||||
return permissionIds;
|
||||
}
|
||||
|
||||
public void setPermissionIds(Set<Integer> permissionIds) {
|
||||
this.permissionIds = permissionIds;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,217 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.AssistanceDTO;
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.MembershipDTO;
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.TrainingGroupDTO;
|
||||
import com.denniseckerskorn.dtos.class_managment_dtos.TrainingSessionDTO;
|
||||
import com.denniseckerskorn.entities.class_managment.Assistance;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class StudentDTO {
|
||||
|
||||
private Integer id;
|
||||
private UserDTO user;
|
||||
private String dni;
|
||||
private LocalDate birthdate;
|
||||
private String belt;
|
||||
private String progress;
|
||||
private String medicalReport;
|
||||
private String parentName;
|
||||
private Integer membershipId;
|
||||
|
||||
private List<AssistanceDTO> assistances;
|
||||
private List<TrainingGroupDTO> trainingGroups;
|
||||
private List<TrainingSessionDTO> trainingSessions;
|
||||
|
||||
private MembershipDTO membership;
|
||||
|
||||
public StudentDTO() {
|
||||
}
|
||||
|
||||
public StudentDTO(Integer id, UserDTO user, String dni, LocalDate birthdate, String belt, String progress,
|
||||
String medicalReport, String parentName, Integer membershipId,
|
||||
List<AssistanceDTO> assistances, List<TrainingGroupDTO> trainingGroups, List<TrainingSessionDTO> trainingSessions) {
|
||||
this.id = id;
|
||||
this.user = user;
|
||||
this.dni = dni;
|
||||
this.birthdate = birthdate;
|
||||
this.belt = belt;
|
||||
this.progress = progress;
|
||||
this.medicalReport = medicalReport;
|
||||
this.parentName = parentName;
|
||||
this.membershipId = membershipId;
|
||||
this.assistances = assistances;
|
||||
this.trainingGroups = trainingGroups;
|
||||
this.trainingSessions = trainingSessions;
|
||||
}
|
||||
|
||||
public static StudentDTO fromEntity(Student student) {
|
||||
if (student == null || student.getUser() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<AssistanceDTO> assistanceDTOs = student.getAssistances().stream()
|
||||
.map(AssistanceDTO::fromEntity)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
List<TrainingGroupDTO> groupDTOs = student.getTrainingGroups().stream()
|
||||
.map(TrainingGroupDTO::fromEntity)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Set<TrainingSession> allSessions = student.getAssistances().stream()
|
||||
.map(Assistance::getTrainingSession)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
List<TrainingSessionDTO> sessionDTOs = allSessions.stream()
|
||||
.map(TrainingSessionDTO::fromEntity)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return new StudentDTO(
|
||||
student.getId(),
|
||||
UserDTO.fromEntity(student.getUser()),
|
||||
student.getDni(),
|
||||
student.getBirthdate(),
|
||||
student.getBelt(),
|
||||
student.getProgress(),
|
||||
student.getMedicalReport(),
|
||||
student.getParentName(),
|
||||
student.getMembership() != null ? student.getMembership().getId() : null,
|
||||
assistanceDTOs,
|
||||
groupDTOs,
|
||||
sessionDTOs
|
||||
).withMembership(student.getMembership() != null ? MembershipDTO.fromEntity(student.getMembership()) : null);
|
||||
}
|
||||
|
||||
public StudentDTO withMembership(MembershipDTO membership) {
|
||||
this.membership = membership;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public Student toEntity() {
|
||||
Student student = new Student();
|
||||
student.setId(this.id);
|
||||
if (this.user != null) {
|
||||
student.setUser(this.user.toEntity());
|
||||
}
|
||||
student.setDni(this.dni);
|
||||
student.setBirthdate(this.birthdate);
|
||||
student.setBelt(this.belt);
|
||||
student.setProgress(this.progress);
|
||||
student.setMedicalReport(this.medicalReport);
|
||||
student.setParentName(this.parentName);
|
||||
return student;
|
||||
}
|
||||
|
||||
// Getters y Setters...
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public UserDTO getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(UserDTO user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public String getDni() {
|
||||
return dni;
|
||||
}
|
||||
|
||||
public void setDni(String dni) {
|
||||
this.dni = dni;
|
||||
}
|
||||
|
||||
public LocalDate getBirthdate() {
|
||||
return birthdate;
|
||||
}
|
||||
|
||||
public void setBirthdate(LocalDate birthdate) {
|
||||
this.birthdate = birthdate;
|
||||
}
|
||||
|
||||
public String getBelt() {
|
||||
return belt;
|
||||
}
|
||||
|
||||
public void setBelt(String belt) {
|
||||
this.belt = belt;
|
||||
}
|
||||
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
|
||||
public String getMedicalReport() {
|
||||
return medicalReport;
|
||||
}
|
||||
|
||||
public void setMedicalReport(String medicalReport) {
|
||||
this.medicalReport = medicalReport;
|
||||
}
|
||||
|
||||
public String getParentName() {
|
||||
return parentName;
|
||||
}
|
||||
|
||||
public void setParentName(String parentName) {
|
||||
this.parentName = parentName;
|
||||
}
|
||||
|
||||
public Integer getMembershipId() {
|
||||
return membershipId;
|
||||
}
|
||||
|
||||
public void setMembershipId(Integer membershipId) {
|
||||
this.membershipId = membershipId;
|
||||
}
|
||||
|
||||
public List<AssistanceDTO> getAssistances() {
|
||||
return assistances;
|
||||
}
|
||||
|
||||
public void setAssistances(List<AssistanceDTO> assistances) {
|
||||
this.assistances = assistances;
|
||||
}
|
||||
|
||||
public List<TrainingGroupDTO> getTrainingGroups() {
|
||||
return trainingGroups;
|
||||
}
|
||||
|
||||
public void setTrainingGroups(List<TrainingGroupDTO> trainingGroups) {
|
||||
this.trainingGroups = trainingGroups;
|
||||
}
|
||||
|
||||
public List<TrainingSessionDTO> getTrainingSessions() {
|
||||
return trainingSessions;
|
||||
}
|
||||
|
||||
public void setTrainingSessions(List<TrainingSessionDTO> trainingSessions) {
|
||||
this.trainingSessions = trainingSessions;
|
||||
}
|
||||
|
||||
public MembershipDTO getMembership() {
|
||||
return membership;
|
||||
}
|
||||
|
||||
public void setMembership(MembershipDTO membership) {
|
||||
this.membership = membership;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,62 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
public class StudentHistoryDTO {
|
||||
private Integer id;
|
||||
private Integer studentId;
|
||||
private LocalDate eventDate;
|
||||
private String eventType;
|
||||
private String description;
|
||||
|
||||
public StudentHistoryDTO() {
|
||||
}
|
||||
|
||||
public StudentHistoryDTO(Integer id, Integer studentId, LocalDate eventDate, String eventType, String description) {
|
||||
this.id = id;
|
||||
this.studentId = studentId;
|
||||
this.eventDate = eventDate;
|
||||
this.eventType = eventType;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Integer getStudentId() {
|
||||
return studentId;
|
||||
}
|
||||
|
||||
public void setStudentId(Integer studentId) {
|
||||
this.studentId = studentId;
|
||||
}
|
||||
|
||||
public LocalDate getEventDate() {
|
||||
return eventDate;
|
||||
}
|
||||
|
||||
public void setEventDate(LocalDate eventDate) {
|
||||
this.eventDate = eventDate;
|
||||
}
|
||||
|
||||
public String getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
public void setEventType(String eventType) {
|
||||
this.eventType = eventType;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
public class StudentHistoryMiniDTO {
|
||||
private Integer id;
|
||||
private LocalDate eventDate;
|
||||
private String eventType;
|
||||
private String description;
|
||||
|
||||
public StudentHistoryMiniDTO() {
|
||||
}
|
||||
|
||||
public StudentHistoryMiniDTO(Integer id, LocalDate eventDate, String eventType, String description) {
|
||||
this.id = id;
|
||||
this.eventDate = eventDate;
|
||||
this.eventType = eventType;
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
// Getters y setters
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public LocalDate getEventDate() {
|
||||
return eventDate;
|
||||
}
|
||||
|
||||
public void setEventDate(LocalDate eventDate) {
|
||||
this.eventDate = eventDate;
|
||||
}
|
||||
|
||||
public String getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
public void setEventType(String eventType) {
|
||||
this.eventType = eventType;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class StudentMiniDTO {
|
||||
private Integer id;
|
||||
private Set<StudentHistoryMiniDTO> histories; // 🔥 mini DTO
|
||||
|
||||
public StudentMiniDTO() {}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public Set<StudentHistoryMiniDTO> getHistories() {
|
||||
return histories;
|
||||
}
|
||||
|
||||
public void setHistories(Set<StudentHistoryMiniDTO> histories) {
|
||||
this.histories = histories;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
public class StudentRegisterDTO {
|
||||
|
||||
// Datos de usuario
|
||||
private String name;
|
||||
private String surname;
|
||||
private String email;
|
||||
private String password;
|
||||
private String phoneNumber;
|
||||
private String address;
|
||||
private String roleName; // ejemplo: "ROLE_STUDENT"
|
||||
private String status; // ejemplo: "ACTIVE"
|
||||
|
||||
// Datos de estudiante
|
||||
private String dni;
|
||||
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
|
||||
private LocalDate birthdate;
|
||||
|
||||
private String belt;
|
||||
private String progress;
|
||||
private String medicalReport;
|
||||
private String parentName;
|
||||
private Integer membershipId;
|
||||
|
||||
// --- Getters y Setters ---
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
public String getSurname() {
|
||||
return surname;
|
||||
}
|
||||
public void setSurname(String surname) {
|
||||
this.surname = surname;
|
||||
}
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
public String getRoleName() {
|
||||
return roleName;
|
||||
}
|
||||
public void setRoleName(String roleName) {
|
||||
this.roleName = roleName;
|
||||
}
|
||||
public String getStatus() {
|
||||
return status;
|
||||
}
|
||||
public void setStatus(String status) {
|
||||
this.status = status;
|
||||
}
|
||||
public String getDni() {
|
||||
return dni;
|
||||
}
|
||||
public void setDni(String dni) {
|
||||
this.dni = dni;
|
||||
}
|
||||
public LocalDate getBirthdate() {
|
||||
return birthdate;
|
||||
}
|
||||
public void setBirthdate(LocalDate birthdate) {
|
||||
this.birthdate = birthdate;
|
||||
}
|
||||
public String getBelt() {
|
||||
return belt;
|
||||
}
|
||||
public void setBelt(String belt) {
|
||||
this.belt = belt;
|
||||
}
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
public String getMedicalReport() {
|
||||
return medicalReport;
|
||||
}
|
||||
public void setMedicalReport(String medicalReport) {
|
||||
this.medicalReport = medicalReport;
|
||||
}
|
||||
public String getParentName() {
|
||||
return parentName;
|
||||
}
|
||||
public void setParentName(String parentName) {
|
||||
this.parentName = parentName;
|
||||
}
|
||||
|
||||
public Integer getMembershipId() {
|
||||
return membershipId;
|
||||
}
|
||||
public void setMembershipId(Integer membershipId) {
|
||||
this.membershipId = membershipId;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Teacher;
|
||||
|
||||
public class TeacherDTO {
|
||||
|
||||
private Integer id;
|
||||
private UserDTO user;
|
||||
private String discipline;
|
||||
|
||||
public TeacherDTO() {
|
||||
}
|
||||
|
||||
public TeacherDTO(Integer id, UserDTO user, String discipline) {
|
||||
this.id = id;
|
||||
this.user = user;
|
||||
this.discipline = discipline;
|
||||
}
|
||||
|
||||
// Getters y Setters
|
||||
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public UserDTO getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setUser(UserDTO user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public String getDiscipline() {
|
||||
return discipline;
|
||||
}
|
||||
|
||||
public void setDiscipline(String discipline) {
|
||||
this.discipline = discipline;
|
||||
}
|
||||
|
||||
public static TeacherDTO fromEntity(Teacher teacher) {
|
||||
if (teacher == null || teacher.getUser() == null) {
|
||||
return null;
|
||||
}
|
||||
return new TeacherDTO(
|
||||
teacher.getId(),
|
||||
UserDTO.fromEntity(teacher.getUser()),
|
||||
teacher.getDiscipline()
|
||||
);
|
||||
}
|
||||
|
||||
public Teacher toEntity() {
|
||||
Teacher teacher = new Teacher();
|
||||
teacher.setId(this.id);
|
||||
if (this.user != null) {
|
||||
teacher.setUser(this.user.toEntity());
|
||||
}
|
||||
teacher.setDiscipline(this.discipline);
|
||||
return teacher;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,173 @@
|
|||
package com.denniseckerskorn.dtos.user_managment_dtos;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Set;
|
||||
|
||||
public class UserDTO {
|
||||
private Integer id;
|
||||
private String name;
|
||||
private String surname;
|
||||
private String email;
|
||||
private String password;
|
||||
private String phoneNumber;
|
||||
private String address;
|
||||
|
||||
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
|
||||
private LocalDateTime registerDate;
|
||||
private String roleName;
|
||||
private StatusValues status;
|
||||
|
||||
// 🔥 Nuevos campos para el perfil completo
|
||||
private Set<NotificationMiniDTO> notifications;
|
||||
private StudentMiniDTO student;
|
||||
|
||||
public UserDTO() {
|
||||
}
|
||||
|
||||
public UserDTO(Integer id, String name, String surname, String email, String password, String phoneNumber,
|
||||
String address, LocalDateTime registerDate, String roleName, StatusValues status) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
this.surname = surname;
|
||||
this.email = email;
|
||||
this.password = password;
|
||||
this.phoneNumber = phoneNumber;
|
||||
this.address = address;
|
||||
this.registerDate = registerDate;
|
||||
this.roleName = roleName;
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
// Getters y Setters
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getSurname() {
|
||||
return surname;
|
||||
}
|
||||
|
||||
public void setSurname(String surname) {
|
||||
this.surname = surname;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public LocalDateTime getRegisterDate() {
|
||||
return registerDate;
|
||||
}
|
||||
|
||||
public void setRegisterDate(LocalDateTime registerDate) {
|
||||
this.registerDate = registerDate;
|
||||
}
|
||||
|
||||
public String getRoleName() {
|
||||
return roleName;
|
||||
}
|
||||
|
||||
public void setRoleName(String roleName) {
|
||||
this.roleName = roleName;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Set<NotificationMiniDTO> getNotifications() {
|
||||
return notifications;
|
||||
}
|
||||
|
||||
public void setNotifications(Set<NotificationMiniDTO> notifications) {
|
||||
this.notifications = notifications;
|
||||
}
|
||||
|
||||
public StudentMiniDTO getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public void setStudent(StudentMiniDTO student) {
|
||||
this.student = student;
|
||||
}
|
||||
|
||||
// Conversión (opcional)
|
||||
public static UserDTO fromEntity(User user) {
|
||||
if (user == null) return null;
|
||||
|
||||
return new UserDTO(
|
||||
user.getId(),
|
||||
user.getName(),
|
||||
user.getSurname(),
|
||||
user.getEmail(),
|
||||
null,
|
||||
user.getPhoneNumber(),
|
||||
user.getAddress(),
|
||||
user.getRegisterDate(),
|
||||
user.getRole() != null ? user.getRole().getName() : null,
|
||||
user.getStatus()
|
||||
);
|
||||
}
|
||||
|
||||
public User toEntity() {
|
||||
User user = new User();
|
||||
user.setId(this.id);
|
||||
user.setName(this.name);
|
||||
user.setSurname(this.surname);
|
||||
user.setEmail(this.email);
|
||||
user.setPassword(this.password);
|
||||
user.setPhoneNumber(this.phoneNumber);
|
||||
user.setAddress(this.address);
|
||||
user.setRegisterDate(this.registerDate);
|
||||
user.setStatus(this.status);
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,166 @@
|
|||
package com.denniseckerskorn.exceptions;
|
||||
|
||||
import com.denniseckerskorn.security.core.AuthenticationException;
|
||||
import org.hibernate.PropertyValueException;
|
||||
import org.hibernate.exception.ConstraintViolationException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.TypeMismatchException;
|
||||
import org.springframework.dao.DataIntegrityViolationException;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||
import org.springframework.http.converter.HttpMessageConversionException;
|
||||
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
||||
import org.springframework.web.bind.*;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
import org.springframework.web.context.request.WebRequest;
|
||||
|
||||
import jakarta.persistence.EntityNotFoundException;
|
||||
import jakarta.persistence.PersistenceException;
|
||||
import org.springframework.web.servlet.resource.NoResourceFoundException;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@ControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
|
||||
|
||||
// 🔹 Custom application exceptions
|
||||
|
||||
@ExceptionHandler(EntityNotFoundException.class)
|
||||
public ResponseEntity<Object> handleEntityNotFound(EntityNotFoundException ex, WebRequest request) {
|
||||
return buildErrorResponse("Entity not found: " + ex.getMessage(), HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
@ExceptionHandler(DuplicateEntityException.class)
|
||||
public ResponseEntity<Object> handleDuplicateEntity(DuplicateEntityException ex, WebRequest request) {
|
||||
return buildErrorResponse("Duplicate entity: " + ex.getMessage(), HttpStatus.CONFLICT);
|
||||
}
|
||||
|
||||
@ExceptionHandler(BadRequestException.class)
|
||||
public ResponseEntity<Object> handleBadRequest(BadRequestException ex, WebRequest request) {
|
||||
return buildErrorResponse("Bad request: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(InvalidDataException.class)
|
||||
public ResponseEntity<Object> handleInvalidData(InvalidDataException ex, WebRequest request) {
|
||||
return buildErrorResponse("Invalid data: " + ex.getMessage(), HttpStatus.UNPROCESSABLE_ENTITY);
|
||||
}
|
||||
|
||||
@ExceptionHandler(AuthenticationException.class)
|
||||
public ResponseEntity<Object> handleAuthentication(AuthenticationException ex, WebRequest request) {
|
||||
return buildErrorResponse("Unauthorized: " + ex.getMessage(), HttpStatus.UNAUTHORIZED);
|
||||
}
|
||||
|
||||
// 🔹 Validation errors
|
||||
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
public ResponseEntity<Object> handleValidationErrors(MethodArgumentNotValidException ex) {
|
||||
Map<String, String> errors = new HashMap<>();
|
||||
ex.getBindingResult().getFieldErrors().forEach(err ->
|
||||
errors.put(err.getField(), err.getDefaultMessage())
|
||||
);
|
||||
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(MissingServletRequestParameterException.class)
|
||||
public ResponseEntity<Object> handleMissingParams(MissingServletRequestParameterException ex) {
|
||||
return buildErrorResponse("Missing required parameter: " + ex.getParameterName(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(MissingPathVariableException.class)
|
||||
public ResponseEntity<Object> handleMissingPathVariable(MissingPathVariableException ex) {
|
||||
return buildErrorResponse("Missing path variable: " + ex.getVariableName(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(MissingRequestHeaderException.class)
|
||||
public ResponseEntity<Object> handleMissingHeader(MissingRequestHeaderException ex) {
|
||||
return buildErrorResponse("Missing request header: " + ex.getHeaderName(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(ServletRequestBindingException.class)
|
||||
public ResponseEntity<Object> handleServletBinding(ServletRequestBindingException ex) {
|
||||
return buildErrorResponse("Request binding failed: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(NoResourceFoundException.class)
|
||||
public ResponseEntity<Object> handleNoResourceFound(NoResourceFoundException ex, WebRequest request) {
|
||||
return buildErrorResponse("Invalid resource path or missing ID in request URL.", HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
// 🔹 JPA / Hibernate exceptions
|
||||
|
||||
@ExceptionHandler(PropertyValueException.class)
|
||||
public ResponseEntity<Object> handlePropertyValueException(PropertyValueException ex) {
|
||||
return buildErrorResponse("Missing required field: " + ex.getPropertyName(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(ConstraintViolationException.class)
|
||||
public ResponseEntity<Object> handleConstraintViolation(ConstraintViolationException ex) {
|
||||
return buildErrorResponse("Database constraint violation: " + ex.getConstraintName(), HttpStatus.CONFLICT);
|
||||
}
|
||||
|
||||
@ExceptionHandler(PersistenceException.class)
|
||||
public ResponseEntity<Object> handlePersistenceException(PersistenceException ex) {
|
||||
return buildErrorResponse("Persistence error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
|
||||
@ExceptionHandler(DataIntegrityViolationException.class)
|
||||
public ResponseEntity<Object> handleDataIntegrityViolation(DataIntegrityViolationException ex) {
|
||||
return buildErrorResponse("Data integrity violation: " + ex.getMostSpecificCause().getMessage(), HttpStatus.CONFLICT);
|
||||
}
|
||||
|
||||
// 🔹 Java & Spring Core exceptions
|
||||
|
||||
@ExceptionHandler(IllegalArgumentException.class)
|
||||
public ResponseEntity<Object> handleIllegalArgument(IllegalArgumentException ex) {
|
||||
return buildErrorResponse("Illegal argument: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(IllegalStateException.class)
|
||||
public ResponseEntity<Object> handleIllegalState(IllegalStateException ex) {
|
||||
return buildErrorResponse("Illegal state: " + ex.getMessage(), HttpStatus.CONFLICT);
|
||||
}
|
||||
|
||||
@ExceptionHandler(TypeMismatchException.class)
|
||||
public ResponseEntity<Object> handleTypeMismatch(TypeMismatchException ex) {
|
||||
return buildErrorResponse("Invalid parameter type: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(HttpMessageNotReadableException.class)
|
||||
public ResponseEntity<Object> handleInvalidJson(HttpMessageNotReadableException ex) {
|
||||
return buildErrorResponse("Malformed JSON request body", HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@ExceptionHandler(HttpMessageConversionException.class)
|
||||
public ResponseEntity<Object> handleConversion(HttpMessageConversionException ex) {
|
||||
return buildErrorResponse("Error converting request body: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
// 🔹 HTTP-related
|
||||
|
||||
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
|
||||
public ResponseEntity<Object> handleMethodNotSupported(HttpRequestMethodNotSupportedException ex) {
|
||||
return buildErrorResponse("HTTP method not supported: " + ex.getMethod(), HttpStatus.METHOD_NOT_ALLOWED);
|
||||
}
|
||||
|
||||
// 🔹 Fallback
|
||||
|
||||
@ExceptionHandler(Exception.class)
|
||||
public ResponseEntity<Object> handleAllUncaught(Exception ex, WebRequest request) {
|
||||
logger.error("Unhandled exception", ex);
|
||||
return buildErrorResponse("Internal server error", HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
|
||||
private ResponseEntity<Object> buildErrorResponse(String message, HttpStatus status) {
|
||||
Map<String, Object> error = new HashMap<>();
|
||||
error.put("status", status.value());
|
||||
error.put("error", status.getReasonPhrase());
|
||||
error.put("message", message);
|
||||
return new ResponseEntity<>(error, status);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
package com.denniseckerskorn.security;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import org.springframework.security.core.GrantedAuthority;
|
||||
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Custom implementation of UserDetails to represent user-specific data.
|
||||
*/
|
||||
public class CustomUserDetails implements UserDetails {
|
||||
private final User user;
|
||||
|
||||
/**
|
||||
* Constructor to initialize the CustomUserDetails with a User object.
|
||||
*
|
||||
* @param user the User object containing user information
|
||||
*/
|
||||
public CustomUserDetails(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the authorities granted to the user.
|
||||
*
|
||||
* @return a collection of GrantedAuthority objects representing user permissions
|
||||
*/
|
||||
@Override
|
||||
public Collection<? extends GrantedAuthority> getAuthorities() {
|
||||
return user.getRole().getPermissions().stream()
|
||||
.map(p -> new SimpleGrantedAuthority(p.getPermissionName().toString()))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the password of the user.
|
||||
*
|
||||
* @return the user's password
|
||||
*/
|
||||
@Override
|
||||
public String getPassword() {
|
||||
return user.getPassword();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the username of the user.
|
||||
*
|
||||
* @return the user's email
|
||||
*/
|
||||
@Override
|
||||
public String getUsername() {
|
||||
return user.getEmail();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the account's expiration status.
|
||||
*
|
||||
* @return true if the account is not expired, false otherwise
|
||||
*/
|
||||
@Override
|
||||
public boolean isAccountNonExpired() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the account's lock status.
|
||||
*
|
||||
* @return true if the account is not locked, false otherwise
|
||||
*/
|
||||
@Override
|
||||
public boolean isAccountNonLocked() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the credentials' expiration status.
|
||||
*
|
||||
* @return true if the credentials are not expired, false otherwise
|
||||
*/
|
||||
@Override
|
||||
public boolean isCredentialsNonExpired() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the account's enabled status.
|
||||
*
|
||||
* @return true if the account is enabled, false otherwise
|
||||
*/
|
||||
@Override
|
||||
public boolean isEnabled() {
|
||||
return user.getStatus().name().equals("ACTIVE");
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the User object associated with this CustomUserDetails.
|
||||
*
|
||||
* @return the User object
|
||||
*/
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
package com.denniseckerskorn.security;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.repositories.user_managment_repositories.UserRepository;
|
||||
import org.springframework.security.core.userdetails.UserDetails;
|
||||
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||
import org.springframework.security.core.userdetails.UsernameNotFoundException;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* Custom implementation of UserDetailsService to load user-specific data.
|
||||
*/
|
||||
@Service
|
||||
public class CustomUserDetailsService implements UserDetailsService {
|
||||
private final UserRepository userRepository;
|
||||
|
||||
/**
|
||||
* Constructor to initialize the UserRepository.
|
||||
*
|
||||
* @param userRepository the UserRepository to be used for fetching user data
|
||||
*/
|
||||
public CustomUserDetailsService(UserRepository userRepository) {
|
||||
this.userRepository = userRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads user by username (email in this case).
|
||||
*
|
||||
* @param username the username (email) of the user to load
|
||||
* @return UserDetails object containing user information
|
||||
* @throws UsernameNotFoundException if the user is not found
|
||||
*/
|
||||
@Override
|
||||
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
|
||||
User user = userRepository.findByEmail(username);
|
||||
if (user == null) {
|
||||
throw new UsernameNotFoundException("User not found with username: " + username);
|
||||
}
|
||||
return new CustomUserDetails(user);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
package com.denniseckerskorn.security;
|
||||
|
||||
|
||||
import io.jsonwebtoken.ExpiredJwtException;
|
||||
import io.jsonwebtoken.JwtException;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.filter.OncePerRequestFilter;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* JwtAuthFilter is a filter that checks for the presence of a JWT token in the request header.
|
||||
* If a valid token is found, it sets the authentication in the security context.
|
||||
*/
|
||||
@Component
|
||||
public class JwtAuthFilter extends OncePerRequestFilter {
|
||||
private final JwtUtil jwtUtil;
|
||||
private final CustomUserDetailsService customUserDetailsService;
|
||||
|
||||
/**
|
||||
* Constructor to initialize JwtUtil and CustomUserDetailsService.
|
||||
*
|
||||
* @param jwtUtil the JWT utility class
|
||||
* @param customUserDetailsService the custom user details service
|
||||
*/
|
||||
public JwtAuthFilter(JwtUtil jwtUtil, CustomUserDetailsService customUserDetailsService) {
|
||||
this.jwtUtil = jwtUtil;
|
||||
this.customUserDetailsService = customUserDetailsService;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method is called for every request to check if the user is authenticated.
|
||||
* It extracts the JWT token from the request header, validates it, and sets the authentication in the security context.
|
||||
*
|
||||
* @param request the HTTP request
|
||||
* @param response the HTTP response
|
||||
* @param filterChain the filter chain
|
||||
* @throws ServletException if an error occurs during filtering
|
||||
* @throws IOException if an I/O error occurs
|
||||
*/
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||
throws ServletException, IOException {
|
||||
|
||||
String authHeader = request.getHeader("Authorization");
|
||||
|
||||
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
|
||||
filterChain.doFilter(request, response);
|
||||
return;
|
||||
}
|
||||
|
||||
String token = authHeader.substring(7);
|
||||
|
||||
try {
|
||||
String username = jwtUtil.extractUsername(token);
|
||||
|
||||
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
|
||||
var userDetails = customUserDetailsService.loadUserByUsername(username);
|
||||
|
||||
if (jwtUtil.validateToken(token)) {
|
||||
var authToken = new UsernamePasswordAuthenticationToken(
|
||||
userDetails, null, userDetails.getAuthorities()
|
||||
);
|
||||
authToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
||||
SecurityContextHolder.getContext().setAuthentication(authToken);
|
||||
}
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
|
||||
} catch (ExpiredJwtException e) {
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
response.setContentType("application/json");
|
||||
response.getWriter().write("{\"message\": \"Session expired. Please Login again\"}");
|
||||
} catch (JwtException e) {
|
||||
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
|
||||
response.setContentType("application/json");
|
||||
response.getWriter().write("{\"message\": \"Token is invalid or corrupt.\"}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This method checks if the filter should not be applied to certain paths.
|
||||
*
|
||||
* @param request the HTTP request
|
||||
* @return true if the filter should not be applied, false otherwise
|
||||
* @throws ServletException if an error occurs during filtering
|
||||
*/
|
||||
@Override
|
||||
protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
|
||||
String path = request.getServletPath();
|
||||
return path.startsWith("/api/v1/auth")
|
||||
|| path.startsWith("/v3/api-docs")
|
||||
|| path.startsWith("/swagger-ui")
|
||||
|| path.equals("/swagger-ui.html");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,95 @@
|
|||
package com.denniseckerskorn.security;
|
||||
|
||||
import io.jsonwebtoken.*;
|
||||
import io.jsonwebtoken.security.Keys;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.security.Key;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* Utility class for generating and validating JWT tokens.
|
||||
*/
|
||||
@Component
|
||||
public class JwtUtil {
|
||||
|
||||
@Value("${jwt.secret}")
|
||||
private String secretKey;
|
||||
|
||||
@Value("${jwt.expiration}")
|
||||
private long expirationTime;
|
||||
|
||||
/**
|
||||
* Generates a signing key using the secret key.
|
||||
*
|
||||
* @return the signing key
|
||||
*/
|
||||
private Key getSigningKey() {
|
||||
return Keys.hmacShaKeyFor(secretKey.getBytes());
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a JWT token for the given username.
|
||||
*
|
||||
* @param username the username to include in the token
|
||||
* @return the generated JWT token
|
||||
*/
|
||||
public String generateToken(String username, String authority) {
|
||||
Date now = new Date();
|
||||
Date expiryDate = new Date(now.getTime() + expirationTime);
|
||||
|
||||
return Jwts.builder()
|
||||
.setSubject(username)
|
||||
.claim("role", authority)
|
||||
.setIssuedAt(now)
|
||||
.setExpiration(expiryDate)
|
||||
.signWith(getSigningKey(), SignatureAlgorithm.HS256)
|
||||
.compact();
|
||||
}
|
||||
|
||||
/**
|
||||
* Extracts the username from the given JWT token.
|
||||
*
|
||||
* @param token the JWT token
|
||||
* @return the username extracted from the token
|
||||
*/
|
||||
public String extractUsername(String token) {
|
||||
return Jwts.parserBuilder()
|
||||
.setSigningKey(getSigningKey())
|
||||
.build()
|
||||
.parseClaimsJws(token)
|
||||
.getBody()
|
||||
.getSubject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the given JWT token.
|
||||
*
|
||||
* @param token the JWT token to validate
|
||||
* @return true if the token is valid, false otherwise
|
||||
*/
|
||||
public boolean validateToken(String token) {
|
||||
try {
|
||||
extractUsername(token);
|
||||
return true;
|
||||
} catch (JwtException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given JWT token is expired.
|
||||
*
|
||||
* @param token the JWT token to check
|
||||
* @return true if the token is expired, false otherwise
|
||||
*/
|
||||
public Claims getAllClaimsFromToken(String token) throws ExpiredJwtException {
|
||||
return Jwts.parserBuilder()
|
||||
.setSigningKey(getSigningKey())
|
||||
.build()
|
||||
.parseClaimsJws(token)
|
||||
.getBody();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.security.core;
|
||||
|
||||
public class AuthenticationException extends RuntimeException {
|
||||
public AuthenticationException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
1. Comprobar seguridad y permisos en cada endpoint.
|
||||
2. Comprobar o arreglar el tema de los ID automáticos y los DTOs.
|
||||
3. Documentar los endpoints.
|
||||
4. Crear javadoc de cada metodo.
|
||||
5. Crear un README.md con la información del proyecto.
|
||||
7. Comprobar como funciona logger en cada endpoint.
|
||||
8. Mejorar excepciones y mensajes de error.
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
# Configuración de la base de datos
|
||||
spring.datasource.url=jdbc:mysql://mysql:3306/mf_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
|
||||
spring.datasource.username=root
|
||||
spring.datasource.password=1234
|
||||
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
|
||||
# Configuración de JPA/Hibernate
|
||||
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
|
||||
spring.jpa.hibernate.ddl-auto=validate
|
||||
spring.jpa.show-sql=false
|
||||
spring.jpa.properties.hibernate.current_session_context_class=thread
|
||||
jwt.secret=c2VjdXJlc2VjdXJlc2VjdXJlc2VjdXJlMTIzNDU2
|
||||
jwt.expiration=7200000
|
||||
#logging.level.org.springdoc=DEBUG
|
||||
springdoc.api-docs.path=/v3/api-docs
|
||||
springdoc.swagger-ui.url=/v3/api-docs
|
||||
#logging.level.org.springframework.web=DEBUG
|
||||
#logging.level.org.springframework.boot.autoconfigure=DEBUG
|
||||
#spring.profiles.active=dev
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
target/
|
||||
!.mvn/wrapper/maven-wrapper.jar
|
||||
!**/src/main/**/target/
|
||||
!**/src/test/**/target/
|
||||
|
||||
### IntelliJ IDEA ###
|
||||
.idea/modules.xml
|
||||
.idea/jarRepositories.xml
|
||||
.idea/compiler.xml
|
||||
.idea/libraries/
|
||||
*.iws
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
### Eclipse ###
|
||||
.apt_generated
|
||||
.classpath
|
||||
.factorypath
|
||||
.project
|
||||
.settings
|
||||
.springBeans
|
||||
.sts4-cache
|
||||
|
||||
### NetBeans ###
|
||||
/nbproject/private/
|
||||
/nbbuild/
|
||||
/dist/
|
||||
/nbdist/
|
||||
/.nb-gradle/
|
||||
build/
|
||||
!**/src/main/**/build/
|
||||
!**/src/test/**/build/
|
||||
|
||||
### VS Code ###
|
||||
.vscode/
|
||||
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding">
|
||||
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
|
||||
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="MavenProjectsManager">
|
||||
<option name="originalFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/pom.xml" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="20" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,179 @@
|
|||
# MemberFlow-Data
|
||||
|
||||
## Diagrama Entidad-Relación
|
||||
|
||||
A continuación, se presenta el diagrama entidad-relación que describe la estructura de la base de datos del proyecto **MemberFlow-Data**. **Nota**: El diagrama debe ser actualizado para reflejar los cambios recientes en las relaciones y el uso de composición en lugar de herencia.
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Descripción del Proyecto
|
||||
|
||||
**MemberFlow-Data** es el módulo de acceso a datos y servicios de la aplicación **MemberFlow**, un sistema diseñado para la gestión de membresías, usuarios, clases y finanzas en un entorno organizacional. Este proyecto actúa como la capa de persistencia y lógica de negocio, proporcionando las entidades, configuraciones y servicios necesarios para interactuar con la base de datos.
|
||||
|
||||
El proyecto está diseñado para trabajar en conjunto con otro módulo llamado **MemberFlow-API**, que será responsable de exponer los controladores, manejar excepciones y proporcionar la interfaz de interacción con la web y otros clientes.
|
||||
|
||||
Actualmente, el proyecto se encuentra en desarrollo y se prueba de manera local utilizando el módulo de `user_managment` hasta que se implemente la API y se pueda interactuar con una interfaz web.
|
||||
|
||||
---
|
||||
|
||||
## Estructura del Proyecto
|
||||
|
||||
El proyecto está organizado en paquetes que agrupan las entidades, configuraciones, servicios y excepciones. A continuación, se detalla la estructura principal:
|
||||
|
||||
### 1. **Configuraciones**
|
||||
- **`HibernateConfig`**: Configuración de Hibernate para la conexión y manejo de la base de datos.
|
||||
|
||||
### 2. **Entidades**
|
||||
Las entidades representan las tablas de la base de datos y están organizadas en diferentes dominios:
|
||||
|
||||
#### a) **Gestión de Clases (`class_managment`)**
|
||||
- **`Assistance`**: Representa la asistencia de un estudiante a una sesión de entrenamiento.
|
||||
- **`Membership`**: Define las membresías de los estudiantes, incluyendo detalles como tipo, duración y beneficios.
|
||||
- **`TrainingGroup`**: Representa un grupo de entrenamiento al que pueden pertenecer varios estudiantes y que está liderado por un profesor.
|
||||
- **`TrainingSession`**: Define una sesión de entrenamiento específica, asociada a un grupo y con un horario determinado.
|
||||
|
||||
#### b) **Gestión de Usuarios (`user_managment`)**
|
||||
- **`User`**: Representa un usuario genérico del sistema. Está asociado a roles, notificaciones y facturas.
|
||||
- **`Student`**: Es un usuario con atributos específicos relacionados con su rol de estudiante, como historial, membresías y grupos de entrenamiento.
|
||||
- **`Teacher`**: Es un usuario con atributos específicos relacionados con su rol de profesor, como los grupos que lidera.
|
||||
- **`Admin`**: Es un usuario con permisos administrativos específicos.
|
||||
- **`Notification`**: Representa notificaciones enviadas a los usuarios.
|
||||
- **`Role`**: Define los roles de los usuarios (e.g., ADMIN, TEACHER, STUDENT).
|
||||
- **`Permission`**: Define los permisos asociados a los roles.
|
||||
- **`StudentHistory`**: Registra el historial de actividades de los estudiantes.
|
||||
|
||||
#### c) **Gestión Financiera (`finance`)**
|
||||
- **`Invoice`**: Representa una factura generada para un usuario.
|
||||
- **`InvoiceLine`**: Detalla los elementos de una factura.
|
||||
- **`Payment`**: Registra los pagos realizados por los usuarios.
|
||||
- **`ProductService`**: Define productos o servicios ofrecidos por la organización.
|
||||
- **`IVAType`**: Define los tipos de IVA aplicables.
|
||||
|
||||
---
|
||||
|
||||
## Relaciones entre Entidades
|
||||
|
||||
A continuación, se describen las relaciones principales entre las entidades:
|
||||
|
||||
### 1. **Relaciones en Gestión de Clases (`class_managment`)**
|
||||
|
||||
#### a) **`Membership` ↔ `Student`**
|
||||
- **Relación**: *Uno a Uno*.
|
||||
- **Descripción**:
|
||||
- Cada estudiante tiene una única membresía activa.
|
||||
- Una membresía está asociada a un único estudiante.
|
||||
|
||||
#### b) **`TrainingGroup` ↔ `TrainingSession`**
|
||||
- **Relación**: *Uno a Muchos*.
|
||||
- **Descripción**:
|
||||
- Un grupo de entrenamiento puede tener múltiples sesiones asociadas.
|
||||
- Cada sesión pertenece a un único grupo.
|
||||
|
||||
#### c) **`TrainingSession` ↔ `Assistance`**
|
||||
- **Relación**: *Uno a Muchos*.
|
||||
- **Descripción**:
|
||||
- Una sesión de entrenamiento puede registrar múltiples asistencias.
|
||||
- Cada asistencia está asociada a un único estudiante y una única sesión.
|
||||
|
||||
#### d) **`TrainingGroup` ↔ `Student`**
|
||||
- **Relación**: *Muchos a Muchos*.
|
||||
- **Descripción**:
|
||||
- Un estudiante puede pertenecer a varios grupos de entrenamiento.
|
||||
- Un grupo puede tener múltiples estudiantes inscritos.
|
||||
|
||||
---
|
||||
|
||||
### 2. **Relaciones en Gestión de Usuarios (`user_managment`)**
|
||||
|
||||
#### a) **`User` ↔ `Role`**
|
||||
- **Relación**: *Muchos a Uno*.
|
||||
- **Descripción**:
|
||||
- Cada usuario tiene un rol asignado.
|
||||
- Un rol puede estar asociado a múltiples usuarios.
|
||||
|
||||
#### b) **`Role` ↔ `Permission`**
|
||||
- **Relación**: *Muchos a Muchos*.
|
||||
- **Descripción**:
|
||||
- Un rol puede tener múltiples permisos asociados.
|
||||
- Un permiso puede estar asociado a múltiples roles.
|
||||
|
||||
#### c) **`Student` ↔ `StudentHistory`**
|
||||
- **Relación**: *Uno a Muchos*.
|
||||
- **Descripción**:
|
||||
- Cada estudiante tiene un historial único que registra sus actividades.
|
||||
|
||||
#### d) **`Notification` ↔ `User`**
|
||||
- **Relación**: *Muchos a Uno*.
|
||||
- **Descripción**:
|
||||
- Un usuario puede recibir múltiples notificaciones.
|
||||
- Cada notificación está asociada a un único usuario.
|
||||
|
||||
#### e) **`User` ↔ `Student`, `Teacher`, `Admin`**
|
||||
- **Relación**: *Uno a Uno* (por composición).
|
||||
- **Descripción**:
|
||||
- Un usuario puede estar asociado a un estudiante, profesor o administrador.
|
||||
- Estas relaciones permiten extender los atributos específicos de cada tipo de usuario sin usar herencia directa.
|
||||
|
||||
---
|
||||
|
||||
### 3. **Relaciones en Gestión Financiera (`finance`)**
|
||||
|
||||
#### a) **`Invoice` ↔ `InvoiceLine`**
|
||||
- **Relación**: *Uno a Muchos*.
|
||||
- **Descripción**:
|
||||
- Una factura puede contener múltiples líneas de detalle.
|
||||
- Cada línea pertenece a una única factura.
|
||||
|
||||
#### b) **`Invoice` ↔ `Payment`**
|
||||
- **Relación**: *Uno a Muchos*.
|
||||
- **Descripción**:
|
||||
- Una factura puede estar asociada a múltiples pagos parciales.
|
||||
- Cada pago pertenece a una única factura.
|
||||
|
||||
#### c) **`ProductService` ↔ `InvoiceLine`**
|
||||
- **Relación**: *Uno a Muchos*.
|
||||
- **Descripción**:
|
||||
- Un producto o servicio puede aparecer en múltiples líneas de factura.
|
||||
- Cada línea de factura está asociada a un único producto o servicio.
|
||||
|
||||
#### d) **`ProductService` ↔ `IVAType`**
|
||||
- **Relación**: *Muchos a Uno*.
|
||||
- **Descripción**:
|
||||
- Un producto o servicio tiene un único tipo de IVA asociado.
|
||||
- Un tipo de IVA puede aplicarse a múltiples productos o servicios.
|
||||
|
||||
---
|
||||
|
||||
## Servicios Implementados
|
||||
|
||||
### Servicios de Gestión de Clases
|
||||
- **`MembershipService`**: Proporciona lógica para gestionar las membresías de los estudiantes, incluyendo creación, actualización y cancelación.
|
||||
|
||||
### Servicios de Gestión de Usuarios
|
||||
- **`AdminService`**: Gestiona las operaciones relacionadas con los administradores del sistema.
|
||||
- **`NotificationService`**: Maneja el envío y la gestión de notificaciones para los usuarios.
|
||||
- **`PermissionService`**: Administra los permisos asociados a los roles de los usuarios.
|
||||
- **`RoleService`**: Gestiona los roles de los usuarios, incluyendo asignación y modificación.
|
||||
- **`StudentHistoryService`**: Proporciona lógica para registrar y consultar el historial de actividades de los estudiantes.
|
||||
- **`StudentService`**: Gestiona las operaciones relacionadas con los estudiantes, como inscripción y actualización de datos.
|
||||
- **`TeacherService`**: Administra las operaciones relacionadas con los profesores, incluyendo asignación de grupos.
|
||||
- **`UserService`**: Proporciona lógica general para la gestión de usuarios, como autenticación y actualización de perfiles.
|
||||
|
||||
---
|
||||
|
||||
## Estado Actual del Proyecto
|
||||
|
||||
- **Pruebas Locales**: Actualmente, el proyecto se prueba utilizando el módulo de `user_managment` de manera local. Esto incluye la gestión de usuarios, roles, permisos y notificaciones.
|
||||
- **Base de Datos**: La configuración de la base de datos está definida en el archivo `HibernateConfig`.
|
||||
- **Servicios**: Los servicios implementados hasta ahora incluyen lógica básica para la gestión de usuarios y clases.
|
||||
|
||||
---
|
||||
|
||||
## Instalación y Ejecución
|
||||
|
||||
1. Clonar el repositorio:
|
||||
```bash
|
||||
git clone https://github.com/tu-usuario/memberflow-data.git
|
||||
cd memberflow-data
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.denniseckerskorn</groupId>
|
||||
<artifactId>memberflow-data</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<dependencies>
|
||||
<!-- MySQL Connector -->
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
<version>8.0.33</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Boot Starter Data JPA -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Boot Starter Security -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Boot Starter -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<version>3.4.4</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-annotations</artifactId>
|
||||
<version>2.19.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>21</maven.compiler.source>
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
package com.denniseckerskorn.config;
|
||||
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.orm.jpa.JpaTransactionManager;
|
||||
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
|
||||
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.Properties;
|
||||
|
||||
@Configuration
|
||||
@EnableTransactionManagement
|
||||
public class HibernateConfig {
|
||||
|
||||
private final Environment env;
|
||||
|
||||
public HibernateConfig(Environment env) {
|
||||
this.env = env;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DataSource dataSource() {
|
||||
HikariDataSource dataSource = new HikariDataSource();
|
||||
dataSource.setJdbcUrl(env.getProperty("spring.datasource.url"));
|
||||
dataSource.setUsername(env.getProperty("spring.datasource.username"));
|
||||
dataSource.setPassword(env.getProperty("spring.datasource.password"));
|
||||
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
|
||||
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
|
||||
emf.setDataSource(dataSource);
|
||||
emf.setPackagesToScan("com.denniseckerskorn.entities");
|
||||
emf.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
|
||||
|
||||
Properties jpaProperties = new Properties();
|
||||
jpaProperties.put("hibernate.dialect", env.getProperty("spring.jpa.database-platform"));
|
||||
jpaProperties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
|
||||
jpaProperties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
|
||||
jpaProperties.put("hibernate.current_session_context_class", env.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));
|
||||
emf.setJpaProperties(jpaProperties);
|
||||
|
||||
return emf;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) {
|
||||
JpaTransactionManager transactionManager = new JpaTransactionManager();
|
||||
transactionManager.setEntityManagerFactory(emf.getObject());
|
||||
return transactionManager;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
package com.denniseckerskorn.entities.class_managment;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "ASSISTANCE")
|
||||
public class Assistance {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_training_session", nullable = false)
|
||||
private TrainingSession trainingSession;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_student", nullable = false)
|
||||
private Student student;
|
||||
|
||||
@Column(name = "date_time", nullable = false)
|
||||
private LocalDateTime date;
|
||||
|
||||
public Assistance() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public TrainingSession getTrainingSession() {
|
||||
return trainingSession;
|
||||
}
|
||||
|
||||
public Student getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public LocalDateTime getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setTrainingSession(TrainingSession trainingSession) {
|
||||
this.trainingSession = trainingSession;
|
||||
}
|
||||
|
||||
public void setStudent(Student student) {
|
||||
this.student = student;
|
||||
}
|
||||
|
||||
public void setDate(LocalDateTime date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Assistance that = (Assistance) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Assistance{" +
|
||||
"id=" + id +
|
||||
", trainingSessionId=" + (trainingSession != null ? trainingSession.getId() : "null") +
|
||||
", studentId=" + (student != null ? student.getId() : "null") +
|
||||
", date=" + date +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
package com.denniseckerskorn.entities.class_managment;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.enums.MembershipTypeValues;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "MEMBERSHIPS")
|
||||
public class Membership {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "type", nullable = false, length = 50)
|
||||
private MembershipTypeValues type;
|
||||
|
||||
@Column(name = "start_date", nullable = false)
|
||||
private LocalDate startDate;
|
||||
|
||||
@Column(name = "end_date", nullable = false)
|
||||
private LocalDate endDate;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status", nullable = false, length = 20)
|
||||
private StatusValues status;
|
||||
|
||||
@OneToOne(mappedBy = "membership")
|
||||
private Student student;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public MembershipTypeValues getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public LocalDate getStartDate() {
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public LocalDate getEndDate() {
|
||||
return endDate;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public Student getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setType(MembershipTypeValues type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public void setStartDate(LocalDate startDate) {
|
||||
this.startDate = startDate;
|
||||
}
|
||||
|
||||
public void setEndDate(LocalDate endDate) {
|
||||
this.endDate = endDate;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public void setStudent(Student student) {
|
||||
this.student = student;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Membership that = (Membership) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Membership{" +
|
||||
"id=" + id +
|
||||
", type='" + type + '\'' +
|
||||
", startDate=" + startDate +
|
||||
", endDate=" + endDate +
|
||||
", status=" + status +
|
||||
", student=" + (student != null ? student.getId() : "null") +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
package com.denniseckerskorn.entities.class_managment;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import com.denniseckerskorn.entities.user_managment.users.Teacher;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "TRAINING_GROUPS")
|
||||
public class TrainingGroup {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_teacher", nullable = false)
|
||||
private Teacher teacher;
|
||||
|
||||
@Column(name = "name", nullable = false, length = 45)
|
||||
private String name;
|
||||
|
||||
@Column(name = "level", length = 45)
|
||||
private String level;
|
||||
|
||||
@Column(name = "schedule", nullable = false)
|
||||
private LocalDateTime schedule;
|
||||
|
||||
@OneToMany(mappedBy = "trainingGroup", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
private Set<TrainingSession> trainingSessions = new HashSet<>();
|
||||
|
||||
@ManyToMany(mappedBy = "trainingGroups")
|
||||
private Set<Student> students = new HashSet<>();
|
||||
|
||||
public TrainingGroup() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Teacher getTeacher() {
|
||||
return teacher;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getLevel() {
|
||||
return level;
|
||||
}
|
||||
|
||||
public LocalDateTime getSchedule() {
|
||||
return schedule;
|
||||
}
|
||||
|
||||
public Set<TrainingSession> getTrainingSessions() {
|
||||
return trainingSessions;
|
||||
}
|
||||
|
||||
public Set<Student> getStudents() {
|
||||
return students;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setTeacher(Teacher teacher) {
|
||||
this.teacher = teacher;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setLevel(String level) {
|
||||
this.level = level;
|
||||
}
|
||||
|
||||
public void setSchedule(LocalDateTime schedule) {
|
||||
this.schedule = schedule;
|
||||
}
|
||||
|
||||
public void setTrainingSessions(Set<TrainingSession> trainingSessions) {
|
||||
this.trainingSessions = trainingSessions;
|
||||
}
|
||||
|
||||
public void setStudents(Set<Student> students) {
|
||||
this.students = students;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
TrainingGroup group = (TrainingGroup) o;
|
||||
return Objects.equals(id, group.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Group{" +
|
||||
"id=" + id +
|
||||
", teacherId=" + (teacher != null ? teacher.getId() : "null") +
|
||||
", name='" + name + '\'' +
|
||||
", level='" + (level != null ? level : "null") + '\'' +
|
||||
", schedule='" + schedule + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
package com.denniseckerskorn.entities.class_managment;
|
||||
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "TRAINING_SESSIONS")
|
||||
public class TrainingSession {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_group", nullable = false)
|
||||
private TrainingGroup trainingGroup;
|
||||
|
||||
@Column(name = "date_time")
|
||||
private LocalDateTime date;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status", length = 50)
|
||||
private StatusValues status;
|
||||
|
||||
//TODO: Control the assitances history, at the moment when group is removed, the assistances are removed too
|
||||
@OneToMany(mappedBy = "trainingSession", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
private Set<Assistance> assistances = new HashSet<>();
|
||||
|
||||
public TrainingSession() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public TrainingGroup getTrainingGroup() {
|
||||
return trainingGroup;
|
||||
}
|
||||
|
||||
public LocalDateTime getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public Set<Assistance> getAssistances() {
|
||||
return assistances;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setTrainingGroup(TrainingGroup trainingGroup) {
|
||||
this.trainingGroup = trainingGroup;
|
||||
}
|
||||
|
||||
public void setDate(LocalDateTime date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public void setAssistances(Set<Assistance> assistances) {
|
||||
this.assistances = assistances;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
TrainingSession that = (TrainingSession) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TrainingSession{" +
|
||||
"id=" + id +
|
||||
", groupId=" + (trainingGroup != null ? trainingGroup.getId() : "null") +
|
||||
", date=" + date +
|
||||
", status=" + status +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
package com.denniseckerskorn.entities.finance;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "IVA_TYPE")
|
||||
public class IVAType {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Column(name = "percentage", nullable = false)
|
||||
private BigDecimal percentage;
|
||||
|
||||
@Column(name = "description", length = 50)
|
||||
private String description;
|
||||
|
||||
public IVAType() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public BigDecimal getPercentage() {
|
||||
return percentage;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setPercentage(BigDecimal percentage) {
|
||||
this.percentage = percentage;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
IVAType ivaType = (IVAType) o;
|
||||
return Objects.equals(id, ivaType.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "IvaType{" +
|
||||
"id=" + id +
|
||||
", percentage=" + percentage +
|
||||
", description='" + description + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,127 @@
|
|||
package com.denniseckerskorn.entities.finance;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "INVOICES")
|
||||
public class Invoice {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_user", nullable = false)
|
||||
private User user;
|
||||
|
||||
@Column(name = "date", nullable = false)
|
||||
private LocalDateTime date;
|
||||
|
||||
@Column(name = "total", nullable = false)
|
||||
private BigDecimal total;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status", nullable = false)
|
||||
private StatusValues status;
|
||||
|
||||
@OneToOne(mappedBy = "invoice", cascade = CascadeType.ALL, orphanRemoval = false)
|
||||
private Payment payment;
|
||||
|
||||
@OneToMany(mappedBy = "invoice", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
private Set<InvoiceLine> invoiceLines = new HashSet<>();
|
||||
|
||||
public Invoice() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public LocalDateTime getDate() {
|
||||
return date;
|
||||
}
|
||||
|
||||
public BigDecimal getTotal() {
|
||||
return total;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public Payment getPayment() {
|
||||
return payment;
|
||||
}
|
||||
|
||||
public Set<InvoiceLine> getInvoiceLines() {
|
||||
return invoiceLines;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public void setDate(LocalDateTime date) {
|
||||
this.date = date;
|
||||
}
|
||||
|
||||
public void setTotal(BigDecimal total) {
|
||||
this.total = total;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public void setPayment(Payment payment) {
|
||||
this.payment = payment;
|
||||
}
|
||||
|
||||
public void setInvoiceLines(Set<InvoiceLine> invoiceLines) {
|
||||
this.invoiceLines = invoiceLines;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Invoice invoice = (Invoice) o;
|
||||
return Objects.equals(id, invoice.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Invoice{" +
|
||||
"id=" + id +
|
||||
", userId=" + (user != null ? user.getId() : "null") +
|
||||
", date=" + date +
|
||||
", total=" + total +
|
||||
", status='" + status + '\'' +
|
||||
", paymentId=" + (payment != null ? payment.getId() : "null") +
|
||||
", invoiceLines= [size hidden for lazy loading safety]" +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
package com.denniseckerskorn.entities.finance;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "INVOICE_LINES")
|
||||
public class InvoiceLine {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_invoice", nullable = false)
|
||||
private Invoice invoice;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_product_service", nullable = false)
|
||||
private ProductService productService;
|
||||
|
||||
@Column(name = "description", columnDefinition = "TEXT")
|
||||
private String description;
|
||||
|
||||
@Column(name = "quantity", nullable = false)
|
||||
private Integer quantity;
|
||||
|
||||
@Column(name = "unit_price", nullable = false)
|
||||
private BigDecimal unitPrice;
|
||||
|
||||
@Column(name = "subtotal", nullable = false)
|
||||
private BigDecimal subtotal;
|
||||
|
||||
public InvoiceLine() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Invoice getInvoice() {
|
||||
return invoice;
|
||||
}
|
||||
|
||||
public ProductService getProductService() {
|
||||
return productService;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public Integer getQuantity() {
|
||||
return quantity;
|
||||
}
|
||||
|
||||
public BigDecimal getUnitPrice() {
|
||||
return unitPrice;
|
||||
}
|
||||
|
||||
public BigDecimal getSubtotal() {
|
||||
return subtotal;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setInvoice(Invoice invoice) {
|
||||
this.invoice = invoice;
|
||||
}
|
||||
|
||||
public void setProductService(ProductService productService) {
|
||||
this.productService = productService;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public void setQuantity(Integer quantity) {
|
||||
this.quantity = quantity;
|
||||
}
|
||||
|
||||
public void setUnitPrice(BigDecimal unitPrice) {
|
||||
this.unitPrice = unitPrice;
|
||||
}
|
||||
|
||||
public void setSubtotal(BigDecimal subtotal) {
|
||||
this.subtotal = subtotal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
InvoiceLine that = (InvoiceLine) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "InvoiceLine{" +
|
||||
"id=" + id +
|
||||
", invoiceId=" + (invoice != null ? invoice.getId() : "null") +
|
||||
", productServiceId=" + (productService != null ? productService.getId() : "null") +
|
||||
", quantity=" + quantity +
|
||||
", unitPrice=" + unitPrice +
|
||||
", subtotal=" + subtotal +
|
||||
", description='" + description + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
package com.denniseckerskorn.entities.finance;
|
||||
|
||||
import com.denniseckerskorn.enums.PaymentMethodValues;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "PAYMENTS")
|
||||
public class Payment {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "fk_invoice", nullable = false)
|
||||
private Invoice invoice;
|
||||
|
||||
@Column(name = "payment_date", nullable = false)
|
||||
private LocalDateTime paymentDate;
|
||||
|
||||
@Column(name = "amount", nullable = false)
|
||||
private BigDecimal amount;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "payment_method", nullable = false, length = 50)
|
||||
private PaymentMethodValues paymentMethod;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status", nullable = false, length = 20)
|
||||
private StatusValues status;
|
||||
|
||||
public Payment() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Invoice getInvoice() {
|
||||
return invoice;
|
||||
}
|
||||
|
||||
public LocalDateTime getPaymentDate() {
|
||||
return paymentDate;
|
||||
}
|
||||
|
||||
public BigDecimal getAmount() {
|
||||
return amount;
|
||||
}
|
||||
|
||||
public PaymentMethodValues getPaymentMethod() {
|
||||
return paymentMethod;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setInvoice(Invoice invoice) {
|
||||
this.invoice = invoice;
|
||||
}
|
||||
|
||||
public void setPaymentDate(LocalDateTime paymentDate) {
|
||||
this.paymentDate = paymentDate;
|
||||
}
|
||||
|
||||
public void setAmount(BigDecimal amount) {
|
||||
this.amount = amount;
|
||||
}
|
||||
|
||||
public void setPaymentMethod(PaymentMethodValues paymentMethod) {
|
||||
this.paymentMethod = paymentMethod;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Payment payment = (Payment) o;
|
||||
return Objects.equals(id, payment.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Payment{" +
|
||||
"id=" + id +
|
||||
", invoiceId=" + (invoice != null ? invoice.getId() : "null") +
|
||||
", paymentDate=" + paymentDate +
|
||||
", amount=" + amount +
|
||||
", paymentMethod='" + paymentMethod + '\'' +
|
||||
", status='" + status + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
package com.denniseckerskorn.entities.finance;
|
||||
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "PRODUCTS_SERVICES")
|
||||
public class ProductService {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_iva_type", nullable = false)
|
||||
private IVAType ivaType;
|
||||
|
||||
@Column(name = "name", nullable = false, length = 100)
|
||||
private String name;
|
||||
|
||||
@Column(name = "description", length = 250)
|
||||
private String description;
|
||||
|
||||
@Column(name = "price", nullable = false)
|
||||
private BigDecimal price;
|
||||
|
||||
@Column(name = "type", nullable = false, length = 45)
|
||||
private String type;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status", nullable = false, length = 20)
|
||||
private StatusValues status;
|
||||
|
||||
public ProductService() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public IVAType getIvaType() {
|
||||
return ivaType;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public BigDecimal getPrice() {
|
||||
return price;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setIvaType(IVAType ivaType) {
|
||||
this.ivaType = ivaType;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public void setPrice(BigDecimal price) {
|
||||
this.price = price;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
ProductService that = (ProductService) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ProductService{" +
|
||||
"id=" + id +
|
||||
", ivaTypeId=" + (ivaType != null ? ivaType.getId() : "null") +
|
||||
", name='" + name + '\'' +
|
||||
", price=" + price +
|
||||
", type='" + type + '\'' +
|
||||
", status='" + status + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,151 @@
|
|||
package com.denniseckerskorn.entities.user_managment;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.User;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "NOTIFICATIONS")
|
||||
public class Notification {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Column(name = "title", length = 200, nullable = false)
|
||||
private String title;
|
||||
|
||||
@Column(name = "message", columnDefinition = "TEXT")
|
||||
private String message;
|
||||
|
||||
@Column(name = "shipping_date", nullable = false)
|
||||
private LocalDateTime shippingDate;
|
||||
|
||||
@Column(length = 100)
|
||||
private String type;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(length = 50)
|
||||
private StatusValues status;
|
||||
|
||||
@ManyToMany(fetch = FetchType.LAZY)
|
||||
@JoinTable(
|
||||
name = "USERS_NOTIFICATIONS",
|
||||
joinColumns = @JoinColumn(name = "fk_notification"),
|
||||
inverseJoinColumns = @JoinColumn(name = "fk_user"),
|
||||
uniqueConstraints = @UniqueConstraint(
|
||||
name = "uk_notification_user",
|
||||
columnNames = {"fk_notification", "fk_user"}
|
||||
)
|
||||
)
|
||||
private Set<User> users = new HashSet<>();
|
||||
|
||||
public Notification() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Set<User> getUsers() {
|
||||
return users;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return message;
|
||||
}
|
||||
|
||||
public LocalDateTime getShippingDate() {
|
||||
return shippingDate;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUsers(Set<User> users) {
|
||||
this.users = users;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public void setShippingDate(LocalDateTime shippingDate) {
|
||||
this.shippingDate = shippingDate;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public void addUser(User user) {
|
||||
if (this.users == null) {
|
||||
this.users = new HashSet<>();
|
||||
}
|
||||
this.users.add(user);
|
||||
if (user.getNotifications() == null) {
|
||||
user.setNotifications(new HashSet<>());
|
||||
}
|
||||
user.getNotifications().add(this);
|
||||
}
|
||||
|
||||
public void removeUser(User user) {
|
||||
if (this.users != null) {
|
||||
this.users.remove(user);
|
||||
if (user.getNotifications() != null) {
|
||||
user.getNotifications().remove(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Notification that = (Notification) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Notifications{" +
|
||||
"id=" + (id != null ? id : "null") +
|
||||
", title='" + (title != null ? title : "null") + '\'' +
|
||||
", message='" + (message != null ? message : "null") + '\'' +
|
||||
", shippingDate=" + (shippingDate != null ? shippingDate : "null") +
|
||||
", type='" + (type != null ? type : "null") + '\'' +
|
||||
", status=" + (status != null ? status : "null") +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
package com.denniseckerskorn.entities.user_managment;
|
||||
|
||||
import com.denniseckerskorn.enums.PermissionValues;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "PERMISSIONS")
|
||||
public class Permission {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "name", nullable = false, length = 45)
|
||||
private PermissionValues permissionName;
|
||||
|
||||
@ManyToMany(mappedBy = "permissions", fetch = FetchType.LAZY)
|
||||
private Set<Role> roles = new HashSet<>();
|
||||
|
||||
public Permission() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public PermissionValues getPermissionName() {
|
||||
return permissionName;
|
||||
}
|
||||
|
||||
public Set<Role> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setRoles(Set<Role> roles) {
|
||||
this.roles = roles;
|
||||
}
|
||||
|
||||
public void setPermissionName(PermissionValues permissionName) {
|
||||
this.permissionName = permissionName;
|
||||
}
|
||||
|
||||
public void addRole(Role role) {
|
||||
this.roles.add(role);
|
||||
role.getPermissions().add(this);
|
||||
}
|
||||
|
||||
public void removeRole(Role role) {
|
||||
this.roles.remove(role);
|
||||
role.getPermissions().remove(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Permission that = (Permission) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Permission{" +
|
||||
"id=" + id +
|
||||
", privilegeName=" + permissionName +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,100 @@
|
|||
package com.denniseckerskorn.entities.user_managment;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import org.hibernate.annotations.Fetch;
|
||||
import org.hibernate.annotations.FetchMode;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "ROLES")
|
||||
public class Role {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@Column(name = "name", nullable = false, length = 45)
|
||||
private String name;
|
||||
|
||||
@ManyToMany(fetch = FetchType.LAZY)
|
||||
@Fetch(FetchMode.JOIN)
|
||||
@JoinTable(
|
||||
name = "ROLES_PERMISSIONS",
|
||||
joinColumns = @JoinColumn(name = "fk_role"),
|
||||
inverseJoinColumns = @JoinColumn(name = "fk_permission"),
|
||||
uniqueConstraints = @UniqueConstraint(
|
||||
name = "uk_role_permission",
|
||||
columnNames = {"fk_role", "fk_permission"}
|
||||
)
|
||||
)
|
||||
private Set<Permission> permissions = new HashSet<>();
|
||||
|
||||
public Role() {
|
||||
}
|
||||
|
||||
public Role(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public Set<Permission> getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setPermissions(Set<Permission> permissions) {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
public void addPermission(Permission permission) {
|
||||
if (this.permissions == null) {
|
||||
this.permissions = new HashSet<>();
|
||||
}
|
||||
this.permissions.add(permission);
|
||||
}
|
||||
|
||||
public void removePermission(Permission permission) {
|
||||
if (this.permissions != null) {
|
||||
this.permissions.remove(permission);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Role role = (Role) o;
|
||||
return Objects.equals(id, role.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Role{" +
|
||||
"id=" + id +
|
||||
", name='" + (name != null ? name : "null") + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
package com.denniseckerskorn.entities.user_managment;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Student;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "STUDENT_HISTORY")
|
||||
public class StudentHistory {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_student", nullable = false)
|
||||
private Student student;
|
||||
|
||||
@Column(name = "event_date")
|
||||
private LocalDate eventDate;
|
||||
|
||||
@Column(name = "event_type")
|
||||
private String eventType;
|
||||
|
||||
@Column(name = "description")
|
||||
private String description;
|
||||
|
||||
public StudentHistory() {
|
||||
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Student getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public LocalDate getEventDate() {
|
||||
return eventDate;
|
||||
}
|
||||
|
||||
public String getEventType() {
|
||||
return eventType;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setStudent(Student student) {
|
||||
this.student = student;
|
||||
}
|
||||
|
||||
public void setEventDate(LocalDate eventDate) {
|
||||
this.eventDate = eventDate;
|
||||
}
|
||||
|
||||
public void setEventType(String eventType) {
|
||||
this.eventType = eventType;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) return true;
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
StudentHistory that = (StudentHistory) o;
|
||||
return Objects.equals(id, that.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "StudentHistory{" +
|
||||
"id=" + (id != null ? id : "null") +
|
||||
", student=" + (student != null ? "Student{id=" + student.getId() + "}" : "null") +
|
||||
", eventDate=" + (eventDate != null ? eventDate : "null") +
|
||||
", eventType='" + (eventType != null ? eventType : "null") + '\'' +
|
||||
", description='" + (description != null ? description : "null") + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
package com.denniseckerskorn.entities.user_managment.users;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@Table(name = "ADMINS")
|
||||
public class Admin {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "fk_user", nullable = false, unique = true)
|
||||
private User user;
|
||||
|
||||
public Admin() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Admin admin = (Admin) o;
|
||||
return Objects.equals(id, admin.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Admin{" +
|
||||
"id=" + id +
|
||||
", userId=" + (user != null ? user.getId() : "null") +
|
||||
", userEmail=" + (user != null ? user.getEmail() : "null") +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,185 @@
|
|||
package com.denniseckerskorn.entities.user_managment.users;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.Assistance;
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import com.denniseckerskorn.entities.class_managment.Membership;
|
||||
import com.denniseckerskorn.entities.user_managment.StudentHistory;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "STUDENTS")
|
||||
public class Student {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "fk_user", nullable = false, unique = true)
|
||||
private User user;
|
||||
|
||||
@Column(name = "dni", nullable = false, length = 10, unique = true)
|
||||
private String dni;
|
||||
|
||||
@Column(name = "birthdate", nullable = false)
|
||||
private LocalDate birthdate;
|
||||
|
||||
@Column(name = "belt", length = 20)
|
||||
private String belt;
|
||||
|
||||
@Column(name = "progress", columnDefinition = "TEXT")
|
||||
private String progress;
|
||||
|
||||
@Column(name = "medical_report", length = 500)
|
||||
private String medicalReport;
|
||||
|
||||
@Column(name = "parent_name", length = 50)
|
||||
private String parentName;
|
||||
|
||||
@OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
private Set<StudentHistory> histories = new HashSet<>();
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "fk_membership")
|
||||
private Membership membership;
|
||||
|
||||
@OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
private Set<Assistance> assistances = new HashSet<>();
|
||||
|
||||
@ManyToMany
|
||||
@JoinTable(name = "STUDENTS_GROUPS", joinColumns = @JoinColumn(name = "fk_student"), inverseJoinColumns = @JoinColumn(name = "fk_group"))
|
||||
private Set<TrainingGroup> trainingGroups = new HashSet<>();
|
||||
|
||||
public Student() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public String getDni() {
|
||||
return dni;
|
||||
}
|
||||
|
||||
public LocalDate getBirthdate() {
|
||||
return birthdate;
|
||||
}
|
||||
|
||||
public Set<StudentHistory> getHistories() {
|
||||
return histories;
|
||||
}
|
||||
|
||||
public Membership getMembership() {
|
||||
return membership;
|
||||
}
|
||||
|
||||
public String getMedicalReport() {
|
||||
return medicalReport;
|
||||
}
|
||||
|
||||
public String getParentName() {
|
||||
return parentName;
|
||||
}
|
||||
|
||||
public String getBelt() {
|
||||
return belt;
|
||||
}
|
||||
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
|
||||
public Set<Assistance> getAssistances() {
|
||||
return assistances;
|
||||
}
|
||||
|
||||
public Set<TrainingGroup> getTrainingGroups() {
|
||||
return trainingGroups;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public void setMedicalReport(String medicalReport) {
|
||||
this.medicalReport = medicalReport;
|
||||
}
|
||||
|
||||
public void setParentName(String parentName) {
|
||||
this.parentName = parentName;
|
||||
}
|
||||
|
||||
public void setDni(String dni) {
|
||||
this.dni = dni;
|
||||
}
|
||||
|
||||
public void setBirthdate(LocalDate birthdate) {
|
||||
this.birthdate = birthdate;
|
||||
}
|
||||
|
||||
public void setBelt(String belt) {
|
||||
this.belt = belt;
|
||||
}
|
||||
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
|
||||
public void setHistories(Set<StudentHistory> histories) {
|
||||
this.histories = histories;
|
||||
}
|
||||
|
||||
public void setMembership(Membership membership) {
|
||||
this.membership = membership;
|
||||
}
|
||||
|
||||
public void setAssistances(Set<Assistance> assistances) {
|
||||
this.assistances = assistances;
|
||||
}
|
||||
|
||||
public void setTrainingGroups(Set<TrainingGroup> trainingGroups) {
|
||||
this.trainingGroups = trainingGroups;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Student student = (Student) o;
|
||||
return Objects.equals(id, student.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Student{" +
|
||||
"dni='" + (dni != null ? dni : "null") + '\'' +
|
||||
", birthdate=" + (birthdate != null ? birthdate : "null") +
|
||||
", belt='" + (belt != null ? belt : "null") + '\'' +
|
||||
", progress='" + (progress != null ? progress : "null") + '\'' +
|
||||
", medicalReport='" + (medicalReport != null ? medicalReport : "null") + '\'' +
|
||||
", parentName='" + (parentName != null ? parentName : "null") + '\'' +
|
||||
", membershipId=" + (membership != null ? membership.getId() : "null") +
|
||||
//", trainingGroups=" + (trainingGroups != null ? trainingGroups.size() : "null") +
|
||||
//", assistances=" + (assistances != null ? assistances.size() : "null") +
|
||||
//", histories=" + (histories != null ? histories.size() : "null") +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
package com.denniseckerskorn.entities.user_managment.users;
|
||||
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "TEACHERS")
|
||||
public class Teacher {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "fk_user", nullable = false, unique = true)
|
||||
private User user;
|
||||
|
||||
@Column(name = "discipline", length = 50)
|
||||
private String discipline;
|
||||
|
||||
@OneToMany(mappedBy = "teacher", cascade = CascadeType.ALL, orphanRemoval = true)
|
||||
private Set<TrainingGroup> trainingGroups = new HashSet<>();
|
||||
|
||||
public Teacher() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public User getUser() {
|
||||
return user;
|
||||
}
|
||||
|
||||
public String getDiscipline() {
|
||||
return discipline;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setUser(User user) {
|
||||
this.user = user;
|
||||
}
|
||||
|
||||
public Set<TrainingGroup> getTrainingGroups() {
|
||||
return trainingGroups;
|
||||
}
|
||||
|
||||
public void setDiscipline(String discipline) {
|
||||
this.discipline = discipline;
|
||||
}
|
||||
|
||||
public void setTrainingGroups(Set<TrainingGroup> trainingGroups) {
|
||||
this.trainingGroups = trainingGroups;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
Teacher teacher = (Teacher) o;
|
||||
return Objects.equals(id, teacher.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Teacher{" +
|
||||
"discipline='" + (discipline != null ? discipline : "null") + '\'' +
|
||||
", super=" + super.toString() +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,235 @@
|
|||
package com.denniseckerskorn.entities.user_managment.users;
|
||||
|
||||
import com.denniseckerskorn.entities.finance.Invoice;
|
||||
import com.denniseckerskorn.entities.user_managment.Notification;
|
||||
import com.denniseckerskorn.entities.user_managment.Role;
|
||||
import com.denniseckerskorn.enums.StatusValues;
|
||||
import jakarta.persistence.*;
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
@Entity
|
||||
@Table(name = "USERS")
|
||||
public class User {
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
|
||||
@JsonIgnore
|
||||
private Student student;
|
||||
|
||||
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
|
||||
@JsonIgnore
|
||||
private Teacher teacher;
|
||||
|
||||
@OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
|
||||
@JsonIgnore
|
||||
private Admin admin;
|
||||
|
||||
@Column(name = "name", nullable = false, length = 50)
|
||||
private String name;
|
||||
|
||||
@Column(name = "surname", nullable = false, length = 50)
|
||||
private String surname;
|
||||
|
||||
@Column(name = "phone_number", nullable = false, length = 30)
|
||||
private String phoneNumber;
|
||||
|
||||
@Column(name = "email", nullable = false, unique = true, length = 100)
|
||||
private String email;
|
||||
|
||||
@Column(name = "password", nullable = false, length = 255)
|
||||
private String password;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
@Column(name = "status", nullable = false, length = 20)
|
||||
private StatusValues status;
|
||||
|
||||
@Column(name = "register_date", nullable = false)
|
||||
private LocalDateTime registerDate;
|
||||
|
||||
@Column(name = "address", nullable = false, length = 100)
|
||||
private String address;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "fk_role", nullable = false)
|
||||
private Role role;
|
||||
|
||||
@ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)
|
||||
private Set<Notification> notifications = new HashSet<>();
|
||||
|
||||
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST)
|
||||
private Set<Invoice> invoices = new HashSet<>();
|
||||
|
||||
public User() {
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public Student getStudent() {
|
||||
return student;
|
||||
}
|
||||
|
||||
public Teacher getTeacher() {
|
||||
return teacher;
|
||||
}
|
||||
|
||||
public Admin getAdmin() {
|
||||
return admin;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getSurname() {
|
||||
return surname;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public StatusValues getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public LocalDateTime getRegisterDate() {
|
||||
return registerDate;
|
||||
}
|
||||
|
||||
public Role getRole() {
|
||||
return role;
|
||||
}
|
||||
|
||||
public Set<Notification> getNotifications() {
|
||||
return notifications;
|
||||
}
|
||||
|
||||
public Set<Invoice> getInvoices() {
|
||||
return invoices;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public void setStudent(Student student) {
|
||||
this.student = student;
|
||||
}
|
||||
|
||||
public void setTeacher(Teacher teacher) {
|
||||
this.teacher = teacher;
|
||||
}
|
||||
|
||||
public void setAdmin(Admin admin) {
|
||||
this.admin = admin;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public void setSurname(String surname) {
|
||||
this.surname = surname;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public void setStatus(StatusValues status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public void setRegisterDate(LocalDateTime registerDate) {
|
||||
this.registerDate = registerDate;
|
||||
}
|
||||
|
||||
public void setRole(Role role) {
|
||||
this.role = role;
|
||||
}
|
||||
|
||||
public void setNotifications(Set<Notification> notifications) {
|
||||
this.notifications = notifications;
|
||||
}
|
||||
|
||||
public void setInvoices(Set<Invoice> invoices) {
|
||||
this.invoices = invoices;
|
||||
}
|
||||
|
||||
public void addNotification(Notification notification) {
|
||||
this.notifications.add(notification);
|
||||
notification.getUsers().add(this);
|
||||
}
|
||||
|
||||
public void removeNotification(Notification notification) {
|
||||
this.notifications.remove(notification);
|
||||
notification.getUsers().remove(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (o == null || getClass() != o.getClass()) return false;
|
||||
|
||||
User user = (User) o;
|
||||
return Objects.equals(id, user.id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "User{" +
|
||||
"id=" + id +
|
||||
", name='" + (name != null ? name : "null") + '\'' +
|
||||
", surname='" + (surname != null ? surname : "null") + '\'' +
|
||||
", phoneNumber='" + (phoneNumber != null ? phoneNumber : "null") + '\'' +
|
||||
", email='" + (email != null ? email : "null") + '\'' +
|
||||
", password='******'" +
|
||||
", status='" + (status != null ? status : "null") + '\'' +
|
||||
", registerDate=" + (registerDate != null ? registerDate : "null") +
|
||||
", address='" + (address != null ? address : "null") + '\'' +
|
||||
", role=" + (role != null ? role.getName() : "null") +
|
||||
", studentId=" + (student != null ? student.getId() : "null") +
|
||||
", teacherId=" + (teacher != null ? teacher.getId() : "null") +
|
||||
", adminId=" + (admin != null ? admin.getId() : "null") +
|
||||
'}';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
package com.denniseckerskorn.enums;
|
||||
|
||||
public enum MembershipTypeValues {
|
||||
BASIC,
|
||||
ADVANCED,
|
||||
PREMIUM,
|
||||
NO_LIMIT,
|
||||
TRIAL,
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.enums;
|
||||
|
||||
public enum PaymentMethodValues {
|
||||
CASH,
|
||||
CREDIT_CARD,
|
||||
BANK_TRANSFER
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.enums;
|
||||
|
||||
public enum PermissionValues {
|
||||
FULL_ACCESS,
|
||||
MANAGE_STUDENTS,
|
||||
VIEW_OWN_DATA
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
package com.denniseckerskorn.enums;
|
||||
|
||||
public enum StatusValues {
|
||||
ACTIVE,
|
||||
INACTIVE,
|
||||
SUSPENDED,
|
||||
DELETED,
|
||||
PAID,
|
||||
NOT_PAID,
|
||||
SENT,
|
||||
NOT_SENT,
|
||||
PENDING
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.exceptions;
|
||||
|
||||
public class BadRequestException extends RuntimeException {
|
||||
public BadRequestException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package com.denniseckerskorn.exceptions;
|
||||
|
||||
public class DuplicateEntityException extends RuntimeException {
|
||||
public DuplicateEntityException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public DuplicateEntityException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public DuplicateEntityException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public DuplicateEntityException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.denniseckerskorn.exceptions;
|
||||
|
||||
public class EntityNotFoundException extends RuntimeException {
|
||||
|
||||
public EntityNotFoundException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public EntityNotFoundException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public EntityNotFoundException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public EntityNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
package com.denniseckerskorn.exceptions;
|
||||
|
||||
public class InvalidDataException extends RuntimeException {
|
||||
public InvalidDataException(String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
public InvalidDataException(String message, Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
public InvalidDataException(Throwable cause) {
|
||||
super(cause);
|
||||
}
|
||||
|
||||
public InvalidDataException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
|
||||
super(message, cause, enableSuppression, writableStackTrace);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
package com.denniseckerskorn.repositories.class_managment_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.Assistance;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public interface AssistanceRepository extends JpaRepository<Assistance, Integer> {
|
||||
Assistance findByTrainingSessionId(Integer trainingSessionId);
|
||||
|
||||
Assistance findByStudentId(Integer studentId);
|
||||
|
||||
@Query("SELECT a FROM Assistance a WHERE a.date BETWEEN :start AND :end")
|
||||
List<Assistance> findAllByDateRange(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end);
|
||||
|
||||
Assistance findByTrainingSessionIdAndStudentId(Integer trainingSessionId, Integer studentId);
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
package com.denniseckerskorn.repositories.class_managment_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.Membership;
|
||||
import com.denniseckerskorn.enums.MembershipTypeValues;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
public interface MembershipRepository extends JpaRepository<Membership, Integer> {
|
||||
Membership findByType(MembershipTypeValues type);
|
||||
|
||||
Membership findByStartDate(LocalDate startDate);
|
||||
|
||||
Membership findByEndDate(LocalDate endDate);
|
||||
|
||||
Membership findByStatus(String status);
|
||||
|
||||
Membership findByStudentId(Integer studentId);
|
||||
|
||||
boolean existsByType(MembershipTypeValues type);
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.repositories.class_managment_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingGroup;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface TrainingGroupRepository extends JpaRepository<TrainingGroup, Integer> {
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
package com.denniseckerskorn.repositories.class_managment_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.class_managment.TrainingSession;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface TrainingSessionRepository extends JpaRepository<TrainingSession, Integer> {
|
||||
TrainingSession findByDate(LocalDateTime date);
|
||||
|
||||
List<TrainingSession> findAllByDateBetween(LocalDateTime start, LocalDateTime end);
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package com.denniseckerskorn.repositories.finance_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.finance.IVAType;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public interface IVATypeRepository extends JpaRepository<IVAType, Integer> {
|
||||
boolean existsByPercentage(BigDecimal percentage);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.repositories.finance_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.finance.InvoiceLine;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface InvoiceLineRepository extends JpaRepository<InvoiceLine, Integer> {
|
||||
}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
package com.denniseckerskorn.repositories.finance_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.finance.Invoice;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface InvoiceRepository extends JpaRepository<Invoice, Integer> {
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
package com.denniseckerskorn.repositories.finance_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.finance.Payment;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface PaymentRepository extends JpaRepository<Payment, Integer> {
|
||||
boolean existsByInvoiceId(Integer invoiceId);
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
package com.denniseckerskorn.repositories.finance_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.finance.ProductService;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface ProductServiceRepository extends JpaRepository<ProductService, Integer> {
|
||||
boolean existsByName(String name);
|
||||
|
||||
boolean existsByIvaTypeId(Integer ivaTypeId);
|
||||
}
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
package com.denniseckerskorn.repositories.user_managment_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.users.Admin;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
public interface AdminRepository extends JpaRepository<Admin, Integer> {
|
||||
boolean existsByUserEmail(String email);
|
||||
|
||||
Admin findByUserEmail(String email);
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.denniseckerskorn.repositories.user_managment_repositories;
|
||||
|
||||
import com.denniseckerskorn.entities.user_managment.Notification;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public interface NotificationRepository extends JpaRepository<Notification, Integer> {
|
||||
boolean existsByTitleAndShippingDate(String title, LocalDateTime shippingDate);
|
||||
List<Notification> findNotificationsById(Integer id);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue